summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-2.98')
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/7t.enc65
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/COPYING416
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/INSTALL176
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.am86
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.in765
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/NEWS1160
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ONEWS433
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/README144
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/autoconf.h.in228
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.in716
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.cc265
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.cc563
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.hh10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/configure.ac502
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphlist.txt4322
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphtounicode.tex5511
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/config.h43
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afm.hh59
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmparse.hh64
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmw.hh29
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/amfm.hh153
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/cff.hh452
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/encoding.hh27
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/findmet.hh114
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/metrics.hh177
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otf.hh363
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfcmap.hh55
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfdata.hh239
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgpos.hh249
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgsub.hh409
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfname.hh122
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfos2.hh75
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfpost.hh62
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/pairop.hh113
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/psres.hh74
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1bounds.hh93
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1cs.hh340
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1csgen.hh123
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1font.hh167
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1interp.hh239
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1item.hh268
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1mm.hh108
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1rw.hh232
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1unparser.hh39
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfcs.hh41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfhead.hh41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfkern.hh42
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/bezier.hh136
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/clp.h303
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/error.hh881
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/filename.hh41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/globmatch.hh8
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashcode.hh31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.cc187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.hh210
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/inttypes.h34
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/landmark.hh39
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/md5.h48
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/permstr.hh194
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/point.hh185
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/slurper.hh63
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/straccum.hh603
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/string.hh880
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/strtonum.h10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/transform.hh162
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.cc202
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.hh324
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/lcdf-typetools.spec99
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.am43
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.in649
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afm.cc586
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmparse.cc365
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmw.cc190
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/amfm.cc850
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/cff.cc1689
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/encoding.cc29
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/findmet.cc321
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/metrics.cc130
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otf.cc1490
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfcmap.cc480
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdata.cc43
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdescrip.cc717
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgpos.cc328
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgsub.cc1285
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfname.cc194
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfos2.cc47
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfpost.cc212
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/pairop.cc153
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/psres.cc419
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1bounds.cc161
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1cs.cc370
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1csgen.cc633
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1font.cc914
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1fontskel.cc433
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1interp.cc1376
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1item.cc861
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1mm.cc392
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1rw.cc613
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1unparser.cc137
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfcs.cc212
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfhead.cc69
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfkern.cc116
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.am31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.in646
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/bezier.cc376
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/clp.c2351
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/error.cc1169
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/filename.cc130
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/fixlibc.c73
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/globmatch.cc116
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/landmark.cc36
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/md5.c357
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/permstr.cc319
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/point.cc57
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/slurper.cc187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/straccum.cc304
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/string.cc786
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/strtonum.c31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/transform.cc167
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/vectorv.cc110
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/m4/lcdf-typetools.m415
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.in695
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/main.cc434
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/mmafm.1178
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.am17
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.in721
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/main.cc463
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/mmpfb.1206
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.cc300
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.hh31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.cc41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.hh7
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.cc924
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.hh68
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.am16
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.in697
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.1195
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.cc636
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.am34
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.in768
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.cc820
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.hh25
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.cc979
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.hh128
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.cc236
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.hh110
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.c231
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.h26
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.cc1550
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.hh297
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.11654
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.cc2307
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.hh25
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.cc742
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.hh97
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.cc365
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.hh34
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.cc286
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.hh35
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.in695
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.196
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.cc418
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.in716
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.cc528
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.hh134
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.148
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.cc450
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.in695
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.155
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.cc362
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.in716
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.1205
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.cc1109
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.cc78
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.hh10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.in695
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.166
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.cc748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist-g2u.txt1188
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist.txt386
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.in695
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.178
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.cc403
192 files changed, 75536 insertions, 0 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/7t.enc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/7t.enc
new file mode 100644
index 00000000000..727f29e5f8c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/COPYING b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/COPYING
new file mode 100644
index 00000000000..67572846722
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/INSTALL b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/INSTALL
new file mode 100644
index 00000000000..95d84c820fb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.am
new file mode 100644
index 00000000000..de0535c5252
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.am
@@ -0,0 +1,86 @@
+## 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 t1rawafm t1reencode t1testpage ttftotype42
+
+EXTRA_DIST = \
+ ONEWS \
+ lcdf-typetools.spec \
+ include/config.h \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashcode.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/md5.h \
+ 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/otfpost.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 \
+ include/efont/ttfcs.hh \
+ include/efont/ttfhead.hh \
+ include/efont/ttfkern.hh \
+ glyphlist.txt \
+ texglyphlist.txt \
+ texglyphlist-g2u.txt \
+ 7t.enc
+
+glyphlist_DATA = glyphlist.txt texglyphlist.txt
+enc_DATA = 7t.enc
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm \
+t1reencode t1testpage ttftotype42: liblcdf libefont
+ cd $@ && $(MAKE)
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(srcdir)/cfftot1/cfftot1.1 $(srcdir)/mmafm/mmafm.1 $(srcdir)/mmpfb/mmpfb.1 $(srcdir)/otfinfo/otfinfo.1 $(srcdir)/otftotfm/otftotfm.1 $(srcdir)/t1dotlessj/t1dotlessj.1 $(srcdir)/t1lint/t1lint.1 $(srcdir)/t1rawafm/t1rawafm.1 $(srcdir)/t1reencode/t1reencode.1 $(srcdir)/t1testpage/t1testpage.1 $(srcdir)/ttftotype42/ttftotype42.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(srcdir)/README
+ perl -pi -e 's/^Version: [\d.ab]+$$/Version: $(VERSION)/;' $(srcdir)/lcdf-typetools.spec
+
+dist-hook:
+ if test -f $(srcdir)/make-glyphtounicode.pl; then (cd $(srcdir); perl make-glyphtounicode.pl) > $(distdir)/glyphtounicode.tex; elif test -f $(srcdir)/glyphtounicode.tex; then cp $(srcdir)/glyphtounicode.tex $(distdir); fi
+
+$(srcdir)/glyphtounicode.tex: $(srcdir)/glyphlist.txt $(srcdir)/texglyphlist.txt $(srcdir)/texglyphlist-g2u.txt $(srcdir)/make-glyphtounicode.pl
+ cd $(srcdir); perl make-glyphtounicode.pl > glyphtounicode.tex
+
+.PHONY: rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.in
new file mode 100644
index 00000000000..59f91d89017
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/Makefile.in
@@ -0,0 +1,765 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = lcdf-typetools-2.98
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am COPYING \
+ INSTALL NEWS README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(encdir)" "$(DESTDIR)$(glyphlistdir)"
+DATA = $(enc_DATA) $(glyphlist_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign check-news
+SUBDIRS = liblcdf libefont @SELECTED_SUBDIRS@
+DIST_SUBDIRS = liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm \
+ t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
+
+EXTRA_DIST = \
+ ONEWS \
+ lcdf-typetools.spec \
+ include/config.h \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashcode.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/md5.h \
+ 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/otfpost.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 \
+ include/efont/ttfcs.hh \
+ include/efont/ttfhead.hh \
+ include/efont/ttfkern.hh \
+ glyphlist.txt \
+ texglyphlist.txt \
+ texglyphlist-g2u.txt \
+ 7t.enc
+
+glyphlist_DATA = glyphlist.txt texglyphlist.txt
+enc_DATA = 7t.enc
+all: all-recursive
+
+.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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-encDATA: $(enc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(enc_DATA)'; test -n "$(encdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(encdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(encdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(encdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(encdir)" || exit $$?; \
+ done
+
+uninstall-encDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(enc_DATA)'; test -n "$(encdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(encdir)'; $(am__uninstall_files_from_dir)
+install-glyphlistDATA: $(glyphlist_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(glyphlist_DATA)'; test -n "$(glyphlistdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(glyphlistdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(glyphlistdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(glyphlistdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(glyphlistdir)" || exit $$?; \
+ done
+
+uninstall-glyphlistDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(glyphlist_DATA)'; test -n "$(glyphlistdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(glyphlistdir)'; $(am__uninstall_files_from_dir)
+
+# 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.
+$(am__recursive_targets):
+ @fail= failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ 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; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ 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 || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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 \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(encdir)" "$(DESTDIR)$(glyphlistdir)"; 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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-encDATA install-glyphlistDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-encDATA uninstall-glyphlistDATA
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am dist-hook distclean distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-encDATA \
+ install-exec install-exec-am install-glyphlistDATA \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-encDATA uninstall-glyphlistDATA
+
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm \
+t1reencode t1testpage ttftotype42: liblcdf libefont
+ cd $@ && $(MAKE)
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(srcdir)/cfftot1/cfftot1.1 $(srcdir)/mmafm/mmafm.1 $(srcdir)/mmpfb/mmpfb.1 $(srcdir)/otfinfo/otfinfo.1 $(srcdir)/otftotfm/otftotfm.1 $(srcdir)/t1dotlessj/t1dotlessj.1 $(srcdir)/t1lint/t1lint.1 $(srcdir)/t1rawafm/t1rawafm.1 $(srcdir)/t1reencode/t1reencode.1 $(srcdir)/t1testpage/t1testpage.1 $(srcdir)/ttftotype42/ttftotype42.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(srcdir)/README
+ perl -pi -e 's/^Version: [\d.ab]+$$/Version: $(VERSION)/;' $(srcdir)/lcdf-typetools.spec
+
+dist-hook:
+ if test -f $(srcdir)/make-glyphtounicode.pl; then (cd $(srcdir); perl make-glyphtounicode.pl) > $(distdir)/glyphtounicode.tex; elif test -f $(srcdir)/glyphtounicode.tex; then cp $(srcdir)/glyphtounicode.tex $(distdir); fi
+
+$(srcdir)/glyphtounicode.tex: $(srcdir)/glyphlist.txt $(srcdir)/texglyphlist.txt $(srcdir)/texglyphlist-g2u.txt $(srcdir)/make-glyphtounicode.pl
+ cd $(srcdir); perl make-glyphtounicode.pl > glyphtounicode.tex
+
+.PHONY: rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
+
+# 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/texk/lcdf-typetools/lcdf-typetools-2.98/NEWS b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/NEWS
new file mode 100644
index 00000000000..d146d746d0c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/NEWS
@@ -0,0 +1,1160 @@
+LCDF Typetools NEWS
+
+Version 2.98 10.Apr.2013
+
+* Fix alignment bug that corrupted output fonts on some platforms
+ (MIPS especially). Reported by Norbert Preining.
+
+
+Version 2.97 25.Oct.2012
+
+* Same.
+
+
+Version 2.96 25.Oct.2012
+
+* Build improvements inspired by Peter Breitenlohner.
+
+
+Version 2.95 21.Sep.2012
+
+* Fix cfftot1: Don't crash on problematic fonts. Bob Tennent report.
+
+
+Version 2.94 3.Aug.2012
+
+* More compilation updates.
+
+
+Version 2.93 23.Jul.2012
+
+* Correct compilation problem reported by Dennis Veatch.
+
+* Update OpenType feature, script, and language lists, and some other nits.
+
+
+Version 2.92 14.Aug.2011
+
+* Correct horrible x86-64 byte-order issue. Bug reported by Michael Ummels.
+
+
+Version 2.91 13.Jun.2011
+
+* Correct some compilation problems on unusual systems reported by Vladimir
+ Volovich.
+
+
+Version 2.90 3.Jun.2011
+
+* Correct crash on glyph names that start with a dot. Marc van Dongen
+ report.
+
+
+Version 2.89 2.Jun.2011
+
+* Better handle combinations of fonts and options that would create so many
+ substitutions that otftotfm would run out of memory. Marc van Dongen
+ report.
+
+* Thanks to Peter Breitenlohner.
+
+
+Version 2.88 8.Mar.2011
+
+* Warning reduction.
+
+
+Version 2.87 27.Jan.2011
+
+* Avoid double-free error in t1testpage. Reported by Kurt Pfeifle.
+
+
+Version 2.86 16.Dec.2010
+
+* Support version 4 of the OpenType OS/2 table. Reported by Thomas
+ Zumbrunn.
+
+
+Version 2.85 26.Sep.2010
+
+* Correct otftotfm bug with glyphlist.txt mappings like I_J.
+
+
+Version 2.84 15.Sep.2010
+
+* otftotfm: Avoid crashes on very large fonts and other odd situations.
+ Bugs reported by Martin Schröder.
+
+* Include new Unicode mappings for glyph names from MSAM and MSBM.
+
+* Bug fixes to texglyphlist.txt Unicode mappings. Thanks to Clea F. Rees.
+
+
+Version 2.83 23.Apr.2010
+
+* otftotfm: If -fkern loads no GPOS lookups, apply the TTF kern table (if
+ it exists). This should use the TTF kern table strictly more often than
+ the previous version. Based on draft changes to the OpenType spec.
+
+* Update with changes from TeX Live. Thanks to Peter Breitenlohner.
+
+
+Version 2.82 19.Jan.2010
+
+* otftotfm: Correctly handle multiply-encoded glyphs (for example, if "j"
+ ends up encoded in more than one slot, apply the j => j.smcp feature to
+ both occurrences). Reported by Michael Ummels.
+
+
+Version 2.81 7.Jan.2010
+
+* otftotfm: Fix "em" and "ex" measurements (QUAD and XHEIGHT font
+ dimensions) for TrueType fonts. Problem reported by Nico Schlömer.
+
+* otftotfm: Add --type42 option.
+
+
+Version 2.80 10.Nov.2009
+
+* otftotfm: Add --fixed-width, --proportional-width, and --italic-angle
+ options. Requested by Karl Berry.
+
+
+Version 2.79 12.Jun.2009
+
+* otftotfm: Use TrueType "kern" tables to satisfy the "-fkern" feature if
+ GPOS information isn't available. Requested by Nico Schlömer.
+
+* ttftotype42: Split very large non-glyf tables, as well as very large glyf
+ tables. Requested by Mark DeVries.
+
+* otfinfo: The -T option dumps a table's contents to standard out.
+
+* Introduce and use a consistent hashcode_t type. Reported by Karl Berry.
+
+
+Version 2.78 6.Apr.2009
+
+* t1lint: Report warnings when a font charstring command has too many
+ arguments. Requested by Han The Thanh.
+
+
+Version 2.77 6.Apr.2009
+
+* Font library changes: correctly implement binary search in a couple
+ places -- unexpected sizes could lead to overflow and bad behavior.
+ Reported by Mark DeVries for ttftotype42 and CharisSILR.
+
+
+Version 2.76 27.Mar.2009
+
+* mmpfb: Ensure all output subroutines end in the "return" command; some
+ type 1 processors treat a subroutine ending in "endchar" as an error.
+ Reported by Melissa O'Neill.
+
+* mmpfb, cfftot1: Ensure that stem3 hints (hstem3, vstem3) meet the
+ necessary constraints, even despite rounding.
+
+* t1lint: Add checks for some more problems, such as subroutines that do
+ not end in "return." Reported/requested by Melissa O'Neill and Han The
+ Thanh.
+
+
+Version 2.75 22.Feb.2009
+
+* Report a helpful warning if automatic mode is specified to a version
+ without kpathsea support. Question from Keith Briggs.
+
+
+Version 2.74 16.Feb.2009
+
+* Correctly detect <unistd.h>. Problem reported by C.M. Connelly.
+
+
+Version 2.73 15.Feb.2009
+
+* cfftot1 bug fix: Avoid introducing stray "rmoveto" commands and attendant
+ visual artifacts into the output. The problem was caused by some
+ coordinate system confusion. Reported by John Owens, who had tried to
+ convert Inconsolata.
+
+
+Version 2.72 27.Oct.2008
+
+* t1rawafm: Add missing newlines; thanks, Michael Zedler.
+
+* otftotfm: Understand "UniXXXX" glyph names. They're not standard, but
+ it's pretty obvious what they imply. Reported by Vasile Gaburici.
+
+
+Version 2.71 8.Aug.2008
+
+* otftotfm: Correctly install TrueType files when --force. Reported by
+ Vasile Gaburici.
+
+
+Version 2.70 8.Aug.2008
+
+* Add new t1rawafm program, which generates a "raw" (kernless and
+ ligatureless) AFM file given a font file (PFB/PFA).
+
+* otftotfm: When installing, --automatic ignores files existing in the
+ current directory. Confusion reported by Vasile Gaburici.
+
+* Type 1 parsing: Parse fonts with rare encoding formats, such as bases
+ other than 10.
+
+
+Version 2.69 5.May.2008
+
+* Mini portability fix for problem reported by Vladimir Volovich.
+
+
+Version 2.68 2.May.2008
+
+* otftotfm: Tweak the ligature sorting algorithm. Prefer lowercase
+ ligatures to mixed-case and uppercase ligatures; prefer the conventional
+ f-ligatures to all others. Reported by Ulrich Dirr.
+
+
+Version 2.67 25.Apr.2008
+
+* otftotfm: Improve font name construction for base fonts. Reported by
+ Ulrich Dirr.
+
+
+Version 2.66 3.Aug.2007
+
+* otftotfm: TrueType fonts had inappropriately large kerning pairs; fixed.
+ Reported by Marc Penninga.
+
+
+Version 2.65 22.Jul.2007
+
+* t1testpage: Fix bug triggered by fonts with empty encoding slots.
+ Reported by Michael Zedler.
+
+
+Version 2.64 25.Jun.2007
+
+* Handle Extension format GPOS and GSUB lookup tables, used for very large
+ fonts. Reported by Marc Penninga.
+
+* cfftot1, t1lint: Correct misunderstanding of the Flex spec: there MUST be
+ an rmoveto in between any two Flex subroutines, even if that rmoveto
+ doesn't move anywhere. (Question: Are hmoveto/vmoveto acceptable? Adobe
+ Reader seems to think so.) Reported by John Owens with respect to
+ Caslon-Antique.
+
+
+Version 2.63 12.Jun.2007
+
+* Correctly handle fonts with 4-byte character code cmap tables. Reported
+ by Alexey Vikhlinin.
+
+
+Version 2.62 11.Apr.2007
+
+* t1dotlessj: Do not use the same UniqueID as the input font. Inspired by
+ Reinhard Kotucha.
+
+* otftotfm: Generate a map line even if there was a missing character in
+ some UNICODING. Reported by Andreas Bühmann.
+
+
+Version 2.61 25.Mar.2007
+
+* otftotfm: Automatically reduce DESIGNUNITS and try again if a font has
+ humungocharacters that overflow PL files' limited range of allowed real
+ numbers. Reported by John Owens.
+
+
+Version 2.60 27.Feb.2007
+
+* otftotfm: Rearrange order of virtual fonts so most-frequently-used font
+ comes in position 0. Requested by Michael Zedler.
+
+* otftotfm: Apply letterspacing to "dotlessj". Maybe finally this is right.
+
+
+Version 2.59 23.Feb.2007
+
+* otftotfm: %POSITION commands don't add glyphs to the encoding. Requested
+ by Achim Blumensath.
+
+
+Version 2.58 22.Feb.2007
+
+* otftotfm: More of the same (with respect to "Germandbls"), again reported
+ by Michael Zedler.
+
+
+Version 2.57 21.Feb.2007
+
+* otftotfm: More of the same: "emptyslot" glyphs don't generate spurious
+ base fonts. Again reported by Michael Zedler.
+
+
+Version 2.56 13.Feb.2007
+
+* otftotfm: Guess what?
+
+
+Version 2.55 13.Feb.2007
+
+* otftotfm: Finally fix (?) letterspacing for simulated characters.
+
+
+Version 2.54 12.Feb.2007
+
+* otftotfm: Include letterspacing for simulated characters. Bug reported
+ by Michael Zedler.
+
+
+Version 2.53 11.Feb.2007
+
+* otftotfm: Positionings and letterspacing apply even with
+ '--base-encodings'. Bug reported by Michael Zedler.
+
+
+Version 2.52 6.Feb.2007
+
+* otftotfm: '--base-encodings' fixes for dotless-J fonts.
+
+
+Version 2.51 6.Feb.2007
+
+* otftotfm: Some '--base-encodings' fixes.
+
+
+Version 2.50 6.Feb.2007
+
+* otftotfm: Add '--base-encodings' option. Requested by Michael Zedler.
+
+
+Version 2.49 11.Jan.2007
+
+* Report certain types of invalid 'size' features that occasionally occur
+ in old fonts. Thanks to John Owens and Read Roberts.
+
+
+Version 2.48 11.Dec.2006
+
+* Translate font names into UTF-8 encoding. Reported by John Owens.
+
+
+Version 2.47 10.Dec.2006
+
+* otfinfo: Add new names, such as "Preferred Family", to 'otfinfo -i' output.
+ Requested by John Owens.
+
+
+Version 2.46 29.Oct.2006
+
+* otftotfm: Base metrics files now reflect the actual base font metrics
+ more accurately (rather than containing virtual-font-only metrics
+ information, such as letterspacing). This should make it easier to tell,
+ using "diff", whether two base metrics files contain the same data.
+
+* otftotfm: '--no-type1' does not affect dotless-j font generation; use
+ '--no-dotlessj' for that (Michael Zedler).
+
+* otftotfm: Don't generate virtual fonts unless you have to (Michael
+ Zedler).
+
+
+Version 2.45 17.Sep.2006
+
+* Include new ttftotype42 program.
+
+
+Version 2.44 16.Sep.2006
+
+* otfinfo/otftotfm: Support new fonts whose 'size' features are defined
+ correctly. Thanks to Read Roberts for defining the compatibility check.
+
+
+Version 2.43 22.Aug.2006
+
+* otftotfm: Check for availability of kpse_opentype_format. Bug reported
+ by Carsten Luckmann.
+
+
+Version 2.42 22.Aug.2006
+
+* otftotfm: Any --altselector-char is actually encoded, so you can use it
+ as a regular character as well as an altselector. Suggested by Carsten
+ Luckmann.
+
+
+Version 2.41 12.Aug.2006
+
+* otftotfm: Some TrueType fixes. Problems reported by Michael Zedler.
+
+
+Version 2.40 1.Aug.2006
+
+* otftotfm: Initial support for TrueType-flavored OpenType fonts. Inspired
+ because John Owens is working with Microsoft's Calibri et al.
+
+
+Version 2.39 11.Jul.2006
+
+* cfftot1: Unify some subroutines previously missed, for slightly smaller
+ output. Reported by Michael Zedler.
+
+
+Version 2.38 8.May.2006
+
+* otfinfo: Add '--info' option. Requested by John Owens.
+
+
+Version 2.37 25.Jan.2006
+
+* otftotfm: Add 'ringfitted'. Requested by Michael Zedler. Required bug
+ fix.
+
+
+Version 2.36 9.Nov.2005
+
+* otfinfo: Add '-a/--family' option. Based on patch from Ottavio G. Rizzo.
+
+* otftotfm: Fix bug where '-q' would inhibit map line output, reported by
+ Achim Blumensath.
+
+
+Version 2.35 3.Oct.2005
+
+* otftotfm: Allow '--ligkern "T h=:T_h"' (note lack of spaces around '=:').
+ Inspired by Michael Saunders.
+
+* otftotfm: Split TeX extensions out from 'glyphlist.txt' into
+ 'texglyphlist.txt', leaving 'glyphlist.txt' exactly as distributed by
+ Adobe. Otftotfm reads both files. Requested by Werner Lemberg.
+
+* otftotfm: Add '% WARNMISSING' and '--warn-missing', so that missing
+ characters result in blots and cause warnings when processed by dvips.
+ Requested by Michael Zedler.
+
+* otfinfo: Add '-v/--font-version' option and document '-t/--tables' option.
+
+* t1reencode: Add many more standard encodings to t1reencode, and fix
+ existing ones. Patch from Peter Betzler.
+
+
+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/texk/lcdf-typetools/lcdf-typetools-2.98/ONEWS b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ONEWS
new file mode 100644
index 00000000000..6bd9dc8c42d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/README b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/README
new file mode 100644
index 00000000000..9451c0fb4ce
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/README
@@ -0,0 +1,144 @@
+LCDF-TYPETOOLS 2.98
+===================
+
+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.
+
+ Ttftotype42 creates a Type 42 wrapper for a TrueType or
+TrueType-flavored OpenType font. See the manual page
+'ttftotype42/ttftotype42.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-2011 Eddie Kohler.
+
+ This code is distributed under the GNU General Public License, Version 2
+(and only Version 2). 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/texk/lcdf-typetools/lcdf-typetools-2.98/autoconf.h.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/autoconf.h.in
new file mode 100644
index 00000000000..353e9a004a9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/autoconf.h.in
@@ -0,0 +1,228 @@
+/* autoconf.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Directory for glyphlist.txt files. */
+#undef GLYPHLISTDIR
+
+/* 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 from otftotfm. */
+#undef HAVE_AUTO_CFFTOT1
+
+/* Define to run t1dotlessj from otftotfm. */
+#undef HAVE_AUTO_T1DOTLESSJ
+
+/* Define to run ttftotype42 from otftotfm. */
+#undef HAVE_AUTO_TTFTOTYPE42
+
+/* Define to run updmap from otftotfm. */
+#undef HAVE_AUTO_UPDMAP
+
+/* Define if strnlen is broken. */
+#undef HAVE_BROKEN_STRNLEN
+
+/* Define if strtod is broken. */
+#undef HAVE_BROKEN_STRTOD
+
+/* 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 declaration of `kpse_enc_format', and to 0 if
+ you don't. */
+#undef HAVE_DECL_KPSE_ENC_FORMAT
+
+/* Define to 1 if you have the declaration of `kpse_opentype_format', and to 0
+ if you don't. */
+#undef HAVE_DECL_KPSE_OPENTYPE_FORMAT
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNLEN
+
+/* 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 include precondition checking assertions. */
+#undef HAVE_PRECONDITION_CHECKING
+
+/* 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 `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 `strnlen' function. */
+#undef HAVE_STRNLEN
+
+/* 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 `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* 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 home page for this package. */
+#undef PACKAGE_URL
+
+/* 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
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `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 WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to 1 if your processor stores words with the least significant byte
+ first (like Intel and VAX, unlike Motorola and SPARC). */
+#undef WORDS_LITTLEENDIAN
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.am
new file mode 100644
index 00000000000..81d5365b976
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = cfftot1.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.in
new file mode 100644
index 00000000000..4c7d7932b67
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/Makefile.in
@@ -0,0 +1,716 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = cfftot1$(EXEEXT)
+subdir = lcdf-typetools-2.98/cfftot1
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_cfftot1_OBJECTS = cfftot1.$(OBJEXT) maket1font.$(OBJEXT)
+cfftot1_OBJECTS = $(am_cfftot1_OBJECTS)
+cfftot1_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(cfftot1_SOURCES)
+DIST_SOURCES = $(cfftot1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = cfftot1.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/cfftot1/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+cfftot1$(EXEEXT): $(cfftot1_OBJECTS) $(cfftot1_DEPENDENCIES) $(EXTRA_cfftot1_DEPENDENCIES)
+ @rm -f cfftot1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.1
new file mode 100644
index 00000000000..f5d13744645
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.1
@@ -0,0 +1,87 @@
+.ds V 2.98
+.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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.cc
new file mode 100644
index 00000000000..fe719e86d56
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/cfftot1.cc
@@ -0,0 +1,265 @@
+/* cfftot1.cc -- driver for translating CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2012 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
+
+const 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_ValString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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')
+ errh->fatal("%s: not a CFF or OpenType/CFF font", infn);
+
+ StringAccum sa(150000);
+ int amt;
+ do {
+ if (char *x = sa.reserve(32768)) {
+ amt = fread(x, 1, 32768, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->lerror(infn, "%s", strerror(errno));
+ if (f != stdin)
+ fclose(f);
+
+ ContextErrorHandler cerrh(errh, "While processing %s:", infn);
+ cerrh.set_indent(0);
+ 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);
+
+ if (errh->nerrors() > 0)
+ return;
+
+ Type1Font *font1 = create_type1_font(font, &cerrh);
+
+ 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->vstr;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("cfftot1 (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2012 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->vstr;
+ 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->vstr;
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.cc
new file mode 100644
index 00000000000..21b632e50d9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.cc
@@ -0,0 +1,563 @@
+/* maket1font.{cc,hh} -- translate CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2012 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(ErrorHandler *errh) 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++; }
+
+ //String name(const MakeType1CharstringInterp *) const;
+ 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;
+ Caller(Subr *s, int p, int l) : subr(s), pos(p), len(l) { }
+ String charstring(MakeType1CharstringInterp *mcsi) const {
+ Type1Charstring *t1cs = subr->charstring(mcsi);
+ return t1cs->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 *);
+
+ 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(ErrorHandler *errh) const
+{
+ if (_cur_glyph >= 0 && _cur_glyph < program()->nglyphs())
+ return errh->format("glyph %<%s%>", program()->glyph_name(_cur_glyph).c_str());
+ 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;
+}
+
+#if 0
+String
+MakeType1CharstringInterp::Subr::name(const MakeType1CharstringInterp *mcsi) const
+{
+ int n = (_csr & CSR_NUM);
+ switch (_csr & CSR_TYPE) {
+ case CSR_SUBR:
+ return "subr" + String(n);
+ case CSR_GSUBR:
+ return "gsubr" + String(n);
+ case CSR_GLYPH:
+ if (String name = mcsi->output()->glyph_name(n))
+ return name;
+ else
+ return "??glyph" + String(n) + "??";
+ default:
+ return "";
+ }
+}
+#endif
+
+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];
+ // 11.Jul.2006 - remember not to shift the new caller's records! (Michael Zedler)
+ if (cs != new_caller)
+ 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) {
+ // shift caller to point at the subroutine
+ 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;
+ }
+}
+
+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()); // because this hasn't been unified yet
+
+ // 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"));
+
+ // This subr has become real, so it is suitable for later unifications.
+ // Mark it as having called any subroutines contained completely within itself.
+ // How to do this? Look at one caller, and go over all its 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];
+ 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(errh), "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 (i == 2301 || i == 2302) {
+ 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
+ PermString name = program->glyph_name(i);
+ if (output->glyph(name)) {
+ errh->warning("glyph %<%s%> defined more than once", name.c_str());
+ int i = 1;
+ do {
+ name = program->glyph_name(i) + String(".") + String(i);
+ ++i;
+ } while (output->glyph(name));
+ }
+ output->add_glyph(Type1Subr::make_glyph(name, 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/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/cfftot1/maket1font.hh
new file mode 100644
index 00000000000..75f2527897f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/configure.ac b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/configure.ac
new file mode 100644
index 00000000000..d08fc566265
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/configure.ac
@@ -0,0 +1,502 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT([lcdf-typetools], [2.98])
+AC_CONFIG_SRCDIR([NEWS])
+AM_INIT_AUTOMAKE
+AC_CONFIG_HEADERS([autoconf.h])
+AM_MAINTAINER_MODE
+
+AC_PROG_MAKE_SET
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+
+AC_ARG_ENABLE([warnings],
+ [AS_HELP_STRING([--enable-warnings], [compile with -W -Wall])],
+ [if test "$enableval" = yes; then
+ CFLAGS="$CFLAGS -W -Wall"; CXXFLAGS="$CXXFLAGS -W -Wall"
+ fi])
+
+AC_ARG_ENABLE([precondition-checking],
+ [AS_HELP_STRING([--enable-precondition-checking], [include precondition checking assertions])],
+ [if test "$enableval" = yes; then
+ AC_DEFINE([HAVE_PRECONDITION_CHECKING], [1], [Define to include precondition checking assertions.])
+ 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 standard headers
+dnl (Though obsolete, AC_HEADER_STC changes the standard includes.)
+dnl
+
+AC_LANG_C
+AC_HEADER_STDC
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS([fcntl.h unistd.h sys/time.h sys/wait.h])
+
+
+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 endianness
+dnl
+
+AC_C_BIGENDIAN(, [AC_DEFINE([WORDS_LITTLEENDIAN], 1, [Define to 1 if your processor stores words with the least significant byte
+ first (like Intel and VAX, unlike Motorola and SPARC).])])
+
+
+dnl
+dnl functions such as strerror, working strtod, working strnlen, strtoul,
+dnl time headers such as unistd.h
+dnl
+
+AC_LANG_C
+need_fixlibc=0
+AC_CHECK_FUNCS([strerror], [], [need_fixlibc=1])
+
+AC_CACHE_CHECK([for broken strtod], [ac_cv_broken_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);
+ return (s + 2) == endp;
+}], [ac_cv_broken_strtod=yes], [ac_cv_broken_strtod=no],
+[ac_cv_broken_strtod=no])])
+if test "x$ac_cv_broken_strtod" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRTOD], [1], [Define if strtod is broken.])
+fi
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_DECLS([strnlen], [], [], [#include <string.h>])
+AC_CHECK_FUNCS([strnlen], [have_strnlen=1], [need_fixlibc=1])
+if test "x$have_strnlen" = x1; then
+ AC_CACHE_CHECK([for broken strnlen], [ac_cv_broken_strnlen],
+ [AC_TRY_RUN([#include <string.h>
+#include <stdio.h>
+int main(int c, char **v) {
+ char s[] = "01234567891";
+ return strnlen(s, 10) == 10;
+}], [ac_cv_broken_strnlen=yes], [ac_cv_broken_strnlen=no],
+[ac_cv_broken_strnlen=no])])
+ if test "x$ac_cv_broken_strnlen" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRNLEN], [1], [Define if strnlen is broken.])
+ fi
+fi
+AC_LANG_C
+
+AC_CHECK_FUNCS([ctime ftruncate mkstemp sigaction strdup strtoul vsnprintf waitpid])
+AC_CHECK_FUNC([floor], [], [AC_CHECK_LIB([m], [floor])])
+AC_CHECK_FUNC([fabs], [], [AC_CHECK_LIB([m], [fabs])])
+AM_CONDITIONAL([FIXLIBC], [test x$need_fixlibc = x1])
+
+
+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
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.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 select programs to be compiled and automatically run
+dnl
+
+m4_include([m4/lcdf-typetools.m4])
+
+SELECTED_SUBDIRS=
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [test "x$enable_[]Kpse_Prog" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS Kpse_Prog"
+])
+AC_SUBST(SELECTED_SUBDIRS)
+
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AS_IF([test "x$enable_auto_]Kpse_Opt[" != xno],
+ [AC_DEFINE([HAVE_AUTO_]AS_TR_CPP(Kpse_Opt), 1,
+ [Define to run ]Kpse_Opt[ from otftotfm.])])
+])
+
+
+dnl
+dnl kpathsea
+dnl
+
+AC_ARG_WITH([kpathsea],
+ [AS_HELP_STRING([--with-kpathsea=PREFIX], [Kpathsea is installed (under PREFIX)])],
+ [kpathsea=$withval], [kpathsea=])
+
+KPATHSEA_INCLUDES=
+KPATHSEA_LIBS=
+KPATHSEA_DEPEND=
+
+if test "x$kpathsea" != xno; then
+ SAVE_CPPFLAGS="$CPPFLAGS"; SAVE_LDFLAGS="$LDFLAGS"
+ if test "x$kpathsea" != x -a "x$kpathsea" != xyes; then
+ KPATHSEA_INCLUDES="-I$kpathsea/include"
+ KPATHSEA_LIBS="-L$kpathsea/lib"
+ else
+ kpathsea=yes
+ fi
+
+ dnl check for kpathsea/kpathsea.h
+ if true; then
+ CPPFLAGS="$SAVE_CPPFLAGS $KPATHSEA_INCLUDES"
+ 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
+ KPATHSEA_INCLUDES="-I/usr/local/include"
+ KPATHSEA_LIBS="-L/usr/local/lib"
+ CPPFLAGS="$SAVE_CPPFLAGS $KPATHSEA_INCLUDES"
+ AC_CHECK_HEADER([kpathsea/tex-file.h], [kpse_header=yes], [kpse_header=no])
+ fi
+
+ dnl check for -lkpathsea
+ if true; then
+ LDFLAGS="$SAVE_LDFLAGS $KPATHSEA_LIBS"
+ 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.])
+ if true; then
+ KPATHSEA_LIBS="$KPATHSEA_LIBS -lkpathsea"
+ fi
+
+ dnl does it have opentype support?
+ if false; then
+ AC_DEFINE(HAVE_DECL_KPSE_OPENTYPE_FORMAT)
+ else
+ AC_CHECK_DECLS([kpse_opentype_format], [], [], [#include <kpathsea/kpathsea.h>])
+ fi
+
+ dnl does it have a separate format for encoding files?
+ AC_CHECK_DECLS([kpse_enc_format], [], [], [#include <kpathsea/kpathsea.h>])
+
+ CPPFLAGS="$SAVE_CPPFLAGS"; LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+AM_CONDITIONAL([have_kpathsea], [test "x$with_kpathsea" != xno])
+AC_SUBST([KPATHSEA_INCLUDES])
+AC_SUBST([KPATHSEA_LIBS])
+AC_SUBST([KPATHSEA_DEPEND])
+
+AC_ARG_ENABLE([selfauto-set],
+ [AS_HELP_STRING([--disable-selfauto-set], [disable setting SELFAUTO variables from kpsewhich])],
+ [], [enable_selfauto_set=yes])
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno; 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
+
+
+dnl
+dnl glyphlist.txt and *.enc installation locations
+dnl
+
+AC_ARG_ENABLE([glyphlistdir],
+ [AS_HELP_STRING([--enable-glyphlistdir=DIR], [store glyphlist.txt files in DIR [pkgdatadir]])], [glyphlistdir="$enableval"], [glyphlistdir=NONE])
+AC_ARG_ENABLE([encdir],
+ [AS_HELP_STRING([--enable-encdir=DIR], [store encoding files in DIR [pkgdatadir]])], [encdir="$enableval"], [encdir=NONE])
+
+test "x$glyphlistdir" = xNONE -o "x$glyphlistdir" = xno \
+ -o "x$glyphlistdir" = x && glyphlistdir='${pkgdatadir}'
+test "x$encdir" = xNONE -o "x$encdir" = xno \
+ -o "x$encdir" = x && encdir='${pkgdatadir}'
+
+AC_SUBST([glyphlistdir])
+AC_SUBST([encdir])
+
+
+dnl
+dnl TeX Live build stub
+dnl
+
+KPATHSEA_RULE=
+AC_SUBST([KPATHSEA_RULE])
+
+
+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?
+
+
+dnl
+dnl set path variables
+dnl
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | grep '\$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ val=`echo "$val" | sed 's,//*,/,g'`
+ 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}'
+
+pkgdatadir="${datadir}/$PACKAGE"
+gdir="$glyphlistdir"
+for i in data dataroot pkgdata g; do shell_expand ${i}dir; done
+AC_DEFINE_UNQUOTED([GLYPHLISTDIR], ["$gdir"], [Directory for glyphlist.txt files.])
+
+
+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 t1rawafm/Makefile t1reencode/Makefile t1testpage/Makefile ttftotype42/Makefile)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphlist.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphlist.txt
new file mode 100644
index 00000000000..0304ffc6674
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphlist.txt
@@ -0,0 +1,4322 @@
+# ###################################################################################
+# Copyright (c) 1997,1998,2002,2007 Adobe Systems Incorporated
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this documentation file to use, copy, publish, distribute,
+# sublicense, and/or sell copies of the documentation, and to permit
+# others to do the same, provided that:
+# - No modification, editing or other alteration of this document is
+# allowed; and
+# - The above copyright notice and this permission notice shall be
+# included in all copies of the documentation.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this documentation file, to create their own derivative works
+# from the content of this document to use, copy, publish, distribute,
+# sublicense, and/or sell the derivative works, and to permit others to do
+# the same, provided that the derived work is not represented as being a
+# copy or version of this document.
+#
+# Adobe shall not be liable to any party for any loss of revenue or profit
+# or for indirect, incidental, special, consequential, or other similar
+# damages, whether based on tort (including without limitation negligence
+# or strict liability), contract or other legal or equitable grounds even
+# if Adobe has been advised or had reason to know of the possibility of
+# such damages.Ê The Adobe materials are provided on an "AS IS" basis.Ê
+# Adobe specifically disclaims all express, statutory, or implied
+# warranties relating to the Adobe materials, including but not limited to
+# those concerning merchantability or fitness for a particular purpose or
+# non-infringement of any third party rights regarding the Adobe
+# materials.
+# ###################################################################################
+# 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
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphtounicode.tex b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphtounicode.tex
new file mode 100644
index 00000000000..adaf8c82fc1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/glyphtounicode.tex
@@ -0,0 +1,5511 @@
+% lcdf-typetools glyphtounicode.tex, Version 2.95
+% Contents: Glyph mapping information for pdftex, used for PDF searching
+% Generated from:
+% - glyphlist.txt, Version 2.0
+% - texglyphlist.txt, Version 2.95
+% - texglyphlist-g2u.txt, Version 2.95
+\pdfglyphtounicode{A}{0041}
+\pdfglyphtounicode{AE}{00C6}
+\pdfglyphtounicode{AEacute}{01FC}
+\pdfglyphtounicode{AEmacron}{01E2}
+\pdfglyphtounicode{AEsmall}{00E6}
+\pdfglyphtounicode{Aacute}{00C1}
+\pdfglyphtounicode{Aacutesmall}{00E1}
+\pdfglyphtounicode{Abreve}{0102}
+\pdfglyphtounicode{Abreveacute}{1EAE}
+\pdfglyphtounicode{Abrevecyrillic}{04D0}
+\pdfglyphtounicode{Abrevedotbelow}{1EB6}
+\pdfglyphtounicode{Abrevegrave}{1EB0}
+\pdfglyphtounicode{Abrevehookabove}{1EB2}
+\pdfglyphtounicode{Abrevetilde}{1EB4}
+\pdfglyphtounicode{Acaron}{01CD}
+\pdfglyphtounicode{Acircle}{24B6}
+\pdfglyphtounicode{Acircumflex}{00C2}
+\pdfglyphtounicode{Acircumflexacute}{1EA4}
+\pdfglyphtounicode{Acircumflexdotbelow}{1EAC}
+\pdfglyphtounicode{Acircumflexgrave}{1EA6}
+\pdfglyphtounicode{Acircumflexhookabove}{1EA8}
+\pdfglyphtounicode{Acircumflexsmall}{00E2}
+\pdfglyphtounicode{Acircumflextilde}{1EAA}
+\pdfglyphtounicode{Acute}{00B4}
+\pdfglyphtounicode{Acutesmall}{00B4}
+\pdfglyphtounicode{Acyrillic}{0410}
+\pdfglyphtounicode{Adblgrave}{0200}
+\pdfglyphtounicode{Adieresis}{00C4}
+\pdfglyphtounicode{Adieresiscyrillic}{04D2}
+\pdfglyphtounicode{Adieresismacron}{01DE}
+\pdfglyphtounicode{Adieresissmall}{00E4}
+\pdfglyphtounicode{Adotbelow}{1EA0}
+\pdfglyphtounicode{Adotmacron}{01E0}
+\pdfglyphtounicode{Agrave}{00C0}
+\pdfglyphtounicode{Agravesmall}{00E0}
+\pdfglyphtounicode{Ahookabove}{1EA2}
+\pdfglyphtounicode{Aiecyrillic}{04D4}
+\pdfglyphtounicode{Ainvertedbreve}{0202}
+\pdfglyphtounicode{Alpha}{0391}
+\pdfglyphtounicode{Alphatonos}{0386}
+\pdfglyphtounicode{Amacron}{0100}
+\pdfglyphtounicode{Amonospace}{FF21}
+\pdfglyphtounicode{Aogonek}{0104}
+\pdfglyphtounicode{Aring}{00C5}
+\pdfglyphtounicode{Aringacute}{01FA}
+\pdfglyphtounicode{Aringbelow}{1E00}
+\pdfglyphtounicode{Aringsmall}{00E5}
+\pdfglyphtounicode{Asmall}{0061}
+\pdfglyphtounicode{Atilde}{00C3}
+\pdfglyphtounicode{Atildesmall}{00E3}
+\pdfglyphtounicode{Aybarmenian}{0531}
+\pdfglyphtounicode{B}{0042}
+\pdfglyphtounicode{Bcircle}{24B7}
+\pdfglyphtounicode{Bdotaccent}{1E02}
+\pdfglyphtounicode{Bdotbelow}{1E04}
+\pdfglyphtounicode{Becyrillic}{0411}
+\pdfglyphtounicode{Benarmenian}{0532}
+\pdfglyphtounicode{Beta}{0392}
+\pdfglyphtounicode{Bhook}{0181}
+\pdfglyphtounicode{Blinebelow}{1E06}
+\pdfglyphtounicode{Bmonospace}{FF22}
+\pdfglyphtounicode{Brevesmall}{02D8}
+\pdfglyphtounicode{Bsmall}{0062}
+\pdfglyphtounicode{Btopbar}{0182}
+\pdfglyphtounicode{C}{0043}
+\pdfglyphtounicode{Caarmenian}{053E}
+\pdfglyphtounicode{Cacute}{0106}
+\pdfglyphtounicode{Caron}{02C7}
+\pdfglyphtounicode{Caronsmall}{02C7}
+\pdfglyphtounicode{Ccaron}{010C}
+\pdfglyphtounicode{Ccedilla}{00C7}
+\pdfglyphtounicode{Ccedillaacute}{1E08}
+\pdfglyphtounicode{Ccedillasmall}{00E7}
+\pdfglyphtounicode{Ccircle}{24B8}
+\pdfglyphtounicode{Ccircumflex}{0108}
+\pdfglyphtounicode{Cdot}{010A}
+\pdfglyphtounicode{Cdotaccent}{010A}
+\pdfglyphtounicode{Cedillasmall}{00B8}
+\pdfglyphtounicode{Chaarmenian}{0549}
+\pdfglyphtounicode{Cheabkhasiancyrillic}{04BC}
+\pdfglyphtounicode{Checyrillic}{0427}
+\pdfglyphtounicode{Chedescenderabkhasiancyrillic}{04BE}
+\pdfglyphtounicode{Chedescendercyrillic}{04B6}
+\pdfglyphtounicode{Chedieresiscyrillic}{04F4}
+\pdfglyphtounicode{Cheharmenian}{0543}
+\pdfglyphtounicode{Chekhakassiancyrillic}{04CB}
+\pdfglyphtounicode{Cheverticalstrokecyrillic}{04B8}
+\pdfglyphtounicode{Chi}{03A7}
+\pdfglyphtounicode{Chook}{0187}
+\pdfglyphtounicode{Circumflexsmall}{02C6}
+\pdfglyphtounicode{Cmonospace}{FF23}
+\pdfglyphtounicode{Coarmenian}{0551}
+\pdfglyphtounicode{Csmall}{0063}
+\pdfglyphtounicode{D}{0044}
+\pdfglyphtounicode{DZ}{01F1}
+\pdfglyphtounicode{DZcaron}{01C4}
+\pdfglyphtounicode{Daarmenian}{0534}
+\pdfglyphtounicode{Dafrican}{0189}
+\pdfglyphtounicode{Dbar}{0110}
+\pdfglyphtounicode{Dcaron}{010E}
+\pdfglyphtounicode{Dcedilla}{1E10}
+\pdfglyphtounicode{Dcircle}{24B9}
+\pdfglyphtounicode{Dcircumflexbelow}{1E12}
+\pdfglyphtounicode{Dcroat}{0110}
+\pdfglyphtounicode{Ddotaccent}{1E0A}
+\pdfglyphtounicode{Ddotbelow}{1E0C}
+\pdfglyphtounicode{Decyrillic}{0414}
+\pdfglyphtounicode{Deicoptic}{03EE}
+\pdfglyphtounicode{Delta}{2206}
+\pdfglyphtounicode{Deltagreek}{0394}
+\pdfglyphtounicode{Dhook}{018A}
+\pdfglyphtounicode{Dieresis}{00A8}
+\pdfglyphtounicode{DieresisAcute}{F6CC}
+\pdfglyphtounicode{DieresisGrave}{F6CD}
+\pdfglyphtounicode{Dieresissmall}{00A8}
+\pdfglyphtounicode{Digamma}{D875 DFCB}
+\pdfglyphtounicode{Digammagreek}{03DC}
+\pdfglyphtounicode{Djecyrillic}{0402}
+\pdfglyphtounicode{Dlinebelow}{1E0E}
+\pdfglyphtounicode{Dmonospace}{FF24}
+\pdfglyphtounicode{Dotaccentsmall}{02D9}
+\pdfglyphtounicode{Dslash}{0110}
+\pdfglyphtounicode{Dsmall}{0064}
+\pdfglyphtounicode{Dtopbar}{018B}
+\pdfglyphtounicode{Dz}{01F2}
+\pdfglyphtounicode{Dzcaron}{01C5}
+\pdfglyphtounicode{Dzeabkhasiancyrillic}{04E0}
+\pdfglyphtounicode{Dzecyrillic}{0405}
+\pdfglyphtounicode{Dzhecyrillic}{040F}
+\pdfglyphtounicode{E}{0045}
+\pdfglyphtounicode{Eacute}{00C9}
+\pdfglyphtounicode{Eacutesmall}{00E9}
+\pdfglyphtounicode{Ebreve}{0114}
+\pdfglyphtounicode{Ecaron}{011A}
+\pdfglyphtounicode{Ecedillabreve}{1E1C}
+\pdfglyphtounicode{Echarmenian}{0535}
+\pdfglyphtounicode{Ecircle}{24BA}
+\pdfglyphtounicode{Ecircumflex}{00CA}
+\pdfglyphtounicode{Ecircumflexacute}{1EBE}
+\pdfglyphtounicode{Ecircumflexbelow}{1E18}
+\pdfglyphtounicode{Ecircumflexdotbelow}{1EC6}
+\pdfglyphtounicode{Ecircumflexgrave}{1EC0}
+\pdfglyphtounicode{Ecircumflexhookabove}{1EC2}
+\pdfglyphtounicode{Ecircumflexsmall}{00EA}
+\pdfglyphtounicode{Ecircumflextilde}{1EC4}
+\pdfglyphtounicode{Ecyrillic}{0404}
+\pdfglyphtounicode{Edblgrave}{0204}
+\pdfglyphtounicode{Edieresis}{00CB}
+\pdfglyphtounicode{Edieresissmall}{00EB}
+\pdfglyphtounicode{Edot}{0116}
+\pdfglyphtounicode{Edotaccent}{0116}
+\pdfglyphtounicode{Edotbelow}{1EB8}
+\pdfglyphtounicode{Efcyrillic}{0424}
+\pdfglyphtounicode{Egrave}{00C8}
+\pdfglyphtounicode{Egravesmall}{00E8}
+\pdfglyphtounicode{Eharmenian}{0537}
+\pdfglyphtounicode{Ehookabove}{1EBA}
+\pdfglyphtounicode{Eightroman}{2167}
+\pdfglyphtounicode{Einvertedbreve}{0206}
+\pdfglyphtounicode{Eiotifiedcyrillic}{0464}
+\pdfglyphtounicode{Elcyrillic}{041B}
+\pdfglyphtounicode{Elevenroman}{216A}
+\pdfglyphtounicode{Emacron}{0112}
+\pdfglyphtounicode{Emacronacute}{1E16}
+\pdfglyphtounicode{Emacrongrave}{1E14}
+\pdfglyphtounicode{Emcyrillic}{041C}
+\pdfglyphtounicode{Emonospace}{FF25}
+\pdfglyphtounicode{Encyrillic}{041D}
+\pdfglyphtounicode{Endescendercyrillic}{04A2}
+\pdfglyphtounicode{Eng}{014A}
+\pdfglyphtounicode{Enghecyrillic}{04A4}
+\pdfglyphtounicode{Enhookcyrillic}{04C7}
+\pdfglyphtounicode{Eogonek}{0118}
+\pdfglyphtounicode{Eopen}{0190}
+\pdfglyphtounicode{Epsilon}{0395}
+\pdfglyphtounicode{Epsilontonos}{0388}
+\pdfglyphtounicode{Ercyrillic}{0420}
+\pdfglyphtounicode{Ereversed}{018E}
+\pdfglyphtounicode{Ereversedcyrillic}{042D}
+\pdfglyphtounicode{Escyrillic}{0421}
+\pdfglyphtounicode{Esdescendercyrillic}{04AA}
+\pdfglyphtounicode{Esh}{01A9}
+\pdfglyphtounicode{Esmall}{0065}
+\pdfglyphtounicode{Eta}{0397}
+\pdfglyphtounicode{Etarmenian}{0538}
+\pdfglyphtounicode{Etatonos}{0389}
+\pdfglyphtounicode{Eth}{00D0}
+\pdfglyphtounicode{Ethsmall}{00F0}
+\pdfglyphtounicode{Etilde}{1EBC}
+\pdfglyphtounicode{Etildebelow}{1E1A}
+\pdfglyphtounicode{Euro}{20AC}
+\pdfglyphtounicode{Ezh}{01B7}
+\pdfglyphtounicode{Ezhcaron}{01EE}
+\pdfglyphtounicode{Ezhreversed}{01B8}
+\pdfglyphtounicode{F}{0046}
+\pdfglyphtounicode{FFIsmall}{0066 0066 0069}
+\pdfglyphtounicode{FFLsmall}{0066 0066 006C}
+\pdfglyphtounicode{FFsmall}{0066 0066}
+\pdfglyphtounicode{FIsmall}{0066 0069}
+\pdfglyphtounicode{FLsmall}{0066 006C}
+\pdfglyphtounicode{Fcircle}{24BB}
+\pdfglyphtounicode{Fdotaccent}{1E1E}
+\pdfglyphtounicode{Feharmenian}{0556}
+\pdfglyphtounicode{Feicoptic}{03E4}
+\pdfglyphtounicode{Fhook}{0191}
+\pdfglyphtounicode{Finv}{2132}
+\pdfglyphtounicode{Fitacyrillic}{0472}
+\pdfglyphtounicode{Fiveroman}{2164}
+\pdfglyphtounicode{Fmonospace}{FF26}
+\pdfglyphtounicode{Fourroman}{2163}
+\pdfglyphtounicode{Fsmall}{0066}
+\pdfglyphtounicode{G}{0047}
+\pdfglyphtounicode{GBsquare}{3387}
+\pdfglyphtounicode{Gacute}{01F4}
+\pdfglyphtounicode{Gamma}{0393}
+\pdfglyphtounicode{Gammaafrican}{0194}
+\pdfglyphtounicode{Gangiacoptic}{03EA}
+\pdfglyphtounicode{Gbreve}{011E}
+\pdfglyphtounicode{Gcaron}{01E6}
+\pdfglyphtounicode{Gcedilla}{0122}
+\pdfglyphtounicode{Gcircle}{24BC}
+\pdfglyphtounicode{Gcircumflex}{011C}
+\pdfglyphtounicode{Gcommaaccent}{0122}
+\pdfglyphtounicode{Gdot}{0120}
+\pdfglyphtounicode{Gdotaccent}{0120}
+\pdfglyphtounicode{Gecyrillic}{0413}
+\pdfglyphtounicode{Germandbls}{0053 0053}
+\pdfglyphtounicode{Germandblssmall}{0073 0073}
+\pdfglyphtounicode{Ghadarmenian}{0542}
+\pdfglyphtounicode{Ghemiddlehookcyrillic}{0494}
+\pdfglyphtounicode{Ghestrokecyrillic}{0492}
+\pdfglyphtounicode{Gheupturncyrillic}{0490}
+\pdfglyphtounicode{Ghook}{0193}
+\pdfglyphtounicode{Gimarmenian}{0533}
+\pdfglyphtounicode{Gjecyrillic}{0403}
+\pdfglyphtounicode{Gmacron}{1E20}
+\pdfglyphtounicode{Gmir}{2141}
+\pdfglyphtounicode{Gmonospace}{FF27}
+\pdfglyphtounicode{Grave}{0060}
+\pdfglyphtounicode{Gravesmall}{0060}
+\pdfglyphtounicode{Gsmall}{0067}
+\pdfglyphtounicode{Gsmallhook}{029B}
+\pdfglyphtounicode{Gstroke}{01E4}
+\pdfglyphtounicode{H}{0048}
+\pdfglyphtounicode{H18533}{25CF}
+\pdfglyphtounicode{H18543}{25AA}
+\pdfglyphtounicode{H18551}{25AB}
+\pdfglyphtounicode{H22073}{25A1}
+\pdfglyphtounicode{HPsquare}{33CB}
+\pdfglyphtounicode{Haabkhasiancyrillic}{04A8}
+\pdfglyphtounicode{Hadescendercyrillic}{04B2}
+\pdfglyphtounicode{Hardsigncyrillic}{042A}
+\pdfglyphtounicode{Hbar}{0126}
+\pdfglyphtounicode{Hbrevebelow}{1E2A}
+\pdfglyphtounicode{Hcedilla}{1E28}
+\pdfglyphtounicode{Hcircle}{24BD}
+\pdfglyphtounicode{Hcircumflex}{0124}
+\pdfglyphtounicode{Hdieresis}{1E26}
+\pdfglyphtounicode{Hdotaccent}{1E22}
+\pdfglyphtounicode{Hdotbelow}{1E24}
+\pdfglyphtounicode{Hmonospace}{FF28}
+\pdfglyphtounicode{Hoarmenian}{0540}
+\pdfglyphtounicode{Horicoptic}{03E8}
+\pdfglyphtounicode{Hsmall}{0068}
+\pdfglyphtounicode{Hungarumlaut}{02DD}
+\pdfglyphtounicode{Hungarumlautsmall}{02DD}
+\pdfglyphtounicode{Hzsquare}{3390}
+\pdfglyphtounicode{I}{0049}
+\pdfglyphtounicode{IAcyrillic}{042F}
+\pdfglyphtounicode{IJ}{0132}
+\pdfglyphtounicode{IUcyrillic}{042E}
+\pdfglyphtounicode{Iacute}{00CD}
+\pdfglyphtounicode{Iacutesmall}{00ED}
+\pdfglyphtounicode{Ibreve}{012C}
+\pdfglyphtounicode{Icaron}{01CF}
+\pdfglyphtounicode{Icircle}{24BE}
+\pdfglyphtounicode{Icircumflex}{00CE}
+\pdfglyphtounicode{Icircumflexsmall}{00EE}
+\pdfglyphtounicode{Icyrillic}{0406}
+\pdfglyphtounicode{Idblgrave}{0208}
+\pdfglyphtounicode{Idieresis}{00CF}
+\pdfglyphtounicode{Idieresisacute}{1E2E}
+\pdfglyphtounicode{Idieresiscyrillic}{04E4}
+\pdfglyphtounicode{Idieresissmall}{00EF}
+\pdfglyphtounicode{Idot}{0130}
+\pdfglyphtounicode{Idotaccent}{0130}
+\pdfglyphtounicode{Idotbelow}{1ECA}
+\pdfglyphtounicode{Iebrevecyrillic}{04D6}
+\pdfglyphtounicode{Iecyrillic}{0415}
+\pdfglyphtounicode{Ifractur}{2111}
+\pdfglyphtounicode{Ifraktur}{2111}
+\pdfglyphtounicode{Igrave}{00CC}
+\pdfglyphtounicode{Igravesmall}{00EC}
+\pdfglyphtounicode{Ihookabove}{1EC8}
+\pdfglyphtounicode{Iicyrillic}{0418}
+\pdfglyphtounicode{Iinvertedbreve}{020A}
+\pdfglyphtounicode{Iishortcyrillic}{0419}
+\pdfglyphtounicode{Imacron}{012A}
+\pdfglyphtounicode{Imacroncyrillic}{04E2}
+\pdfglyphtounicode{Imonospace}{FF29}
+\pdfglyphtounicode{Iniarmenian}{053B}
+\pdfglyphtounicode{Iocyrillic}{0401}
+\pdfglyphtounicode{Iogonek}{012E}
+\pdfglyphtounicode{Iota}{0399}
+\pdfglyphtounicode{Iotaafrican}{0196}
+\pdfglyphtounicode{Iotadieresis}{03AA}
+\pdfglyphtounicode{Iotatonos}{038A}
+\pdfglyphtounicode{Ismall}{0069}
+\pdfglyphtounicode{Istroke}{0197}
+\pdfglyphtounicode{Itilde}{0128}
+\pdfglyphtounicode{Itildebelow}{1E2C}
+\pdfglyphtounicode{Izhitsacyrillic}{0474}
+\pdfglyphtounicode{Izhitsadblgravecyrillic}{0476}
+\pdfglyphtounicode{J}{004A}
+\pdfglyphtounicode{Jaarmenian}{0541}
+\pdfglyphtounicode{Jcircle}{24BF}
+\pdfglyphtounicode{Jcircumflex}{0134}
+\pdfglyphtounicode{Jecyrillic}{0408}
+\pdfglyphtounicode{Jheharmenian}{054B}
+\pdfglyphtounicode{Jmonospace}{FF2A}
+\pdfglyphtounicode{Jsmall}{006A}
+\pdfglyphtounicode{K}{004B}
+\pdfglyphtounicode{KBsquare}{3385}
+\pdfglyphtounicode{KKsquare}{33CD}
+\pdfglyphtounicode{Kabashkircyrillic}{04A0}
+\pdfglyphtounicode{Kacute}{1E30}
+\pdfglyphtounicode{Kacyrillic}{041A}
+\pdfglyphtounicode{Kadescendercyrillic}{049A}
+\pdfglyphtounicode{Kahookcyrillic}{04C3}
+\pdfglyphtounicode{Kappa}{039A}
+\pdfglyphtounicode{Kastrokecyrillic}{049E}
+\pdfglyphtounicode{Kaverticalstrokecyrillic}{049C}
+\pdfglyphtounicode{Kcaron}{01E8}
+\pdfglyphtounicode{Kcedilla}{0136}
+\pdfglyphtounicode{Kcircle}{24C0}
+\pdfglyphtounicode{Kcommaaccent}{0136}
+\pdfglyphtounicode{Kdotbelow}{1E32}
+\pdfglyphtounicode{Keharmenian}{0554}
+\pdfglyphtounicode{Kenarmenian}{053F}
+\pdfglyphtounicode{Khacyrillic}{0425}
+\pdfglyphtounicode{Kheicoptic}{03E6}
+\pdfglyphtounicode{Khook}{0198}
+\pdfglyphtounicode{Kjecyrillic}{040C}
+\pdfglyphtounicode{Klinebelow}{1E34}
+\pdfglyphtounicode{Kmonospace}{FF2B}
+\pdfglyphtounicode{Koppacyrillic}{0480}
+\pdfglyphtounicode{Koppagreek}{03DE}
+\pdfglyphtounicode{Ksicyrillic}{046E}
+\pdfglyphtounicode{Ksmall}{006B}
+\pdfglyphtounicode{L}{004C}
+\pdfglyphtounicode{LJ}{01C7}
+\pdfglyphtounicode{LL}{004C 004C}
+\pdfglyphtounicode{Lacute}{0139}
+\pdfglyphtounicode{Lambda}{039B}
+\pdfglyphtounicode{Lcaron}{013D}
+\pdfglyphtounicode{Lcedilla}{013B}
+\pdfglyphtounicode{Lcircle}{24C1}
+\pdfglyphtounicode{Lcircumflexbelow}{1E3C}
+\pdfglyphtounicode{Lcommaaccent}{013B}
+\pdfglyphtounicode{Ldot}{013F}
+\pdfglyphtounicode{Ldotaccent}{013F}
+\pdfglyphtounicode{Ldotbelow}{1E36}
+\pdfglyphtounicode{Ldotbelowmacron}{1E38}
+\pdfglyphtounicode{Liwnarmenian}{053C}
+\pdfglyphtounicode{Lj}{01C8}
+\pdfglyphtounicode{Ljecyrillic}{0409}
+\pdfglyphtounicode{Llinebelow}{1E3A}
+\pdfglyphtounicode{Lmonospace}{FF2C}
+\pdfglyphtounicode{Lslash}{0141}
+\pdfglyphtounicode{Lslashsmall}{0142}
+\pdfglyphtounicode{Lsmall}{006C}
+\pdfglyphtounicode{M}{004D}
+\pdfglyphtounicode{MBsquare}{3386}
+\pdfglyphtounicode{Macron}{00AF}
+\pdfglyphtounicode{Macronsmall}{00AF}
+\pdfglyphtounicode{Macute}{1E3E}
+\pdfglyphtounicode{Mcircle}{24C2}
+\pdfglyphtounicode{Mdotaccent}{1E40}
+\pdfglyphtounicode{Mdotbelow}{1E42}
+\pdfglyphtounicode{Menarmenian}{0544}
+\pdfglyphtounicode{Mmonospace}{FF2D}
+\pdfglyphtounicode{Msmall}{006D}
+\pdfglyphtounicode{Mturned}{019C}
+\pdfglyphtounicode{Mu}{039C}
+\pdfglyphtounicode{N}{004E}
+\pdfglyphtounicode{NJ}{01CA}
+\pdfglyphtounicode{Nacute}{0143}
+\pdfglyphtounicode{Ncaron}{0147}
+\pdfglyphtounicode{Ncedilla}{0145}
+\pdfglyphtounicode{Ncircle}{24C3}
+\pdfglyphtounicode{Ncircumflexbelow}{1E4A}
+\pdfglyphtounicode{Ncommaaccent}{0145}
+\pdfglyphtounicode{Ndotaccent}{1E44}
+\pdfglyphtounicode{Ndotbelow}{1E46}
+\pdfglyphtounicode{Ng}{014A}
+\pdfglyphtounicode{Nhookleft}{019D}
+\pdfglyphtounicode{Nineroman}{2168}
+\pdfglyphtounicode{Nj}{01CB}
+\pdfglyphtounicode{Njecyrillic}{040A}
+\pdfglyphtounicode{Nlinebelow}{1E48}
+\pdfglyphtounicode{Nmonospace}{FF2E}
+\pdfglyphtounicode{Nowarmenian}{0546}
+\pdfglyphtounicode{Nsmall}{006E}
+\pdfglyphtounicode{Ntilde}{00D1}
+\pdfglyphtounicode{Ntildesmall}{00F1}
+\pdfglyphtounicode{Nu}{039D}
+\pdfglyphtounicode{O}{004F}
+\pdfglyphtounicode{OE}{0152}
+\pdfglyphtounicode{OEsmall}{0153}
+\pdfglyphtounicode{Oacute}{00D3}
+\pdfglyphtounicode{Oacutesmall}{00F3}
+\pdfglyphtounicode{Obarredcyrillic}{04E8}
+\pdfglyphtounicode{Obarreddieresiscyrillic}{04EA}
+\pdfglyphtounicode{Obreve}{014E}
+\pdfglyphtounicode{Ocaron}{01D1}
+\pdfglyphtounicode{Ocenteredtilde}{019F}
+\pdfglyphtounicode{Ocircle}{24C4}
+\pdfglyphtounicode{Ocircumflex}{00D4}
+\pdfglyphtounicode{Ocircumflexacute}{1ED0}
+\pdfglyphtounicode{Ocircumflexdotbelow}{1ED8}
+\pdfglyphtounicode{Ocircumflexgrave}{1ED2}
+\pdfglyphtounicode{Ocircumflexhookabove}{1ED4}
+\pdfglyphtounicode{Ocircumflexsmall}{00F4}
+\pdfglyphtounicode{Ocircumflextilde}{1ED6}
+\pdfglyphtounicode{Ocyrillic}{041E}
+\pdfglyphtounicode{Odblacute}{0150}
+\pdfglyphtounicode{Odblgrave}{020C}
+\pdfglyphtounicode{Odieresis}{00D6}
+\pdfglyphtounicode{Odieresiscyrillic}{04E6}
+\pdfglyphtounicode{Odieresissmall}{00F6}
+\pdfglyphtounicode{Odotbelow}{1ECC}
+\pdfglyphtounicode{Ogoneksmall}{02DB}
+\pdfglyphtounicode{Ograve}{00D2}
+\pdfglyphtounicode{Ogravesmall}{00F2}
+\pdfglyphtounicode{Oharmenian}{0555}
+\pdfglyphtounicode{Ohm}{2126}
+\pdfglyphtounicode{Ohookabove}{1ECE}
+\pdfglyphtounicode{Ohorn}{01A0}
+\pdfglyphtounicode{Ohornacute}{1EDA}
+\pdfglyphtounicode{Ohorndotbelow}{1EE2}
+\pdfglyphtounicode{Ohorngrave}{1EDC}
+\pdfglyphtounicode{Ohornhookabove}{1EDE}
+\pdfglyphtounicode{Ohorntilde}{1EE0}
+\pdfglyphtounicode{Ohungarumlaut}{0150}
+\pdfglyphtounicode{Oi}{01A2}
+\pdfglyphtounicode{Oinvertedbreve}{020E}
+\pdfglyphtounicode{Omacron}{014C}
+\pdfglyphtounicode{Omacronacute}{1E52}
+\pdfglyphtounicode{Omacrongrave}{1E50}
+\pdfglyphtounicode{Omega}{2126}
+\pdfglyphtounicode{Omegacyrillic}{0460}
+\pdfglyphtounicode{Omegagreek}{03A9}
+\pdfglyphtounicode{Omegainv}{2127}
+\pdfglyphtounicode{Omegaroundcyrillic}{047A}
+\pdfglyphtounicode{Omegatitlocyrillic}{047C}
+\pdfglyphtounicode{Omegatonos}{038F}
+\pdfglyphtounicode{Omicron}{039F}
+\pdfglyphtounicode{Omicrontonos}{038C}
+\pdfglyphtounicode{Omonospace}{FF2F}
+\pdfglyphtounicode{Oneroman}{2160}
+\pdfglyphtounicode{Oogonek}{01EA}
+\pdfglyphtounicode{Oogonekmacron}{01EC}
+\pdfglyphtounicode{Oopen}{0186}
+\pdfglyphtounicode{Oslash}{00D8}
+\pdfglyphtounicode{Oslashacute}{01FE}
+\pdfglyphtounicode{Oslashsmall}{00F8}
+\pdfglyphtounicode{Osmall}{006F}
+\pdfglyphtounicode{Ostrokeacute}{01FE}
+\pdfglyphtounicode{Otcyrillic}{047E}
+\pdfglyphtounicode{Otilde}{00D5}
+\pdfglyphtounicode{Otildeacute}{1E4C}
+\pdfglyphtounicode{Otildedieresis}{1E4E}
+\pdfglyphtounicode{Otildesmall}{00F5}
+\pdfglyphtounicode{P}{0050}
+\pdfglyphtounicode{Pacute}{1E54}
+\pdfglyphtounicode{Pcircle}{24C5}
+\pdfglyphtounicode{Pdotaccent}{1E56}
+\pdfglyphtounicode{Pecyrillic}{041F}
+\pdfglyphtounicode{Peharmenian}{054A}
+\pdfglyphtounicode{Pemiddlehookcyrillic}{04A6}
+\pdfglyphtounicode{Phi}{03A6}
+\pdfglyphtounicode{Phook}{01A4}
+\pdfglyphtounicode{Pi}{03A0}
+\pdfglyphtounicode{Piwrarmenian}{0553}
+\pdfglyphtounicode{Pmonospace}{FF30}
+\pdfglyphtounicode{Psi}{03A8}
+\pdfglyphtounicode{Psicyrillic}{0470}
+\pdfglyphtounicode{Psmall}{0070}
+\pdfglyphtounicode{Q}{0051}
+\pdfglyphtounicode{Qcircle}{24C6}
+\pdfglyphtounicode{Qmonospace}{FF31}
+\pdfglyphtounicode{Qsmall}{0071}
+\pdfglyphtounicode{R}{0052}
+\pdfglyphtounicode{Raarmenian}{054C}
+\pdfglyphtounicode{Racute}{0154}
+\pdfglyphtounicode{Rcaron}{0158}
+\pdfglyphtounicode{Rcedilla}{0156}
+\pdfglyphtounicode{Rcircle}{24C7}
+\pdfglyphtounicode{Rcommaaccent}{0156}
+\pdfglyphtounicode{Rdblgrave}{0210}
+\pdfglyphtounicode{Rdotaccent}{1E58}
+\pdfglyphtounicode{Rdotbelow}{1E5A}
+\pdfglyphtounicode{Rdotbelowmacron}{1E5C}
+\pdfglyphtounicode{Reharmenian}{0550}
+\pdfglyphtounicode{Rfractur}{211C}
+\pdfglyphtounicode{Rfraktur}{211C}
+\pdfglyphtounicode{Rho}{03A1}
+\pdfglyphtounicode{Ringsmall}{02DA}
+\pdfglyphtounicode{Rinvertedbreve}{0212}
+\pdfglyphtounicode{Rlinebelow}{1E5E}
+\pdfglyphtounicode{Rmonospace}{FF32}
+\pdfglyphtounicode{Rsmall}{0072}
+\pdfglyphtounicode{Rsmallinverted}{0281}
+\pdfglyphtounicode{Rsmallinvertedsuperior}{02B6}
+\pdfglyphtounicode{S}{0053}
+\pdfglyphtounicode{SF010000}{250C}
+\pdfglyphtounicode{SF020000}{2514}
+\pdfglyphtounicode{SF030000}{2510}
+\pdfglyphtounicode{SF040000}{2518}
+\pdfglyphtounicode{SF050000}{253C}
+\pdfglyphtounicode{SF060000}{252C}
+\pdfglyphtounicode{SF070000}{2534}
+\pdfglyphtounicode{SF080000}{251C}
+\pdfglyphtounicode{SF090000}{2524}
+\pdfglyphtounicode{SF100000}{2500}
+\pdfglyphtounicode{SF110000}{2502}
+\pdfglyphtounicode{SF190000}{2561}
+\pdfglyphtounicode{SF200000}{2562}
+\pdfglyphtounicode{SF210000}{2556}
+\pdfglyphtounicode{SF220000}{2555}
+\pdfglyphtounicode{SF230000}{2563}
+\pdfglyphtounicode{SF240000}{2551}
+\pdfglyphtounicode{SF250000}{2557}
+\pdfglyphtounicode{SF260000}{255D}
+\pdfglyphtounicode{SF270000}{255C}
+\pdfglyphtounicode{SF280000}{255B}
+\pdfglyphtounicode{SF360000}{255E}
+\pdfglyphtounicode{SF370000}{255F}
+\pdfglyphtounicode{SF380000}{255A}
+\pdfglyphtounicode{SF390000}{2554}
+\pdfglyphtounicode{SF400000}{2569}
+\pdfglyphtounicode{SF410000}{2566}
+\pdfglyphtounicode{SF420000}{2560}
+\pdfglyphtounicode{SF430000}{2550}
+\pdfglyphtounicode{SF440000}{256C}
+\pdfglyphtounicode{SF450000}{2567}
+\pdfglyphtounicode{SF460000}{2568}
+\pdfglyphtounicode{SF470000}{2564}
+\pdfglyphtounicode{SF480000}{2565}
+\pdfglyphtounicode{SF490000}{2559}
+\pdfglyphtounicode{SF500000}{2558}
+\pdfglyphtounicode{SF510000}{2552}
+\pdfglyphtounicode{SF520000}{2553}
+\pdfglyphtounicode{SF530000}{256B}
+\pdfglyphtounicode{SF540000}{256A}
+\pdfglyphtounicode{SS}{0053 0053}
+\pdfglyphtounicode{SSsmall}{0073 0073}
+\pdfglyphtounicode{Sacute}{015A}
+\pdfglyphtounicode{Sacutedotaccent}{1E64}
+\pdfglyphtounicode{Sampigreek}{03E0}
+\pdfglyphtounicode{Scaron}{0160}
+\pdfglyphtounicode{Scarondotaccent}{1E66}
+\pdfglyphtounicode{Scaronsmall}{0161}
+\pdfglyphtounicode{Scedilla}{015E}
+\pdfglyphtounicode{Schwa}{018F}
+\pdfglyphtounicode{Schwacyrillic}{04D8}
+\pdfglyphtounicode{Schwadieresiscyrillic}{04DA}
+\pdfglyphtounicode{Scircle}{24C8}
+\pdfglyphtounicode{Scircumflex}{015C}
+\pdfglyphtounicode{Scommaaccent}{0218}
+\pdfglyphtounicode{Sdotaccent}{1E60}
+\pdfglyphtounicode{Sdotbelow}{1E62}
+\pdfglyphtounicode{Sdotbelowdotaccent}{1E68}
+\pdfglyphtounicode{Seharmenian}{054D}
+\pdfglyphtounicode{Sevenroman}{2166}
+\pdfglyphtounicode{Shaarmenian}{0547}
+\pdfglyphtounicode{Shacyrillic}{0428}
+\pdfglyphtounicode{Shchacyrillic}{0429}
+\pdfglyphtounicode{Sheicoptic}{03E2}
+\pdfglyphtounicode{Shhacyrillic}{04BA}
+\pdfglyphtounicode{Shimacoptic}{03EC}
+\pdfglyphtounicode{Sigma}{03A3}
+\pdfglyphtounicode{Sixroman}{2165}
+\pdfglyphtounicode{Smonospace}{FF33}
+\pdfglyphtounicode{Softsigncyrillic}{042C}
+\pdfglyphtounicode{Ssmall}{0073}
+\pdfglyphtounicode{Stigmagreek}{03DA}
+\pdfglyphtounicode{T}{0054}
+\pdfglyphtounicode{Tau}{03A4}
+\pdfglyphtounicode{Tbar}{0166}
+\pdfglyphtounicode{Tcaron}{0164}
+\pdfglyphtounicode{Tcedilla}{0162}
+\pdfglyphtounicode{Tcircle}{24C9}
+\pdfglyphtounicode{Tcircumflexbelow}{1E70}
+\pdfglyphtounicode{Tcommaaccent}{0162}
+\pdfglyphtounicode{Tdotaccent}{1E6A}
+\pdfglyphtounicode{Tdotbelow}{1E6C}
+\pdfglyphtounicode{Tecyrillic}{0422}
+\pdfglyphtounicode{Tedescendercyrillic}{04AC}
+\pdfglyphtounicode{Tenroman}{2169}
+\pdfglyphtounicode{Tetsecyrillic}{04B4}
+\pdfglyphtounicode{Theta}{0398}
+\pdfglyphtounicode{Thook}{01AC}
+\pdfglyphtounicode{Thorn}{00DE}
+\pdfglyphtounicode{Thornsmall}{00FE}
+\pdfglyphtounicode{Threeroman}{2162}
+\pdfglyphtounicode{Tildesmall}{02DC}
+\pdfglyphtounicode{Tiwnarmenian}{054F}
+\pdfglyphtounicode{Tlinebelow}{1E6E}
+\pdfglyphtounicode{Tmonospace}{FF34}
+\pdfglyphtounicode{Toarmenian}{0539}
+\pdfglyphtounicode{Tonefive}{01BC}
+\pdfglyphtounicode{Tonesix}{0184}
+\pdfglyphtounicode{Tonetwo}{01A7}
+\pdfglyphtounicode{Tretroflexhook}{01AE}
+\pdfglyphtounicode{Tsecyrillic}{0426}
+\pdfglyphtounicode{Tshecyrillic}{040B}
+\pdfglyphtounicode{Tsmall}{0074}
+\pdfglyphtounicode{Twelveroman}{216B}
+\pdfglyphtounicode{Tworoman}{2161}
+\pdfglyphtounicode{U}{0055}
+\pdfglyphtounicode{Uacute}{00DA}
+\pdfglyphtounicode{Uacutesmall}{00FA}
+\pdfglyphtounicode{Ubreve}{016C}
+\pdfglyphtounicode{Ucaron}{01D3}
+\pdfglyphtounicode{Ucircle}{24CA}
+\pdfglyphtounicode{Ucircumflex}{00DB}
+\pdfglyphtounicode{Ucircumflexbelow}{1E76}
+\pdfglyphtounicode{Ucircumflexsmall}{00FB}
+\pdfglyphtounicode{Ucyrillic}{0423}
+\pdfglyphtounicode{Udblacute}{0170}
+\pdfglyphtounicode{Udblgrave}{0214}
+\pdfglyphtounicode{Udieresis}{00DC}
+\pdfglyphtounicode{Udieresisacute}{01D7}
+\pdfglyphtounicode{Udieresisbelow}{1E72}
+\pdfglyphtounicode{Udieresiscaron}{01D9}
+\pdfglyphtounicode{Udieresiscyrillic}{04F0}
+\pdfglyphtounicode{Udieresisgrave}{01DB}
+\pdfglyphtounicode{Udieresismacron}{01D5}
+\pdfglyphtounicode{Udieresissmall}{00FC}
+\pdfglyphtounicode{Udotbelow}{1EE4}
+\pdfglyphtounicode{Ugrave}{00D9}
+\pdfglyphtounicode{Ugravesmall}{00F9}
+\pdfglyphtounicode{Uhookabove}{1EE6}
+\pdfglyphtounicode{Uhorn}{01AF}
+\pdfglyphtounicode{Uhornacute}{1EE8}
+\pdfglyphtounicode{Uhorndotbelow}{1EF0}
+\pdfglyphtounicode{Uhorngrave}{1EEA}
+\pdfglyphtounicode{Uhornhookabove}{1EEC}
+\pdfglyphtounicode{Uhorntilde}{1EEE}
+\pdfglyphtounicode{Uhungarumlaut}{0170}
+\pdfglyphtounicode{Uhungarumlautcyrillic}{04F2}
+\pdfglyphtounicode{Uinvertedbreve}{0216}
+\pdfglyphtounicode{Ukcyrillic}{0478}
+\pdfglyphtounicode{Umacron}{016A}
+\pdfglyphtounicode{Umacroncyrillic}{04EE}
+\pdfglyphtounicode{Umacrondieresis}{1E7A}
+\pdfglyphtounicode{Umonospace}{FF35}
+\pdfglyphtounicode{Uogonek}{0172}
+\pdfglyphtounicode{Upsilon}{03A5}
+\pdfglyphtounicode{Upsilon1}{03D2}
+\pdfglyphtounicode{Upsilonacutehooksymbolgreek}{03D3}
+\pdfglyphtounicode{Upsilonafrican}{01B1}
+\pdfglyphtounicode{Upsilondieresis}{03AB}
+\pdfglyphtounicode{Upsilondieresishooksymbolgreek}{03D4}
+\pdfglyphtounicode{Upsilonhooksymbol}{03D2}
+\pdfglyphtounicode{Upsilontonos}{038E}
+\pdfglyphtounicode{Uring}{016E}
+\pdfglyphtounicode{Ushortcyrillic}{040E}
+\pdfglyphtounicode{Usmall}{0075}
+\pdfglyphtounicode{Ustraightcyrillic}{04AE}
+\pdfglyphtounicode{Ustraightstrokecyrillic}{04B0}
+\pdfglyphtounicode{Utilde}{0168}
+\pdfglyphtounicode{Utildeacute}{1E78}
+\pdfglyphtounicode{Utildebelow}{1E74}
+\pdfglyphtounicode{V}{0056}
+\pdfglyphtounicode{Vcircle}{24CB}
+\pdfglyphtounicode{Vdotbelow}{1E7E}
+\pdfglyphtounicode{Vecyrillic}{0412}
+\pdfglyphtounicode{Vewarmenian}{054E}
+\pdfglyphtounicode{Vhook}{01B2}
+\pdfglyphtounicode{Vmonospace}{FF36}
+\pdfglyphtounicode{Voarmenian}{0548}
+\pdfglyphtounicode{Vsmall}{0076}
+\pdfglyphtounicode{Vtilde}{1E7C}
+\pdfglyphtounicode{W}{0057}
+\pdfglyphtounicode{Wacute}{1E82}
+\pdfglyphtounicode{Wcircle}{24CC}
+\pdfglyphtounicode{Wcircumflex}{0174}
+\pdfglyphtounicode{Wdieresis}{1E84}
+\pdfglyphtounicode{Wdotaccent}{1E86}
+\pdfglyphtounicode{Wdotbelow}{1E88}
+\pdfglyphtounicode{Wgrave}{1E80}
+\pdfglyphtounicode{Wmonospace}{FF37}
+\pdfglyphtounicode{Wsmall}{0077}
+\pdfglyphtounicode{X}{0058}
+\pdfglyphtounicode{Xcircle}{24CD}
+\pdfglyphtounicode{Xdieresis}{1E8C}
+\pdfglyphtounicode{Xdotaccent}{1E8A}
+\pdfglyphtounicode{Xeharmenian}{053D}
+\pdfglyphtounicode{Xi}{039E}
+\pdfglyphtounicode{Xmonospace}{FF38}
+\pdfglyphtounicode{Xsmall}{0078}
+\pdfglyphtounicode{Y}{0059}
+\pdfglyphtounicode{Yacute}{00DD}
+\pdfglyphtounicode{Yacutesmall}{00FD}
+\pdfglyphtounicode{Yatcyrillic}{0462}
+\pdfglyphtounicode{Ycircle}{24CE}
+\pdfglyphtounicode{Ycircumflex}{0176}
+\pdfglyphtounicode{Ydieresis}{0178}
+\pdfglyphtounicode{Ydieresissmall}{00FF}
+\pdfglyphtounicode{Ydotaccent}{1E8E}
+\pdfglyphtounicode{Ydotbelow}{1EF4}
+\pdfglyphtounicode{Yen}{00A5}
+\pdfglyphtounicode{Yericyrillic}{042B}
+\pdfglyphtounicode{Yerudieresiscyrillic}{04F8}
+\pdfglyphtounicode{Ygrave}{1EF2}
+\pdfglyphtounicode{Yhook}{01B3}
+\pdfglyphtounicode{Yhookabove}{1EF6}
+\pdfglyphtounicode{Yiarmenian}{0545}
+\pdfglyphtounicode{Yicyrillic}{0407}
+\pdfglyphtounicode{Yiwnarmenian}{0552}
+\pdfglyphtounicode{Ymonospace}{FF39}
+\pdfglyphtounicode{Ysmall}{0079}
+\pdfglyphtounicode{Ytilde}{1EF8}
+\pdfglyphtounicode{Yusbigcyrillic}{046A}
+\pdfglyphtounicode{Yusbigiotifiedcyrillic}{046C}
+\pdfglyphtounicode{Yuslittlecyrillic}{0466}
+\pdfglyphtounicode{Yuslittleiotifiedcyrillic}{0468}
+\pdfglyphtounicode{Z}{005A}
+\pdfglyphtounicode{Zaarmenian}{0536}
+\pdfglyphtounicode{Zacute}{0179}
+\pdfglyphtounicode{Zcaron}{017D}
+\pdfglyphtounicode{Zcaronsmall}{017E}
+\pdfglyphtounicode{Zcircle}{24CF}
+\pdfglyphtounicode{Zcircumflex}{1E90}
+\pdfglyphtounicode{Zdot}{017B}
+\pdfglyphtounicode{Zdotaccent}{017B}
+\pdfglyphtounicode{Zdotbelow}{1E92}
+\pdfglyphtounicode{Zecyrillic}{0417}
+\pdfglyphtounicode{Zedescendercyrillic}{0498}
+\pdfglyphtounicode{Zedieresiscyrillic}{04DE}
+\pdfglyphtounicode{Zeta}{0396}
+\pdfglyphtounicode{Zhearmenian}{053A}
+\pdfglyphtounicode{Zhebrevecyrillic}{04C1}
+\pdfglyphtounicode{Zhecyrillic}{0416}
+\pdfglyphtounicode{Zhedescendercyrillic}{0496}
+\pdfglyphtounicode{Zhedieresiscyrillic}{04DC}
+\pdfglyphtounicode{Zlinebelow}{1E94}
+\pdfglyphtounicode{Zmonospace}{FF3A}
+\pdfglyphtounicode{Zsmall}{007A}
+\pdfglyphtounicode{Zstroke}{01B5}
+\pdfglyphtounicode{a}{0061}
+\pdfglyphtounicode{aabengali}{0986}
+\pdfglyphtounicode{aacute}{00E1}
+\pdfglyphtounicode{aadeva}{0906}
+\pdfglyphtounicode{aagujarati}{0A86}
+\pdfglyphtounicode{aagurmukhi}{0A06}
+\pdfglyphtounicode{aamatragurmukhi}{0A3E}
+\pdfglyphtounicode{aarusquare}{3303}
+\pdfglyphtounicode{aavowelsignbengali}{09BE}
+\pdfglyphtounicode{aavowelsigndeva}{093E}
+\pdfglyphtounicode{aavowelsigngujarati}{0ABE}
+\pdfglyphtounicode{abbreviationmarkarmenian}{055F}
+\pdfglyphtounicode{abbreviationsigndeva}{0970}
+\pdfglyphtounicode{abengali}{0985}
+\pdfglyphtounicode{abopomofo}{311A}
+\pdfglyphtounicode{abreve}{0103}
+\pdfglyphtounicode{abreveacute}{1EAF}
+\pdfglyphtounicode{abrevecyrillic}{04D1}
+\pdfglyphtounicode{abrevedotbelow}{1EB7}
+\pdfglyphtounicode{abrevegrave}{1EB1}
+\pdfglyphtounicode{abrevehookabove}{1EB3}
+\pdfglyphtounicode{abrevetilde}{1EB5}
+\pdfglyphtounicode{acaron}{01CE}
+\pdfglyphtounicode{acircle}{24D0}
+\pdfglyphtounicode{acircumflex}{00E2}
+\pdfglyphtounicode{acircumflexacute}{1EA5}
+\pdfglyphtounicode{acircumflexdotbelow}{1EAD}
+\pdfglyphtounicode{acircumflexgrave}{1EA7}
+\pdfglyphtounicode{acircumflexhookabove}{1EA9}
+\pdfglyphtounicode{acircumflextilde}{1EAB}
+\pdfglyphtounicode{acute}{00B4}
+\pdfglyphtounicode{acutebelowcmb}{0317}
+\pdfglyphtounicode{acutecmb}{0301}
+\pdfglyphtounicode{acutecomb}{0301}
+\pdfglyphtounicode{acutedeva}{0954}
+\pdfglyphtounicode{acutelowmod}{02CF}
+\pdfglyphtounicode{acutetonecmb}{0341}
+\pdfglyphtounicode{acyrillic}{0430}
+\pdfglyphtounicode{adblgrave}{0201}
+\pdfglyphtounicode{addakgurmukhi}{0A71}
+\pdfglyphtounicode{adeva}{0905}
+\pdfglyphtounicode{adieresis}{00E4}
+\pdfglyphtounicode{adieresiscyrillic}{04D3}
+\pdfglyphtounicode{adieresismacron}{01DF}
+\pdfglyphtounicode{adotbelow}{1EA1}
+\pdfglyphtounicode{adotmacron}{01E1}
+\pdfglyphtounicode{ae}{00E6}
+\pdfglyphtounicode{aeacute}{01FD}
+\pdfglyphtounicode{aekorean}{3150}
+\pdfglyphtounicode{aemacron}{01E3}
+\pdfglyphtounicode{afii00208}{2015}
+\pdfglyphtounicode{afii08941}{20A4}
+\pdfglyphtounicode{afii10017}{0410}
+\pdfglyphtounicode{afii10018}{0411}
+\pdfglyphtounicode{afii10019}{0412}
+\pdfglyphtounicode{afii10020}{0413}
+\pdfglyphtounicode{afii10021}{0414}
+\pdfglyphtounicode{afii10022}{0415}
+\pdfglyphtounicode{afii10023}{0401}
+\pdfglyphtounicode{afii10024}{0416}
+\pdfglyphtounicode{afii10025}{0417}
+\pdfglyphtounicode{afii10026}{0418}
+\pdfglyphtounicode{afii10027}{0419}
+\pdfglyphtounicode{afii10028}{041A}
+\pdfglyphtounicode{afii10029}{041B}
+\pdfglyphtounicode{afii10030}{041C}
+\pdfglyphtounicode{afii10031}{041D}
+\pdfglyphtounicode{afii10032}{041E}
+\pdfglyphtounicode{afii10033}{041F}
+\pdfglyphtounicode{afii10034}{0420}
+\pdfglyphtounicode{afii10035}{0421}
+\pdfglyphtounicode{afii10036}{0422}
+\pdfglyphtounicode{afii10037}{0423}
+\pdfglyphtounicode{afii10038}{0424}
+\pdfglyphtounicode{afii10039}{0425}
+\pdfglyphtounicode{afii10040}{0426}
+\pdfglyphtounicode{afii10041}{0427}
+\pdfglyphtounicode{afii10042}{0428}
+\pdfglyphtounicode{afii10043}{0429}
+\pdfglyphtounicode{afii10044}{042A}
+\pdfglyphtounicode{afii10045}{042B}
+\pdfglyphtounicode{afii10046}{042C}
+\pdfglyphtounicode{afii10047}{042D}
+\pdfglyphtounicode{afii10048}{042E}
+\pdfglyphtounicode{afii10049}{042F}
+\pdfglyphtounicode{afii10050}{0490}
+\pdfglyphtounicode{afii10051}{0402}
+\pdfglyphtounicode{afii10052}{0403}
+\pdfglyphtounicode{afii10053}{0404}
+\pdfglyphtounicode{afii10054}{0405}
+\pdfglyphtounicode{afii10055}{0406}
+\pdfglyphtounicode{afii10056}{0407}
+\pdfglyphtounicode{afii10057}{0408}
+\pdfglyphtounicode{afii10058}{0409}
+\pdfglyphtounicode{afii10059}{040A}
+\pdfglyphtounicode{afii10060}{040B}
+\pdfglyphtounicode{afii10061}{040C}
+\pdfglyphtounicode{afii10062}{040E}
+\pdfglyphtounicode{afii10063}{F6C4}
+\pdfglyphtounicode{afii10064}{F6C5}
+\pdfglyphtounicode{afii10065}{0430}
+\pdfglyphtounicode{afii10066}{0431}
+\pdfglyphtounicode{afii10067}{0432}
+\pdfglyphtounicode{afii10068}{0433}
+\pdfglyphtounicode{afii10069}{0434}
+\pdfglyphtounicode{afii10070}{0435}
+\pdfglyphtounicode{afii10071}{0451}
+\pdfglyphtounicode{afii10072}{0436}
+\pdfglyphtounicode{afii10073}{0437}
+\pdfglyphtounicode{afii10074}{0438}
+\pdfglyphtounicode{afii10075}{0439}
+\pdfglyphtounicode{afii10076}{043A}
+\pdfglyphtounicode{afii10077}{043B}
+\pdfglyphtounicode{afii10078}{043C}
+\pdfglyphtounicode{afii10079}{043D}
+\pdfglyphtounicode{afii10080}{043E}
+\pdfglyphtounicode{afii10081}{043F}
+\pdfglyphtounicode{afii10082}{0440}
+\pdfglyphtounicode{afii10083}{0441}
+\pdfglyphtounicode{afii10084}{0442}
+\pdfglyphtounicode{afii10085}{0443}
+\pdfglyphtounicode{afii10086}{0444}
+\pdfglyphtounicode{afii10087}{0445}
+\pdfglyphtounicode{afii10088}{0446}
+\pdfglyphtounicode{afii10089}{0447}
+\pdfglyphtounicode{afii10090}{0448}
+\pdfglyphtounicode{afii10091}{0449}
+\pdfglyphtounicode{afii10092}{044A}
+\pdfglyphtounicode{afii10093}{044B}
+\pdfglyphtounicode{afii10094}{044C}
+\pdfglyphtounicode{afii10095}{044D}
+\pdfglyphtounicode{afii10096}{044E}
+\pdfglyphtounicode{afii10097}{044F}
+\pdfglyphtounicode{afii10098}{0491}
+\pdfglyphtounicode{afii10099}{0452}
+\pdfglyphtounicode{afii10100}{0453}
+\pdfglyphtounicode{afii10101}{0454}
+\pdfglyphtounicode{afii10102}{0455}
+\pdfglyphtounicode{afii10103}{0456}
+\pdfglyphtounicode{afii10104}{0457}
+\pdfglyphtounicode{afii10105}{0458}
+\pdfglyphtounicode{afii10106}{0459}
+\pdfglyphtounicode{afii10107}{045A}
+\pdfglyphtounicode{afii10108}{045B}
+\pdfglyphtounicode{afii10109}{045C}
+\pdfglyphtounicode{afii10110}{045E}
+\pdfglyphtounicode{afii10145}{040F}
+\pdfglyphtounicode{afii10146}{0462}
+\pdfglyphtounicode{afii10147}{0472}
+\pdfglyphtounicode{afii10148}{0474}
+\pdfglyphtounicode{afii10192}{F6C6}
+\pdfglyphtounicode{afii10193}{045F}
+\pdfglyphtounicode{afii10194}{0463}
+\pdfglyphtounicode{afii10195}{0473}
+\pdfglyphtounicode{afii10196}{0475}
+\pdfglyphtounicode{afii10831}{F6C7}
+\pdfglyphtounicode{afii10832}{F6C8}
+\pdfglyphtounicode{afii10846}{04D9}
+\pdfglyphtounicode{afii299}{200E}
+\pdfglyphtounicode{afii300}{200F}
+\pdfglyphtounicode{afii301}{200D}
+\pdfglyphtounicode{afii57381}{066A}
+\pdfglyphtounicode{afii57388}{060C}
+\pdfglyphtounicode{afii57392}{0660}
+\pdfglyphtounicode{afii57393}{0661}
+\pdfglyphtounicode{afii57394}{0662}
+\pdfglyphtounicode{afii57395}{0663}
+\pdfglyphtounicode{afii57396}{0664}
+\pdfglyphtounicode{afii57397}{0665}
+\pdfglyphtounicode{afii57398}{0666}
+\pdfglyphtounicode{afii57399}{0667}
+\pdfglyphtounicode{afii57400}{0668}
+\pdfglyphtounicode{afii57401}{0669}
+\pdfglyphtounicode{afii57403}{061B}
+\pdfglyphtounicode{afii57407}{061F}
+\pdfglyphtounicode{afii57409}{0621}
+\pdfglyphtounicode{afii57410}{0622}
+\pdfglyphtounicode{afii57411}{0623}
+\pdfglyphtounicode{afii57412}{0624}
+\pdfglyphtounicode{afii57413}{0625}
+\pdfglyphtounicode{afii57414}{0626}
+\pdfglyphtounicode{afii57415}{0627}
+\pdfglyphtounicode{afii57416}{0628}
+\pdfglyphtounicode{afii57417}{0629}
+\pdfglyphtounicode{afii57418}{062A}
+\pdfglyphtounicode{afii57419}{062B}
+\pdfglyphtounicode{afii57420}{062C}
+\pdfglyphtounicode{afii57421}{062D}
+\pdfglyphtounicode{afii57422}{062E}
+\pdfglyphtounicode{afii57423}{062F}
+\pdfglyphtounicode{afii57424}{0630}
+\pdfglyphtounicode{afii57425}{0631}
+\pdfglyphtounicode{afii57426}{0632}
+\pdfglyphtounicode{afii57427}{0633}
+\pdfglyphtounicode{afii57428}{0634}
+\pdfglyphtounicode{afii57429}{0635}
+\pdfglyphtounicode{afii57430}{0636}
+\pdfglyphtounicode{afii57431}{0637}
+\pdfglyphtounicode{afii57432}{0638}
+\pdfglyphtounicode{afii57433}{0639}
+\pdfglyphtounicode{afii57434}{063A}
+\pdfglyphtounicode{afii57440}{0640}
+\pdfglyphtounicode{afii57441}{0641}
+\pdfglyphtounicode{afii57442}{0642}
+\pdfglyphtounicode{afii57443}{0643}
+\pdfglyphtounicode{afii57444}{0644}
+\pdfglyphtounicode{afii57445}{0645}
+\pdfglyphtounicode{afii57446}{0646}
+\pdfglyphtounicode{afii57448}{0648}
+\pdfglyphtounicode{afii57449}{0649}
+\pdfglyphtounicode{afii57450}{064A}
+\pdfglyphtounicode{afii57451}{064B}
+\pdfglyphtounicode{afii57452}{064C}
+\pdfglyphtounicode{afii57453}{064D}
+\pdfglyphtounicode{afii57454}{064E}
+\pdfglyphtounicode{afii57455}{064F}
+\pdfglyphtounicode{afii57456}{0650}
+\pdfglyphtounicode{afii57457}{0651}
+\pdfglyphtounicode{afii57458}{0652}
+\pdfglyphtounicode{afii57470}{0647}
+\pdfglyphtounicode{afii57505}{06A4}
+\pdfglyphtounicode{afii57506}{067E}
+\pdfglyphtounicode{afii57507}{0686}
+\pdfglyphtounicode{afii57508}{0698}
+\pdfglyphtounicode{afii57509}{06AF}
+\pdfglyphtounicode{afii57511}{0679}
+\pdfglyphtounicode{afii57512}{0688}
+\pdfglyphtounicode{afii57513}{0691}
+\pdfglyphtounicode{afii57514}{06BA}
+\pdfglyphtounicode{afii57519}{06D2}
+\pdfglyphtounicode{afii57534}{06D5}
+\pdfglyphtounicode{afii57636}{20AA}
+\pdfglyphtounicode{afii57645}{05BE}
+\pdfglyphtounicode{afii57658}{05C3}
+\pdfglyphtounicode{afii57664}{05D0}
+\pdfglyphtounicode{afii57665}{05D1}
+\pdfglyphtounicode{afii57666}{05D2}
+\pdfglyphtounicode{afii57667}{05D3}
+\pdfglyphtounicode{afii57668}{05D4}
+\pdfglyphtounicode{afii57669}{05D5}
+\pdfglyphtounicode{afii57670}{05D6}
+\pdfglyphtounicode{afii57671}{05D7}
+\pdfglyphtounicode{afii57672}{05D8}
+\pdfglyphtounicode{afii57673}{05D9}
+\pdfglyphtounicode{afii57674}{05DA}
+\pdfglyphtounicode{afii57675}{05DB}
+\pdfglyphtounicode{afii57676}{05DC}
+\pdfglyphtounicode{afii57677}{05DD}
+\pdfglyphtounicode{afii57678}{05DE}
+\pdfglyphtounicode{afii57679}{05DF}
+\pdfglyphtounicode{afii57680}{05E0}
+\pdfglyphtounicode{afii57681}{05E1}
+\pdfglyphtounicode{afii57682}{05E2}
+\pdfglyphtounicode{afii57683}{05E3}
+\pdfglyphtounicode{afii57684}{05E4}
+\pdfglyphtounicode{afii57685}{05E5}
+\pdfglyphtounicode{afii57686}{05E6}
+\pdfglyphtounicode{afii57687}{05E7}
+\pdfglyphtounicode{afii57688}{05E8}
+\pdfglyphtounicode{afii57689}{05E9}
+\pdfglyphtounicode{afii57690}{05EA}
+\pdfglyphtounicode{afii57694}{FB2A}
+\pdfglyphtounicode{afii57695}{FB2B}
+\pdfglyphtounicode{afii57700}{FB4B}
+\pdfglyphtounicode{afii57705}{FB1F}
+\pdfglyphtounicode{afii57716}{05F0}
+\pdfglyphtounicode{afii57717}{05F1}
+\pdfglyphtounicode{afii57718}{05F2}
+\pdfglyphtounicode{afii57723}{FB35}
+\pdfglyphtounicode{afii57793}{05B4}
+\pdfglyphtounicode{afii57794}{05B5}
+\pdfglyphtounicode{afii57795}{05B6}
+\pdfglyphtounicode{afii57796}{05BB}
+\pdfglyphtounicode{afii57797}{05B8}
+\pdfglyphtounicode{afii57798}{05B7}
+\pdfglyphtounicode{afii57799}{05B0}
+\pdfglyphtounicode{afii57800}{05B2}
+\pdfglyphtounicode{afii57801}{05B1}
+\pdfglyphtounicode{afii57802}{05B3}
+\pdfglyphtounicode{afii57803}{05C2}
+\pdfglyphtounicode{afii57804}{05C1}
+\pdfglyphtounicode{afii57806}{05B9}
+\pdfglyphtounicode{afii57807}{05BC}
+\pdfglyphtounicode{afii57839}{05BD}
+\pdfglyphtounicode{afii57841}{05BF}
+\pdfglyphtounicode{afii57842}{05C0}
+\pdfglyphtounicode{afii57929}{02BC}
+\pdfglyphtounicode{afii61248}{2105}
+\pdfglyphtounicode{afii61289}{2113}
+\pdfglyphtounicode{afii61352}{2116}
+\pdfglyphtounicode{afii61573}{202C}
+\pdfglyphtounicode{afii61574}{202D}
+\pdfglyphtounicode{afii61575}{202E}
+\pdfglyphtounicode{afii61664}{200C}
+\pdfglyphtounicode{afii63167}{066D}
+\pdfglyphtounicode{afii64937}{02BD}
+\pdfglyphtounicode{agrave}{00E0}
+\pdfglyphtounicode{agujarati}{0A85}
+\pdfglyphtounicode{agurmukhi}{0A05}
+\pdfglyphtounicode{ahiragana}{3042}
+\pdfglyphtounicode{ahookabove}{1EA3}
+\pdfglyphtounicode{aibengali}{0990}
+\pdfglyphtounicode{aibopomofo}{311E}
+\pdfglyphtounicode{aideva}{0910}
+\pdfglyphtounicode{aiecyrillic}{04D5}
+\pdfglyphtounicode{aigujarati}{0A90}
+\pdfglyphtounicode{aigurmukhi}{0A10}
+\pdfglyphtounicode{aimatragurmukhi}{0A48}
+\pdfglyphtounicode{ainarabic}{0639}
+\pdfglyphtounicode{ainfinalarabic}{FECA}
+\pdfglyphtounicode{aininitialarabic}{FECB}
+\pdfglyphtounicode{ainmedialarabic}{FECC}
+\pdfglyphtounicode{ainvertedbreve}{0203}
+\pdfglyphtounicode{aivowelsignbengali}{09C8}
+\pdfglyphtounicode{aivowelsigndeva}{0948}
+\pdfglyphtounicode{aivowelsigngujarati}{0AC8}
+\pdfglyphtounicode{akatakana}{30A2}
+\pdfglyphtounicode{akatakanahalfwidth}{FF71}
+\pdfglyphtounicode{akorean}{314F}
+\pdfglyphtounicode{alef}{05D0}
+\pdfglyphtounicode{alefarabic}{0627}
+\pdfglyphtounicode{alefdageshhebrew}{FB30}
+\pdfglyphtounicode{aleffinalarabic}{FE8E}
+\pdfglyphtounicode{alefhamzaabovearabic}{0623}
+\pdfglyphtounicode{alefhamzaabovefinalarabic}{FE84}
+\pdfglyphtounicode{alefhamzabelowarabic}{0625}
+\pdfglyphtounicode{alefhamzabelowfinalarabic}{FE88}
+\pdfglyphtounicode{alefhebrew}{05D0}
+\pdfglyphtounicode{aleflamedhebrew}{FB4F}
+\pdfglyphtounicode{alefmaddaabovearabic}{0622}
+\pdfglyphtounicode{alefmaddaabovefinalarabic}{FE82}
+\pdfglyphtounicode{alefmaksuraarabic}{0649}
+\pdfglyphtounicode{alefmaksurafinalarabic}{FEF0}
+\pdfglyphtounicode{alefmaksurainitialarabic}{FEF3}
+\pdfglyphtounicode{alefmaksuramedialarabic}{FEF4}
+\pdfglyphtounicode{alefpatahhebrew}{FB2E}
+\pdfglyphtounicode{alefqamatshebrew}{FB2F}
+\pdfglyphtounicode{aleph}{2135}
+\pdfglyphtounicode{allequal}{224C}
+\pdfglyphtounicode{alpha}{03B1}
+\pdfglyphtounicode{alphatonos}{03AC}
+\pdfglyphtounicode{amacron}{0101}
+\pdfglyphtounicode{amonospace}{FF41}
+\pdfglyphtounicode{ampersand}{0026}
+\pdfglyphtounicode{ampersandmonospace}{FF06}
+\pdfglyphtounicode{ampersandsmall}{0026}
+\pdfglyphtounicode{amsquare}{33C2}
+\pdfglyphtounicode{anbopomofo}{3122}
+\pdfglyphtounicode{angbopomofo}{3124}
+\pdfglyphtounicode{angbracketleft}{27E8}
+\pdfglyphtounicode{angbracketright}{27E9}
+\pdfglyphtounicode{angkhankhuthai}{0E5A}
+\pdfglyphtounicode{angle}{2220}
+\pdfglyphtounicode{anglebracketleft}{3008}
+\pdfglyphtounicode{anglebracketleftvertical}{FE3F}
+\pdfglyphtounicode{anglebracketright}{3009}
+\pdfglyphtounicode{anglebracketrightvertical}{FE40}
+\pdfglyphtounicode{angleleft}{2329}
+\pdfglyphtounicode{angleright}{232A}
+\pdfglyphtounicode{angstrom}{212B}
+\pdfglyphtounicode{anoteleia}{0387}
+\pdfglyphtounicode{anticlockwise}{27F2}
+\pdfglyphtounicode{anudattadeva}{0952}
+\pdfglyphtounicode{anusvarabengali}{0982}
+\pdfglyphtounicode{anusvaradeva}{0902}
+\pdfglyphtounicode{anusvaragujarati}{0A82}
+\pdfglyphtounicode{aogonek}{0105}
+\pdfglyphtounicode{apaatosquare}{3300}
+\pdfglyphtounicode{aparen}{249C}
+\pdfglyphtounicode{apostrophearmenian}{055A}
+\pdfglyphtounicode{apostrophemod}{02BC}
+\pdfglyphtounicode{apple}{F8FF}
+\pdfglyphtounicode{approaches}{2250}
+\pdfglyphtounicode{approxequal}{2248}
+\pdfglyphtounicode{approxequalorimage}{2252}
+\pdfglyphtounicode{approximatelyequal}{2245}
+\pdfglyphtounicode{approxorequal}{224A}
+\pdfglyphtounicode{araeaekorean}{318E}
+\pdfglyphtounicode{araeakorean}{318D}
+\pdfglyphtounicode{arc}{2312}
+\pdfglyphtounicode{archleftdown}{21B6}
+\pdfglyphtounicode{archrightdown}{21B7}
+\pdfglyphtounicode{arighthalfring}{1E9A}
+\pdfglyphtounicode{aring}{00E5}
+\pdfglyphtounicode{aringacute}{01FB}
+\pdfglyphtounicode{aringbelow}{1E01}
+\pdfglyphtounicode{arrowboth}{2194}
+\pdfglyphtounicode{arrowbothv}{2195}
+\pdfglyphtounicode{arrowdashdown}{21E3}
+\pdfglyphtounicode{arrowdashleft}{21E0}
+\pdfglyphtounicode{arrowdashright}{21E2}
+\pdfglyphtounicode{arrowdashup}{21E1}
+\pdfglyphtounicode{arrowdblboth}{21D4}
+\pdfglyphtounicode{arrowdblbothv}{21D5}
+\pdfglyphtounicode{arrowdbldown}{21D3}
+\pdfglyphtounicode{arrowdblleft}{21D0}
+\pdfglyphtounicode{arrowdblright}{21D2}
+\pdfglyphtounicode{arrowdblup}{21D1}
+\pdfglyphtounicode{arrowdown}{2193}
+\pdfglyphtounicode{arrowdownleft}{2199}
+\pdfglyphtounicode{arrowdownright}{2198}
+\pdfglyphtounicode{arrowdownwhite}{21E9}
+\pdfglyphtounicode{arrowheaddownmod}{02C5}
+\pdfglyphtounicode{arrowheadleftmod}{02C2}
+\pdfglyphtounicode{arrowheadrightmod}{02C3}
+\pdfglyphtounicode{arrowheadupmod}{02C4}
+\pdfglyphtounicode{arrowhorizex}{F8E7}
+\pdfglyphtounicode{arrowleft}{2190}
+\pdfglyphtounicode{arrowleftbothalf}{21BD}
+\pdfglyphtounicode{arrowleftdbl}{21D0}
+\pdfglyphtounicode{arrowleftdblstroke}{21CD}
+\pdfglyphtounicode{arrowleftoverright}{21C6}
+\pdfglyphtounicode{arrowlefttophalf}{21BC}
+\pdfglyphtounicode{arrowleftwhite}{21E6}
+\pdfglyphtounicode{arrownortheast}{2197}
+\pdfglyphtounicode{arrownorthwest}{2196}
+\pdfglyphtounicode{arrowparrleftright}{21C6}
+\pdfglyphtounicode{arrowparrrightleft}{21C4}
+\pdfglyphtounicode{arrowright}{2192}
+\pdfglyphtounicode{arrowrightbothalf}{21C1}
+\pdfglyphtounicode{arrowrightdblstroke}{21CF}
+\pdfglyphtounicode{arrowrightheavy}{279E}
+\pdfglyphtounicode{arrowrightoverleft}{21C4}
+\pdfglyphtounicode{arrowrighttophalf}{21C0}
+\pdfglyphtounicode{arrowrightwhite}{21E8}
+\pdfglyphtounicode{arrowsoutheast}{2198}
+\pdfglyphtounicode{arrowsouthwest}{2199}
+\pdfglyphtounicode{arrowtableft}{21E4}
+\pdfglyphtounicode{arrowtabright}{21E5}
+\pdfglyphtounicode{arrowtailleft}{21A2}
+\pdfglyphtounicode{arrowtailright}{21A3}
+\pdfglyphtounicode{arrowtripleleft}{21DA}
+\pdfglyphtounicode{arrowtripleright}{21DB}
+\pdfglyphtounicode{arrowup}{2191}
+\pdfglyphtounicode{arrowupdn}{2195}
+\pdfglyphtounicode{arrowupdnbse}{21A8}
+\pdfglyphtounicode{arrowupdownbase}{21A8}
+\pdfglyphtounicode{arrowupleft}{2196}
+\pdfglyphtounicode{arrowupleftofdown}{21C5}
+\pdfglyphtounicode{arrowupright}{2197}
+\pdfglyphtounicode{arrowupwhite}{21E7}
+\pdfglyphtounicode{arrowvertex}{F8E6}
+\pdfglyphtounicode{asciicircum}{005E}
+\pdfglyphtounicode{asciicircummonospace}{FF3E}
+\pdfglyphtounicode{asciitilde}{007E}
+\pdfglyphtounicode{asciitildemonospace}{FF5E}
+\pdfglyphtounicode{ascript}{0251}
+\pdfglyphtounicode{ascriptturned}{0252}
+\pdfglyphtounicode{asmallhiragana}{3041}
+\pdfglyphtounicode{asmallkatakana}{30A1}
+\pdfglyphtounicode{asmallkatakanahalfwidth}{FF67}
+\pdfglyphtounicode{asterisk}{002A}
+\pdfglyphtounicode{asteriskaltonearabic}{066D}
+\pdfglyphtounicode{asteriskarabic}{066D}
+\pdfglyphtounicode{asteriskcentered}{2217}
+\pdfglyphtounicode{asteriskmath}{2217}
+\pdfglyphtounicode{asteriskmonospace}{FF0A}
+\pdfglyphtounicode{asterisksmall}{FE61}
+\pdfglyphtounicode{asterism}{2042}
+\pdfglyphtounicode{asuperior}{0061}
+\pdfglyphtounicode{asymptoticallyequal}{2243}
+\pdfglyphtounicode{at}{0040}
+\pdfglyphtounicode{atilde}{00E3}
+\pdfglyphtounicode{atmonospace}{FF20}
+\pdfglyphtounicode{atsmall}{FE6B}
+\pdfglyphtounicode{aturned}{0250}
+\pdfglyphtounicode{aubengali}{0994}
+\pdfglyphtounicode{aubopomofo}{3120}
+\pdfglyphtounicode{audeva}{0914}
+\pdfglyphtounicode{augujarati}{0A94}
+\pdfglyphtounicode{augurmukhi}{0A14}
+\pdfglyphtounicode{aulengthmarkbengali}{09D7}
+\pdfglyphtounicode{aumatragurmukhi}{0A4C}
+\pdfglyphtounicode{auvowelsignbengali}{09CC}
+\pdfglyphtounicode{auvowelsigndeva}{094C}
+\pdfglyphtounicode{auvowelsigngujarati}{0ACC}
+\pdfglyphtounicode{avagrahadeva}{093D}
+\pdfglyphtounicode{aybarmenian}{0561}
+\pdfglyphtounicode{ayin}{05E2}
+\pdfglyphtounicode{ayinaltonehebrew}{FB20}
+\pdfglyphtounicode{ayinhebrew}{05E2}
+\pdfglyphtounicode{b}{0062}
+\pdfglyphtounicode{babengali}{09AC}
+\pdfglyphtounicode{backslash}{005C}
+\pdfglyphtounicode{backslashmonospace}{FF3C}
+\pdfglyphtounicode{badeva}{092C}
+\pdfglyphtounicode{bagujarati}{0AAC}
+\pdfglyphtounicode{bagurmukhi}{0A2C}
+\pdfglyphtounicode{bahiragana}{3070}
+\pdfglyphtounicode{bahtthai}{0E3F}
+\pdfglyphtounicode{bakatakana}{30D0}
+\pdfglyphtounicode{bar}{007C}
+\pdfglyphtounicode{bardbl}{2225}
+\pdfglyphtounicode{barmonospace}{FF5C}
+\pdfglyphtounicode{bbopomofo}{3105}
+\pdfglyphtounicode{bcircle}{24D1}
+\pdfglyphtounicode{bdotaccent}{1E03}
+\pdfglyphtounicode{bdotbelow}{1E05}
+\pdfglyphtounicode{beamedsixteenthnotes}{266C}
+\pdfglyphtounicode{because}{2235}
+\pdfglyphtounicode{becyrillic}{0431}
+\pdfglyphtounicode{beharabic}{0628}
+\pdfglyphtounicode{behfinalarabic}{FE90}
+\pdfglyphtounicode{behinitialarabic}{FE91}
+\pdfglyphtounicode{behiragana}{3079}
+\pdfglyphtounicode{behmedialarabic}{FE92}
+\pdfglyphtounicode{behmeeminitialarabic}{FC9F}
+\pdfglyphtounicode{behmeemisolatedarabic}{FC08}
+\pdfglyphtounicode{behnoonfinalarabic}{FC6D}
+\pdfglyphtounicode{bekatakana}{30D9}
+\pdfglyphtounicode{benarmenian}{0562}
+\pdfglyphtounicode{bet}{05D1}
+\pdfglyphtounicode{beta}{03B2}
+\pdfglyphtounicode{betasymbolgreek}{03D0}
+\pdfglyphtounicode{betdagesh}{FB31}
+\pdfglyphtounicode{betdageshhebrew}{FB31}
+\pdfglyphtounicode{beth}{2136}
+\pdfglyphtounicode{bethebrew}{05D1}
+\pdfglyphtounicode{betrafehebrew}{FB4C}
+\pdfglyphtounicode{between}{226C}
+\pdfglyphtounicode{bhabengali}{09AD}
+\pdfglyphtounicode{bhadeva}{092D}
+\pdfglyphtounicode{bhagujarati}{0AAD}
+\pdfglyphtounicode{bhagurmukhi}{0A2D}
+\pdfglyphtounicode{bhook}{0253}
+\pdfglyphtounicode{bihiragana}{3073}
+\pdfglyphtounicode{bikatakana}{30D3}
+\pdfglyphtounicode{bilabialclick}{0298}
+\pdfglyphtounicode{bindigurmukhi}{0A02}
+\pdfglyphtounicode{birusquare}{3331}
+\pdfglyphtounicode{blackcircle}{25CF}
+\pdfglyphtounicode{blackdiamond}{25C6}
+\pdfglyphtounicode{blackdownpointingtriangle}{25BC}
+\pdfglyphtounicode{blackleftpointingpointer}{25C4}
+\pdfglyphtounicode{blackleftpointingtriangle}{25C0}
+\pdfglyphtounicode{blacklenticularbracketleft}{3010}
+\pdfglyphtounicode{blacklenticularbracketleftvertical}{FE3B}
+\pdfglyphtounicode{blacklenticularbracketright}{3011}
+\pdfglyphtounicode{blacklenticularbracketrightvertical}{FE3C}
+\pdfglyphtounicode{blacklowerlefttriangle}{25E3}
+\pdfglyphtounicode{blacklowerrighttriangle}{25E2}
+\pdfglyphtounicode{blackrectangle}{25AC}
+\pdfglyphtounicode{blackrightpointingpointer}{25BA}
+\pdfglyphtounicode{blackrightpointingtriangle}{25B6}
+\pdfglyphtounicode{blacksmallsquare}{25AA}
+\pdfglyphtounicode{blacksmilingface}{263B}
+\pdfglyphtounicode{blacksquare}{25A0}
+\pdfglyphtounicode{blackstar}{2605}
+\pdfglyphtounicode{blackupperlefttriangle}{25E4}
+\pdfglyphtounicode{blackupperrighttriangle}{25E5}
+\pdfglyphtounicode{blackuppointingsmalltriangle}{25B4}
+\pdfglyphtounicode{blackuppointingtriangle}{25B2}
+\pdfglyphtounicode{blank}{2423}
+\pdfglyphtounicode{blinebelow}{1E07}
+\pdfglyphtounicode{block}{2588}
+\pdfglyphtounicode{bmonospace}{FF42}
+\pdfglyphtounicode{bobaimaithai}{0E1A}
+\pdfglyphtounicode{bohiragana}{307C}
+\pdfglyphtounicode{bokatakana}{30DC}
+\pdfglyphtounicode{bparen}{249D}
+\pdfglyphtounicode{bqsquare}{33C3}
+\pdfglyphtounicode{braceex}{F8F4}
+\pdfglyphtounicode{braceleft}{007B}
+\pdfglyphtounicode{braceleftbt}{F8F3}
+\pdfglyphtounicode{braceleftmid}{F8F2}
+\pdfglyphtounicode{braceleftmonospace}{FF5B}
+\pdfglyphtounicode{braceleftsmall}{FE5B}
+\pdfglyphtounicode{bracelefttp}{F8F1}
+\pdfglyphtounicode{braceleftvertical}{FE37}
+\pdfglyphtounicode{braceright}{007D}
+\pdfglyphtounicode{bracerightbt}{F8FE}
+\pdfglyphtounicode{bracerightmid}{F8FD}
+\pdfglyphtounicode{bracerightmonospace}{FF5D}
+\pdfglyphtounicode{bracerightsmall}{FE5C}
+\pdfglyphtounicode{bracerighttp}{F8FC}
+\pdfglyphtounicode{bracerightvertical}{FE38}
+\pdfglyphtounicode{bracketleft}{005B}
+\pdfglyphtounicode{bracketleftbt}{F8F0}
+\pdfglyphtounicode{bracketleftex}{F8EF}
+\pdfglyphtounicode{bracketleftmonospace}{FF3B}
+\pdfglyphtounicode{bracketlefttp}{F8EE}
+\pdfglyphtounicode{bracketright}{005D}
+\pdfglyphtounicode{bracketrightbt}{F8FB}
+\pdfglyphtounicode{bracketrightex}{F8FA}
+\pdfglyphtounicode{bracketrightmonospace}{FF3D}
+\pdfglyphtounicode{bracketrighttp}{F8F9}
+\pdfglyphtounicode{breve}{02D8}
+\pdfglyphtounicode{brevebelowcmb}{032E}
+\pdfglyphtounicode{brevecmb}{0306}
+\pdfglyphtounicode{breveinvertedbelowcmb}{032F}
+\pdfglyphtounicode{breveinvertedcmb}{0311}
+\pdfglyphtounicode{breveinverteddoublecmb}{0361}
+\pdfglyphtounicode{bridgebelowcmb}{032A}
+\pdfglyphtounicode{bridgeinvertedbelowcmb}{033A}
+\pdfglyphtounicode{brokenbar}{00A6}
+\pdfglyphtounicode{bstroke}{0180}
+\pdfglyphtounicode{bsuperior}{0062}
+\pdfglyphtounicode{btopbar}{0183}
+\pdfglyphtounicode{buhiragana}{3076}
+\pdfglyphtounicode{bukatakana}{30D6}
+\pdfglyphtounicode{bullet}{2022}
+\pdfglyphtounicode{bulletinverse}{25D8}
+\pdfglyphtounicode{bulletoperator}{2219}
+\pdfglyphtounicode{bullseye}{25CE}
+\pdfglyphtounicode{c}{0063}
+\pdfglyphtounicode{caarmenian}{056E}
+\pdfglyphtounicode{cabengali}{099A}
+\pdfglyphtounicode{cacute}{0107}
+\pdfglyphtounicode{cadeva}{091A}
+\pdfglyphtounicode{cagujarati}{0A9A}
+\pdfglyphtounicode{cagurmukhi}{0A1A}
+\pdfglyphtounicode{calsquare}{3388}
+\pdfglyphtounicode{candrabindubengali}{0981}
+\pdfglyphtounicode{candrabinducmb}{0310}
+\pdfglyphtounicode{candrabindudeva}{0901}
+\pdfglyphtounicode{candrabindugujarati}{0A81}
+\pdfglyphtounicode{capslock}{21EA}
+\pdfglyphtounicode{careof}{2105}
+\pdfglyphtounicode{caron}{02C7}
+\pdfglyphtounicode{caronbelowcmb}{032C}
+\pdfglyphtounicode{caroncmb}{030C}
+\pdfglyphtounicode{carriagereturn}{21B5}
+\pdfglyphtounicode{cbopomofo}{3118}
+\pdfglyphtounicode{ccaron}{010D}
+\pdfglyphtounicode{ccedilla}{00E7}
+\pdfglyphtounicode{ccedillaacute}{1E09}
+\pdfglyphtounicode{ccircle}{24D2}
+\pdfglyphtounicode{ccircumflex}{0109}
+\pdfglyphtounicode{ccurl}{0255}
+\pdfglyphtounicode{cdot}{010B}
+\pdfglyphtounicode{cdotaccent}{010B}
+\pdfglyphtounicode{cdsquare}{33C5}
+\pdfglyphtounicode{cedilla}{00B8}
+\pdfglyphtounicode{cedillacmb}{0327}
+\pdfglyphtounicode{ceilingleft}{2308}
+\pdfglyphtounicode{ceilingright}{2309}
+\pdfglyphtounicode{cent}{00A2}
+\pdfglyphtounicode{centigrade}{2103}
+\pdfglyphtounicode{centinferior}{00A2}
+\pdfglyphtounicode{centmonospace}{FFE0}
+\pdfglyphtounicode{centoldstyle}{00A2}
+\pdfglyphtounicode{centsuperior}{00A2}
+\pdfglyphtounicode{chaarmenian}{0579}
+\pdfglyphtounicode{chabengali}{099B}
+\pdfglyphtounicode{chadeva}{091B}
+\pdfglyphtounicode{chagujarati}{0A9B}
+\pdfglyphtounicode{chagurmukhi}{0A1B}
+\pdfglyphtounicode{chbopomofo}{3114}
+\pdfglyphtounicode{cheabkhasiancyrillic}{04BD}
+\pdfglyphtounicode{check}{2713}
+\pdfglyphtounicode{checkmark}{2713}
+\pdfglyphtounicode{checyrillic}{0447}
+\pdfglyphtounicode{chedescenderabkhasiancyrillic}{04BF}
+\pdfglyphtounicode{chedescendercyrillic}{04B7}
+\pdfglyphtounicode{chedieresiscyrillic}{04F5}
+\pdfglyphtounicode{cheharmenian}{0573}
+\pdfglyphtounicode{chekhakassiancyrillic}{04CC}
+\pdfglyphtounicode{cheverticalstrokecyrillic}{04B9}
+\pdfglyphtounicode{chi}{03C7}
+\pdfglyphtounicode{chieuchacirclekorean}{3277}
+\pdfglyphtounicode{chieuchaparenkorean}{3217}
+\pdfglyphtounicode{chieuchcirclekorean}{3269}
+\pdfglyphtounicode{chieuchkorean}{314A}
+\pdfglyphtounicode{chieuchparenkorean}{3209}
+\pdfglyphtounicode{chochangthai}{0E0A}
+\pdfglyphtounicode{chochanthai}{0E08}
+\pdfglyphtounicode{chochingthai}{0E09}
+\pdfglyphtounicode{chochoethai}{0E0C}
+\pdfglyphtounicode{chook}{0188}
+\pdfglyphtounicode{cieucacirclekorean}{3276}
+\pdfglyphtounicode{cieucaparenkorean}{3216}
+\pdfglyphtounicode{cieuccirclekorean}{3268}
+\pdfglyphtounicode{cieuckorean}{3148}
+\pdfglyphtounicode{cieucparenkorean}{3208}
+\pdfglyphtounicode{cieucuparenkorean}{321C}
+\pdfglyphtounicode{circle}{25CB}
+\pdfglyphtounicode{circleR}{00AE}
+\pdfglyphtounicode{circleS}{24C8}
+\pdfglyphtounicode{circleasterisk}{229B}
+\pdfglyphtounicode{circlecopyrt}{20DD}
+\pdfglyphtounicode{circledivide}{2298}
+\pdfglyphtounicode{circledot}{2299}
+\pdfglyphtounicode{circleequal}{229C}
+\pdfglyphtounicode{circleminus}{2296}
+\pdfglyphtounicode{circlemultiply}{2297}
+\pdfglyphtounicode{circleot}{2299}
+\pdfglyphtounicode{circleplus}{2295}
+\pdfglyphtounicode{circlepostalmark}{3036}
+\pdfglyphtounicode{circlering}{229A}
+\pdfglyphtounicode{circlewithlefthalfblack}{25D0}
+\pdfglyphtounicode{circlewithrighthalfblack}{25D1}
+\pdfglyphtounicode{circumflex}{02C6}
+\pdfglyphtounicode{circumflexbelowcmb}{032D}
+\pdfglyphtounicode{circumflexcmb}{0302}
+\pdfglyphtounicode{clear}{2327}
+\pdfglyphtounicode{clickalveolar}{01C2}
+\pdfglyphtounicode{clickdental}{01C0}
+\pdfglyphtounicode{clicklateral}{01C1}
+\pdfglyphtounicode{clickretroflex}{01C3}
+\pdfglyphtounicode{clockwise}{27F3}
+\pdfglyphtounicode{club}{2663}
+\pdfglyphtounicode{clubsuitblack}{2663}
+\pdfglyphtounicode{clubsuitwhite}{2667}
+\pdfglyphtounicode{cmcubedsquare}{33A4}
+\pdfglyphtounicode{cmonospace}{FF43}
+\pdfglyphtounicode{cmsquaredsquare}{33A0}
+\pdfglyphtounicode{coarmenian}{0581}
+\pdfglyphtounicode{colon}{003A}
+\pdfglyphtounicode{colonmonetary}{20A1}
+\pdfglyphtounicode{colonmonospace}{FF1A}
+\pdfglyphtounicode{colonsign}{20A1}
+\pdfglyphtounicode{colonsmall}{FE55}
+\pdfglyphtounicode{colontriangularhalfmod}{02D1}
+\pdfglyphtounicode{colontriangularmod}{02D0}
+\pdfglyphtounicode{comma}{002C}
+\pdfglyphtounicode{commaabovecmb}{0313}
+\pdfglyphtounicode{commaaboverightcmb}{0315}
+\pdfglyphtounicode{commaaccent}{F6C3}
+\pdfglyphtounicode{commaarabic}{060C}
+\pdfglyphtounicode{commaarmenian}{055D}
+\pdfglyphtounicode{commainferior}{002C}
+\pdfglyphtounicode{commamonospace}{FF0C}
+\pdfglyphtounicode{commareversedabovecmb}{0314}
+\pdfglyphtounicode{commareversedmod}{02BD}
+\pdfglyphtounicode{commasmall}{FE50}
+\pdfglyphtounicode{commasuperior}{002C}
+\pdfglyphtounicode{commaturnedabovecmb}{0312}
+\pdfglyphtounicode{commaturnedmod}{02BB}
+\pdfglyphtounicode{compass}{263C}
+\pdfglyphtounicode{complement}{2201}
+\pdfglyphtounicode{compwordmark}{200C}
+\pdfglyphtounicode{congruent}{2245}
+\pdfglyphtounicode{contourintegral}{222E}
+\pdfglyphtounicode{control}{2303}
+\pdfglyphtounicode{controlACK}{0006}
+\pdfglyphtounicode{controlBEL}{0007}
+\pdfglyphtounicode{controlBS}{0008}
+\pdfglyphtounicode{controlCAN}{0018}
+\pdfglyphtounicode{controlCR}{000D}
+\pdfglyphtounicode{controlDC1}{0011}
+\pdfglyphtounicode{controlDC2}{0012}
+\pdfglyphtounicode{controlDC3}{0013}
+\pdfglyphtounicode{controlDC4}{0014}
+\pdfglyphtounicode{controlDEL}{007F}
+\pdfglyphtounicode{controlDLE}{0010}
+\pdfglyphtounicode{controlEM}{0019}
+\pdfglyphtounicode{controlENQ}{0005}
+\pdfglyphtounicode{controlEOT}{0004}
+\pdfglyphtounicode{controlESC}{001B}
+\pdfglyphtounicode{controlETB}{0017}
+\pdfglyphtounicode{controlETX}{0003}
+\pdfglyphtounicode{controlFF}{000C}
+\pdfglyphtounicode{controlFS}{001C}
+\pdfglyphtounicode{controlGS}{001D}
+\pdfglyphtounicode{controlHT}{0009}
+\pdfglyphtounicode{controlLF}{000A}
+\pdfglyphtounicode{controlNAK}{0015}
+\pdfglyphtounicode{controlRS}{001E}
+\pdfglyphtounicode{controlSI}{000F}
+\pdfglyphtounicode{controlSO}{000E}
+\pdfglyphtounicode{controlSOT}{0002}
+\pdfglyphtounicode{controlSTX}{0001}
+\pdfglyphtounicode{controlSUB}{001A}
+\pdfglyphtounicode{controlSYN}{0016}
+\pdfglyphtounicode{controlUS}{001F}
+\pdfglyphtounicode{controlVT}{000B}
+\pdfglyphtounicode{coproduct}{2A3F}
+\pdfglyphtounicode{copyright}{00A9}
+\pdfglyphtounicode{copyrightsans}{00A9}
+\pdfglyphtounicode{copyrightserif}{00A9}
+\pdfglyphtounicode{cornerbracketleft}{300C}
+\pdfglyphtounicode{cornerbracketlefthalfwidth}{FF62}
+\pdfglyphtounicode{cornerbracketleftvertical}{FE41}
+\pdfglyphtounicode{cornerbracketright}{300D}
+\pdfglyphtounicode{cornerbracketrighthalfwidth}{FF63}
+\pdfglyphtounicode{cornerbracketrightvertical}{FE42}
+\pdfglyphtounicode{corporationsquare}{337F}
+\pdfglyphtounicode{cosquare}{33C7}
+\pdfglyphtounicode{coverkgsquare}{33C6}
+\pdfglyphtounicode{cparen}{249E}
+\pdfglyphtounicode{cruzeiro}{20A2}
+\pdfglyphtounicode{cstretched}{0297}
+\pdfglyphtounicode{ct}{0063 0074}
+\pdfglyphtounicode{curlyand}{22CF}
+\pdfglyphtounicode{curlyleft}{21AB}
+\pdfglyphtounicode{curlyor}{22CE}
+\pdfglyphtounicode{curlyright}{21AC}
+\pdfglyphtounicode{currency}{00A4}
+\pdfglyphtounicode{cwm}{200C}
+\pdfglyphtounicode{cyrBreve}{02D8}
+\pdfglyphtounicode{cyrFlex}{00A0 0311}
+\pdfglyphtounicode{cyrbreve}{02D8}
+\pdfglyphtounicode{cyrflex}{00A0 0311}
+\pdfglyphtounicode{d}{0064}
+\pdfglyphtounicode{daarmenian}{0564}
+\pdfglyphtounicode{dabengali}{09A6}
+\pdfglyphtounicode{dadarabic}{0636}
+\pdfglyphtounicode{dadeva}{0926}
+\pdfglyphtounicode{dadfinalarabic}{FEBE}
+\pdfglyphtounicode{dadinitialarabic}{FEBF}
+\pdfglyphtounicode{dadmedialarabic}{FEC0}
+\pdfglyphtounicode{dagesh}{05BC}
+\pdfglyphtounicode{dageshhebrew}{05BC}
+\pdfglyphtounicode{dagger}{2020}
+\pdfglyphtounicode{daggerdbl}{2021}
+\pdfglyphtounicode{dagujarati}{0AA6}
+\pdfglyphtounicode{dagurmukhi}{0A26}
+\pdfglyphtounicode{dahiragana}{3060}
+\pdfglyphtounicode{dakatakana}{30C0}
+\pdfglyphtounicode{dalarabic}{062F}
+\pdfglyphtounicode{dalet}{05D3}
+\pdfglyphtounicode{daletdagesh}{FB33}
+\pdfglyphtounicode{daletdageshhebrew}{FB33}
+\pdfglyphtounicode{daleth}{2138}
+\pdfglyphtounicode{dalethatafpatah}{05D3 05B2}
+\pdfglyphtounicode{dalethatafpatahhebrew}{05D3 05B2}
+\pdfglyphtounicode{dalethatafsegol}{05D3 05B1}
+\pdfglyphtounicode{dalethatafsegolhebrew}{05D3 05B1}
+\pdfglyphtounicode{dalethebrew}{05D3}
+\pdfglyphtounicode{dalethiriq}{05D3 05B4}
+\pdfglyphtounicode{dalethiriqhebrew}{05D3 05B4}
+\pdfglyphtounicode{daletholam}{05D3 05B9}
+\pdfglyphtounicode{daletholamhebrew}{05D3 05B9}
+\pdfglyphtounicode{daletpatah}{05D3 05B7}
+\pdfglyphtounicode{daletpatahhebrew}{05D3 05B7}
+\pdfglyphtounicode{daletqamats}{05D3 05B8}
+\pdfglyphtounicode{daletqamatshebrew}{05D3 05B8}
+\pdfglyphtounicode{daletqubuts}{05D3 05BB}
+\pdfglyphtounicode{daletqubutshebrew}{05D3 05BB}
+\pdfglyphtounicode{daletsegol}{05D3 05B6}
+\pdfglyphtounicode{daletsegolhebrew}{05D3 05B6}
+\pdfglyphtounicode{daletsheva}{05D3 05B0}
+\pdfglyphtounicode{daletshevahebrew}{05D3 05B0}
+\pdfglyphtounicode{dalettsere}{05D3 05B5}
+\pdfglyphtounicode{dalettserehebrew}{05D3 05B5}
+\pdfglyphtounicode{dalfinalarabic}{FEAA}
+\pdfglyphtounicode{dammaarabic}{064F}
+\pdfglyphtounicode{dammalowarabic}{064F}
+\pdfglyphtounicode{dammatanaltonearabic}{064C}
+\pdfglyphtounicode{dammatanarabic}{064C}
+\pdfglyphtounicode{danda}{0964}
+\pdfglyphtounicode{dargahebrew}{05A7}
+\pdfglyphtounicode{dargalefthebrew}{05A7}
+\pdfglyphtounicode{dasiapneumatacyrilliccmb}{0485}
+\pdfglyphtounicode{dbar}{0111}
+\pdfglyphtounicode{dblGrave}{00A0 030F}
+\pdfglyphtounicode{dblanglebracketleft}{300A}
+\pdfglyphtounicode{dblanglebracketleftvertical}{FE3D}
+\pdfglyphtounicode{dblanglebracketright}{300B}
+\pdfglyphtounicode{dblanglebracketrightvertical}{FE3E}
+\pdfglyphtounicode{dblarchinvertedbelowcmb}{032B}
+\pdfglyphtounicode{dblarrowdwn}{21CA}
+\pdfglyphtounicode{dblarrowheadleft}{219E}
+\pdfglyphtounicode{dblarrowheadright}{21A0}
+\pdfglyphtounicode{dblarrowleft}{21D4}
+\pdfglyphtounicode{dblarrowright}{21D2}
+\pdfglyphtounicode{dblarrowup}{21C8}
+\pdfglyphtounicode{dblbracketleft}{27E6}
+\pdfglyphtounicode{dblbracketright}{27E7}
+\pdfglyphtounicode{dbldanda}{0965}
+\pdfglyphtounicode{dblgrave}{00A0 030F}
+\pdfglyphtounicode{dblgravecmb}{030F}
+\pdfglyphtounicode{dblintegral}{222C}
+\pdfglyphtounicode{dbllowline}{2017}
+\pdfglyphtounicode{dbllowlinecmb}{0333}
+\pdfglyphtounicode{dbloverlinecmb}{033F}
+\pdfglyphtounicode{dblprimemod}{02BA}
+\pdfglyphtounicode{dblverticalbar}{2016}
+\pdfglyphtounicode{dblverticallineabovecmb}{030E}
+\pdfglyphtounicode{dbopomofo}{3109}
+\pdfglyphtounicode{dbsquare}{33C8}
+\pdfglyphtounicode{dcaron}{010F}
+\pdfglyphtounicode{dcedilla}{1E11}
+\pdfglyphtounicode{dcircle}{24D3}
+\pdfglyphtounicode{dcircumflexbelow}{1E13}
+\pdfglyphtounicode{dcroat}{0111}
+\pdfglyphtounicode{ddabengali}{09A1}
+\pdfglyphtounicode{ddadeva}{0921}
+\pdfglyphtounicode{ddagujarati}{0AA1}
+\pdfglyphtounicode{ddagurmukhi}{0A21}
+\pdfglyphtounicode{ddalarabic}{0688}
+\pdfglyphtounicode{ddalfinalarabic}{FB89}
+\pdfglyphtounicode{dddhadeva}{095C}
+\pdfglyphtounicode{ddhabengali}{09A2}
+\pdfglyphtounicode{ddhadeva}{0922}
+\pdfglyphtounicode{ddhagujarati}{0AA2}
+\pdfglyphtounicode{ddhagurmukhi}{0A22}
+\pdfglyphtounicode{ddotaccent}{1E0B}
+\pdfglyphtounicode{ddotbelow}{1E0D}
+\pdfglyphtounicode{decimalseparatorarabic}{066B}
+\pdfglyphtounicode{decimalseparatorpersian}{066B}
+\pdfglyphtounicode{decyrillic}{0434}
+\pdfglyphtounicode{defines}{225C}
+\pdfglyphtounicode{degree}{00B0}
+\pdfglyphtounicode{dehihebrew}{05AD}
+\pdfglyphtounicode{dehiragana}{3067}
+\pdfglyphtounicode{deicoptic}{03EF}
+\pdfglyphtounicode{dekatakana}{30C7}
+\pdfglyphtounicode{deleteleft}{232B}
+\pdfglyphtounicode{deleteright}{2326}
+\pdfglyphtounicode{delta}{03B4}
+\pdfglyphtounicode{deltaturned}{018D}
+\pdfglyphtounicode{denominatorminusonenumeratorbengali}{09F8}
+\pdfglyphtounicode{dezh}{02A4}
+\pdfglyphtounicode{dhabengali}{09A7}
+\pdfglyphtounicode{dhadeva}{0927}
+\pdfglyphtounicode{dhagujarati}{0AA7}
+\pdfglyphtounicode{dhagurmukhi}{0A27}
+\pdfglyphtounicode{dhook}{0257}
+\pdfglyphtounicode{dialytikatonos}{0385}
+\pdfglyphtounicode{dialytikatonoscmb}{0344}
+\pdfglyphtounicode{diamond}{2666}
+\pdfglyphtounicode{diamondmath}{22C4}
+\pdfglyphtounicode{diamondsolid}{2666}
+\pdfglyphtounicode{diamondsuitwhite}{2662}
+\pdfglyphtounicode{dieresis}{00A8}
+\pdfglyphtounicode{dieresisacute}{00A0 0308 0301}
+\pdfglyphtounicode{dieresisbelowcmb}{0324}
+\pdfglyphtounicode{dieresiscmb}{0308}
+\pdfglyphtounicode{dieresisgrave}{00A0 0308 0300}
+\pdfglyphtounicode{dieresistonos}{0385}
+\pdfglyphtounicode{difference}{224F}
+\pdfglyphtounicode{dihiragana}{3062}
+\pdfglyphtounicode{dikatakana}{30C2}
+\pdfglyphtounicode{dittomark}{3003}
+\pdfglyphtounicode{divide}{00F7}
+\pdfglyphtounicode{dividemultiply}{22C7}
+\pdfglyphtounicode{divides}{2223}
+\pdfglyphtounicode{divisionslash}{2215}
+\pdfglyphtounicode{djecyrillic}{0452}
+\pdfglyphtounicode{dkshade}{2593}
+\pdfglyphtounicode{dlinebelow}{1E0F}
+\pdfglyphtounicode{dlsquare}{3397}
+\pdfglyphtounicode{dmacron}{0111}
+\pdfglyphtounicode{dmonospace}{FF44}
+\pdfglyphtounicode{dnblock}{2584}
+\pdfglyphtounicode{dochadathai}{0E0E}
+\pdfglyphtounicode{dodekthai}{0E14}
+\pdfglyphtounicode{dohiragana}{3069}
+\pdfglyphtounicode{dokatakana}{30C9}
+\pdfglyphtounicode{dollar}{0024}
+\pdfglyphtounicode{dollarinferior}{0024}
+\pdfglyphtounicode{dollarmonospace}{FF04}
+\pdfglyphtounicode{dollaroldstyle}{0024}
+\pdfglyphtounicode{dollarsmall}{FE69}
+\pdfglyphtounicode{dollarsuperior}{0024}
+\pdfglyphtounicode{dong}{20AB}
+\pdfglyphtounicode{dorusquare}{3326}
+\pdfglyphtounicode{dotaccent}{02D9}
+\pdfglyphtounicode{dotaccentcmb}{0307}
+\pdfglyphtounicode{dotbelowcmb}{0323}
+\pdfglyphtounicode{dotbelowcomb}{0323}
+\pdfglyphtounicode{dotkatakana}{30FB}
+\pdfglyphtounicode{dotlessi}{0131}
+\pdfglyphtounicode{dotlessj}{0237}
+\pdfglyphtounicode{dotlessjstrokehook}{0284}
+\pdfglyphtounicode{dotmath}{22C5}
+\pdfglyphtounicode{dotplus}{2214}
+\pdfglyphtounicode{dottedcircle}{25CC}
+\pdfglyphtounicode{doubleyodpatah}{FB1F}
+\pdfglyphtounicode{doubleyodpatahhebrew}{FB1F}
+\pdfglyphtounicode{downfall}{22CE}
+\pdfglyphtounicode{downslope}{29F9}
+\pdfglyphtounicode{downtackbelowcmb}{031E}
+\pdfglyphtounicode{downtackmod}{02D5}
+\pdfglyphtounicode{dparen}{249F}
+\pdfglyphtounicode{dsuperior}{0064}
+\pdfglyphtounicode{dtail}{0256}
+\pdfglyphtounicode{dtopbar}{018C}
+\pdfglyphtounicode{duhiragana}{3065}
+\pdfglyphtounicode{dukatakana}{30C5}
+\pdfglyphtounicode{dz}{01F3}
+\pdfglyphtounicode{dzaltone}{02A3}
+\pdfglyphtounicode{dzcaron}{01C6}
+\pdfglyphtounicode{dzcurl}{02A5}
+\pdfglyphtounicode{dzeabkhasiancyrillic}{04E1}
+\pdfglyphtounicode{dzecyrillic}{0455}
+\pdfglyphtounicode{dzhecyrillic}{045F}
+\pdfglyphtounicode{e}{0065}
+\pdfglyphtounicode{eacute}{00E9}
+\pdfglyphtounicode{earth}{2641}
+\pdfglyphtounicode{ebengali}{098F}
+\pdfglyphtounicode{ebopomofo}{311C}
+\pdfglyphtounicode{ebreve}{0115}
+\pdfglyphtounicode{ecandradeva}{090D}
+\pdfglyphtounicode{ecandragujarati}{0A8D}
+\pdfglyphtounicode{ecandravowelsigndeva}{0945}
+\pdfglyphtounicode{ecandravowelsigngujarati}{0AC5}
+\pdfglyphtounicode{ecaron}{011B}
+\pdfglyphtounicode{ecedillabreve}{1E1D}
+\pdfglyphtounicode{echarmenian}{0565}
+\pdfglyphtounicode{echyiwnarmenian}{0587}
+\pdfglyphtounicode{ecircle}{24D4}
+\pdfglyphtounicode{ecircumflex}{00EA}
+\pdfglyphtounicode{ecircumflexacute}{1EBF}
+\pdfglyphtounicode{ecircumflexbelow}{1E19}
+\pdfglyphtounicode{ecircumflexdotbelow}{1EC7}
+\pdfglyphtounicode{ecircumflexgrave}{1EC1}
+\pdfglyphtounicode{ecircumflexhookabove}{1EC3}
+\pdfglyphtounicode{ecircumflextilde}{1EC5}
+\pdfglyphtounicode{ecyrillic}{0454}
+\pdfglyphtounicode{edblgrave}{0205}
+\pdfglyphtounicode{edeva}{090F}
+\pdfglyphtounicode{edieresis}{00EB}
+\pdfglyphtounicode{edot}{0117}
+\pdfglyphtounicode{edotaccent}{0117}
+\pdfglyphtounicode{edotbelow}{1EB9}
+\pdfglyphtounicode{eegurmukhi}{0A0F}
+\pdfglyphtounicode{eematragurmukhi}{0A47}
+\pdfglyphtounicode{efcyrillic}{0444}
+\pdfglyphtounicode{egrave}{00E8}
+\pdfglyphtounicode{egujarati}{0A8F}
+\pdfglyphtounicode{eharmenian}{0567}
+\pdfglyphtounicode{ehbopomofo}{311D}
+\pdfglyphtounicode{ehiragana}{3048}
+\pdfglyphtounicode{ehookabove}{1EBB}
+\pdfglyphtounicode{eibopomofo}{311F}
+\pdfglyphtounicode{eight}{0038}
+\pdfglyphtounicode{eightarabic}{0668}
+\pdfglyphtounicode{eightbengali}{09EE}
+\pdfglyphtounicode{eightcircle}{2467}
+\pdfglyphtounicode{eightcircleinversesansserif}{2791}
+\pdfglyphtounicode{eightdeva}{096E}
+\pdfglyphtounicode{eighteencircle}{2471}
+\pdfglyphtounicode{eighteenparen}{2485}
+\pdfglyphtounicode{eighteenperiod}{2499}
+\pdfglyphtounicode{eightgujarati}{0AEE}
+\pdfglyphtounicode{eightgurmukhi}{0A6E}
+\pdfglyphtounicode{eighthackarabic}{0668}
+\pdfglyphtounicode{eighthangzhou}{3028}
+\pdfglyphtounicode{eighthnotebeamed}{266B}
+\pdfglyphtounicode{eightideographicparen}{3227}
+\pdfglyphtounicode{eightinferior}{2088}
+\pdfglyphtounicode{eightmonospace}{FF18}
+\pdfglyphtounicode{eightoldstyle}{0038}
+\pdfglyphtounicode{eightparen}{247B}
+\pdfglyphtounicode{eightperiod}{248F}
+\pdfglyphtounicode{eightpersian}{06F8}
+\pdfglyphtounicode{eightroman}{2177}
+\pdfglyphtounicode{eightsuperior}{2078}
+\pdfglyphtounicode{eightthai}{0E58}
+\pdfglyphtounicode{einvertedbreve}{0207}
+\pdfglyphtounicode{eiotifiedcyrillic}{0465}
+\pdfglyphtounicode{ekatakana}{30A8}
+\pdfglyphtounicode{ekatakanahalfwidth}{FF74}
+\pdfglyphtounicode{ekonkargurmukhi}{0A74}
+\pdfglyphtounicode{ekorean}{3154}
+\pdfglyphtounicode{elcyrillic}{043B}
+\pdfglyphtounicode{element}{2208}
+\pdfglyphtounicode{elevencircle}{246A}
+\pdfglyphtounicode{elevenparen}{247E}
+\pdfglyphtounicode{elevenperiod}{2492}
+\pdfglyphtounicode{elevenroman}{217A}
+\pdfglyphtounicode{ellipsis}{2026}
+\pdfglyphtounicode{ellipsisvertical}{22EE}
+\pdfglyphtounicode{emacron}{0113}
+\pdfglyphtounicode{emacronacute}{1E17}
+\pdfglyphtounicode{emacrongrave}{1E15}
+\pdfglyphtounicode{emcyrillic}{043C}
+\pdfglyphtounicode{emdash}{2014}
+\pdfglyphtounicode{emdashvertical}{FE31}
+\pdfglyphtounicode{emonospace}{FF45}
+\pdfglyphtounicode{emphasismarkarmenian}{055B}
+\pdfglyphtounicode{emptyset}{2205}
+\pdfglyphtounicode{enbopomofo}{3123}
+\pdfglyphtounicode{encyrillic}{043D}
+\pdfglyphtounicode{endash}{2013}
+\pdfglyphtounicode{endashvertical}{FE32}
+\pdfglyphtounicode{endescendercyrillic}{04A3}
+\pdfglyphtounicode{eng}{014B}
+\pdfglyphtounicode{engbopomofo}{3125}
+\pdfglyphtounicode{enghecyrillic}{04A5}
+\pdfglyphtounicode{enhookcyrillic}{04C8}
+\pdfglyphtounicode{enspace}{2002}
+\pdfglyphtounicode{eogonek}{0119}
+\pdfglyphtounicode{eokorean}{3153}
+\pdfglyphtounicode{eopen}{025B}
+\pdfglyphtounicode{eopenclosed}{029A}
+\pdfglyphtounicode{eopenreversed}{025C}
+\pdfglyphtounicode{eopenreversedclosed}{025E}
+\pdfglyphtounicode{eopenreversedhook}{025D}
+\pdfglyphtounicode{eparen}{24A0}
+\pdfglyphtounicode{epsilon}{03B5}
+\pdfglyphtounicode{epsilon1}{03F5}
+\pdfglyphtounicode{epsiloninv}{03F6}
+\pdfglyphtounicode{epsilontonos}{03AD}
+\pdfglyphtounicode{equal}{003D}
+\pdfglyphtounicode{equaldotleftright}{2252}
+\pdfglyphtounicode{equaldotrightleft}{2253}
+\pdfglyphtounicode{equalmonospace}{FF1D}
+\pdfglyphtounicode{equalorfollows}{22DF}
+\pdfglyphtounicode{equalorgreater}{2A96}
+\pdfglyphtounicode{equalorless}{2A95}
+\pdfglyphtounicode{equalorprecedes}{22DE}
+\pdfglyphtounicode{equalorsimilar}{2242}
+\pdfglyphtounicode{equalsdots}{2251}
+\pdfglyphtounicode{equalsmall}{FE66}
+\pdfglyphtounicode{equalsuperior}{207C}
+\pdfglyphtounicode{equivalence}{2261}
+\pdfglyphtounicode{equivasymptotic}{224D}
+\pdfglyphtounicode{erbopomofo}{3126}
+\pdfglyphtounicode{ercyrillic}{0440}
+\pdfglyphtounicode{ereversed}{0258}
+\pdfglyphtounicode{ereversedcyrillic}{044D}
+\pdfglyphtounicode{escyrillic}{0441}
+\pdfglyphtounicode{esdescendercyrillic}{04AB}
+\pdfglyphtounicode{esh}{0283}
+\pdfglyphtounicode{eshcurl}{0286}
+\pdfglyphtounicode{eshortdeva}{090E}
+\pdfglyphtounicode{eshortvowelsigndeva}{0946}
+\pdfglyphtounicode{eshreversedloop}{01AA}
+\pdfglyphtounicode{eshsquatreversed}{0285}
+\pdfglyphtounicode{esmallhiragana}{3047}
+\pdfglyphtounicode{esmallkatakana}{30A7}
+\pdfglyphtounicode{esmallkatakanahalfwidth}{FF6A}
+\pdfglyphtounicode{estimated}{212E}
+\pdfglyphtounicode{esuperior}{0065}
+\pdfglyphtounicode{eta}{03B7}
+\pdfglyphtounicode{etarmenian}{0568}
+\pdfglyphtounicode{etatonos}{03AE}
+\pdfglyphtounicode{eth}{00F0}
+\pdfglyphtounicode{etilde}{1EBD}
+\pdfglyphtounicode{etildebelow}{1E1B}
+\pdfglyphtounicode{etnahtafoukhhebrew}{0591}
+\pdfglyphtounicode{etnahtafoukhlefthebrew}{0591}
+\pdfglyphtounicode{etnahtahebrew}{0591}
+\pdfglyphtounicode{etnahtalefthebrew}{0591}
+\pdfglyphtounicode{eturned}{01DD}
+\pdfglyphtounicode{eukorean}{3161}
+\pdfglyphtounicode{euro}{20AC}
+\pdfglyphtounicode{evowelsignbengali}{09C7}
+\pdfglyphtounicode{evowelsigndeva}{0947}
+\pdfglyphtounicode{evowelsigngujarati}{0AC7}
+\pdfglyphtounicode{exclam}{0021}
+\pdfglyphtounicode{exclamarmenian}{055C}
+\pdfglyphtounicode{exclamdbl}{203C}
+\pdfglyphtounicode{exclamdown}{00A1}
+\pdfglyphtounicode{exclamdownsmall}{00A1}
+\pdfglyphtounicode{exclammonospace}{FF01}
+\pdfglyphtounicode{exclamsmall}{0021}
+\pdfglyphtounicode{existential}{2203}
+\pdfglyphtounicode{ezh}{0292}
+\pdfglyphtounicode{ezhcaron}{01EF}
+\pdfglyphtounicode{ezhcurl}{0293}
+\pdfglyphtounicode{ezhreversed}{01B9}
+\pdfglyphtounicode{ezhtail}{01BA}
+\pdfglyphtounicode{f}{0066}
+\pdfglyphtounicode{fadeva}{095E}
+\pdfglyphtounicode{fagurmukhi}{0A5E}
+\pdfglyphtounicode{fahrenheit}{2109}
+\pdfglyphtounicode{fathaarabic}{064E}
+\pdfglyphtounicode{fathalowarabic}{064E}
+\pdfglyphtounicode{fathatanarabic}{064B}
+\pdfglyphtounicode{fbopomofo}{3108}
+\pdfglyphtounicode{fcircle}{24D5}
+\pdfglyphtounicode{fdotaccent}{1E1F}
+\pdfglyphtounicode{feharabic}{0641}
+\pdfglyphtounicode{feharmenian}{0586}
+\pdfglyphtounicode{fehfinalarabic}{FED2}
+\pdfglyphtounicode{fehinitialarabic}{FED3}
+\pdfglyphtounicode{fehmedialarabic}{FED4}
+\pdfglyphtounicode{feicoptic}{03E5}
+\pdfglyphtounicode{female}{2640}
+\pdfglyphtounicode{ff}{0066 0066}
+\pdfglyphtounicode{ffi}{0066 0066 0069}
+\pdfglyphtounicode{ffl}{0066 0066 006C}
+\pdfglyphtounicode{fi}{0066 0069}
+\pdfglyphtounicode{fifteencircle}{246E}
+\pdfglyphtounicode{fifteenparen}{2482}
+\pdfglyphtounicode{fifteenperiod}{2496}
+\pdfglyphtounicode{figuredash}{2012}
+\pdfglyphtounicode{filledbox}{25A0}
+\pdfglyphtounicode{filledrect}{25AC}
+\pdfglyphtounicode{finalkaf}{05DA}
+\pdfglyphtounicode{finalkafdagesh}{FB3A}
+\pdfglyphtounicode{finalkafdageshhebrew}{FB3A}
+\pdfglyphtounicode{finalkafhebrew}{05DA}
+\pdfglyphtounicode{finalkafqamats}{05DA 05B8}
+\pdfglyphtounicode{finalkafqamatshebrew}{05DA 05B8}
+\pdfglyphtounicode{finalkafsheva}{05DA 05B0}
+\pdfglyphtounicode{finalkafshevahebrew}{05DA 05B0}
+\pdfglyphtounicode{finalmem}{05DD}
+\pdfglyphtounicode{finalmemhebrew}{05DD}
+\pdfglyphtounicode{finalnun}{05DF}
+\pdfglyphtounicode{finalnunhebrew}{05DF}
+\pdfglyphtounicode{finalpe}{05E3}
+\pdfglyphtounicode{finalpehebrew}{05E3}
+\pdfglyphtounicode{finaltsadi}{05E5}
+\pdfglyphtounicode{finaltsadihebrew}{05E5}
+\pdfglyphtounicode{firsttonechinese}{02C9}
+\pdfglyphtounicode{fisheye}{25C9}
+\pdfglyphtounicode{fitacyrillic}{0473}
+\pdfglyphtounicode{five}{0035}
+\pdfglyphtounicode{fivearabic}{0665}
+\pdfglyphtounicode{fivebengali}{09EB}
+\pdfglyphtounicode{fivecircle}{2464}
+\pdfglyphtounicode{fivecircleinversesansserif}{278E}
+\pdfglyphtounicode{fivedeva}{096B}
+\pdfglyphtounicode{fiveeighths}{215D}
+\pdfglyphtounicode{fivegujarati}{0AEB}
+\pdfglyphtounicode{fivegurmukhi}{0A6B}
+\pdfglyphtounicode{fivehackarabic}{0665}
+\pdfglyphtounicode{fivehangzhou}{3025}
+\pdfglyphtounicode{fiveideographicparen}{3224}
+\pdfglyphtounicode{fiveinferior}{2085}
+\pdfglyphtounicode{fivemonospace}{FF15}
+\pdfglyphtounicode{fiveoldstyle}{0035}
+\pdfglyphtounicode{fiveparen}{2478}
+\pdfglyphtounicode{fiveperiod}{248C}
+\pdfglyphtounicode{fivepersian}{06F5}
+\pdfglyphtounicode{fiveroman}{2174}
+\pdfglyphtounicode{fivesuperior}{2075}
+\pdfglyphtounicode{fivethai}{0E55}
+\pdfglyphtounicode{fl}{0066 006C}
+\pdfglyphtounicode{flat}{266D}
+\pdfglyphtounicode{floorleft}{230A}
+\pdfglyphtounicode{floorright}{230B}
+\pdfglyphtounicode{florin}{0192}
+\pdfglyphtounicode{fmonospace}{FF46}
+\pdfglyphtounicode{fmsquare}{3399}
+\pdfglyphtounicode{fofanthai}{0E1F}
+\pdfglyphtounicode{fofathai}{0E1D}
+\pdfglyphtounicode{follownotdbleqv}{2ABA}
+\pdfglyphtounicode{follownotslnteql}{2AB6}
+\pdfglyphtounicode{followornoteqvlnt}{22E9}
+\pdfglyphtounicode{follows}{227B}
+\pdfglyphtounicode{followsequal}{2AB0}
+\pdfglyphtounicode{followsorcurly}{227D}
+\pdfglyphtounicode{followsorequal}{227F}
+\pdfglyphtounicode{fongmanthai}{0E4F}
+\pdfglyphtounicode{forall}{2200}
+\pdfglyphtounicode{forces}{22A9}
+\pdfglyphtounicode{forcesbar}{22AA}
+\pdfglyphtounicode{fork}{22D4}
+\pdfglyphtounicode{four}{0034}
+\pdfglyphtounicode{fourarabic}{0664}
+\pdfglyphtounicode{fourbengali}{09EA}
+\pdfglyphtounicode{fourcircle}{2463}
+\pdfglyphtounicode{fourcircleinversesansserif}{278D}
+\pdfglyphtounicode{fourdeva}{096A}
+\pdfglyphtounicode{fourgujarati}{0AEA}
+\pdfglyphtounicode{fourgurmukhi}{0A6A}
+\pdfglyphtounicode{fourhackarabic}{0664}
+\pdfglyphtounicode{fourhangzhou}{3024}
+\pdfglyphtounicode{fourideographicparen}{3223}
+\pdfglyphtounicode{fourinferior}{2084}
+\pdfglyphtounicode{fourmonospace}{FF14}
+\pdfglyphtounicode{fournumeratorbengali}{09F7}
+\pdfglyphtounicode{fouroldstyle}{0034}
+\pdfglyphtounicode{fourparen}{2477}
+\pdfglyphtounicode{fourperiod}{248B}
+\pdfglyphtounicode{fourpersian}{06F4}
+\pdfglyphtounicode{fourroman}{2173}
+\pdfglyphtounicode{foursuperior}{2074}
+\pdfglyphtounicode{fourteencircle}{246D}
+\pdfglyphtounicode{fourteenparen}{2481}
+\pdfglyphtounicode{fourteenperiod}{2495}
+\pdfglyphtounicode{fourthai}{0E54}
+\pdfglyphtounicode{fourthtonechinese}{02CB}
+\pdfglyphtounicode{fparen}{24A1}
+\pdfglyphtounicode{fraction}{2044}
+\pdfglyphtounicode{franc}{20A3}
+\pdfglyphtounicode{frown}{2322}
+\pdfglyphtounicode{g}{0067}
+\pdfglyphtounicode{gabengali}{0997}
+\pdfglyphtounicode{gacute}{01F5}
+\pdfglyphtounicode{gadeva}{0917}
+\pdfglyphtounicode{gafarabic}{06AF}
+\pdfglyphtounicode{gaffinalarabic}{FB93}
+\pdfglyphtounicode{gafinitialarabic}{FB94}
+\pdfglyphtounicode{gafmedialarabic}{FB95}
+\pdfglyphtounicode{gagujarati}{0A97}
+\pdfglyphtounicode{gagurmukhi}{0A17}
+\pdfglyphtounicode{gahiragana}{304C}
+\pdfglyphtounicode{gakatakana}{30AC}
+\pdfglyphtounicode{gamma}{03B3}
+\pdfglyphtounicode{gammalatinsmall}{0263}
+\pdfglyphtounicode{gammasuperior}{02E0}
+\pdfglyphtounicode{gangiacoptic}{03EB}
+\pdfglyphtounicode{gbopomofo}{310D}
+\pdfglyphtounicode{gbreve}{011F}
+\pdfglyphtounicode{gcaron}{01E7}
+\pdfglyphtounicode{gcedilla}{0123}
+\pdfglyphtounicode{gcircle}{24D6}
+\pdfglyphtounicode{gcircumflex}{011D}
+\pdfglyphtounicode{gcommaaccent}{0123}
+\pdfglyphtounicode{gdot}{0121}
+\pdfglyphtounicode{gdotaccent}{0121}
+\pdfglyphtounicode{gecyrillic}{0433}
+\pdfglyphtounicode{gehiragana}{3052}
+\pdfglyphtounicode{gekatakana}{30B2}
+\pdfglyphtounicode{geomequivalent}{224E}
+\pdfglyphtounicode{geometricallyequal}{2251}
+\pdfglyphtounicode{gereshaccenthebrew}{059C}
+\pdfglyphtounicode{gereshhebrew}{05F3}
+\pdfglyphtounicode{gereshmuqdamhebrew}{059D}
+\pdfglyphtounicode{germandbls}{00DF}
+\pdfglyphtounicode{gershayimaccenthebrew}{059E}
+\pdfglyphtounicode{gershayimhebrew}{05F4}
+\pdfglyphtounicode{getamark}{3013}
+\pdfglyphtounicode{ghabengali}{0998}
+\pdfglyphtounicode{ghadarmenian}{0572}
+\pdfglyphtounicode{ghadeva}{0918}
+\pdfglyphtounicode{ghagujarati}{0A98}
+\pdfglyphtounicode{ghagurmukhi}{0A18}
+\pdfglyphtounicode{ghainarabic}{063A}
+\pdfglyphtounicode{ghainfinalarabic}{FECE}
+\pdfglyphtounicode{ghaininitialarabic}{FECF}
+\pdfglyphtounicode{ghainmedialarabic}{FED0}
+\pdfglyphtounicode{ghemiddlehookcyrillic}{0495}
+\pdfglyphtounicode{ghestrokecyrillic}{0493}
+\pdfglyphtounicode{gheupturncyrillic}{0491}
+\pdfglyphtounicode{ghhadeva}{095A}
+\pdfglyphtounicode{ghhagurmukhi}{0A5A}
+\pdfglyphtounicode{ghook}{0260}
+\pdfglyphtounicode{ghzsquare}{3393}
+\pdfglyphtounicode{gihiragana}{304E}
+\pdfglyphtounicode{gikatakana}{30AE}
+\pdfglyphtounicode{gimarmenian}{0563}
+\pdfglyphtounicode{gimel}{05D2}
+\pdfglyphtounicode{gimeldagesh}{FB32}
+\pdfglyphtounicode{gimeldageshhebrew}{FB32}
+\pdfglyphtounicode{gimelhebrew}{05D2}
+\pdfglyphtounicode{gjecyrillic}{0453}
+\pdfglyphtounicode{glottalinvertedstroke}{01BE}
+\pdfglyphtounicode{glottalstop}{0294}
+\pdfglyphtounicode{glottalstopinverted}{0296}
+\pdfglyphtounicode{glottalstopmod}{02C0}
+\pdfglyphtounicode{glottalstopreversed}{0295}
+\pdfglyphtounicode{glottalstopreversedmod}{02C1}
+\pdfglyphtounicode{glottalstopreversedsuperior}{02E4}
+\pdfglyphtounicode{glottalstopstroke}{02A1}
+\pdfglyphtounicode{glottalstopstrokereversed}{02A2}
+\pdfglyphtounicode{gmacron}{1E21}
+\pdfglyphtounicode{gmonospace}{FF47}
+\pdfglyphtounicode{gohiragana}{3054}
+\pdfglyphtounicode{gokatakana}{30B4}
+\pdfglyphtounicode{gparen}{24A2}
+\pdfglyphtounicode{gpasquare}{33AC}
+\pdfglyphtounicode{gradient}{2207}
+\pdfglyphtounicode{grave}{0060}
+\pdfglyphtounicode{gravebelowcmb}{0316}
+\pdfglyphtounicode{gravecmb}{0300}
+\pdfglyphtounicode{gravecomb}{0300}
+\pdfglyphtounicode{gravedeva}{0953}
+\pdfglyphtounicode{gravelowmod}{02CE}
+\pdfglyphtounicode{gravemonospace}{FF40}
+\pdfglyphtounicode{gravetonecmb}{0340}
+\pdfglyphtounicode{greater}{003E}
+\pdfglyphtounicode{greaterdbleqlless}{2A8C}
+\pdfglyphtounicode{greaterdblequal}{2267}
+\pdfglyphtounicode{greaterdot}{22D7}
+\pdfglyphtounicode{greaterequal}{2265}
+\pdfglyphtounicode{greaterequalorless}{22DB}
+\pdfglyphtounicode{greaterlessequal}{22DB}
+\pdfglyphtounicode{greatermonospace}{FF1E}
+\pdfglyphtounicode{greatermuch}{226B}
+\pdfglyphtounicode{greaternotdblequal}{2A8A}
+\pdfglyphtounicode{greaternotequal}{2A88}
+\pdfglyphtounicode{greaterorapproxeql}{2A86}
+\pdfglyphtounicode{greaterorequalslant}{2A7E}
+\pdfglyphtounicode{greaterorequivalent}{2273}
+\pdfglyphtounicode{greaterorless}{2277}
+\pdfglyphtounicode{greaterornotdbleql}{2269}
+\pdfglyphtounicode{greaterornotequal}{2269}
+\pdfglyphtounicode{greaterorsimilar}{2273}
+\pdfglyphtounicode{greateroverequal}{2267}
+\pdfglyphtounicode{greatersmall}{FE65}
+\pdfglyphtounicode{gscript}{0261}
+\pdfglyphtounicode{gstroke}{01E5}
+\pdfglyphtounicode{guhiragana}{3050}
+\pdfglyphtounicode{guillemotleft}{00AB}
+\pdfglyphtounicode{guillemotright}{00BB}
+\pdfglyphtounicode{guilsinglleft}{2039}
+\pdfglyphtounicode{guilsinglright}{203A}
+\pdfglyphtounicode{gukatakana}{30B0}
+\pdfglyphtounicode{guramusquare}{3318}
+\pdfglyphtounicode{gysquare}{33C9}
+\pdfglyphtounicode{h}{0068}
+\pdfglyphtounicode{haabkhasiancyrillic}{04A9}
+\pdfglyphtounicode{haaltonearabic}{06C1}
+\pdfglyphtounicode{habengali}{09B9}
+\pdfglyphtounicode{hadescendercyrillic}{04B3}
+\pdfglyphtounicode{hadeva}{0939}
+\pdfglyphtounicode{hagujarati}{0AB9}
+\pdfglyphtounicode{hagurmukhi}{0A39}
+\pdfglyphtounicode{haharabic}{062D}
+\pdfglyphtounicode{hahfinalarabic}{FEA2}
+\pdfglyphtounicode{hahinitialarabic}{FEA3}
+\pdfglyphtounicode{hahiragana}{306F}
+\pdfglyphtounicode{hahmedialarabic}{FEA4}
+\pdfglyphtounicode{haitusquare}{332A}
+\pdfglyphtounicode{hakatakana}{30CF}
+\pdfglyphtounicode{hakatakanahalfwidth}{FF8A}
+\pdfglyphtounicode{halantgurmukhi}{0A4D}
+\pdfglyphtounicode{hamzaarabic}{0621}
+\pdfglyphtounicode{hamzadammaarabic}{0621 064F}
+\pdfglyphtounicode{hamzadammatanarabic}{0621 064C}
+\pdfglyphtounicode{hamzafathaarabic}{0621 064E}
+\pdfglyphtounicode{hamzafathatanarabic}{0621 064B}
+\pdfglyphtounicode{hamzalowarabic}{0621}
+\pdfglyphtounicode{hamzalowkasraarabic}{0621 0650}
+\pdfglyphtounicode{hamzalowkasratanarabic}{0621 064D}
+\pdfglyphtounicode{hamzasukunarabic}{0621 0652}
+\pdfglyphtounicode{hangulfiller}{3164}
+\pdfglyphtounicode{hardsigncyrillic}{044A}
+\pdfglyphtounicode{harpoondownleft}{21C3}
+\pdfglyphtounicode{harpoondownright}{21C2}
+\pdfglyphtounicode{harpoonleftbarbup}{21BC}
+\pdfglyphtounicode{harpoonleftright}{21CC}
+\pdfglyphtounicode{harpoonrightbarbup}{21C0}
+\pdfglyphtounicode{harpoonrightleft}{21CB}
+\pdfglyphtounicode{harpoonupleft}{21BF}
+\pdfglyphtounicode{harpoonupright}{21BE}
+\pdfglyphtounicode{hasquare}{33CA}
+\pdfglyphtounicode{hatafpatah}{05B2}
+\pdfglyphtounicode{hatafpatah16}{05B2}
+\pdfglyphtounicode{hatafpatah23}{05B2}
+\pdfglyphtounicode{hatafpatah2f}{05B2}
+\pdfglyphtounicode{hatafpatahhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahnarrowhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahquarterhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahwidehebrew}{05B2}
+\pdfglyphtounicode{hatafqamats}{05B3}
+\pdfglyphtounicode{hatafqamats1b}{05B3}
+\pdfglyphtounicode{hatafqamats28}{05B3}
+\pdfglyphtounicode{hatafqamats34}{05B3}
+\pdfglyphtounicode{hatafqamatshebrew}{05B3}
+\pdfglyphtounicode{hatafqamatsnarrowhebrew}{05B3}
+\pdfglyphtounicode{hatafqamatsquarterhebrew}{05B3}
+\pdfglyphtounicode{hatafqamatswidehebrew}{05B3}
+\pdfglyphtounicode{hatafsegol}{05B1}
+\pdfglyphtounicode{hatafsegol17}{05B1}
+\pdfglyphtounicode{hatafsegol24}{05B1}
+\pdfglyphtounicode{hatafsegol30}{05B1}
+\pdfglyphtounicode{hatafsegolhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolnarrowhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolquarterhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolwidehebrew}{05B1}
+\pdfglyphtounicode{hbar}{0127}
+\pdfglyphtounicode{hbopomofo}{310F}
+\pdfglyphtounicode{hbrevebelow}{1E2B}
+\pdfglyphtounicode{hcedilla}{1E29}
+\pdfglyphtounicode{hcircle}{24D7}
+\pdfglyphtounicode{hcircumflex}{0125}
+\pdfglyphtounicode{hdieresis}{1E27}
+\pdfglyphtounicode{hdotaccent}{1E23}
+\pdfglyphtounicode{hdotbelow}{1E25}
+\pdfglyphtounicode{he}{05D4}
+\pdfglyphtounicode{heart}{2665}
+\pdfglyphtounicode{heartsuitblack}{2665}
+\pdfglyphtounicode{heartsuitwhite}{2661}
+\pdfglyphtounicode{hedagesh}{FB34}
+\pdfglyphtounicode{hedageshhebrew}{FB34}
+\pdfglyphtounicode{hehaltonearabic}{06C1}
+\pdfglyphtounicode{heharabic}{0647}
+\pdfglyphtounicode{hehebrew}{05D4}
+\pdfglyphtounicode{hehfinalaltonearabic}{FBA7}
+\pdfglyphtounicode{hehfinalalttwoarabic}{FEEA}
+\pdfglyphtounicode{hehfinalarabic}{FEEA}
+\pdfglyphtounicode{hehhamzaabovefinalarabic}{FBA5}
+\pdfglyphtounicode{hehhamzaaboveisolatedarabic}{FBA4}
+\pdfglyphtounicode{hehinitialaltonearabic}{FBA8}
+\pdfglyphtounicode{hehinitialarabic}{FEEB}
+\pdfglyphtounicode{hehiragana}{3078}
+\pdfglyphtounicode{hehmedialaltonearabic}{FBA9}
+\pdfglyphtounicode{hehmedialarabic}{FEEC}
+\pdfglyphtounicode{heiseierasquare}{337B}
+\pdfglyphtounicode{hekatakana}{30D8}
+\pdfglyphtounicode{hekatakanahalfwidth}{FF8D}
+\pdfglyphtounicode{hekutaarusquare}{3336}
+\pdfglyphtounicode{henghook}{0267}
+\pdfglyphtounicode{herutusquare}{3339}
+\pdfglyphtounicode{het}{05D7}
+\pdfglyphtounicode{hethebrew}{05D7}
+\pdfglyphtounicode{hhook}{0266}
+\pdfglyphtounicode{hhooksuperior}{02B1}
+\pdfglyphtounicode{hieuhacirclekorean}{327B}
+\pdfglyphtounicode{hieuhaparenkorean}{321B}
+\pdfglyphtounicode{hieuhcirclekorean}{326D}
+\pdfglyphtounicode{hieuhkorean}{314E}
+\pdfglyphtounicode{hieuhparenkorean}{320D}
+\pdfglyphtounicode{hihiragana}{3072}
+\pdfglyphtounicode{hikatakana}{30D2}
+\pdfglyphtounicode{hikatakanahalfwidth}{FF8B}
+\pdfglyphtounicode{hiriq}{05B4}
+\pdfglyphtounicode{hiriq14}{05B4}
+\pdfglyphtounicode{hiriq21}{05B4}
+\pdfglyphtounicode{hiriq2d}{05B4}
+\pdfglyphtounicode{hiriqhebrew}{05B4}
+\pdfglyphtounicode{hiriqnarrowhebrew}{05B4}
+\pdfglyphtounicode{hiriqquarterhebrew}{05B4}
+\pdfglyphtounicode{hiriqwidehebrew}{05B4}
+\pdfglyphtounicode{hlinebelow}{1E96}
+\pdfglyphtounicode{hmonospace}{FF48}
+\pdfglyphtounicode{hoarmenian}{0570}
+\pdfglyphtounicode{hohipthai}{0E2B}
+\pdfglyphtounicode{hohiragana}{307B}
+\pdfglyphtounicode{hokatakana}{30DB}
+\pdfglyphtounicode{hokatakanahalfwidth}{FF8E}
+\pdfglyphtounicode{holam}{05B9}
+\pdfglyphtounicode{holam19}{05B9}
+\pdfglyphtounicode{holam26}{05B9}
+\pdfglyphtounicode{holam32}{05B9}
+\pdfglyphtounicode{holamhebrew}{05B9}
+\pdfglyphtounicode{holamnarrowhebrew}{05B9}
+\pdfglyphtounicode{holamquarterhebrew}{05B9}
+\pdfglyphtounicode{holamwidehebrew}{05B9}
+\pdfglyphtounicode{honokhukthai}{0E2E}
+\pdfglyphtounicode{hookabovecomb}{0309}
+\pdfglyphtounicode{hookcmb}{0309}
+\pdfglyphtounicode{hookpalatalizedbelowcmb}{0321}
+\pdfglyphtounicode{hookretroflexbelowcmb}{0322}
+\pdfglyphtounicode{hoonsquare}{3342}
+\pdfglyphtounicode{horicoptic}{03E9}
+\pdfglyphtounicode{horizontalbar}{2015}
+\pdfglyphtounicode{horncmb}{031B}
+\pdfglyphtounicode{hotsprings}{2668}
+\pdfglyphtounicode{house}{2302}
+\pdfglyphtounicode{hparen}{24A3}
+\pdfglyphtounicode{hsuperior}{02B0}
+\pdfglyphtounicode{hturned}{0265}
+\pdfglyphtounicode{huhiragana}{3075}
+\pdfglyphtounicode{huiitosquare}{3333}
+\pdfglyphtounicode{hukatakana}{30D5}
+\pdfglyphtounicode{hukatakanahalfwidth}{FF8C}
+\pdfglyphtounicode{hungarumlaut}{02DD}
+\pdfglyphtounicode{hungarumlautcmb}{030B}
+\pdfglyphtounicode{hv}{0195}
+\pdfglyphtounicode{hyphen}{002D}
+\pdfglyphtounicode{hyphenchar}{002D}
+\pdfglyphtounicode{hypheninferior}{002D}
+\pdfglyphtounicode{hyphenmonospace}{FF0D}
+\pdfglyphtounicode{hyphensmall}{FE63}
+\pdfglyphtounicode{hyphensuperior}{002D}
+\pdfglyphtounicode{hyphentwo}{2010}
+\pdfglyphtounicode{i}{0069}
+\pdfglyphtounicode{iacute}{00ED}
+\pdfglyphtounicode{iacyrillic}{044F}
+\pdfglyphtounicode{ibengali}{0987}
+\pdfglyphtounicode{ibopomofo}{3127}
+\pdfglyphtounicode{ibreve}{012D}
+\pdfglyphtounicode{icaron}{01D0}
+\pdfglyphtounicode{icircle}{24D8}
+\pdfglyphtounicode{icircumflex}{00EE}
+\pdfglyphtounicode{icyrillic}{0456}
+\pdfglyphtounicode{idblgrave}{0209}
+\pdfglyphtounicode{ideographearthcircle}{328F}
+\pdfglyphtounicode{ideographfirecircle}{328B}
+\pdfglyphtounicode{ideographicallianceparen}{323F}
+\pdfglyphtounicode{ideographiccallparen}{323A}
+\pdfglyphtounicode{ideographiccentrecircle}{32A5}
+\pdfglyphtounicode{ideographicclose}{3006}
+\pdfglyphtounicode{ideographiccomma}{3001}
+\pdfglyphtounicode{ideographiccommaleft}{FF64}
+\pdfglyphtounicode{ideographiccongratulationparen}{3237}
+\pdfglyphtounicode{ideographiccorrectcircle}{32A3}
+\pdfglyphtounicode{ideographicearthparen}{322F}
+\pdfglyphtounicode{ideographicenterpriseparen}{323D}
+\pdfglyphtounicode{ideographicexcellentcircle}{329D}
+\pdfglyphtounicode{ideographicfestivalparen}{3240}
+\pdfglyphtounicode{ideographicfinancialcircle}{3296}
+\pdfglyphtounicode{ideographicfinancialparen}{3236}
+\pdfglyphtounicode{ideographicfireparen}{322B}
+\pdfglyphtounicode{ideographichaveparen}{3232}
+\pdfglyphtounicode{ideographichighcircle}{32A4}
+\pdfglyphtounicode{ideographiciterationmark}{3005}
+\pdfglyphtounicode{ideographiclaborcircle}{3298}
+\pdfglyphtounicode{ideographiclaborparen}{3238}
+\pdfglyphtounicode{ideographicleftcircle}{32A7}
+\pdfglyphtounicode{ideographiclowcircle}{32A6}
+\pdfglyphtounicode{ideographicmedicinecircle}{32A9}
+\pdfglyphtounicode{ideographicmetalparen}{322E}
+\pdfglyphtounicode{ideographicmoonparen}{322A}
+\pdfglyphtounicode{ideographicnameparen}{3234}
+\pdfglyphtounicode{ideographicperiod}{3002}
+\pdfglyphtounicode{ideographicprintcircle}{329E}
+\pdfglyphtounicode{ideographicreachparen}{3243}
+\pdfglyphtounicode{ideographicrepresentparen}{3239}
+\pdfglyphtounicode{ideographicresourceparen}{323E}
+\pdfglyphtounicode{ideographicrightcircle}{32A8}
+\pdfglyphtounicode{ideographicsecretcircle}{3299}
+\pdfglyphtounicode{ideographicselfparen}{3242}
+\pdfglyphtounicode{ideographicsocietyparen}{3233}
+\pdfglyphtounicode{ideographicspace}{3000}
+\pdfglyphtounicode{ideographicspecialparen}{3235}
+\pdfglyphtounicode{ideographicstockparen}{3231}
+\pdfglyphtounicode{ideographicstudyparen}{323B}
+\pdfglyphtounicode{ideographicsunparen}{3230}
+\pdfglyphtounicode{ideographicsuperviseparen}{323C}
+\pdfglyphtounicode{ideographicwaterparen}{322C}
+\pdfglyphtounicode{ideographicwoodparen}{322D}
+\pdfglyphtounicode{ideographiczero}{3007}
+\pdfglyphtounicode{ideographmetalcircle}{328E}
+\pdfglyphtounicode{ideographmooncircle}{328A}
+\pdfglyphtounicode{ideographnamecircle}{3294}
+\pdfglyphtounicode{ideographsuncircle}{3290}
+\pdfglyphtounicode{ideographwatercircle}{328C}
+\pdfglyphtounicode{ideographwoodcircle}{328D}
+\pdfglyphtounicode{ideva}{0907}
+\pdfglyphtounicode{idieresis}{00EF}
+\pdfglyphtounicode{idieresisacute}{1E2F}
+\pdfglyphtounicode{idieresiscyrillic}{04E5}
+\pdfglyphtounicode{idotbelow}{1ECB}
+\pdfglyphtounicode{iebrevecyrillic}{04D7}
+\pdfglyphtounicode{iecyrillic}{0435}
+\pdfglyphtounicode{ieungacirclekorean}{3275}
+\pdfglyphtounicode{ieungaparenkorean}{3215}
+\pdfglyphtounicode{ieungcirclekorean}{3267}
+\pdfglyphtounicode{ieungkorean}{3147}
+\pdfglyphtounicode{ieungparenkorean}{3207}
+\pdfglyphtounicode{igrave}{00EC}
+\pdfglyphtounicode{igujarati}{0A87}
+\pdfglyphtounicode{igurmukhi}{0A07}
+\pdfglyphtounicode{ihiragana}{3044}
+\pdfglyphtounicode{ihookabove}{1EC9}
+\pdfglyphtounicode{iibengali}{0988}
+\pdfglyphtounicode{iicyrillic}{0438}
+\pdfglyphtounicode{iideva}{0908}
+\pdfglyphtounicode{iigujarati}{0A88}
+\pdfglyphtounicode{iigurmukhi}{0A08}
+\pdfglyphtounicode{iimatragurmukhi}{0A40}
+\pdfglyphtounicode{iinvertedbreve}{020B}
+\pdfglyphtounicode{iishortcyrillic}{0439}
+\pdfglyphtounicode{iivowelsignbengali}{09C0}
+\pdfglyphtounicode{iivowelsigndeva}{0940}
+\pdfglyphtounicode{iivowelsigngujarati}{0AC0}
+\pdfglyphtounicode{ij}{0133}
+\pdfglyphtounicode{ikatakana}{30A4}
+\pdfglyphtounicode{ikatakanahalfwidth}{FF72}
+\pdfglyphtounicode{ikorean}{3163}
+\pdfglyphtounicode{ilde}{02DC}
+\pdfglyphtounicode{iluyhebrew}{05AC}
+\pdfglyphtounicode{imacron}{012B}
+\pdfglyphtounicode{imacroncyrillic}{04E3}
+\pdfglyphtounicode{imageorapproximatelyequal}{2253}
+\pdfglyphtounicode{imatragurmukhi}{0A3F}
+\pdfglyphtounicode{imonospace}{FF49}
+\pdfglyphtounicode{increment}{2206}
+\pdfglyphtounicode{infinity}{221E}
+\pdfglyphtounicode{iniarmenian}{056B}
+\pdfglyphtounicode{integerdivide}{2216}
+\pdfglyphtounicode{integral}{222B}
+\pdfglyphtounicode{integralbottom}{2321}
+\pdfglyphtounicode{integralbt}{2321}
+\pdfglyphtounicode{integralex}{F8F5}
+\pdfglyphtounicode{integraltop}{2320}
+\pdfglyphtounicode{integraltp}{2320}
+\pdfglyphtounicode{intercal}{22BA}
+\pdfglyphtounicode{interrobang}{203D}
+\pdfglyphtounicode{interrobangdown}{2E18}
+\pdfglyphtounicode{intersection}{2229}
+\pdfglyphtounicode{intersectiondbl}{22D2}
+\pdfglyphtounicode{intersectionsq}{2293}
+\pdfglyphtounicode{intisquare}{3305}
+\pdfglyphtounicode{invbullet}{25D8}
+\pdfglyphtounicode{invcircle}{25D9}
+\pdfglyphtounicode{invsmileface}{263B}
+\pdfglyphtounicode{iocyrillic}{0451}
+\pdfglyphtounicode{iogonek}{012F}
+\pdfglyphtounicode{iota}{03B9}
+\pdfglyphtounicode{iotadieresis}{03CA}
+\pdfglyphtounicode{iotadieresistonos}{0390}
+\pdfglyphtounicode{iotalatin}{0269}
+\pdfglyphtounicode{iotatonos}{03AF}
+\pdfglyphtounicode{iparen}{24A4}
+\pdfglyphtounicode{irigurmukhi}{0A72}
+\pdfglyphtounicode{ismallhiragana}{3043}
+\pdfglyphtounicode{ismallkatakana}{30A3}
+\pdfglyphtounicode{ismallkatakanahalfwidth}{FF68}
+\pdfglyphtounicode{issharbengali}{09FA}
+\pdfglyphtounicode{istroke}{0268}
+\pdfglyphtounicode{isuperior}{0069}
+\pdfglyphtounicode{iterationhiragana}{309D}
+\pdfglyphtounicode{iterationkatakana}{30FD}
+\pdfglyphtounicode{itilde}{0129}
+\pdfglyphtounicode{itildebelow}{1E2D}
+\pdfglyphtounicode{iubopomofo}{3129}
+\pdfglyphtounicode{iucyrillic}{044E}
+\pdfglyphtounicode{ivowelsignbengali}{09BF}
+\pdfglyphtounicode{ivowelsigndeva}{093F}
+\pdfglyphtounicode{ivowelsigngujarati}{0ABF}
+\pdfglyphtounicode{izhitsacyrillic}{0475}
+\pdfglyphtounicode{izhitsadblgravecyrillic}{0477}
+\pdfglyphtounicode{j}{006A}
+\pdfglyphtounicode{jaarmenian}{0571}
+\pdfglyphtounicode{jabengali}{099C}
+\pdfglyphtounicode{jadeva}{091C}
+\pdfglyphtounicode{jagujarati}{0A9C}
+\pdfglyphtounicode{jagurmukhi}{0A1C}
+\pdfglyphtounicode{jbopomofo}{3110}
+\pdfglyphtounicode{jcaron}{01F0}
+\pdfglyphtounicode{jcircle}{24D9}
+\pdfglyphtounicode{jcircumflex}{0135}
+\pdfglyphtounicode{jcrossedtail}{029D}
+\pdfglyphtounicode{jdotlessstroke}{025F}
+\pdfglyphtounicode{jecyrillic}{0458}
+\pdfglyphtounicode{jeemarabic}{062C}
+\pdfglyphtounicode{jeemfinalarabic}{FE9E}
+\pdfglyphtounicode{jeeminitialarabic}{FE9F}
+\pdfglyphtounicode{jeemmedialarabic}{FEA0}
+\pdfglyphtounicode{jeharabic}{0698}
+\pdfglyphtounicode{jehfinalarabic}{FB8B}
+\pdfglyphtounicode{jhabengali}{099D}
+\pdfglyphtounicode{jhadeva}{091D}
+\pdfglyphtounicode{jhagujarati}{0A9D}
+\pdfglyphtounicode{jhagurmukhi}{0A1D}
+\pdfglyphtounicode{jheharmenian}{057B}
+\pdfglyphtounicode{jis}{3004}
+\pdfglyphtounicode{jmonospace}{FF4A}
+\pdfglyphtounicode{jparen}{24A5}
+\pdfglyphtounicode{jsuperior}{02B2}
+\pdfglyphtounicode{k}{006B}
+\pdfglyphtounicode{kabashkircyrillic}{04A1}
+\pdfglyphtounicode{kabengali}{0995}
+\pdfglyphtounicode{kacute}{1E31}
+\pdfglyphtounicode{kacyrillic}{043A}
+\pdfglyphtounicode{kadescendercyrillic}{049B}
+\pdfglyphtounicode{kadeva}{0915}
+\pdfglyphtounicode{kaf}{05DB}
+\pdfglyphtounicode{kafarabic}{0643}
+\pdfglyphtounicode{kafdagesh}{FB3B}
+\pdfglyphtounicode{kafdageshhebrew}{FB3B}
+\pdfglyphtounicode{kaffinalarabic}{FEDA}
+\pdfglyphtounicode{kafhebrew}{05DB}
+\pdfglyphtounicode{kafinitialarabic}{FEDB}
+\pdfglyphtounicode{kafmedialarabic}{FEDC}
+\pdfglyphtounicode{kafrafehebrew}{FB4D}
+\pdfglyphtounicode{kagujarati}{0A95}
+\pdfglyphtounicode{kagurmukhi}{0A15}
+\pdfglyphtounicode{kahiragana}{304B}
+\pdfglyphtounicode{kahookcyrillic}{04C4}
+\pdfglyphtounicode{kakatakana}{30AB}
+\pdfglyphtounicode{kakatakanahalfwidth}{FF76}
+\pdfglyphtounicode{kappa}{03BA}
+\pdfglyphtounicode{kappasymbolgreek}{03F0}
+\pdfglyphtounicode{kapyeounmieumkorean}{3171}
+\pdfglyphtounicode{kapyeounphieuphkorean}{3184}
+\pdfglyphtounicode{kapyeounpieupkorean}{3178}
+\pdfglyphtounicode{kapyeounssangpieupkorean}{3179}
+\pdfglyphtounicode{karoriisquare}{330D}
+\pdfglyphtounicode{kashidaautoarabic}{0640}
+\pdfglyphtounicode{kashidaautonosidebearingarabic}{0640}
+\pdfglyphtounicode{kasmallkatakana}{30F5}
+\pdfglyphtounicode{kasquare}{3384}
+\pdfglyphtounicode{kasraarabic}{0650}
+\pdfglyphtounicode{kasratanarabic}{064D}
+\pdfglyphtounicode{kastrokecyrillic}{049F}
+\pdfglyphtounicode{katahiraprolongmarkhalfwidth}{FF70}
+\pdfglyphtounicode{kaverticalstrokecyrillic}{049D}
+\pdfglyphtounicode{kbopomofo}{310E}
+\pdfglyphtounicode{kcalsquare}{3389}
+\pdfglyphtounicode{kcaron}{01E9}
+\pdfglyphtounicode{kcedilla}{0137}
+\pdfglyphtounicode{kcircle}{24DA}
+\pdfglyphtounicode{kcommaaccent}{0137}
+\pdfglyphtounicode{kdotbelow}{1E33}
+\pdfglyphtounicode{keharmenian}{0584}
+\pdfglyphtounicode{kehiragana}{3051}
+\pdfglyphtounicode{kekatakana}{30B1}
+\pdfglyphtounicode{kekatakanahalfwidth}{FF79}
+\pdfglyphtounicode{kenarmenian}{056F}
+\pdfglyphtounicode{kesmallkatakana}{30F6}
+\pdfglyphtounicode{kgreenlandic}{0138}
+\pdfglyphtounicode{khabengali}{0996}
+\pdfglyphtounicode{khacyrillic}{0445}
+\pdfglyphtounicode{khadeva}{0916}
+\pdfglyphtounicode{khagujarati}{0A96}
+\pdfglyphtounicode{khagurmukhi}{0A16}
+\pdfglyphtounicode{khaharabic}{062E}
+\pdfglyphtounicode{khahfinalarabic}{FEA6}
+\pdfglyphtounicode{khahinitialarabic}{FEA7}
+\pdfglyphtounicode{khahmedialarabic}{FEA8}
+\pdfglyphtounicode{kheicoptic}{03E7}
+\pdfglyphtounicode{khhadeva}{0959}
+\pdfglyphtounicode{khhagurmukhi}{0A59}
+\pdfglyphtounicode{khieukhacirclekorean}{3278}
+\pdfglyphtounicode{khieukhaparenkorean}{3218}
+\pdfglyphtounicode{khieukhcirclekorean}{326A}
+\pdfglyphtounicode{khieukhkorean}{314B}
+\pdfglyphtounicode{khieukhparenkorean}{320A}
+\pdfglyphtounicode{khokhaithai}{0E02}
+\pdfglyphtounicode{khokhonthai}{0E05}
+\pdfglyphtounicode{khokhuatthai}{0E03}
+\pdfglyphtounicode{khokhwaithai}{0E04}
+\pdfglyphtounicode{khomutthai}{0E5B}
+\pdfglyphtounicode{khook}{0199}
+\pdfglyphtounicode{khorakhangthai}{0E06}
+\pdfglyphtounicode{khzsquare}{3391}
+\pdfglyphtounicode{kihiragana}{304D}
+\pdfglyphtounicode{kikatakana}{30AD}
+\pdfglyphtounicode{kikatakanahalfwidth}{FF77}
+\pdfglyphtounicode{kiroguramusquare}{3315}
+\pdfglyphtounicode{kiromeetorusquare}{3316}
+\pdfglyphtounicode{kirosquare}{3314}
+\pdfglyphtounicode{kiyeokacirclekorean}{326E}
+\pdfglyphtounicode{kiyeokaparenkorean}{320E}
+\pdfglyphtounicode{kiyeokcirclekorean}{3260}
+\pdfglyphtounicode{kiyeokkorean}{3131}
+\pdfglyphtounicode{kiyeokparenkorean}{3200}
+\pdfglyphtounicode{kiyeoksioskorean}{3133}
+\pdfglyphtounicode{kjecyrillic}{045C}
+\pdfglyphtounicode{klinebelow}{1E35}
+\pdfglyphtounicode{klsquare}{3398}
+\pdfglyphtounicode{kmcubedsquare}{33A6}
+\pdfglyphtounicode{kmonospace}{FF4B}
+\pdfglyphtounicode{kmsquaredsquare}{33A2}
+\pdfglyphtounicode{kohiragana}{3053}
+\pdfglyphtounicode{kohmsquare}{33C0}
+\pdfglyphtounicode{kokaithai}{0E01}
+\pdfglyphtounicode{kokatakana}{30B3}
+\pdfglyphtounicode{kokatakanahalfwidth}{FF7A}
+\pdfglyphtounicode{kooposquare}{331E}
+\pdfglyphtounicode{koppacyrillic}{0481}
+\pdfglyphtounicode{koreanstandardsymbol}{327F}
+\pdfglyphtounicode{koroniscmb}{0343}
+\pdfglyphtounicode{kparen}{24A6}
+\pdfglyphtounicode{kpasquare}{33AA}
+\pdfglyphtounicode{ksicyrillic}{046F}
+\pdfglyphtounicode{ktsquare}{33CF}
+\pdfglyphtounicode{kturned}{029E}
+\pdfglyphtounicode{kuhiragana}{304F}
+\pdfglyphtounicode{kukatakana}{30AF}
+\pdfglyphtounicode{kukatakanahalfwidth}{FF78}
+\pdfglyphtounicode{kvsquare}{33B8}
+\pdfglyphtounicode{kwsquare}{33BE}
+\pdfglyphtounicode{l}{006C}
+\pdfglyphtounicode{labengali}{09B2}
+\pdfglyphtounicode{lacute}{013A}
+\pdfglyphtounicode{ladeva}{0932}
+\pdfglyphtounicode{lagujarati}{0AB2}
+\pdfglyphtounicode{lagurmukhi}{0A32}
+\pdfglyphtounicode{lakkhangyaothai}{0E45}
+\pdfglyphtounicode{lamaleffinalarabic}{FEFC}
+\pdfglyphtounicode{lamalefhamzaabovefinalarabic}{FEF8}
+\pdfglyphtounicode{lamalefhamzaaboveisolatedarabic}{FEF7}
+\pdfglyphtounicode{lamalefhamzabelowfinalarabic}{FEFA}
+\pdfglyphtounicode{lamalefhamzabelowisolatedarabic}{FEF9}
+\pdfglyphtounicode{lamalefisolatedarabic}{FEFB}
+\pdfglyphtounicode{lamalefmaddaabovefinalarabic}{FEF6}
+\pdfglyphtounicode{lamalefmaddaaboveisolatedarabic}{FEF5}
+\pdfglyphtounicode{lamarabic}{0644}
+\pdfglyphtounicode{lambda}{03BB}
+\pdfglyphtounicode{lambdastroke}{019B}
+\pdfglyphtounicode{lamed}{05DC}
+\pdfglyphtounicode{lameddagesh}{FB3C}
+\pdfglyphtounicode{lameddageshhebrew}{FB3C}
+\pdfglyphtounicode{lamedhebrew}{05DC}
+\pdfglyphtounicode{lamedholam}{05DC 05B9}
+\pdfglyphtounicode{lamedholamdagesh}{05DC 05B9 05BC}
+\pdfglyphtounicode{lamedholamdageshhebrew}{05DC 05B9 05BC}
+\pdfglyphtounicode{lamedholamhebrew}{05DC 05B9}
+\pdfglyphtounicode{lamfinalarabic}{FEDE}
+\pdfglyphtounicode{lamhahinitialarabic}{FCCA}
+\pdfglyphtounicode{laminitialarabic}{FEDF}
+\pdfglyphtounicode{lamjeeminitialarabic}{FCC9}
+\pdfglyphtounicode{lamkhahinitialarabic}{FCCB}
+\pdfglyphtounicode{lamlamhehisolatedarabic}{FDF2}
+\pdfglyphtounicode{lammedialarabic}{FEE0}
+\pdfglyphtounicode{lammeemhahinitialarabic}{FD88}
+\pdfglyphtounicode{lammeeminitialarabic}{FCCC}
+\pdfglyphtounicode{lammeemjeeminitialarabic}{FEDF FEE4 FEA0}
+\pdfglyphtounicode{lammeemkhahinitialarabic}{FEDF FEE4 FEA8}
+\pdfglyphtounicode{largecircle}{25EF}
+\pdfglyphtounicode{latticetop}{22A4}
+\pdfglyphtounicode{lbar}{019A}
+\pdfglyphtounicode{lbelt}{026C}
+\pdfglyphtounicode{lbopomofo}{310C}
+\pdfglyphtounicode{lcaron}{013E}
+\pdfglyphtounicode{lcedilla}{013C}
+\pdfglyphtounicode{lcircle}{24DB}
+\pdfglyphtounicode{lcircumflexbelow}{1E3D}
+\pdfglyphtounicode{lcommaaccent}{013C}
+\pdfglyphtounicode{ldot}{0140}
+\pdfglyphtounicode{ldotaccent}{0140}
+\pdfglyphtounicode{ldotbelow}{1E37}
+\pdfglyphtounicode{ldotbelowmacron}{1E39}
+\pdfglyphtounicode{leftangleabovecmb}{031A}
+\pdfglyphtounicode{lefttackbelowcmb}{0318}
+\pdfglyphtounicode{less}{003C}
+\pdfglyphtounicode{lessdbleqlgreater}{2A8B}
+\pdfglyphtounicode{lessdblequal}{2266}
+\pdfglyphtounicode{lessdot}{22D6}
+\pdfglyphtounicode{lessequal}{2264}
+\pdfglyphtounicode{lessequalgreater}{22DA}
+\pdfglyphtounicode{lessequalorgreater}{22DA}
+\pdfglyphtounicode{lessmonospace}{FF1C}
+\pdfglyphtounicode{lessmuch}{226A}
+\pdfglyphtounicode{lessnotdblequal}{2A89}
+\pdfglyphtounicode{lessnotequal}{2A87}
+\pdfglyphtounicode{lessorapproxeql}{2A85}
+\pdfglyphtounicode{lessorequalslant}{2A7D}
+\pdfglyphtounicode{lessorequivalent}{2272}
+\pdfglyphtounicode{lessorgreater}{2276}
+\pdfglyphtounicode{lessornotdbleql}{2268}
+\pdfglyphtounicode{lessornotequal}{2268}
+\pdfglyphtounicode{lessorsimilar}{2272}
+\pdfglyphtounicode{lessoverequal}{2266}
+\pdfglyphtounicode{lesssmall}{FE64}
+\pdfglyphtounicode{lezh}{026E}
+\pdfglyphtounicode{lfblock}{258C}
+\pdfglyphtounicode{lhookretroflex}{026D}
+\pdfglyphtounicode{lira}{20A4}
+\pdfglyphtounicode{liwnarmenian}{056C}
+\pdfglyphtounicode{lj}{01C9}
+\pdfglyphtounicode{ljecyrillic}{0459}
+\pdfglyphtounicode{ll}{006C 006C}
+\pdfglyphtounicode{lladeva}{0933}
+\pdfglyphtounicode{llagujarati}{0AB3}
+\pdfglyphtounicode{llinebelow}{1E3B}
+\pdfglyphtounicode{llladeva}{0934}
+\pdfglyphtounicode{llvocalicbengali}{09E1}
+\pdfglyphtounicode{llvocalicdeva}{0961}
+\pdfglyphtounicode{llvocalicvowelsignbengali}{09E3}
+\pdfglyphtounicode{llvocalicvowelsigndeva}{0963}
+\pdfglyphtounicode{lmiddletilde}{026B}
+\pdfglyphtounicode{lmonospace}{FF4C}
+\pdfglyphtounicode{lmsquare}{33D0}
+\pdfglyphtounicode{lochulathai}{0E2C}
+\pdfglyphtounicode{logicaland}{2227}
+\pdfglyphtounicode{logicalnot}{00AC}
+\pdfglyphtounicode{logicalnotreversed}{2310}
+\pdfglyphtounicode{logicalor}{2228}
+\pdfglyphtounicode{lolingthai}{0E25}
+\pdfglyphtounicode{longdbls}{017F 017F}
+\pdfglyphtounicode{longs}{017F}
+\pdfglyphtounicode{longsh}{017F 0068}
+\pdfglyphtounicode{longsi}{017F 0069}
+\pdfglyphtounicode{longsl}{017F 006C}
+\pdfglyphtounicode{longst}{017F 0074}
+\pdfglyphtounicode{lowlinecenterline}{FE4E}
+\pdfglyphtounicode{lowlinecmb}{0332}
+\pdfglyphtounicode{lowlinedashed}{FE4D}
+\pdfglyphtounicode{lozenge}{25CA}
+\pdfglyphtounicode{lparen}{24A7}
+\pdfglyphtounicode{lscript}{2113}
+\pdfglyphtounicode{lslash}{0142}
+\pdfglyphtounicode{lsquare}{2113}
+\pdfglyphtounicode{lsuperior}{006C}
+\pdfglyphtounicode{ltshade}{2591}
+\pdfglyphtounicode{luthai}{0E26}
+\pdfglyphtounicode{lvocalicbengali}{098C}
+\pdfglyphtounicode{lvocalicdeva}{090C}
+\pdfglyphtounicode{lvocalicvowelsignbengali}{09E2}
+\pdfglyphtounicode{lvocalicvowelsigndeva}{0962}
+\pdfglyphtounicode{lxsquare}{33D3}
+\pdfglyphtounicode{m}{006D}
+\pdfglyphtounicode{mabengali}{09AE}
+\pdfglyphtounicode{macron}{00AF}
+\pdfglyphtounicode{macronbelowcmb}{0331}
+\pdfglyphtounicode{macroncmb}{0304}
+\pdfglyphtounicode{macronlowmod}{02CD}
+\pdfglyphtounicode{macronmonospace}{FFE3}
+\pdfglyphtounicode{macute}{1E3F}
+\pdfglyphtounicode{madeva}{092E}
+\pdfglyphtounicode{magujarati}{0AAE}
+\pdfglyphtounicode{magurmukhi}{0A2E}
+\pdfglyphtounicode{mahapakhhebrew}{05A4}
+\pdfglyphtounicode{mahapakhlefthebrew}{05A4}
+\pdfglyphtounicode{mahiragana}{307E}
+\pdfglyphtounicode{maichattawalowleftthai}{F895}
+\pdfglyphtounicode{maichattawalowrightthai}{F894}
+\pdfglyphtounicode{maichattawathai}{0E4B}
+\pdfglyphtounicode{maichattawaupperleftthai}{F893}
+\pdfglyphtounicode{maieklowleftthai}{F88C}
+\pdfglyphtounicode{maieklowrightthai}{F88B}
+\pdfglyphtounicode{maiekthai}{0E48}
+\pdfglyphtounicode{maiekupperleftthai}{F88A}
+\pdfglyphtounicode{maihanakatleftthai}{F884}
+\pdfglyphtounicode{maihanakatthai}{0E31}
+\pdfglyphtounicode{maitaikhuleftthai}{F889}
+\pdfglyphtounicode{maitaikhuthai}{0E47}
+\pdfglyphtounicode{maitholowleftthai}{F88F}
+\pdfglyphtounicode{maitholowrightthai}{F88E}
+\pdfglyphtounicode{maithothai}{0E49}
+\pdfglyphtounicode{maithoupperleftthai}{F88D}
+\pdfglyphtounicode{maitrilowleftthai}{F892}
+\pdfglyphtounicode{maitrilowrightthai}{F891}
+\pdfglyphtounicode{maitrithai}{0E4A}
+\pdfglyphtounicode{maitriupperleftthai}{F890}
+\pdfglyphtounicode{maiyamokthai}{0E46}
+\pdfglyphtounicode{makatakana}{30DE}
+\pdfglyphtounicode{makatakanahalfwidth}{FF8F}
+\pdfglyphtounicode{male}{2642}
+\pdfglyphtounicode{maltesecross}{2720}
+\pdfglyphtounicode{mansyonsquare}{3347}
+\pdfglyphtounicode{maqafhebrew}{05BE}
+\pdfglyphtounicode{mars}{2642}
+\pdfglyphtounicode{masoracirclehebrew}{05AF}
+\pdfglyphtounicode{masquare}{3383}
+\pdfglyphtounicode{mbopomofo}{3107}
+\pdfglyphtounicode{mbsquare}{33D4}
+\pdfglyphtounicode{mcircle}{24DC}
+\pdfglyphtounicode{mcubedsquare}{33A5}
+\pdfglyphtounicode{mdotaccent}{1E41}
+\pdfglyphtounicode{mdotbelow}{1E43}
+\pdfglyphtounicode{measuredangle}{2221}
+\pdfglyphtounicode{meemarabic}{0645}
+\pdfglyphtounicode{meemfinalarabic}{FEE2}
+\pdfglyphtounicode{meeminitialarabic}{FEE3}
+\pdfglyphtounicode{meemmedialarabic}{FEE4}
+\pdfglyphtounicode{meemmeeminitialarabic}{FCD1}
+\pdfglyphtounicode{meemmeemisolatedarabic}{FC48}
+\pdfglyphtounicode{meetorusquare}{334D}
+\pdfglyphtounicode{mehiragana}{3081}
+\pdfglyphtounicode{meizierasquare}{337E}
+\pdfglyphtounicode{mekatakana}{30E1}
+\pdfglyphtounicode{mekatakanahalfwidth}{FF92}
+\pdfglyphtounicode{mem}{05DE}
+\pdfglyphtounicode{memdagesh}{FB3E}
+\pdfglyphtounicode{memdageshhebrew}{FB3E}
+\pdfglyphtounicode{memhebrew}{05DE}
+\pdfglyphtounicode{menarmenian}{0574}
+\pdfglyphtounicode{merkhahebrew}{05A5}
+\pdfglyphtounicode{merkhakefulahebrew}{05A6}
+\pdfglyphtounicode{merkhakefulalefthebrew}{05A6}
+\pdfglyphtounicode{merkhalefthebrew}{05A5}
+\pdfglyphtounicode{mhook}{0271}
+\pdfglyphtounicode{mhzsquare}{3392}
+\pdfglyphtounicode{middledotkatakanahalfwidth}{FF65}
+\pdfglyphtounicode{middot}{00B7}
+\pdfglyphtounicode{mieumacirclekorean}{3272}
+\pdfglyphtounicode{mieumaparenkorean}{3212}
+\pdfglyphtounicode{mieumcirclekorean}{3264}
+\pdfglyphtounicode{mieumkorean}{3141}
+\pdfglyphtounicode{mieumpansioskorean}{3170}
+\pdfglyphtounicode{mieumparenkorean}{3204}
+\pdfglyphtounicode{mieumpieupkorean}{316E}
+\pdfglyphtounicode{mieumsioskorean}{316F}
+\pdfglyphtounicode{mihiragana}{307F}
+\pdfglyphtounicode{mikatakana}{30DF}
+\pdfglyphtounicode{mikatakanahalfwidth}{FF90}
+\pdfglyphtounicode{minus}{2212}
+\pdfglyphtounicode{minusbelowcmb}{0320}
+\pdfglyphtounicode{minuscircle}{2296}
+\pdfglyphtounicode{minusmod}{02D7}
+\pdfglyphtounicode{minusplus}{2213}
+\pdfglyphtounicode{minute}{2032}
+\pdfglyphtounicode{miribaarusquare}{334A}
+\pdfglyphtounicode{mirisquare}{3349}
+\pdfglyphtounicode{mlonglegturned}{0270}
+\pdfglyphtounicode{mlsquare}{3396}
+\pdfglyphtounicode{mmcubedsquare}{33A3}
+\pdfglyphtounicode{mmonospace}{FF4D}
+\pdfglyphtounicode{mmsquaredsquare}{339F}
+\pdfglyphtounicode{mohiragana}{3082}
+\pdfglyphtounicode{mohmsquare}{33C1}
+\pdfglyphtounicode{mokatakana}{30E2}
+\pdfglyphtounicode{mokatakanahalfwidth}{FF93}
+\pdfglyphtounicode{molsquare}{33D6}
+\pdfglyphtounicode{momathai}{0E21}
+\pdfglyphtounicode{moverssquare}{33A7}
+\pdfglyphtounicode{moverssquaredsquare}{33A8}
+\pdfglyphtounicode{mparen}{24A8}
+\pdfglyphtounicode{mpasquare}{33AB}
+\pdfglyphtounicode{mssquare}{33B3}
+\pdfglyphtounicode{msuperior}{006D}
+\pdfglyphtounicode{mturned}{026F}
+\pdfglyphtounicode{mu}{00B5}
+\pdfglyphtounicode{mu1}{00B5}
+\pdfglyphtounicode{muasquare}{3382}
+\pdfglyphtounicode{muchgreater}{226B}
+\pdfglyphtounicode{muchless}{226A}
+\pdfglyphtounicode{mufsquare}{338C}
+\pdfglyphtounicode{mugreek}{03BC}
+\pdfglyphtounicode{mugsquare}{338D}
+\pdfglyphtounicode{muhiragana}{3080}
+\pdfglyphtounicode{mukatakana}{30E0}
+\pdfglyphtounicode{mukatakanahalfwidth}{FF91}
+\pdfglyphtounicode{mulsquare}{3395}
+\pdfglyphtounicode{multicloseleft}{22C9}
+\pdfglyphtounicode{multicloseright}{22CA}
+\pdfglyphtounicode{multimap}{22B8}
+\pdfglyphtounicode{multiopenleft}{22CB}
+\pdfglyphtounicode{multiopenright}{22CC}
+\pdfglyphtounicode{multiply}{00D7}
+\pdfglyphtounicode{mumsquare}{339B}
+\pdfglyphtounicode{munahhebrew}{05A3}
+\pdfglyphtounicode{munahlefthebrew}{05A3}
+\pdfglyphtounicode{musicalnote}{266A}
+\pdfglyphtounicode{musicalnotedbl}{266B}
+\pdfglyphtounicode{musicflatsign}{266D}
+\pdfglyphtounicode{musicsharpsign}{266F}
+\pdfglyphtounicode{mussquare}{33B2}
+\pdfglyphtounicode{muvsquare}{33B6}
+\pdfglyphtounicode{muwsquare}{33BC}
+\pdfglyphtounicode{mvmegasquare}{33B9}
+\pdfglyphtounicode{mvsquare}{33B7}
+\pdfglyphtounicode{mwmegasquare}{33BF}
+\pdfglyphtounicode{mwsquare}{33BD}
+\pdfglyphtounicode{n}{006E}
+\pdfglyphtounicode{nabengali}{09A8}
+\pdfglyphtounicode{nabla}{2207}
+\pdfglyphtounicode{nacute}{0144}
+\pdfglyphtounicode{nadeva}{0928}
+\pdfglyphtounicode{nagujarati}{0AA8}
+\pdfglyphtounicode{nagurmukhi}{0A28}
+\pdfglyphtounicode{nahiragana}{306A}
+\pdfglyphtounicode{nakatakana}{30CA}
+\pdfglyphtounicode{nakatakanahalfwidth}{FF85}
+\pdfglyphtounicode{nand}{22BC}
+\pdfglyphtounicode{napostrophe}{0149}
+\pdfglyphtounicode{nasquare}{3381}
+\pdfglyphtounicode{natural}{266E}
+\pdfglyphtounicode{nbopomofo}{310B}
+\pdfglyphtounicode{nbspace}{00A0}
+\pdfglyphtounicode{ncaron}{0148}
+\pdfglyphtounicode{ncedilla}{0146}
+\pdfglyphtounicode{ncircle}{24DD}
+\pdfglyphtounicode{ncircumflexbelow}{1E4B}
+\pdfglyphtounicode{ncommaaccent}{0146}
+\pdfglyphtounicode{ndotaccent}{1E45}
+\pdfglyphtounicode{ndotbelow}{1E47}
+\pdfglyphtounicode{negationslash}{0338}
+\pdfglyphtounicode{nehiragana}{306D}
+\pdfglyphtounicode{nekatakana}{30CD}
+\pdfglyphtounicode{nekatakanahalfwidth}{FF88}
+\pdfglyphtounicode{newsheqelsign}{20AA}
+\pdfglyphtounicode{nfsquare}{338B}
+\pdfglyphtounicode{ng}{014B}
+\pdfglyphtounicode{ngabengali}{0999}
+\pdfglyphtounicode{ngadeva}{0919}
+\pdfglyphtounicode{ngagujarati}{0A99}
+\pdfglyphtounicode{ngagurmukhi}{0A19}
+\pdfglyphtounicode{ngonguthai}{0E07}
+\pdfglyphtounicode{nhiragana}{3093}
+\pdfglyphtounicode{nhookleft}{0272}
+\pdfglyphtounicode{nhookretroflex}{0273}
+\pdfglyphtounicode{nieunacirclekorean}{326F}
+\pdfglyphtounicode{nieunaparenkorean}{320F}
+\pdfglyphtounicode{nieuncieuckorean}{3135}
+\pdfglyphtounicode{nieuncirclekorean}{3261}
+\pdfglyphtounicode{nieunhieuhkorean}{3136}
+\pdfglyphtounicode{nieunkorean}{3134}
+\pdfglyphtounicode{nieunpansioskorean}{3168}
+\pdfglyphtounicode{nieunparenkorean}{3201}
+\pdfglyphtounicode{nieunsioskorean}{3167}
+\pdfglyphtounicode{nieuntikeutkorean}{3166}
+\pdfglyphtounicode{nihiragana}{306B}
+\pdfglyphtounicode{nikatakana}{30CB}
+\pdfglyphtounicode{nikatakanahalfwidth}{FF86}
+\pdfglyphtounicode{nikhahitleftthai}{F899}
+\pdfglyphtounicode{nikhahitthai}{0E4D}
+\pdfglyphtounicode{nine}{0039}
+\pdfglyphtounicode{ninearabic}{0669}
+\pdfglyphtounicode{ninebengali}{09EF}
+\pdfglyphtounicode{ninecircle}{2468}
+\pdfglyphtounicode{ninecircleinversesansserif}{2792}
+\pdfglyphtounicode{ninedeva}{096F}
+\pdfglyphtounicode{ninegujarati}{0AEF}
+\pdfglyphtounicode{ninegurmukhi}{0A6F}
+\pdfglyphtounicode{ninehackarabic}{0669}
+\pdfglyphtounicode{ninehangzhou}{3029}
+\pdfglyphtounicode{nineideographicparen}{3228}
+\pdfglyphtounicode{nineinferior}{2089}
+\pdfglyphtounicode{ninemonospace}{FF19}
+\pdfglyphtounicode{nineoldstyle}{0039}
+\pdfglyphtounicode{nineparen}{247C}
+\pdfglyphtounicode{nineperiod}{2490}
+\pdfglyphtounicode{ninepersian}{06F9}
+\pdfglyphtounicode{nineroman}{2178}
+\pdfglyphtounicode{ninesuperior}{2079}
+\pdfglyphtounicode{nineteencircle}{2472}
+\pdfglyphtounicode{nineteenparen}{2486}
+\pdfglyphtounicode{nineteenperiod}{249A}
+\pdfglyphtounicode{ninethai}{0E59}
+\pdfglyphtounicode{nj}{01CC}
+\pdfglyphtounicode{njecyrillic}{045A}
+\pdfglyphtounicode{nkatakana}{30F3}
+\pdfglyphtounicode{nkatakanahalfwidth}{FF9D}
+\pdfglyphtounicode{nlegrightlong}{019E}
+\pdfglyphtounicode{nlinebelow}{1E49}
+\pdfglyphtounicode{nmonospace}{FF4E}
+\pdfglyphtounicode{nmsquare}{339A}
+\pdfglyphtounicode{nnabengali}{09A3}
+\pdfglyphtounicode{nnadeva}{0923}
+\pdfglyphtounicode{nnagujarati}{0AA3}
+\pdfglyphtounicode{nnagurmukhi}{0A23}
+\pdfglyphtounicode{nnnadeva}{0929}
+\pdfglyphtounicode{nohiragana}{306E}
+\pdfglyphtounicode{nokatakana}{30CE}
+\pdfglyphtounicode{nokatakanahalfwidth}{FF89}
+\pdfglyphtounicode{nonbreakingspace}{00A0}
+\pdfglyphtounicode{nonenthai}{0E13}
+\pdfglyphtounicode{nonuthai}{0E19}
+\pdfglyphtounicode{noonarabic}{0646}
+\pdfglyphtounicode{noonfinalarabic}{FEE6}
+\pdfglyphtounicode{noonghunnaarabic}{06BA}
+\pdfglyphtounicode{noonghunnafinalarabic}{FB9F}
+\pdfglyphtounicode{noonhehinitialarabic}{FEE7 FEEC}
+\pdfglyphtounicode{nooninitialarabic}{FEE7}
+\pdfglyphtounicode{noonjeeminitialarabic}{FCD2}
+\pdfglyphtounicode{noonjeemisolatedarabic}{FC4B}
+\pdfglyphtounicode{noonmedialarabic}{FEE8}
+\pdfglyphtounicode{noonmeeminitialarabic}{FCD5}
+\pdfglyphtounicode{noonmeemisolatedarabic}{FC4E}
+\pdfglyphtounicode{noonnoonfinalarabic}{FC8D}
+\pdfglyphtounicode{notapproxequal}{2247}
+\pdfglyphtounicode{notarrowboth}{21AE}
+\pdfglyphtounicode{notarrowleft}{219A}
+\pdfglyphtounicode{notarrowright}{219B}
+\pdfglyphtounicode{notbar}{2224}
+\pdfglyphtounicode{notcontains}{220C}
+\pdfglyphtounicode{notdblarrowboth}{21CE}
+\pdfglyphtounicode{notdblarrowleft}{21CD}
+\pdfglyphtounicode{notdblarrowright}{21CF}
+\pdfglyphtounicode{notelement}{2209}
+\pdfglyphtounicode{notelementof}{2209}
+\pdfglyphtounicode{notequal}{2260}
+\pdfglyphtounicode{notexistential}{2204}
+\pdfglyphtounicode{notfollows}{2281}
+\pdfglyphtounicode{notfollowsoreql}{2AB0 0338}
+\pdfglyphtounicode{notforces}{22AE}
+\pdfglyphtounicode{notforcesextra}{22AF}
+\pdfglyphtounicode{notgreater}{226F}
+\pdfglyphtounicode{notgreaterdblequal}{2267 0338}
+\pdfglyphtounicode{notgreaterequal}{2271}
+\pdfglyphtounicode{notgreaternorequal}{2271}
+\pdfglyphtounicode{notgreaternorless}{2279}
+\pdfglyphtounicode{notgreaterorslnteql}{2A7E 0338}
+\pdfglyphtounicode{notidentical}{2262}
+\pdfglyphtounicode{notless}{226E}
+\pdfglyphtounicode{notlessdblequal}{2266 0338}
+\pdfglyphtounicode{notlessequal}{2270}
+\pdfglyphtounicode{notlessnorequal}{2270}
+\pdfglyphtounicode{notlessorslnteql}{2A7D 0338}
+\pdfglyphtounicode{notparallel}{2226}
+\pdfglyphtounicode{notprecedes}{2280}
+\pdfglyphtounicode{notprecedesoreql}{2AAF 0338}
+\pdfglyphtounicode{notsatisfies}{22AD}
+\pdfglyphtounicode{notsimilar}{2241}
+\pdfglyphtounicode{notsubset}{2284}
+\pdfglyphtounicode{notsubseteql}{2288}
+\pdfglyphtounicode{notsubsetordbleql}{2AC5 0338}
+\pdfglyphtounicode{notsubsetoreql}{228A}
+\pdfglyphtounicode{notsucceeds}{2281}
+\pdfglyphtounicode{notsuperset}{2285}
+\pdfglyphtounicode{notsuperseteql}{2289}
+\pdfglyphtounicode{notsupersetordbleql}{2AC6 0338}
+\pdfglyphtounicode{notsupersetoreql}{228B}
+\pdfglyphtounicode{nottriangeqlleft}{22EC}
+\pdfglyphtounicode{nottriangeqlright}{22ED}
+\pdfglyphtounicode{nottriangleleft}{22EA}
+\pdfglyphtounicode{nottriangleright}{22EB}
+\pdfglyphtounicode{notturnstile}{22AC}
+\pdfglyphtounicode{nowarmenian}{0576}
+\pdfglyphtounicode{nparen}{24A9}
+\pdfglyphtounicode{nssquare}{33B1}
+\pdfglyphtounicode{nsuperior}{207F}
+\pdfglyphtounicode{ntilde}{00F1}
+\pdfglyphtounicode{nu}{03BD}
+\pdfglyphtounicode{nuhiragana}{306C}
+\pdfglyphtounicode{nukatakana}{30CC}
+\pdfglyphtounicode{nukatakanahalfwidth}{FF87}
+\pdfglyphtounicode{nuktabengali}{09BC}
+\pdfglyphtounicode{nuktadeva}{093C}
+\pdfglyphtounicode{nuktagujarati}{0ABC}
+\pdfglyphtounicode{nuktagurmukhi}{0A3C}
+\pdfglyphtounicode{numbersign}{0023}
+\pdfglyphtounicode{numbersignmonospace}{FF03}
+\pdfglyphtounicode{numbersignsmall}{FE5F}
+\pdfglyphtounicode{numeralsigngreek}{0374}
+\pdfglyphtounicode{numeralsignlowergreek}{0375}
+\pdfglyphtounicode{numero}{2116}
+\pdfglyphtounicode{nun}{05E0}
+\pdfglyphtounicode{nundagesh}{FB40}
+\pdfglyphtounicode{nundageshhebrew}{FB40}
+\pdfglyphtounicode{nunhebrew}{05E0}
+\pdfglyphtounicode{nvsquare}{33B5}
+\pdfglyphtounicode{nwsquare}{33BB}
+\pdfglyphtounicode{nyabengali}{099E}
+\pdfglyphtounicode{nyadeva}{091E}
+\pdfglyphtounicode{nyagujarati}{0A9E}
+\pdfglyphtounicode{nyagurmukhi}{0A1E}
+\pdfglyphtounicode{o}{006F}
+\pdfglyphtounicode{oacute}{00F3}
+\pdfglyphtounicode{oangthai}{0E2D}
+\pdfglyphtounicode{obarred}{0275}
+\pdfglyphtounicode{obarredcyrillic}{04E9}
+\pdfglyphtounicode{obarreddieresiscyrillic}{04EB}
+\pdfglyphtounicode{obengali}{0993}
+\pdfglyphtounicode{obopomofo}{311B}
+\pdfglyphtounicode{obreve}{014F}
+\pdfglyphtounicode{ocandradeva}{0911}
+\pdfglyphtounicode{ocandragujarati}{0A91}
+\pdfglyphtounicode{ocandravowelsigndeva}{0949}
+\pdfglyphtounicode{ocandravowelsigngujarati}{0AC9}
+\pdfglyphtounicode{ocaron}{01D2}
+\pdfglyphtounicode{ocircle}{24DE}
+\pdfglyphtounicode{ocircumflex}{00F4}
+\pdfglyphtounicode{ocircumflexacute}{1ED1}
+\pdfglyphtounicode{ocircumflexdotbelow}{1ED9}
+\pdfglyphtounicode{ocircumflexgrave}{1ED3}
+\pdfglyphtounicode{ocircumflexhookabove}{1ED5}
+\pdfglyphtounicode{ocircumflextilde}{1ED7}
+\pdfglyphtounicode{ocyrillic}{043E}
+\pdfglyphtounicode{odblacute}{0151}
+\pdfglyphtounicode{odblgrave}{020D}
+\pdfglyphtounicode{odeva}{0913}
+\pdfglyphtounicode{odieresis}{00F6}
+\pdfglyphtounicode{odieresiscyrillic}{04E7}
+\pdfglyphtounicode{odotbelow}{1ECD}
+\pdfglyphtounicode{oe}{0153}
+\pdfglyphtounicode{oekorean}{315A}
+\pdfglyphtounicode{ogonek}{02DB}
+\pdfglyphtounicode{ogonekcmb}{0328}
+\pdfglyphtounicode{ograve}{00F2}
+\pdfglyphtounicode{ogujarati}{0A93}
+\pdfglyphtounicode{oharmenian}{0585}
+\pdfglyphtounicode{ohiragana}{304A}
+\pdfglyphtounicode{ohookabove}{1ECF}
+\pdfglyphtounicode{ohorn}{01A1}
+\pdfglyphtounicode{ohornacute}{1EDB}
+\pdfglyphtounicode{ohorndotbelow}{1EE3}
+\pdfglyphtounicode{ohorngrave}{1EDD}
+\pdfglyphtounicode{ohornhookabove}{1EDF}
+\pdfglyphtounicode{ohorntilde}{1EE1}
+\pdfglyphtounicode{ohungarumlaut}{0151}
+\pdfglyphtounicode{oi}{01A3}
+\pdfglyphtounicode{oinvertedbreve}{020F}
+\pdfglyphtounicode{okatakana}{30AA}
+\pdfglyphtounicode{okatakanahalfwidth}{FF75}
+\pdfglyphtounicode{okorean}{3157}
+\pdfglyphtounicode{olehebrew}{05AB}
+\pdfglyphtounicode{omacron}{014D}
+\pdfglyphtounicode{omacronacute}{1E53}
+\pdfglyphtounicode{omacrongrave}{1E51}
+\pdfglyphtounicode{omdeva}{0950}
+\pdfglyphtounicode{omega}{03C9}
+\pdfglyphtounicode{omega1}{03D6}
+\pdfglyphtounicode{omegacyrillic}{0461}
+\pdfglyphtounicode{omegalatinclosed}{0277}
+\pdfglyphtounicode{omegaroundcyrillic}{047B}
+\pdfglyphtounicode{omegatitlocyrillic}{047D}
+\pdfglyphtounicode{omegatonos}{03CE}
+\pdfglyphtounicode{omgujarati}{0AD0}
+\pdfglyphtounicode{omicron}{03BF}
+\pdfglyphtounicode{omicrontonos}{03CC}
+\pdfglyphtounicode{omonospace}{FF4F}
+\pdfglyphtounicode{one}{0031}
+\pdfglyphtounicode{onearabic}{0661}
+\pdfglyphtounicode{onebengali}{09E7}
+\pdfglyphtounicode{onecircle}{2460}
+\pdfglyphtounicode{onecircleinversesansserif}{278A}
+\pdfglyphtounicode{onedeva}{0967}
+\pdfglyphtounicode{onedotenleader}{2024}
+\pdfglyphtounicode{oneeighth}{215B}
+\pdfglyphtounicode{onefitted}{0031}
+\pdfglyphtounicode{onegujarati}{0AE7}
+\pdfglyphtounicode{onegurmukhi}{0A67}
+\pdfglyphtounicode{onehackarabic}{0661}
+\pdfglyphtounicode{onehalf}{00BD}
+\pdfglyphtounicode{onehangzhou}{3021}
+\pdfglyphtounicode{oneideographicparen}{3220}
+\pdfglyphtounicode{oneinferior}{2081}
+\pdfglyphtounicode{onemonospace}{FF11}
+\pdfglyphtounicode{onenumeratorbengali}{09F4}
+\pdfglyphtounicode{oneoldstyle}{0031}
+\pdfglyphtounicode{oneparen}{2474}
+\pdfglyphtounicode{oneperiod}{2488}
+\pdfglyphtounicode{onepersian}{06F1}
+\pdfglyphtounicode{onequarter}{00BC}
+\pdfglyphtounicode{oneroman}{2170}
+\pdfglyphtounicode{onesuperior}{00B9}
+\pdfglyphtounicode{onethai}{0E51}
+\pdfglyphtounicode{onethird}{2153}
+\pdfglyphtounicode{oogonek}{01EB}
+\pdfglyphtounicode{oogonekmacron}{01ED}
+\pdfglyphtounicode{oogurmukhi}{0A13}
+\pdfglyphtounicode{oomatragurmukhi}{0A4B}
+\pdfglyphtounicode{oopen}{0254}
+\pdfglyphtounicode{oparen}{24AA}
+\pdfglyphtounicode{openbullet}{25E6}
+\pdfglyphtounicode{option}{2325}
+\pdfglyphtounicode{ordfeminine}{00AA}
+\pdfglyphtounicode{ordmasculine}{00BA}
+\pdfglyphtounicode{orthogonal}{221F}
+\pdfglyphtounicode{orunderscore}{22BB}
+\pdfglyphtounicode{oshortdeva}{0912}
+\pdfglyphtounicode{oshortvowelsigndeva}{094A}
+\pdfglyphtounicode{oslash}{00F8}
+\pdfglyphtounicode{oslashacute}{01FF}
+\pdfglyphtounicode{osmallhiragana}{3049}
+\pdfglyphtounicode{osmallkatakana}{30A9}
+\pdfglyphtounicode{osmallkatakanahalfwidth}{FF6B}
+\pdfglyphtounicode{ostrokeacute}{01FF}
+\pdfglyphtounicode{osuperior}{006F}
+\pdfglyphtounicode{otcyrillic}{047F}
+\pdfglyphtounicode{otilde}{00F5}
+\pdfglyphtounicode{otildeacute}{1E4D}
+\pdfglyphtounicode{otildedieresis}{1E4F}
+\pdfglyphtounicode{oubopomofo}{3121}
+\pdfglyphtounicode{overline}{203E}
+\pdfglyphtounicode{overlinecenterline}{FE4A}
+\pdfglyphtounicode{overlinecmb}{0305}
+\pdfglyphtounicode{overlinedashed}{FE49}
+\pdfglyphtounicode{overlinedblwavy}{FE4C}
+\pdfglyphtounicode{overlinewavy}{FE4B}
+\pdfglyphtounicode{overscore}{00AF}
+\pdfglyphtounicode{ovowelsignbengali}{09CB}
+\pdfglyphtounicode{ovowelsigndeva}{094B}
+\pdfglyphtounicode{ovowelsigngujarati}{0ACB}
+\pdfglyphtounicode{owner}{220B}
+\pdfglyphtounicode{p}{0070}
+\pdfglyphtounicode{paampssquare}{3380}
+\pdfglyphtounicode{paasentosquare}{332B}
+\pdfglyphtounicode{pabengali}{09AA}
+\pdfglyphtounicode{pacute}{1E55}
+\pdfglyphtounicode{padeva}{092A}
+\pdfglyphtounicode{pagedown}{21DF}
+\pdfglyphtounicode{pageup}{21DE}
+\pdfglyphtounicode{pagujarati}{0AAA}
+\pdfglyphtounicode{pagurmukhi}{0A2A}
+\pdfglyphtounicode{pahiragana}{3071}
+\pdfglyphtounicode{paiyannoithai}{0E2F}
+\pdfglyphtounicode{pakatakana}{30D1}
+\pdfglyphtounicode{palatalizationcyrilliccmb}{0484}
+\pdfglyphtounicode{palochkacyrillic}{04C0}
+\pdfglyphtounicode{pansioskorean}{317F}
+\pdfglyphtounicode{paragraph}{00B6}
+\pdfglyphtounicode{parallel}{2225}
+\pdfglyphtounicode{parenleft}{0028}
+\pdfglyphtounicode{parenleftaltonearabic}{FD3E}
+\pdfglyphtounicode{parenleftbt}{F8ED}
+\pdfglyphtounicode{parenleftex}{F8EC}
+\pdfglyphtounicode{parenleftinferior}{208D}
+\pdfglyphtounicode{parenleftmonospace}{FF08}
+\pdfglyphtounicode{parenleftsmall}{FE59}
+\pdfglyphtounicode{parenleftsuperior}{207D}
+\pdfglyphtounicode{parenlefttp}{F8EB}
+\pdfglyphtounicode{parenleftvertical}{FE35}
+\pdfglyphtounicode{parenright}{0029}
+\pdfglyphtounicode{parenrightaltonearabic}{FD3F}
+\pdfglyphtounicode{parenrightbt}{F8F8}
+\pdfglyphtounicode{parenrightex}{F8F7}
+\pdfglyphtounicode{parenrightinferior}{208E}
+\pdfglyphtounicode{parenrightmonospace}{FF09}
+\pdfglyphtounicode{parenrightsmall}{FE5A}
+\pdfglyphtounicode{parenrightsuperior}{207E}
+\pdfglyphtounicode{parenrighttp}{F8F6}
+\pdfglyphtounicode{parenrightvertical}{FE36}
+\pdfglyphtounicode{partialdiff}{2202}
+\pdfglyphtounicode{paseqhebrew}{05C0}
+\pdfglyphtounicode{pashtahebrew}{0599}
+\pdfglyphtounicode{pasquare}{33A9}
+\pdfglyphtounicode{patah}{05B7}
+\pdfglyphtounicode{patah11}{05B7}
+\pdfglyphtounicode{patah1d}{05B7}
+\pdfglyphtounicode{patah2a}{05B7}
+\pdfglyphtounicode{patahhebrew}{05B7}
+\pdfglyphtounicode{patahnarrowhebrew}{05B7}
+\pdfglyphtounicode{patahquarterhebrew}{05B7}
+\pdfglyphtounicode{patahwidehebrew}{05B7}
+\pdfglyphtounicode{pazerhebrew}{05A1}
+\pdfglyphtounicode{pbopomofo}{3106}
+\pdfglyphtounicode{pcircle}{24DF}
+\pdfglyphtounicode{pdotaccent}{1E57}
+\pdfglyphtounicode{pe}{05E4}
+\pdfglyphtounicode{pecyrillic}{043F}
+\pdfglyphtounicode{pedagesh}{FB44}
+\pdfglyphtounicode{pedageshhebrew}{FB44}
+\pdfglyphtounicode{peezisquare}{333B}
+\pdfglyphtounicode{pefinaldageshhebrew}{FB43}
+\pdfglyphtounicode{peharabic}{067E}
+\pdfglyphtounicode{peharmenian}{057A}
+\pdfglyphtounicode{pehebrew}{05E4}
+\pdfglyphtounicode{pehfinalarabic}{FB57}
+\pdfglyphtounicode{pehinitialarabic}{FB58}
+\pdfglyphtounicode{pehiragana}{307A}
+\pdfglyphtounicode{pehmedialarabic}{FB59}
+\pdfglyphtounicode{pekatakana}{30DA}
+\pdfglyphtounicode{pemiddlehookcyrillic}{04A7}
+\pdfglyphtounicode{perafehebrew}{FB4E}
+\pdfglyphtounicode{percent}{0025}
+\pdfglyphtounicode{percentarabic}{066A}
+\pdfglyphtounicode{percentmonospace}{FF05}
+\pdfglyphtounicode{percentsmall}{FE6A}
+\pdfglyphtounicode{period}{002E}
+\pdfglyphtounicode{periodarmenian}{0589}
+\pdfglyphtounicode{periodcentered}{00B7}
+\pdfglyphtounicode{periodhalfwidth}{FF61}
+\pdfglyphtounicode{periodinferior}{002E}
+\pdfglyphtounicode{periodmonospace}{FF0E}
+\pdfglyphtounicode{periodsmall}{FE52}
+\pdfglyphtounicode{periodsuperior}{002E}
+\pdfglyphtounicode{perispomenigreekcmb}{0342}
+\pdfglyphtounicode{perpcorrespond}{2A5E}
+\pdfglyphtounicode{perpendicular}{22A5}
+\pdfglyphtounicode{pertenthousand}{2031}
+\pdfglyphtounicode{perthousand}{2030}
+\pdfglyphtounicode{peseta}{20A7}
+\pdfglyphtounicode{pfsquare}{338A}
+\pdfglyphtounicode{phabengali}{09AB}
+\pdfglyphtounicode{phadeva}{092B}
+\pdfglyphtounicode{phagujarati}{0AAB}
+\pdfglyphtounicode{phagurmukhi}{0A2B}
+\pdfglyphtounicode{phi}{03C6}
+\pdfglyphtounicode{phi1}{03D5}
+\pdfglyphtounicode{phieuphacirclekorean}{327A}
+\pdfglyphtounicode{phieuphaparenkorean}{321A}
+\pdfglyphtounicode{phieuphcirclekorean}{326C}
+\pdfglyphtounicode{phieuphkorean}{314D}
+\pdfglyphtounicode{phieuphparenkorean}{320C}
+\pdfglyphtounicode{philatin}{0278}
+\pdfglyphtounicode{phinthuthai}{0E3A}
+\pdfglyphtounicode{phisymbolgreek}{03D5}
+\pdfglyphtounicode{phook}{01A5}
+\pdfglyphtounicode{phophanthai}{0E1E}
+\pdfglyphtounicode{phophungthai}{0E1C}
+\pdfglyphtounicode{phosamphaothai}{0E20}
+\pdfglyphtounicode{pi}{03C0}
+\pdfglyphtounicode{pi1}{03D6}
+\pdfglyphtounicode{pieupacirclekorean}{3273}
+\pdfglyphtounicode{pieupaparenkorean}{3213}
+\pdfglyphtounicode{pieupcieuckorean}{3176}
+\pdfglyphtounicode{pieupcirclekorean}{3265}
+\pdfglyphtounicode{pieupkiyeokkorean}{3172}
+\pdfglyphtounicode{pieupkorean}{3142}
+\pdfglyphtounicode{pieupparenkorean}{3205}
+\pdfglyphtounicode{pieupsioskiyeokkorean}{3174}
+\pdfglyphtounicode{pieupsioskorean}{3144}
+\pdfglyphtounicode{pieupsiostikeutkorean}{3175}
+\pdfglyphtounicode{pieupthieuthkorean}{3177}
+\pdfglyphtounicode{pieuptikeutkorean}{3173}
+\pdfglyphtounicode{pihiragana}{3074}
+\pdfglyphtounicode{pikatakana}{30D4}
+\pdfglyphtounicode{pisymbolgreek}{03D6}
+\pdfglyphtounicode{piwrarmenian}{0583}
+\pdfglyphtounicode{planckover2pi}{210F}
+\pdfglyphtounicode{planckover2pi1}{210F}
+\pdfglyphtounicode{plus}{002B}
+\pdfglyphtounicode{plusbelowcmb}{031F}
+\pdfglyphtounicode{pluscircle}{2295}
+\pdfglyphtounicode{plusminus}{00B1}
+\pdfglyphtounicode{plusmod}{02D6}
+\pdfglyphtounicode{plusmonospace}{FF0B}
+\pdfglyphtounicode{plussmall}{FE62}
+\pdfglyphtounicode{plussuperior}{207A}
+\pdfglyphtounicode{pmonospace}{FF50}
+\pdfglyphtounicode{pmsquare}{33D8}
+\pdfglyphtounicode{pohiragana}{307D}
+\pdfglyphtounicode{pointingindexdownwhite}{261F}
+\pdfglyphtounicode{pointingindexleftwhite}{261C}
+\pdfglyphtounicode{pointingindexrightwhite}{261E}
+\pdfglyphtounicode{pointingindexupwhite}{261D}
+\pdfglyphtounicode{pokatakana}{30DD}
+\pdfglyphtounicode{poplathai}{0E1B}
+\pdfglyphtounicode{postalmark}{3012}
+\pdfglyphtounicode{postalmarkface}{3020}
+\pdfglyphtounicode{pparen}{24AB}
+\pdfglyphtounicode{precedenotdbleqv}{2AB9}
+\pdfglyphtounicode{precedenotslnteql}{2AB5}
+\pdfglyphtounicode{precedeornoteqvlnt}{22E8}
+\pdfglyphtounicode{precedes}{227A}
+\pdfglyphtounicode{precedesequal}{2AAF}
+\pdfglyphtounicode{precedesorcurly}{227C}
+\pdfglyphtounicode{precedesorequal}{227E}
+\pdfglyphtounicode{prescription}{211E}
+\pdfglyphtounicode{prime}{2032}
+\pdfglyphtounicode{primemod}{02B9}
+\pdfglyphtounicode{primereverse}{2035}
+\pdfglyphtounicode{primereversed}{2035}
+\pdfglyphtounicode{product}{220F}
+\pdfglyphtounicode{projective}{2305}
+\pdfglyphtounicode{prolongedkana}{30FC}
+\pdfglyphtounicode{propellor}{2318}
+\pdfglyphtounicode{propersubset}{2282}
+\pdfglyphtounicode{propersuperset}{2283}
+\pdfglyphtounicode{proportion}{2237}
+\pdfglyphtounicode{proportional}{221D}
+\pdfglyphtounicode{psi}{03C8}
+\pdfglyphtounicode{psicyrillic}{0471}
+\pdfglyphtounicode{psilipneumatacyrilliccmb}{0486}
+\pdfglyphtounicode{pssquare}{33B0}
+\pdfglyphtounicode{puhiragana}{3077}
+\pdfglyphtounicode{pukatakana}{30D7}
+\pdfglyphtounicode{punctdash}{2014}
+\pdfglyphtounicode{pvsquare}{33B4}
+\pdfglyphtounicode{pwsquare}{33BA}
+\pdfglyphtounicode{q}{0071}
+\pdfglyphtounicode{qadeva}{0958}
+\pdfglyphtounicode{qadmahebrew}{05A8}
+\pdfglyphtounicode{qafarabic}{0642}
+\pdfglyphtounicode{qaffinalarabic}{FED6}
+\pdfglyphtounicode{qafinitialarabic}{FED7}
+\pdfglyphtounicode{qafmedialarabic}{FED8}
+\pdfglyphtounicode{qamats}{05B8}
+\pdfglyphtounicode{qamats10}{05B8}
+\pdfglyphtounicode{qamats1a}{05B8}
+\pdfglyphtounicode{qamats1c}{05B8}
+\pdfglyphtounicode{qamats27}{05B8}
+\pdfglyphtounicode{qamats29}{05B8}
+\pdfglyphtounicode{qamats33}{05B8}
+\pdfglyphtounicode{qamatsde}{05B8}
+\pdfglyphtounicode{qamatshebrew}{05B8}
+\pdfglyphtounicode{qamatsnarrowhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatannarrowhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanquarterhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanwidehebrew}{05B8}
+\pdfglyphtounicode{qamatsquarterhebrew}{05B8}
+\pdfglyphtounicode{qamatswidehebrew}{05B8}
+\pdfglyphtounicode{qarneyparahebrew}{059F}
+\pdfglyphtounicode{qbopomofo}{3111}
+\pdfglyphtounicode{qcircle}{24E0}
+\pdfglyphtounicode{qhook}{02A0}
+\pdfglyphtounicode{qmonospace}{FF51}
+\pdfglyphtounicode{qof}{05E7}
+\pdfglyphtounicode{qofdagesh}{FB47}
+\pdfglyphtounicode{qofdageshhebrew}{FB47}
+\pdfglyphtounicode{qofhatafpatah}{05E7 05B2}
+\pdfglyphtounicode{qofhatafpatahhebrew}{05E7 05B2}
+\pdfglyphtounicode{qofhatafsegol}{05E7 05B1}
+\pdfglyphtounicode{qofhatafsegolhebrew}{05E7 05B1}
+\pdfglyphtounicode{qofhebrew}{05E7}
+\pdfglyphtounicode{qofhiriq}{05E7 05B4}
+\pdfglyphtounicode{qofhiriqhebrew}{05E7 05B4}
+\pdfglyphtounicode{qofholam}{05E7 05B9}
+\pdfglyphtounicode{qofholamhebrew}{05E7 05B9}
+\pdfglyphtounicode{qofpatah}{05E7 05B7}
+\pdfglyphtounicode{qofpatahhebrew}{05E7 05B7}
+\pdfglyphtounicode{qofqamats}{05E7 05B8}
+\pdfglyphtounicode{qofqamatshebrew}{05E7 05B8}
+\pdfglyphtounicode{qofqubuts}{05E7 05BB}
+\pdfglyphtounicode{qofqubutshebrew}{05E7 05BB}
+\pdfglyphtounicode{qofsegol}{05E7 05B6}
+\pdfglyphtounicode{qofsegolhebrew}{05E7 05B6}
+\pdfglyphtounicode{qofsheva}{05E7 05B0}
+\pdfglyphtounicode{qofshevahebrew}{05E7 05B0}
+\pdfglyphtounicode{qoftsere}{05E7 05B5}
+\pdfglyphtounicode{qoftserehebrew}{05E7 05B5}
+\pdfglyphtounicode{qparen}{24AC}
+\pdfglyphtounicode{quarternote}{2669}
+\pdfglyphtounicode{qubuts}{05BB}
+\pdfglyphtounicode{qubuts18}{05BB}
+\pdfglyphtounicode{qubuts25}{05BB}
+\pdfglyphtounicode{qubuts31}{05BB}
+\pdfglyphtounicode{qubutshebrew}{05BB}
+\pdfglyphtounicode{qubutsnarrowhebrew}{05BB}
+\pdfglyphtounicode{qubutsquarterhebrew}{05BB}
+\pdfglyphtounicode{qubutswidehebrew}{05BB}
+\pdfglyphtounicode{question}{003F}
+\pdfglyphtounicode{questionarabic}{061F}
+\pdfglyphtounicode{questionarmenian}{055E}
+\pdfglyphtounicode{questiondown}{00BF}
+\pdfglyphtounicode{questiondownsmall}{00BF}
+\pdfglyphtounicode{questiongreek}{037E}
+\pdfglyphtounicode{questionmonospace}{FF1F}
+\pdfglyphtounicode{questionsmall}{003F}
+\pdfglyphtounicode{quotedbl}{0022}
+\pdfglyphtounicode{quotedblbase}{201E}
+\pdfglyphtounicode{quotedblleft}{201C}
+\pdfglyphtounicode{quotedblmonospace}{FF02}
+\pdfglyphtounicode{quotedblprime}{301E}
+\pdfglyphtounicode{quotedblprimereversed}{301D}
+\pdfglyphtounicode{quotedblright}{201D}
+\pdfglyphtounicode{quoteleft}{2018}
+\pdfglyphtounicode{quoteleftreversed}{201B}
+\pdfglyphtounicode{quotereversed}{201B}
+\pdfglyphtounicode{quoteright}{2019}
+\pdfglyphtounicode{quoterightn}{0149}
+\pdfglyphtounicode{quotesinglbase}{201A}
+\pdfglyphtounicode{quotesingle}{0027}
+\pdfglyphtounicode{quotesinglemonospace}{FF07}
+\pdfglyphtounicode{r}{0072}
+\pdfglyphtounicode{raarmenian}{057C}
+\pdfglyphtounicode{rabengali}{09B0}
+\pdfglyphtounicode{racute}{0155}
+\pdfglyphtounicode{radeva}{0930}
+\pdfglyphtounicode{radical}{221A}
+\pdfglyphtounicode{radicalex}{F8E5}
+\pdfglyphtounicode{radoverssquare}{33AE}
+\pdfglyphtounicode{radoverssquaredsquare}{33AF}
+\pdfglyphtounicode{radsquare}{33AD}
+\pdfglyphtounicode{rafe}{05BF}
+\pdfglyphtounicode{rafehebrew}{05BF}
+\pdfglyphtounicode{ragujarati}{0AB0}
+\pdfglyphtounicode{ragurmukhi}{0A30}
+\pdfglyphtounicode{rahiragana}{3089}
+\pdfglyphtounicode{rakatakana}{30E9}
+\pdfglyphtounicode{rakatakanahalfwidth}{FF97}
+\pdfglyphtounicode{ralowerdiagonalbengali}{09F1}
+\pdfglyphtounicode{ramiddlediagonalbengali}{09F0}
+\pdfglyphtounicode{ramshorn}{0264}
+\pdfglyphtounicode{rangedash}{2013}
+\pdfglyphtounicode{ratio}{2236}
+\pdfglyphtounicode{rbopomofo}{3116}
+\pdfglyphtounicode{rcaron}{0159}
+\pdfglyphtounicode{rcedilla}{0157}
+\pdfglyphtounicode{rcircle}{24E1}
+\pdfglyphtounicode{rcommaaccent}{0157}
+\pdfglyphtounicode{rdblgrave}{0211}
+\pdfglyphtounicode{rdotaccent}{1E59}
+\pdfglyphtounicode{rdotbelow}{1E5B}
+\pdfglyphtounicode{rdotbelowmacron}{1E5D}
+\pdfglyphtounicode{referencemark}{203B}
+\pdfglyphtounicode{reflexsubset}{2286}
+\pdfglyphtounicode{reflexsuperset}{2287}
+\pdfglyphtounicode{registered}{00AE}
+\pdfglyphtounicode{registersans}{00AE}
+\pdfglyphtounicode{registerserif}{00AE}
+\pdfglyphtounicode{reharabic}{0631}
+\pdfglyphtounicode{reharmenian}{0580}
+\pdfglyphtounicode{rehfinalarabic}{FEAE}
+\pdfglyphtounicode{rehiragana}{308C}
+\pdfglyphtounicode{rehyehaleflamarabic}{0631 FEF3 FE8E 0644}
+\pdfglyphtounicode{rekatakana}{30EC}
+\pdfglyphtounicode{rekatakanahalfwidth}{FF9A}
+\pdfglyphtounicode{resh}{05E8}
+\pdfglyphtounicode{reshdageshhebrew}{FB48}
+\pdfglyphtounicode{reshhatafpatah}{05E8 05B2}
+\pdfglyphtounicode{reshhatafpatahhebrew}{05E8 05B2}
+\pdfglyphtounicode{reshhatafsegol}{05E8 05B1}
+\pdfglyphtounicode{reshhatafsegolhebrew}{05E8 05B1}
+\pdfglyphtounicode{reshhebrew}{05E8}
+\pdfglyphtounicode{reshhiriq}{05E8 05B4}
+\pdfglyphtounicode{reshhiriqhebrew}{05E8 05B4}
+\pdfglyphtounicode{reshholam}{05E8 05B9}
+\pdfglyphtounicode{reshholamhebrew}{05E8 05B9}
+\pdfglyphtounicode{reshpatah}{05E8 05B7}
+\pdfglyphtounicode{reshpatahhebrew}{05E8 05B7}
+\pdfglyphtounicode{reshqamats}{05E8 05B8}
+\pdfglyphtounicode{reshqamatshebrew}{05E8 05B8}
+\pdfglyphtounicode{reshqubuts}{05E8 05BB}
+\pdfglyphtounicode{reshqubutshebrew}{05E8 05BB}
+\pdfglyphtounicode{reshsegol}{05E8 05B6}
+\pdfglyphtounicode{reshsegolhebrew}{05E8 05B6}
+\pdfglyphtounicode{reshsheva}{05E8 05B0}
+\pdfglyphtounicode{reshshevahebrew}{05E8 05B0}
+\pdfglyphtounicode{reshtsere}{05E8 05B5}
+\pdfglyphtounicode{reshtserehebrew}{05E8 05B5}
+\pdfglyphtounicode{revasymptequal}{22CD}
+\pdfglyphtounicode{reversedtilde}{223D}
+\pdfglyphtounicode{reviahebrew}{0597}
+\pdfglyphtounicode{reviamugrashhebrew}{0597}
+\pdfglyphtounicode{revlogicalnot}{2310}
+\pdfglyphtounicode{revsimilar}{223D}
+\pdfglyphtounicode{rfishhook}{027E}
+\pdfglyphtounicode{rfishhookreversed}{027F}
+\pdfglyphtounicode{rhabengali}{09DD}
+\pdfglyphtounicode{rhadeva}{095D}
+\pdfglyphtounicode{rho}{03C1}
+\pdfglyphtounicode{rho1}{03F1}
+\pdfglyphtounicode{rhook}{027D}
+\pdfglyphtounicode{rhookturned}{027B}
+\pdfglyphtounicode{rhookturnedsuperior}{02B5}
+\pdfglyphtounicode{rhosymbolgreek}{03F1}
+\pdfglyphtounicode{rhotichookmod}{02DE}
+\pdfglyphtounicode{rieulacirclekorean}{3271}
+\pdfglyphtounicode{rieulaparenkorean}{3211}
+\pdfglyphtounicode{rieulcirclekorean}{3263}
+\pdfglyphtounicode{rieulhieuhkorean}{3140}
+\pdfglyphtounicode{rieulkiyeokkorean}{313A}
+\pdfglyphtounicode{rieulkiyeoksioskorean}{3169}
+\pdfglyphtounicode{rieulkorean}{3139}
+\pdfglyphtounicode{rieulmieumkorean}{313B}
+\pdfglyphtounicode{rieulpansioskorean}{316C}
+\pdfglyphtounicode{rieulparenkorean}{3203}
+\pdfglyphtounicode{rieulphieuphkorean}{313F}
+\pdfglyphtounicode{rieulpieupkorean}{313C}
+\pdfglyphtounicode{rieulpieupsioskorean}{316B}
+\pdfglyphtounicode{rieulsioskorean}{313D}
+\pdfglyphtounicode{rieulthieuthkorean}{313E}
+\pdfglyphtounicode{rieultikeutkorean}{316A}
+\pdfglyphtounicode{rieulyeorinhieuhkorean}{316D}
+\pdfglyphtounicode{rightangle}{221F}
+\pdfglyphtounicode{rightanglene}{231D}
+\pdfglyphtounicode{rightanglenw}{231C}
+\pdfglyphtounicode{rightanglese}{231F}
+\pdfglyphtounicode{rightanglesw}{231E}
+\pdfglyphtounicode{righttackbelowcmb}{0319}
+\pdfglyphtounicode{righttriangle}{22BF}
+\pdfglyphtounicode{rihiragana}{308A}
+\pdfglyphtounicode{rikatakana}{30EA}
+\pdfglyphtounicode{rikatakanahalfwidth}{FF98}
+\pdfglyphtounicode{ring}{02DA}
+\pdfglyphtounicode{ringbelowcmb}{0325}
+\pdfglyphtounicode{ringcmb}{030A}
+\pdfglyphtounicode{ringhalfleft}{02BF}
+\pdfglyphtounicode{ringhalfleftarmenian}{0559}
+\pdfglyphtounicode{ringhalfleftbelowcmb}{031C}
+\pdfglyphtounicode{ringhalfleftcentered}{02D3}
+\pdfglyphtounicode{ringhalfright}{02BE}
+\pdfglyphtounicode{ringhalfrightbelowcmb}{0339}
+\pdfglyphtounicode{ringhalfrightcentered}{02D2}
+\pdfglyphtounicode{ringinequal}{2256}
+\pdfglyphtounicode{rinvertedbreve}{0213}
+\pdfglyphtounicode{rittorusquare}{3351}
+\pdfglyphtounicode{rlinebelow}{1E5F}
+\pdfglyphtounicode{rlongleg}{027C}
+\pdfglyphtounicode{rlonglegturned}{027A}
+\pdfglyphtounicode{rmonospace}{FF52}
+\pdfglyphtounicode{rohiragana}{308D}
+\pdfglyphtounicode{rokatakana}{30ED}
+\pdfglyphtounicode{rokatakanahalfwidth}{FF9B}
+\pdfglyphtounicode{roruathai}{0E23}
+\pdfglyphtounicode{rparen}{24AD}
+\pdfglyphtounicode{rrabengali}{09DC}
+\pdfglyphtounicode{rradeva}{0931}
+\pdfglyphtounicode{rragurmukhi}{0A5C}
+\pdfglyphtounicode{rreharabic}{0691}
+\pdfglyphtounicode{rrehfinalarabic}{FB8D}
+\pdfglyphtounicode{rrvocalicbengali}{09E0}
+\pdfglyphtounicode{rrvocalicdeva}{0960}
+\pdfglyphtounicode{rrvocalicgujarati}{0AE0}
+\pdfglyphtounicode{rrvocalicvowelsignbengali}{09C4}
+\pdfglyphtounicode{rrvocalicvowelsigndeva}{0944}
+\pdfglyphtounicode{rrvocalicvowelsigngujarati}{0AC4}
+\pdfglyphtounicode{rsuperior}{0072}
+\pdfglyphtounicode{rtblock}{2590}
+\pdfglyphtounicode{rturned}{0279}
+\pdfglyphtounicode{rturnedsuperior}{02B4}
+\pdfglyphtounicode{ruhiragana}{308B}
+\pdfglyphtounicode{rukatakana}{30EB}
+\pdfglyphtounicode{rukatakanahalfwidth}{FF99}
+\pdfglyphtounicode{rupeemarkbengali}{09F2}
+\pdfglyphtounicode{rupeesignbengali}{09F3}
+\pdfglyphtounicode{rupiah}{20A8}
+\pdfglyphtounicode{ruthai}{0E24}
+\pdfglyphtounicode{rvocalicbengali}{098B}
+\pdfglyphtounicode{rvocalicdeva}{090B}
+\pdfglyphtounicode{rvocalicgujarati}{0A8B}
+\pdfglyphtounicode{rvocalicvowelsignbengali}{09C3}
+\pdfglyphtounicode{rvocalicvowelsigndeva}{0943}
+\pdfglyphtounicode{rvocalicvowelsigngujarati}{0AC3}
+\pdfglyphtounicode{s}{0073}
+\pdfglyphtounicode{sabengali}{09B8}
+\pdfglyphtounicode{sacute}{015B}
+\pdfglyphtounicode{sacutedotaccent}{1E65}
+\pdfglyphtounicode{sadarabic}{0635}
+\pdfglyphtounicode{sadeva}{0938}
+\pdfglyphtounicode{sadfinalarabic}{FEBA}
+\pdfglyphtounicode{sadinitialarabic}{FEBB}
+\pdfglyphtounicode{sadmedialarabic}{FEBC}
+\pdfglyphtounicode{sagujarati}{0AB8}
+\pdfglyphtounicode{sagurmukhi}{0A38}
+\pdfglyphtounicode{sahiragana}{3055}
+\pdfglyphtounicode{sakatakana}{30B5}
+\pdfglyphtounicode{sakatakanahalfwidth}{FF7B}
+\pdfglyphtounicode{sallallahoualayhewasallamarabic}{FDFA}
+\pdfglyphtounicode{samekh}{05E1}
+\pdfglyphtounicode{samekhdagesh}{FB41}
+\pdfglyphtounicode{samekhdageshhebrew}{FB41}
+\pdfglyphtounicode{samekhhebrew}{05E1}
+\pdfglyphtounicode{saraaathai}{0E32}
+\pdfglyphtounicode{saraaethai}{0E41}
+\pdfglyphtounicode{saraaimaimalaithai}{0E44}
+\pdfglyphtounicode{saraaimaimuanthai}{0E43}
+\pdfglyphtounicode{saraamthai}{0E33}
+\pdfglyphtounicode{saraathai}{0E30}
+\pdfglyphtounicode{saraethai}{0E40}
+\pdfglyphtounicode{saraiileftthai}{F886}
+\pdfglyphtounicode{saraiithai}{0E35}
+\pdfglyphtounicode{saraileftthai}{F885}
+\pdfglyphtounicode{saraithai}{0E34}
+\pdfglyphtounicode{saraothai}{0E42}
+\pdfglyphtounicode{saraueeleftthai}{F888}
+\pdfglyphtounicode{saraueethai}{0E37}
+\pdfglyphtounicode{saraueleftthai}{F887}
+\pdfglyphtounicode{sarauethai}{0E36}
+\pdfglyphtounicode{sarauthai}{0E38}
+\pdfglyphtounicode{sarauuthai}{0E39}
+\pdfglyphtounicode{satisfies}{22A8}
+\pdfglyphtounicode{sbopomofo}{3119}
+\pdfglyphtounicode{scaron}{0161}
+\pdfglyphtounicode{scarondotaccent}{1E67}
+\pdfglyphtounicode{scedilla}{015F}
+\pdfglyphtounicode{schwa}{0259}
+\pdfglyphtounicode{schwacyrillic}{04D9}
+\pdfglyphtounicode{schwadieresiscyrillic}{04DB}
+\pdfglyphtounicode{schwahook}{025A}
+\pdfglyphtounicode{scircle}{24E2}
+\pdfglyphtounicode{scircumflex}{015D}
+\pdfglyphtounicode{scommaaccent}{0219}
+\pdfglyphtounicode{sdotaccent}{1E61}
+\pdfglyphtounicode{sdotbelow}{1E63}
+\pdfglyphtounicode{sdotbelowdotaccent}{1E69}
+\pdfglyphtounicode{seagullbelowcmb}{033C}
+\pdfglyphtounicode{second}{2033}
+\pdfglyphtounicode{secondtonechinese}{02CA}
+\pdfglyphtounicode{section}{00A7}
+\pdfglyphtounicode{seenarabic}{0633}
+\pdfglyphtounicode{seenfinalarabic}{FEB2}
+\pdfglyphtounicode{seeninitialarabic}{FEB3}
+\pdfglyphtounicode{seenmedialarabic}{FEB4}
+\pdfglyphtounicode{segol}{05B6}
+\pdfglyphtounicode{segol13}{05B6}
+\pdfglyphtounicode{segol1f}{05B6}
+\pdfglyphtounicode{segol2c}{05B6}
+\pdfglyphtounicode{segolhebrew}{05B6}
+\pdfglyphtounicode{segolnarrowhebrew}{05B6}
+\pdfglyphtounicode{segolquarterhebrew}{05B6}
+\pdfglyphtounicode{segoltahebrew}{0592}
+\pdfglyphtounicode{segolwidehebrew}{05B6}
+\pdfglyphtounicode{seharmenian}{057D}
+\pdfglyphtounicode{sehiragana}{305B}
+\pdfglyphtounicode{sekatakana}{30BB}
+\pdfglyphtounicode{sekatakanahalfwidth}{FF7E}
+\pdfglyphtounicode{semicolon}{003B}
+\pdfglyphtounicode{semicolonarabic}{061B}
+\pdfglyphtounicode{semicolonmonospace}{FF1B}
+\pdfglyphtounicode{semicolonsmall}{FE54}
+\pdfglyphtounicode{semivoicedmarkkana}{309C}
+\pdfglyphtounicode{semivoicedmarkkanahalfwidth}{FF9F}
+\pdfglyphtounicode{sentisquare}{3322}
+\pdfglyphtounicode{sentosquare}{3323}
+\pdfglyphtounicode{seven}{0037}
+\pdfglyphtounicode{sevenarabic}{0667}
+\pdfglyphtounicode{sevenbengali}{09ED}
+\pdfglyphtounicode{sevencircle}{2466}
+\pdfglyphtounicode{sevencircleinversesansserif}{2790}
+\pdfglyphtounicode{sevendeva}{096D}
+\pdfglyphtounicode{seveneighths}{215E}
+\pdfglyphtounicode{sevengujarati}{0AED}
+\pdfglyphtounicode{sevengurmukhi}{0A6D}
+\pdfglyphtounicode{sevenhackarabic}{0667}
+\pdfglyphtounicode{sevenhangzhou}{3027}
+\pdfglyphtounicode{sevenideographicparen}{3226}
+\pdfglyphtounicode{seveninferior}{2087}
+\pdfglyphtounicode{sevenmonospace}{FF17}
+\pdfglyphtounicode{sevenoldstyle}{0037}
+\pdfglyphtounicode{sevenparen}{247A}
+\pdfglyphtounicode{sevenperiod}{248E}
+\pdfglyphtounicode{sevenpersian}{06F7}
+\pdfglyphtounicode{sevenroman}{2176}
+\pdfglyphtounicode{sevensuperior}{2077}
+\pdfglyphtounicode{seventeencircle}{2470}
+\pdfglyphtounicode{seventeenparen}{2484}
+\pdfglyphtounicode{seventeenperiod}{2498}
+\pdfglyphtounicode{seventhai}{0E57}
+\pdfglyphtounicode{sfthyphen}{00AD}
+\pdfglyphtounicode{shaarmenian}{0577}
+\pdfglyphtounicode{shabengali}{09B6}
+\pdfglyphtounicode{shacyrillic}{0448}
+\pdfglyphtounicode{shaddaarabic}{0651}
+\pdfglyphtounicode{shaddadammaarabic}{FC61}
+\pdfglyphtounicode{shaddadammatanarabic}{FC5E}
+\pdfglyphtounicode{shaddafathaarabic}{FC60}
+\pdfglyphtounicode{shaddafathatanarabic}{0651 064B}
+\pdfglyphtounicode{shaddakasraarabic}{FC62}
+\pdfglyphtounicode{shaddakasratanarabic}{FC5F}
+\pdfglyphtounicode{shade}{2592}
+\pdfglyphtounicode{shadedark}{2593}
+\pdfglyphtounicode{shadelight}{2591}
+\pdfglyphtounicode{shademedium}{2592}
+\pdfglyphtounicode{shadeva}{0936}
+\pdfglyphtounicode{shagujarati}{0AB6}
+\pdfglyphtounicode{shagurmukhi}{0A36}
+\pdfglyphtounicode{shalshelethebrew}{0593}
+\pdfglyphtounicode{sharp}{266F}
+\pdfglyphtounicode{shbopomofo}{3115}
+\pdfglyphtounicode{shchacyrillic}{0449}
+\pdfglyphtounicode{sheenarabic}{0634}
+\pdfglyphtounicode{sheenfinalarabic}{FEB6}
+\pdfglyphtounicode{sheeninitialarabic}{FEB7}
+\pdfglyphtounicode{sheenmedialarabic}{FEB8}
+\pdfglyphtounicode{sheicoptic}{03E3}
+\pdfglyphtounicode{sheqel}{20AA}
+\pdfglyphtounicode{sheqelhebrew}{20AA}
+\pdfglyphtounicode{sheva}{05B0}
+\pdfglyphtounicode{sheva115}{05B0}
+\pdfglyphtounicode{sheva15}{05B0}
+\pdfglyphtounicode{sheva22}{05B0}
+\pdfglyphtounicode{sheva2e}{05B0}
+\pdfglyphtounicode{shevahebrew}{05B0}
+\pdfglyphtounicode{shevanarrowhebrew}{05B0}
+\pdfglyphtounicode{shevaquarterhebrew}{05B0}
+\pdfglyphtounicode{shevawidehebrew}{05B0}
+\pdfglyphtounicode{shhacyrillic}{04BB}
+\pdfglyphtounicode{shiftleft}{21B0}
+\pdfglyphtounicode{shiftright}{21B1}
+\pdfglyphtounicode{shimacoptic}{03ED}
+\pdfglyphtounicode{shin}{05E9}
+\pdfglyphtounicode{shindagesh}{FB49}
+\pdfglyphtounicode{shindageshhebrew}{FB49}
+\pdfglyphtounicode{shindageshshindot}{FB2C}
+\pdfglyphtounicode{shindageshshindothebrew}{FB2C}
+\pdfglyphtounicode{shindageshsindot}{FB2D}
+\pdfglyphtounicode{shindageshsindothebrew}{FB2D}
+\pdfglyphtounicode{shindothebrew}{05C1}
+\pdfglyphtounicode{shinhebrew}{05E9}
+\pdfglyphtounicode{shinshindot}{FB2A}
+\pdfglyphtounicode{shinshindothebrew}{FB2A}
+\pdfglyphtounicode{shinsindot}{FB2B}
+\pdfglyphtounicode{shinsindothebrew}{FB2B}
+\pdfglyphtounicode{shook}{0282}
+\pdfglyphtounicode{sigma}{03C3}
+\pdfglyphtounicode{sigma1}{03C2}
+\pdfglyphtounicode{sigmafinal}{03C2}
+\pdfglyphtounicode{sigmalunatesymbolgreek}{03F2}
+\pdfglyphtounicode{sihiragana}{3057}
+\pdfglyphtounicode{sikatakana}{30B7}
+\pdfglyphtounicode{sikatakanahalfwidth}{FF7C}
+\pdfglyphtounicode{siluqhebrew}{05BD}
+\pdfglyphtounicode{siluqlefthebrew}{05BD}
+\pdfglyphtounicode{similar}{223C}
+\pdfglyphtounicode{similarequal}{2243}
+\pdfglyphtounicode{sindothebrew}{05C2}
+\pdfglyphtounicode{siosacirclekorean}{3274}
+\pdfglyphtounicode{siosaparenkorean}{3214}
+\pdfglyphtounicode{sioscieuckorean}{317E}
+\pdfglyphtounicode{sioscirclekorean}{3266}
+\pdfglyphtounicode{sioskiyeokkorean}{317A}
+\pdfglyphtounicode{sioskorean}{3145}
+\pdfglyphtounicode{siosnieunkorean}{317B}
+\pdfglyphtounicode{siosparenkorean}{3206}
+\pdfglyphtounicode{siospieupkorean}{317D}
+\pdfglyphtounicode{siostikeutkorean}{317C}
+\pdfglyphtounicode{six}{0036}
+\pdfglyphtounicode{sixarabic}{0666}
+\pdfglyphtounicode{sixbengali}{09EC}
+\pdfglyphtounicode{sixcircle}{2465}
+\pdfglyphtounicode{sixcircleinversesansserif}{278F}
+\pdfglyphtounicode{sixdeva}{096C}
+\pdfglyphtounicode{sixgujarati}{0AEC}
+\pdfglyphtounicode{sixgurmukhi}{0A6C}
+\pdfglyphtounicode{sixhackarabic}{0666}
+\pdfglyphtounicode{sixhangzhou}{3026}
+\pdfglyphtounicode{sixideographicparen}{3225}
+\pdfglyphtounicode{sixinferior}{2086}
+\pdfglyphtounicode{sixmonospace}{FF16}
+\pdfglyphtounicode{sixoldstyle}{0036}
+\pdfglyphtounicode{sixparen}{2479}
+\pdfglyphtounicode{sixperiod}{248D}
+\pdfglyphtounicode{sixpersian}{06F6}
+\pdfglyphtounicode{sixroman}{2175}
+\pdfglyphtounicode{sixsuperior}{2076}
+\pdfglyphtounicode{sixteencircle}{246F}
+\pdfglyphtounicode{sixteencurrencydenominatorbengali}{09F9}
+\pdfglyphtounicode{sixteenparen}{2483}
+\pdfglyphtounicode{sixteenperiod}{2497}
+\pdfglyphtounicode{sixthai}{0E56}
+\pdfglyphtounicode{slash}{002F}
+\pdfglyphtounicode{slashmonospace}{FF0F}
+\pdfglyphtounicode{slong}{017F}
+\pdfglyphtounicode{slongdotaccent}{1E9B}
+\pdfglyphtounicode{slurabove}{2322}
+\pdfglyphtounicode{slurbelow}{2323}
+\pdfglyphtounicode{smile}{2323}
+\pdfglyphtounicode{smileface}{263A}
+\pdfglyphtounicode{smonospace}{FF53}
+\pdfglyphtounicode{sofpasuqhebrew}{05C3}
+\pdfglyphtounicode{softhyphen}{00AD}
+\pdfglyphtounicode{softsigncyrillic}{044C}
+\pdfglyphtounicode{sohiragana}{305D}
+\pdfglyphtounicode{sokatakana}{30BD}
+\pdfglyphtounicode{sokatakanahalfwidth}{FF7F}
+\pdfglyphtounicode{soliduslongoverlaycmb}{0338}
+\pdfglyphtounicode{solidusshortoverlaycmb}{0337}
+\pdfglyphtounicode{sorusithai}{0E29}
+\pdfglyphtounicode{sosalathai}{0E28}
+\pdfglyphtounicode{sosothai}{0E0B}
+\pdfglyphtounicode{sosuathai}{0E2A}
+\pdfglyphtounicode{space}{0020}
+\pdfglyphtounicode{spacehackarabic}{0020}
+\pdfglyphtounicode{spade}{2660}
+\pdfglyphtounicode{spadesuitblack}{2660}
+\pdfglyphtounicode{spadesuitwhite}{2664}
+\pdfglyphtounicode{sparen}{24AE}
+\pdfglyphtounicode{sphericalangle}{2222}
+\pdfglyphtounicode{square}{25A1}
+\pdfglyphtounicode{squarebelowcmb}{033B}
+\pdfglyphtounicode{squarecc}{33C4}
+\pdfglyphtounicode{squarecm}{339D}
+\pdfglyphtounicode{squarediagonalcrosshatchfill}{25A9}
+\pdfglyphtounicode{squaredot}{22A1}
+\pdfglyphtounicode{squarehorizontalfill}{25A4}
+\pdfglyphtounicode{squareimage}{228F}
+\pdfglyphtounicode{squarekg}{338F}
+\pdfglyphtounicode{squarekm}{339E}
+\pdfglyphtounicode{squarekmcapital}{33CE}
+\pdfglyphtounicode{squareln}{33D1}
+\pdfglyphtounicode{squarelog}{33D2}
+\pdfglyphtounicode{squaremg}{338E}
+\pdfglyphtounicode{squaremil}{33D5}
+\pdfglyphtounicode{squareminus}{229F}
+\pdfglyphtounicode{squaremm}{339C}
+\pdfglyphtounicode{squaremsquared}{33A1}
+\pdfglyphtounicode{squaremultiply}{22A0}
+\pdfglyphtounicode{squareoriginal}{2290}
+\pdfglyphtounicode{squareorthogonalcrosshatchfill}{25A6}
+\pdfglyphtounicode{squareplus}{229E}
+\pdfglyphtounicode{squaresolid}{25A0}
+\pdfglyphtounicode{squareupperlefttolowerrightfill}{25A7}
+\pdfglyphtounicode{squareupperrighttolowerleftfill}{25A8}
+\pdfglyphtounicode{squareverticalfill}{25A5}
+\pdfglyphtounicode{squarewhitewithsmallblack}{25A3}
+\pdfglyphtounicode{squiggleleftright}{21AD}
+\pdfglyphtounicode{squiggleright}{21DD}
+\pdfglyphtounicode{srsquare}{33DB}
+\pdfglyphtounicode{ssabengali}{09B7}
+\pdfglyphtounicode{ssadeva}{0937}
+\pdfglyphtounicode{ssagujarati}{0AB7}
+\pdfglyphtounicode{ssangcieuckorean}{3149}
+\pdfglyphtounicode{ssanghieuhkorean}{3185}
+\pdfglyphtounicode{ssangieungkorean}{3180}
+\pdfglyphtounicode{ssangkiyeokkorean}{3132}
+\pdfglyphtounicode{ssangnieunkorean}{3165}
+\pdfglyphtounicode{ssangpieupkorean}{3143}
+\pdfglyphtounicode{ssangsioskorean}{3146}
+\pdfglyphtounicode{ssangtikeutkorean}{3138}
+\pdfglyphtounicode{ssuperior}{0073}
+\pdfglyphtounicode{st}{0073 0074}
+\pdfglyphtounicode{star}{22C6}
+\pdfglyphtounicode{sterling}{00A3}
+\pdfglyphtounicode{sterlingmonospace}{FFE1}
+\pdfglyphtounicode{strokelongoverlaycmb}{0336}
+\pdfglyphtounicode{strokeshortoverlaycmb}{0335}
+\pdfglyphtounicode{subset}{2282}
+\pdfglyphtounicode{subsetdbl}{22D0}
+\pdfglyphtounicode{subsetdblequal}{2AC5}
+\pdfglyphtounicode{subsetnoteql}{228A}
+\pdfglyphtounicode{subsetnotequal}{228A}
+\pdfglyphtounicode{subsetorequal}{2286}
+\pdfglyphtounicode{subsetornotdbleql}{2ACB}
+\pdfglyphtounicode{subsetsqequal}{2291}
+\pdfglyphtounicode{succeeds}{227B}
+\pdfglyphtounicode{suchthat}{220B}
+\pdfglyphtounicode{suhiragana}{3059}
+\pdfglyphtounicode{sukatakana}{30B9}
+\pdfglyphtounicode{sukatakanahalfwidth}{FF7D}
+\pdfglyphtounicode{sukunarabic}{0652}
+\pdfglyphtounicode{summation}{2211}
+\pdfglyphtounicode{sun}{263C}
+\pdfglyphtounicode{superset}{2283}
+\pdfglyphtounicode{supersetdbl}{22D1}
+\pdfglyphtounicode{supersetdblequal}{2AC6}
+\pdfglyphtounicode{supersetnoteql}{228B}
+\pdfglyphtounicode{supersetnotequal}{228B}
+\pdfglyphtounicode{supersetorequal}{2287}
+\pdfglyphtounicode{supersetornotdbleql}{2ACC}
+\pdfglyphtounicode{supersetsqequal}{2292}
+\pdfglyphtounicode{svsquare}{33DC}
+\pdfglyphtounicode{syouwaerasquare}{337C}
+\pdfglyphtounicode{t}{0074}
+\pdfglyphtounicode{tabengali}{09A4}
+\pdfglyphtounicode{tackdown}{22A4}
+\pdfglyphtounicode{tackleft}{22A3}
+\pdfglyphtounicode{tadeva}{0924}
+\pdfglyphtounicode{tagujarati}{0AA4}
+\pdfglyphtounicode{tagurmukhi}{0A24}
+\pdfglyphtounicode{taharabic}{0637}
+\pdfglyphtounicode{tahfinalarabic}{FEC2}
+\pdfglyphtounicode{tahinitialarabic}{FEC3}
+\pdfglyphtounicode{tahiragana}{305F}
+\pdfglyphtounicode{tahmedialarabic}{FEC4}
+\pdfglyphtounicode{taisyouerasquare}{337D}
+\pdfglyphtounicode{takatakana}{30BF}
+\pdfglyphtounicode{takatakanahalfwidth}{FF80}
+\pdfglyphtounicode{tatweelarabic}{0640}
+\pdfglyphtounicode{tau}{03C4}
+\pdfglyphtounicode{tav}{05EA}
+\pdfglyphtounicode{tavdages}{FB4A}
+\pdfglyphtounicode{tavdagesh}{FB4A}
+\pdfglyphtounicode{tavdageshhebrew}{FB4A}
+\pdfglyphtounicode{tavhebrew}{05EA}
+\pdfglyphtounicode{tbar}{0167}
+\pdfglyphtounicode{tbopomofo}{310A}
+\pdfglyphtounicode{tcaron}{0165}
+\pdfglyphtounicode{tccurl}{02A8}
+\pdfglyphtounicode{tcedilla}{0163}
+\pdfglyphtounicode{tcheharabic}{0686}
+\pdfglyphtounicode{tchehfinalarabic}{FB7B}
+\pdfglyphtounicode{tchehinitialarabic}{FB7C}
+\pdfglyphtounicode{tchehmedialarabic}{FB7D}
+\pdfglyphtounicode{tchehmeeminitialarabic}{FB7C FEE4}
+\pdfglyphtounicode{tcircle}{24E3}
+\pdfglyphtounicode{tcircumflexbelow}{1E71}
+\pdfglyphtounicode{tcommaaccent}{0163}
+\pdfglyphtounicode{tdieresis}{1E97}
+\pdfglyphtounicode{tdotaccent}{1E6B}
+\pdfglyphtounicode{tdotbelow}{1E6D}
+\pdfglyphtounicode{tecyrillic}{0442}
+\pdfglyphtounicode{tedescendercyrillic}{04AD}
+\pdfglyphtounicode{teharabic}{062A}
+\pdfglyphtounicode{tehfinalarabic}{FE96}
+\pdfglyphtounicode{tehhahinitialarabic}{FCA2}
+\pdfglyphtounicode{tehhahisolatedarabic}{FC0C}
+\pdfglyphtounicode{tehinitialarabic}{FE97}
+\pdfglyphtounicode{tehiragana}{3066}
+\pdfglyphtounicode{tehjeeminitialarabic}{FCA1}
+\pdfglyphtounicode{tehjeemisolatedarabic}{FC0B}
+\pdfglyphtounicode{tehmarbutaarabic}{0629}
+\pdfglyphtounicode{tehmarbutafinalarabic}{FE94}
+\pdfglyphtounicode{tehmedialarabic}{FE98}
+\pdfglyphtounicode{tehmeeminitialarabic}{FCA4}
+\pdfglyphtounicode{tehmeemisolatedarabic}{FC0E}
+\pdfglyphtounicode{tehnoonfinalarabic}{FC73}
+\pdfglyphtounicode{tekatakana}{30C6}
+\pdfglyphtounicode{tekatakanahalfwidth}{FF83}
+\pdfglyphtounicode{telephone}{2121}
+\pdfglyphtounicode{telephoneblack}{260E}
+\pdfglyphtounicode{telishagedolahebrew}{05A0}
+\pdfglyphtounicode{telishaqetanahebrew}{05A9}
+\pdfglyphtounicode{tencircle}{2469}
+\pdfglyphtounicode{tenideographicparen}{3229}
+\pdfglyphtounicode{tenparen}{247D}
+\pdfglyphtounicode{tenperiod}{2491}
+\pdfglyphtounicode{tenroman}{2179}
+\pdfglyphtounicode{tesh}{02A7}
+\pdfglyphtounicode{tet}{05D8}
+\pdfglyphtounicode{tetdagesh}{FB38}
+\pdfglyphtounicode{tetdageshhebrew}{FB38}
+\pdfglyphtounicode{tethebrew}{05D8}
+\pdfglyphtounicode{tetsecyrillic}{04B5}
+\pdfglyphtounicode{tevirhebrew}{059B}
+\pdfglyphtounicode{tevirlefthebrew}{059B}
+\pdfglyphtounicode{tfm:cmbsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy10/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy5/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy6/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy7/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy8/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy9/heart}{2661}
+\pdfglyphtounicode{tfm:cmmi10/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi10/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi12/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi12/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi5/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi5/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi6/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi6/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi7/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi7/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi8/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi8/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi9/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi9/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib10/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib10/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib5/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib5/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib6/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib6/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib7/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib7/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib8/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib8/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib9/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib9/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy10/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy5/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy6/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy7/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy8/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy9/heart}{2661}
+\pdfglyphtounicode{tfm:eurb10/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb10/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb5/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb5/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb6/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb6/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb7/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb7/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb8/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb8/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb9/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb9/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm10/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm10/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm5/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm5/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm6/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm6/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm7/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm7/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm8/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm8/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm9/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm9/phi1}{03C6}
+\pdfglyphtounicode{tfm:fplmbi/phi}{03D5}
+\pdfglyphtounicode{tfm:fplmbi/phi1}{03C6}
+\pdfglyphtounicode{tfm:fplmri/phi}{03D5}
+\pdfglyphtounicode{tfm:fplmri/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmbsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy10/heart}{2661}
+\pdfglyphtounicode{tfm:lmbsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy5/heart}{2661}
+\pdfglyphtounicode{tfm:lmbsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy7/heart}{2661}
+\pdfglyphtounicode{tfm:lmmi10/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi10/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi12/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi12/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi5/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi5/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi6/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi6/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi7/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi7/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi8/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi8/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi9/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi9/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib10/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib10/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib5/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib5/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib7/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib7/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy10/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy5/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy6/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy7/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy8/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy9/heart}{2661}
+\pdfglyphtounicode{tfm:msam10/diamond}{2662}
+\pdfglyphtounicode{tfm:msam5/diamond}{2662}
+\pdfglyphtounicode{tfm:msam6/diamond}{2662}
+\pdfglyphtounicode{tfm:msam7/diamond}{2662}
+\pdfglyphtounicode{tfm:msam8/diamond}{2662}
+\pdfglyphtounicode{tfm:msam9/diamond}{2662}
+\pdfglyphtounicode{tfm:pxbmia/phi}{03D5}
+\pdfglyphtounicode{tfm:pxbmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:pxbsy/diamond}{2662}
+\pdfglyphtounicode{tfm:pxbsy/heart}{2661}
+\pdfglyphtounicode{tfm:pxbsya/diamond}{2662}
+\pdfglyphtounicode{tfm:pxmia/phi}{03D5}
+\pdfglyphtounicode{tfm:pxmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:pxsy/diamond}{2662}
+\pdfglyphtounicode{tfm:pxsy/heart}{2661}
+\pdfglyphtounicode{tfm:pxsya/diamond}{2662}
+\pdfglyphtounicode{tfm:pzdr/a1}{2701}
+\pdfglyphtounicode{tfm:pzdr/a10}{2721}
+\pdfglyphtounicode{tfm:pzdr/a100}{275E}
+\pdfglyphtounicode{tfm:pzdr/a101}{2761}
+\pdfglyphtounicode{tfm:pzdr/a102}{2762}
+\pdfglyphtounicode{tfm:pzdr/a103}{2763}
+\pdfglyphtounicode{tfm:pzdr/a104}{2764}
+\pdfglyphtounicode{tfm:pzdr/a105}{2710}
+\pdfglyphtounicode{tfm:pzdr/a106}{2765}
+\pdfglyphtounicode{tfm:pzdr/a107}{2766}
+\pdfglyphtounicode{tfm:pzdr/a108}{2767}
+\pdfglyphtounicode{tfm:pzdr/a109}{2660}
+\pdfglyphtounicode{tfm:pzdr/a11}{261B}
+\pdfglyphtounicode{tfm:pzdr/a110}{2665}
+\pdfglyphtounicode{tfm:pzdr/a111}{2666}
+\pdfglyphtounicode{tfm:pzdr/a112}{2663}
+\pdfglyphtounicode{tfm:pzdr/a117}{2709}
+\pdfglyphtounicode{tfm:pzdr/a118}{2708}
+\pdfglyphtounicode{tfm:pzdr/a119}{2707}
+\pdfglyphtounicode{tfm:pzdr/a12}{261E}
+\pdfglyphtounicode{tfm:pzdr/a120}{2460}
+\pdfglyphtounicode{tfm:pzdr/a121}{2461}
+\pdfglyphtounicode{tfm:pzdr/a122}{2462}
+\pdfglyphtounicode{tfm:pzdr/a123}{2463}
+\pdfglyphtounicode{tfm:pzdr/a124}{2464}
+\pdfglyphtounicode{tfm:pzdr/a125}{2465}
+\pdfglyphtounicode{tfm:pzdr/a126}{2466}
+\pdfglyphtounicode{tfm:pzdr/a127}{2467}
+\pdfglyphtounicode{tfm:pzdr/a128}{2468}
+\pdfglyphtounicode{tfm:pzdr/a129}{2469}
+\pdfglyphtounicode{tfm:pzdr/a13}{270C}
+\pdfglyphtounicode{tfm:pzdr/a130}{2776}
+\pdfglyphtounicode{tfm:pzdr/a131}{2777}
+\pdfglyphtounicode{tfm:pzdr/a132}{2778}
+\pdfglyphtounicode{tfm:pzdr/a133}{2779}
+\pdfglyphtounicode{tfm:pzdr/a134}{277A}
+\pdfglyphtounicode{tfm:pzdr/a135}{277B}
+\pdfglyphtounicode{tfm:pzdr/a136}{277C}
+\pdfglyphtounicode{tfm:pzdr/a137}{277D}
+\pdfglyphtounicode{tfm:pzdr/a138}{277E}
+\pdfglyphtounicode{tfm:pzdr/a139}{277F}
+\pdfglyphtounicode{tfm:pzdr/a14}{270D}
+\pdfglyphtounicode{tfm:pzdr/a140}{2780}
+\pdfglyphtounicode{tfm:pzdr/a141}{2781}
+\pdfglyphtounicode{tfm:pzdr/a142}{2782}
+\pdfglyphtounicode{tfm:pzdr/a143}{2783}
+\pdfglyphtounicode{tfm:pzdr/a144}{2784}
+\pdfglyphtounicode{tfm:pzdr/a145}{2785}
+\pdfglyphtounicode{tfm:pzdr/a146}{2786}
+\pdfglyphtounicode{tfm:pzdr/a147}{2787}
+\pdfglyphtounicode{tfm:pzdr/a148}{2788}
+\pdfglyphtounicode{tfm:pzdr/a149}{2789}
+\pdfglyphtounicode{tfm:pzdr/a15}{270E}
+\pdfglyphtounicode{tfm:pzdr/a150}{278A}
+\pdfglyphtounicode{tfm:pzdr/a151}{278B}
+\pdfglyphtounicode{tfm:pzdr/a152}{278C}
+\pdfglyphtounicode{tfm:pzdr/a153}{278D}
+\pdfglyphtounicode{tfm:pzdr/a154}{278E}
+\pdfglyphtounicode{tfm:pzdr/a155}{278F}
+\pdfglyphtounicode{tfm:pzdr/a156}{2790}
+\pdfglyphtounicode{tfm:pzdr/a157}{2791}
+\pdfglyphtounicode{tfm:pzdr/a158}{2792}
+\pdfglyphtounicode{tfm:pzdr/a159}{2793}
+\pdfglyphtounicode{tfm:pzdr/a16}{270F}
+\pdfglyphtounicode{tfm:pzdr/a160}{2794}
+\pdfglyphtounicode{tfm:pzdr/a161}{2192}
+\pdfglyphtounicode{tfm:pzdr/a162}{27A3}
+\pdfglyphtounicode{tfm:pzdr/a163}{2194}
+\pdfglyphtounicode{tfm:pzdr/a164}{2195}
+\pdfglyphtounicode{tfm:pzdr/a165}{2799}
+\pdfglyphtounicode{tfm:pzdr/a166}{279B}
+\pdfglyphtounicode{tfm:pzdr/a167}{279C}
+\pdfglyphtounicode{tfm:pzdr/a168}{279D}
+\pdfglyphtounicode{tfm:pzdr/a169}{279E}
+\pdfglyphtounicode{tfm:pzdr/a17}{2711}
+\pdfglyphtounicode{tfm:pzdr/a170}{279F}
+\pdfglyphtounicode{tfm:pzdr/a171}{27A0}
+\pdfglyphtounicode{tfm:pzdr/a172}{27A1}
+\pdfglyphtounicode{tfm:pzdr/a173}{27A2}
+\pdfglyphtounicode{tfm:pzdr/a174}{27A4}
+\pdfglyphtounicode{tfm:pzdr/a175}{27A5}
+\pdfglyphtounicode{tfm:pzdr/a176}{27A6}
+\pdfglyphtounicode{tfm:pzdr/a177}{27A7}
+\pdfglyphtounicode{tfm:pzdr/a178}{27A8}
+\pdfglyphtounicode{tfm:pzdr/a179}{27A9}
+\pdfglyphtounicode{tfm:pzdr/a18}{2712}
+\pdfglyphtounicode{tfm:pzdr/a180}{27AB}
+\pdfglyphtounicode{tfm:pzdr/a181}{27AD}
+\pdfglyphtounicode{tfm:pzdr/a182}{27AF}
+\pdfglyphtounicode{tfm:pzdr/a183}{27B2}
+\pdfglyphtounicode{tfm:pzdr/a184}{27B3}
+\pdfglyphtounicode{tfm:pzdr/a185}{27B5}
+\pdfglyphtounicode{tfm:pzdr/a186}{27B8}
+\pdfglyphtounicode{tfm:pzdr/a187}{27BA}
+\pdfglyphtounicode{tfm:pzdr/a188}{27BB}
+\pdfglyphtounicode{tfm:pzdr/a189}{27BC}
+\pdfglyphtounicode{tfm:pzdr/a19}{2713}
+\pdfglyphtounicode{tfm:pzdr/a190}{27BD}
+\pdfglyphtounicode{tfm:pzdr/a191}{27BE}
+\pdfglyphtounicode{tfm:pzdr/a192}{279A}
+\pdfglyphtounicode{tfm:pzdr/a193}{27AA}
+\pdfglyphtounicode{tfm:pzdr/a194}{27B6}
+\pdfglyphtounicode{tfm:pzdr/a195}{27B9}
+\pdfglyphtounicode{tfm:pzdr/a196}{2798}
+\pdfglyphtounicode{tfm:pzdr/a197}{27B4}
+\pdfglyphtounicode{tfm:pzdr/a198}{27B7}
+\pdfglyphtounicode{tfm:pzdr/a199}{27AC}
+\pdfglyphtounicode{tfm:pzdr/a2}{2702}
+\pdfglyphtounicode{tfm:pzdr/a20}{2714}
+\pdfglyphtounicode{tfm:pzdr/a200}{27AE}
+\pdfglyphtounicode{tfm:pzdr/a201}{27B1}
+\pdfglyphtounicode{tfm:pzdr/a202}{2703}
+\pdfglyphtounicode{tfm:pzdr/a203}{2750}
+\pdfglyphtounicode{tfm:pzdr/a204}{2752}
+\pdfglyphtounicode{tfm:pzdr/a205}{276E}
+\pdfglyphtounicode{tfm:pzdr/a206}{2770}
+\pdfglyphtounicode{tfm:pzdr/a21}{2715}
+\pdfglyphtounicode{tfm:pzdr/a22}{2716}
+\pdfglyphtounicode{tfm:pzdr/a23}{2717}
+\pdfglyphtounicode{tfm:pzdr/a24}{2718}
+\pdfglyphtounicode{tfm:pzdr/a25}{2719}
+\pdfglyphtounicode{tfm:pzdr/a26}{271A}
+\pdfglyphtounicode{tfm:pzdr/a27}{271B}
+\pdfglyphtounicode{tfm:pzdr/a28}{271C}
+\pdfglyphtounicode{tfm:pzdr/a29}{2722}
+\pdfglyphtounicode{tfm:pzdr/a3}{2704}
+\pdfglyphtounicode{tfm:pzdr/a30}{2723}
+\pdfglyphtounicode{tfm:pzdr/a31}{2724}
+\pdfglyphtounicode{tfm:pzdr/a32}{2725}
+\pdfglyphtounicode{tfm:pzdr/a33}{2726}
+\pdfglyphtounicode{tfm:pzdr/a34}{2727}
+\pdfglyphtounicode{tfm:pzdr/a35}{2605}
+\pdfglyphtounicode{tfm:pzdr/a36}{2729}
+\pdfglyphtounicode{tfm:pzdr/a37}{272A}
+\pdfglyphtounicode{tfm:pzdr/a38}{272B}
+\pdfglyphtounicode{tfm:pzdr/a39}{272C}
+\pdfglyphtounicode{tfm:pzdr/a4}{260E}
+\pdfglyphtounicode{tfm:pzdr/a40}{272D}
+\pdfglyphtounicode{tfm:pzdr/a41}{272E}
+\pdfglyphtounicode{tfm:pzdr/a42}{272F}
+\pdfglyphtounicode{tfm:pzdr/a43}{2730}
+\pdfglyphtounicode{tfm:pzdr/a44}{2731}
+\pdfglyphtounicode{tfm:pzdr/a45}{2732}
+\pdfglyphtounicode{tfm:pzdr/a46}{2733}
+\pdfglyphtounicode{tfm:pzdr/a47}{2734}
+\pdfglyphtounicode{tfm:pzdr/a48}{2735}
+\pdfglyphtounicode{tfm:pzdr/a49}{2736}
+\pdfglyphtounicode{tfm:pzdr/a5}{2706}
+\pdfglyphtounicode{tfm:pzdr/a50}{2737}
+\pdfglyphtounicode{tfm:pzdr/a51}{2738}
+\pdfglyphtounicode{tfm:pzdr/a52}{2739}
+\pdfglyphtounicode{tfm:pzdr/a53}{273A}
+\pdfglyphtounicode{tfm:pzdr/a54}{273B}
+\pdfglyphtounicode{tfm:pzdr/a55}{273C}
+\pdfglyphtounicode{tfm:pzdr/a56}{273D}
+\pdfglyphtounicode{tfm:pzdr/a57}{273E}
+\pdfglyphtounicode{tfm:pzdr/a58}{273F}
+\pdfglyphtounicode{tfm:pzdr/a59}{2740}
+\pdfglyphtounicode{tfm:pzdr/a6}{271D}
+\pdfglyphtounicode{tfm:pzdr/a60}{2741}
+\pdfglyphtounicode{tfm:pzdr/a61}{2742}
+\pdfglyphtounicode{tfm:pzdr/a62}{2743}
+\pdfglyphtounicode{tfm:pzdr/a63}{2744}
+\pdfglyphtounicode{tfm:pzdr/a64}{2745}
+\pdfglyphtounicode{tfm:pzdr/a65}{2746}
+\pdfglyphtounicode{tfm:pzdr/a66}{2747}
+\pdfglyphtounicode{tfm:pzdr/a67}{2748}
+\pdfglyphtounicode{tfm:pzdr/a68}{2749}
+\pdfglyphtounicode{tfm:pzdr/a69}{274A}
+\pdfglyphtounicode{tfm:pzdr/a7}{271E}
+\pdfglyphtounicode{tfm:pzdr/a70}{274B}
+\pdfglyphtounicode{tfm:pzdr/a71}{25CF}
+\pdfglyphtounicode{tfm:pzdr/a72}{274D}
+\pdfglyphtounicode{tfm:pzdr/a73}{25A0}
+\pdfglyphtounicode{tfm:pzdr/a74}{274F}
+\pdfglyphtounicode{tfm:pzdr/a75}{2751}
+\pdfglyphtounicode{tfm:pzdr/a76}{25B2}
+\pdfglyphtounicode{tfm:pzdr/a77}{25BC}
+\pdfglyphtounicode{tfm:pzdr/a78}{25C6}
+\pdfglyphtounicode{tfm:pzdr/a79}{2756}
+\pdfglyphtounicode{tfm:pzdr/a8}{271F}
+\pdfglyphtounicode{tfm:pzdr/a81}{25D7}
+\pdfglyphtounicode{tfm:pzdr/a82}{2758}
+\pdfglyphtounicode{tfm:pzdr/a83}{2759}
+\pdfglyphtounicode{tfm:pzdr/a84}{275A}
+\pdfglyphtounicode{tfm:pzdr/a85}{276F}
+\pdfglyphtounicode{tfm:pzdr/a86}{2771}
+\pdfglyphtounicode{tfm:pzdr/a87}{2772}
+\pdfglyphtounicode{tfm:pzdr/a88}{2773}
+\pdfglyphtounicode{tfm:pzdr/a89}{2768}
+\pdfglyphtounicode{tfm:pzdr/a9}{2720}
+\pdfglyphtounicode{tfm:pzdr/a90}{2769}
+\pdfglyphtounicode{tfm:pzdr/a91}{276C}
+\pdfglyphtounicode{tfm:pzdr/a92}{276D}
+\pdfglyphtounicode{tfm:pzdr/a93}{276A}
+\pdfglyphtounicode{tfm:pzdr/a94}{276B}
+\pdfglyphtounicode{tfm:pzdr/a95}{2774}
+\pdfglyphtounicode{tfm:pzdr/a96}{2775}
+\pdfglyphtounicode{tfm:pzdr/a97}{275B}
+\pdfglyphtounicode{tfm:pzdr/a98}{275C}
+\pdfglyphtounicode{tfm:pzdr/a99}{275D}
+\pdfglyphtounicode{tfm:rpxbmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rpxbmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rpxmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rpxmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rpzdr/a1}{2701}
+\pdfglyphtounicode{tfm:rpzdr/a10}{2721}
+\pdfglyphtounicode{tfm:rpzdr/a100}{275E}
+\pdfglyphtounicode{tfm:rpzdr/a101}{2761}
+\pdfglyphtounicode{tfm:rpzdr/a102}{2762}
+\pdfglyphtounicode{tfm:rpzdr/a103}{2763}
+\pdfglyphtounicode{tfm:rpzdr/a104}{2764}
+\pdfglyphtounicode{tfm:rpzdr/a105}{2710}
+\pdfglyphtounicode{tfm:rpzdr/a106}{2765}
+\pdfglyphtounicode{tfm:rpzdr/a107}{2766}
+\pdfglyphtounicode{tfm:rpzdr/a108}{2767}
+\pdfglyphtounicode{tfm:rpzdr/a109}{2660}
+\pdfglyphtounicode{tfm:rpzdr/a11}{261B}
+\pdfglyphtounicode{tfm:rpzdr/a110}{2665}
+\pdfglyphtounicode{tfm:rpzdr/a111}{2666}
+\pdfglyphtounicode{tfm:rpzdr/a112}{2663}
+\pdfglyphtounicode{tfm:rpzdr/a117}{2709}
+\pdfglyphtounicode{tfm:rpzdr/a118}{2708}
+\pdfglyphtounicode{tfm:rpzdr/a119}{2707}
+\pdfglyphtounicode{tfm:rpzdr/a12}{261E}
+\pdfglyphtounicode{tfm:rpzdr/a120}{2460}
+\pdfglyphtounicode{tfm:rpzdr/a121}{2461}
+\pdfglyphtounicode{tfm:rpzdr/a122}{2462}
+\pdfglyphtounicode{tfm:rpzdr/a123}{2463}
+\pdfglyphtounicode{tfm:rpzdr/a124}{2464}
+\pdfglyphtounicode{tfm:rpzdr/a125}{2465}
+\pdfglyphtounicode{tfm:rpzdr/a126}{2466}
+\pdfglyphtounicode{tfm:rpzdr/a127}{2467}
+\pdfglyphtounicode{tfm:rpzdr/a128}{2468}
+\pdfglyphtounicode{tfm:rpzdr/a129}{2469}
+\pdfglyphtounicode{tfm:rpzdr/a13}{270C}
+\pdfglyphtounicode{tfm:rpzdr/a130}{2776}
+\pdfglyphtounicode{tfm:rpzdr/a131}{2777}
+\pdfglyphtounicode{tfm:rpzdr/a132}{2778}
+\pdfglyphtounicode{tfm:rpzdr/a133}{2779}
+\pdfglyphtounicode{tfm:rpzdr/a134}{277A}
+\pdfglyphtounicode{tfm:rpzdr/a135}{277B}
+\pdfglyphtounicode{tfm:rpzdr/a136}{277C}
+\pdfglyphtounicode{tfm:rpzdr/a137}{277D}
+\pdfglyphtounicode{tfm:rpzdr/a138}{277E}
+\pdfglyphtounicode{tfm:rpzdr/a139}{277F}
+\pdfglyphtounicode{tfm:rpzdr/a14}{270D}
+\pdfglyphtounicode{tfm:rpzdr/a140}{2780}
+\pdfglyphtounicode{tfm:rpzdr/a141}{2781}
+\pdfglyphtounicode{tfm:rpzdr/a142}{2782}
+\pdfglyphtounicode{tfm:rpzdr/a143}{2783}
+\pdfglyphtounicode{tfm:rpzdr/a144}{2784}
+\pdfglyphtounicode{tfm:rpzdr/a145}{2785}
+\pdfglyphtounicode{tfm:rpzdr/a146}{2786}
+\pdfglyphtounicode{tfm:rpzdr/a147}{2787}
+\pdfglyphtounicode{tfm:rpzdr/a148}{2788}
+\pdfglyphtounicode{tfm:rpzdr/a149}{2789}
+\pdfglyphtounicode{tfm:rpzdr/a15}{270E}
+\pdfglyphtounicode{tfm:rpzdr/a150}{278A}
+\pdfglyphtounicode{tfm:rpzdr/a151}{278B}
+\pdfglyphtounicode{tfm:rpzdr/a152}{278C}
+\pdfglyphtounicode{tfm:rpzdr/a153}{278D}
+\pdfglyphtounicode{tfm:rpzdr/a154}{278E}
+\pdfglyphtounicode{tfm:rpzdr/a155}{278F}
+\pdfglyphtounicode{tfm:rpzdr/a156}{2790}
+\pdfglyphtounicode{tfm:rpzdr/a157}{2791}
+\pdfglyphtounicode{tfm:rpzdr/a158}{2792}
+\pdfglyphtounicode{tfm:rpzdr/a159}{2793}
+\pdfglyphtounicode{tfm:rpzdr/a16}{270F}
+\pdfglyphtounicode{tfm:rpzdr/a160}{2794}
+\pdfglyphtounicode{tfm:rpzdr/a161}{2192}
+\pdfglyphtounicode{tfm:rpzdr/a162}{27A3}
+\pdfglyphtounicode{tfm:rpzdr/a163}{2194}
+\pdfglyphtounicode{tfm:rpzdr/a164}{2195}
+\pdfglyphtounicode{tfm:rpzdr/a165}{2799}
+\pdfglyphtounicode{tfm:rpzdr/a166}{279B}
+\pdfglyphtounicode{tfm:rpzdr/a167}{279C}
+\pdfglyphtounicode{tfm:rpzdr/a168}{279D}
+\pdfglyphtounicode{tfm:rpzdr/a169}{279E}
+\pdfglyphtounicode{tfm:rpzdr/a17}{2711}
+\pdfglyphtounicode{tfm:rpzdr/a170}{279F}
+\pdfglyphtounicode{tfm:rpzdr/a171}{27A0}
+\pdfglyphtounicode{tfm:rpzdr/a172}{27A1}
+\pdfglyphtounicode{tfm:rpzdr/a173}{27A2}
+\pdfglyphtounicode{tfm:rpzdr/a174}{27A4}
+\pdfglyphtounicode{tfm:rpzdr/a175}{27A5}
+\pdfglyphtounicode{tfm:rpzdr/a176}{27A6}
+\pdfglyphtounicode{tfm:rpzdr/a177}{27A7}
+\pdfglyphtounicode{tfm:rpzdr/a178}{27A8}
+\pdfglyphtounicode{tfm:rpzdr/a179}{27A9}
+\pdfglyphtounicode{tfm:rpzdr/a18}{2712}
+\pdfglyphtounicode{tfm:rpzdr/a180}{27AB}
+\pdfglyphtounicode{tfm:rpzdr/a181}{27AD}
+\pdfglyphtounicode{tfm:rpzdr/a182}{27AF}
+\pdfglyphtounicode{tfm:rpzdr/a183}{27B2}
+\pdfglyphtounicode{tfm:rpzdr/a184}{27B3}
+\pdfglyphtounicode{tfm:rpzdr/a185}{27B5}
+\pdfglyphtounicode{tfm:rpzdr/a186}{27B8}
+\pdfglyphtounicode{tfm:rpzdr/a187}{27BA}
+\pdfglyphtounicode{tfm:rpzdr/a188}{27BB}
+\pdfglyphtounicode{tfm:rpzdr/a189}{27BC}
+\pdfglyphtounicode{tfm:rpzdr/a19}{2713}
+\pdfglyphtounicode{tfm:rpzdr/a190}{27BD}
+\pdfglyphtounicode{tfm:rpzdr/a191}{27BE}
+\pdfglyphtounicode{tfm:rpzdr/a192}{279A}
+\pdfglyphtounicode{tfm:rpzdr/a193}{27AA}
+\pdfglyphtounicode{tfm:rpzdr/a194}{27B6}
+\pdfglyphtounicode{tfm:rpzdr/a195}{27B9}
+\pdfglyphtounicode{tfm:rpzdr/a196}{2798}
+\pdfglyphtounicode{tfm:rpzdr/a197}{27B4}
+\pdfglyphtounicode{tfm:rpzdr/a198}{27B7}
+\pdfglyphtounicode{tfm:rpzdr/a199}{27AC}
+\pdfglyphtounicode{tfm:rpzdr/a2}{2702}
+\pdfglyphtounicode{tfm:rpzdr/a20}{2714}
+\pdfglyphtounicode{tfm:rpzdr/a200}{27AE}
+\pdfglyphtounicode{tfm:rpzdr/a201}{27B1}
+\pdfglyphtounicode{tfm:rpzdr/a202}{2703}
+\pdfglyphtounicode{tfm:rpzdr/a203}{2750}
+\pdfglyphtounicode{tfm:rpzdr/a204}{2752}
+\pdfglyphtounicode{tfm:rpzdr/a205}{276E}
+\pdfglyphtounicode{tfm:rpzdr/a206}{2770}
+\pdfglyphtounicode{tfm:rpzdr/a21}{2715}
+\pdfglyphtounicode{tfm:rpzdr/a22}{2716}
+\pdfglyphtounicode{tfm:rpzdr/a23}{2717}
+\pdfglyphtounicode{tfm:rpzdr/a24}{2718}
+\pdfglyphtounicode{tfm:rpzdr/a25}{2719}
+\pdfglyphtounicode{tfm:rpzdr/a26}{271A}
+\pdfglyphtounicode{tfm:rpzdr/a27}{271B}
+\pdfglyphtounicode{tfm:rpzdr/a28}{271C}
+\pdfglyphtounicode{tfm:rpzdr/a29}{2722}
+\pdfglyphtounicode{tfm:rpzdr/a3}{2704}
+\pdfglyphtounicode{tfm:rpzdr/a30}{2723}
+\pdfglyphtounicode{tfm:rpzdr/a31}{2724}
+\pdfglyphtounicode{tfm:rpzdr/a32}{2725}
+\pdfglyphtounicode{tfm:rpzdr/a33}{2726}
+\pdfglyphtounicode{tfm:rpzdr/a34}{2727}
+\pdfglyphtounicode{tfm:rpzdr/a35}{2605}
+\pdfglyphtounicode{tfm:rpzdr/a36}{2729}
+\pdfglyphtounicode{tfm:rpzdr/a37}{272A}
+\pdfglyphtounicode{tfm:rpzdr/a38}{272B}
+\pdfglyphtounicode{tfm:rpzdr/a39}{272C}
+\pdfglyphtounicode{tfm:rpzdr/a4}{260E}
+\pdfglyphtounicode{tfm:rpzdr/a40}{272D}
+\pdfglyphtounicode{tfm:rpzdr/a41}{272E}
+\pdfglyphtounicode{tfm:rpzdr/a42}{272F}
+\pdfglyphtounicode{tfm:rpzdr/a43}{2730}
+\pdfglyphtounicode{tfm:rpzdr/a44}{2731}
+\pdfglyphtounicode{tfm:rpzdr/a45}{2732}
+\pdfglyphtounicode{tfm:rpzdr/a46}{2733}
+\pdfglyphtounicode{tfm:rpzdr/a47}{2734}
+\pdfglyphtounicode{tfm:rpzdr/a48}{2735}
+\pdfglyphtounicode{tfm:rpzdr/a49}{2736}
+\pdfglyphtounicode{tfm:rpzdr/a5}{2706}
+\pdfglyphtounicode{tfm:rpzdr/a50}{2737}
+\pdfglyphtounicode{tfm:rpzdr/a51}{2738}
+\pdfglyphtounicode{tfm:rpzdr/a52}{2739}
+\pdfglyphtounicode{tfm:rpzdr/a53}{273A}
+\pdfglyphtounicode{tfm:rpzdr/a54}{273B}
+\pdfglyphtounicode{tfm:rpzdr/a55}{273C}
+\pdfglyphtounicode{tfm:rpzdr/a56}{273D}
+\pdfglyphtounicode{tfm:rpzdr/a57}{273E}
+\pdfglyphtounicode{tfm:rpzdr/a58}{273F}
+\pdfglyphtounicode{tfm:rpzdr/a59}{2740}
+\pdfglyphtounicode{tfm:rpzdr/a6}{271D}
+\pdfglyphtounicode{tfm:rpzdr/a60}{2741}
+\pdfglyphtounicode{tfm:rpzdr/a61}{2742}
+\pdfglyphtounicode{tfm:rpzdr/a62}{2743}
+\pdfglyphtounicode{tfm:rpzdr/a63}{2744}
+\pdfglyphtounicode{tfm:rpzdr/a64}{2745}
+\pdfglyphtounicode{tfm:rpzdr/a65}{2746}
+\pdfglyphtounicode{tfm:rpzdr/a66}{2747}
+\pdfglyphtounicode{tfm:rpzdr/a67}{2748}
+\pdfglyphtounicode{tfm:rpzdr/a68}{2749}
+\pdfglyphtounicode{tfm:rpzdr/a69}{274A}
+\pdfglyphtounicode{tfm:rpzdr/a7}{271E}
+\pdfglyphtounicode{tfm:rpzdr/a70}{274B}
+\pdfglyphtounicode{tfm:rpzdr/a71}{25CF}
+\pdfglyphtounicode{tfm:rpzdr/a72}{274D}
+\pdfglyphtounicode{tfm:rpzdr/a73}{25A0}
+\pdfglyphtounicode{tfm:rpzdr/a74}{274F}
+\pdfglyphtounicode{tfm:rpzdr/a75}{2751}
+\pdfglyphtounicode{tfm:rpzdr/a76}{25B2}
+\pdfglyphtounicode{tfm:rpzdr/a77}{25BC}
+\pdfglyphtounicode{tfm:rpzdr/a78}{25C6}
+\pdfglyphtounicode{tfm:rpzdr/a79}{2756}
+\pdfglyphtounicode{tfm:rpzdr/a8}{271F}
+\pdfglyphtounicode{tfm:rpzdr/a81}{25D7}
+\pdfglyphtounicode{tfm:rpzdr/a82}{2758}
+\pdfglyphtounicode{tfm:rpzdr/a83}{2759}
+\pdfglyphtounicode{tfm:rpzdr/a84}{275A}
+\pdfglyphtounicode{tfm:rpzdr/a85}{276F}
+\pdfglyphtounicode{tfm:rpzdr/a86}{2771}
+\pdfglyphtounicode{tfm:rpzdr/a87}{2772}
+\pdfglyphtounicode{tfm:rpzdr/a88}{2773}
+\pdfglyphtounicode{tfm:rpzdr/a89}{2768}
+\pdfglyphtounicode{tfm:rpzdr/a9}{2720}
+\pdfglyphtounicode{tfm:rpzdr/a90}{2769}
+\pdfglyphtounicode{tfm:rpzdr/a91}{276C}
+\pdfglyphtounicode{tfm:rpzdr/a92}{276D}
+\pdfglyphtounicode{tfm:rpzdr/a93}{276A}
+\pdfglyphtounicode{tfm:rpzdr/a94}{276B}
+\pdfglyphtounicode{tfm:rpzdr/a95}{2774}
+\pdfglyphtounicode{tfm:rpzdr/a96}{2775}
+\pdfglyphtounicode{tfm:rpzdr/a97}{275B}
+\pdfglyphtounicode{tfm:rpzdr/a98}{275C}
+\pdfglyphtounicode{tfm:rpzdr/a99}{275D}
+\pdfglyphtounicode{tfm:rtxbmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rtxbmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rtxmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rtxmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:txbmia/phi}{03D5}
+\pdfglyphtounicode{tfm:txbmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:txbsy/diamond}{2662}
+\pdfglyphtounicode{tfm:txbsy/heart}{2661}
+\pdfglyphtounicode{tfm:txbsya/diamond}{2662}
+\pdfglyphtounicode{tfm:txmia/phi}{03D5}
+\pdfglyphtounicode{tfm:txmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:txsy/diamond}{2662}
+\pdfglyphtounicode{tfm:txsy/heart}{2661}
+\pdfglyphtounicode{tfm:txsya/diamond}{2662}
+\pdfglyphtounicode{tfm:zd/a1}{2701}
+\pdfglyphtounicode{tfm:zd/a10}{2721}
+\pdfglyphtounicode{tfm:zd/a100}{275E}
+\pdfglyphtounicode{tfm:zd/a101}{2761}
+\pdfglyphtounicode{tfm:zd/a102}{2762}
+\pdfglyphtounicode{tfm:zd/a103}{2763}
+\pdfglyphtounicode{tfm:zd/a104}{2764}
+\pdfglyphtounicode{tfm:zd/a105}{2710}
+\pdfglyphtounicode{tfm:zd/a106}{2765}
+\pdfglyphtounicode{tfm:zd/a107}{2766}
+\pdfglyphtounicode{tfm:zd/a108}{2767}
+\pdfglyphtounicode{tfm:zd/a109}{2660}
+\pdfglyphtounicode{tfm:zd/a11}{261B}
+\pdfglyphtounicode{tfm:zd/a110}{2665}
+\pdfglyphtounicode{tfm:zd/a111}{2666}
+\pdfglyphtounicode{tfm:zd/a112}{2663}
+\pdfglyphtounicode{tfm:zd/a117}{2709}
+\pdfglyphtounicode{tfm:zd/a118}{2708}
+\pdfglyphtounicode{tfm:zd/a119}{2707}
+\pdfglyphtounicode{tfm:zd/a12}{261E}
+\pdfglyphtounicode{tfm:zd/a120}{2460}
+\pdfglyphtounicode{tfm:zd/a121}{2461}
+\pdfglyphtounicode{tfm:zd/a122}{2462}
+\pdfglyphtounicode{tfm:zd/a123}{2463}
+\pdfglyphtounicode{tfm:zd/a124}{2464}
+\pdfglyphtounicode{tfm:zd/a125}{2465}
+\pdfglyphtounicode{tfm:zd/a126}{2466}
+\pdfglyphtounicode{tfm:zd/a127}{2467}
+\pdfglyphtounicode{tfm:zd/a128}{2468}
+\pdfglyphtounicode{tfm:zd/a129}{2469}
+\pdfglyphtounicode{tfm:zd/a13}{270C}
+\pdfglyphtounicode{tfm:zd/a130}{2776}
+\pdfglyphtounicode{tfm:zd/a131}{2777}
+\pdfglyphtounicode{tfm:zd/a132}{2778}
+\pdfglyphtounicode{tfm:zd/a133}{2779}
+\pdfglyphtounicode{tfm:zd/a134}{277A}
+\pdfglyphtounicode{tfm:zd/a135}{277B}
+\pdfglyphtounicode{tfm:zd/a136}{277C}
+\pdfglyphtounicode{tfm:zd/a137}{277D}
+\pdfglyphtounicode{tfm:zd/a138}{277E}
+\pdfglyphtounicode{tfm:zd/a139}{277F}
+\pdfglyphtounicode{tfm:zd/a14}{270D}
+\pdfglyphtounicode{tfm:zd/a140}{2780}
+\pdfglyphtounicode{tfm:zd/a141}{2781}
+\pdfglyphtounicode{tfm:zd/a142}{2782}
+\pdfglyphtounicode{tfm:zd/a143}{2783}
+\pdfglyphtounicode{tfm:zd/a144}{2784}
+\pdfglyphtounicode{tfm:zd/a145}{2785}
+\pdfglyphtounicode{tfm:zd/a146}{2786}
+\pdfglyphtounicode{tfm:zd/a147}{2787}
+\pdfglyphtounicode{tfm:zd/a148}{2788}
+\pdfglyphtounicode{tfm:zd/a149}{2789}
+\pdfglyphtounicode{tfm:zd/a15}{270E}
+\pdfglyphtounicode{tfm:zd/a150}{278A}
+\pdfglyphtounicode{tfm:zd/a151}{278B}
+\pdfglyphtounicode{tfm:zd/a152}{278C}
+\pdfglyphtounicode{tfm:zd/a153}{278D}
+\pdfglyphtounicode{tfm:zd/a154}{278E}
+\pdfglyphtounicode{tfm:zd/a155}{278F}
+\pdfglyphtounicode{tfm:zd/a156}{2790}
+\pdfglyphtounicode{tfm:zd/a157}{2791}
+\pdfglyphtounicode{tfm:zd/a158}{2792}
+\pdfglyphtounicode{tfm:zd/a159}{2793}
+\pdfglyphtounicode{tfm:zd/a16}{270F}
+\pdfglyphtounicode{tfm:zd/a160}{2794}
+\pdfglyphtounicode{tfm:zd/a161}{2192}
+\pdfglyphtounicode{tfm:zd/a162}{27A3}
+\pdfglyphtounicode{tfm:zd/a163}{2194}
+\pdfglyphtounicode{tfm:zd/a164}{2195}
+\pdfglyphtounicode{tfm:zd/a165}{2799}
+\pdfglyphtounicode{tfm:zd/a166}{279B}
+\pdfglyphtounicode{tfm:zd/a167}{279C}
+\pdfglyphtounicode{tfm:zd/a168}{279D}
+\pdfglyphtounicode{tfm:zd/a169}{279E}
+\pdfglyphtounicode{tfm:zd/a17}{2711}
+\pdfglyphtounicode{tfm:zd/a170}{279F}
+\pdfglyphtounicode{tfm:zd/a171}{27A0}
+\pdfglyphtounicode{tfm:zd/a172}{27A1}
+\pdfglyphtounicode{tfm:zd/a173}{27A2}
+\pdfglyphtounicode{tfm:zd/a174}{27A4}
+\pdfglyphtounicode{tfm:zd/a175}{27A5}
+\pdfglyphtounicode{tfm:zd/a176}{27A6}
+\pdfglyphtounicode{tfm:zd/a177}{27A7}
+\pdfglyphtounicode{tfm:zd/a178}{27A8}
+\pdfglyphtounicode{tfm:zd/a179}{27A9}
+\pdfglyphtounicode{tfm:zd/a18}{2712}
+\pdfglyphtounicode{tfm:zd/a180}{27AB}
+\pdfglyphtounicode{tfm:zd/a181}{27AD}
+\pdfglyphtounicode{tfm:zd/a182}{27AF}
+\pdfglyphtounicode{tfm:zd/a183}{27B2}
+\pdfglyphtounicode{tfm:zd/a184}{27B3}
+\pdfglyphtounicode{tfm:zd/a185}{27B5}
+\pdfglyphtounicode{tfm:zd/a186}{27B8}
+\pdfglyphtounicode{tfm:zd/a187}{27BA}
+\pdfglyphtounicode{tfm:zd/a188}{27BB}
+\pdfglyphtounicode{tfm:zd/a189}{27BC}
+\pdfglyphtounicode{tfm:zd/a19}{2713}
+\pdfglyphtounicode{tfm:zd/a190}{27BD}
+\pdfglyphtounicode{tfm:zd/a191}{27BE}
+\pdfglyphtounicode{tfm:zd/a192}{279A}
+\pdfglyphtounicode{tfm:zd/a193}{27AA}
+\pdfglyphtounicode{tfm:zd/a194}{27B6}
+\pdfglyphtounicode{tfm:zd/a195}{27B9}
+\pdfglyphtounicode{tfm:zd/a196}{2798}
+\pdfglyphtounicode{tfm:zd/a197}{27B4}
+\pdfglyphtounicode{tfm:zd/a198}{27B7}
+\pdfglyphtounicode{tfm:zd/a199}{27AC}
+\pdfglyphtounicode{tfm:zd/a2}{2702}
+\pdfglyphtounicode{tfm:zd/a20}{2714}
+\pdfglyphtounicode{tfm:zd/a200}{27AE}
+\pdfglyphtounicode{tfm:zd/a201}{27B1}
+\pdfglyphtounicode{tfm:zd/a202}{2703}
+\pdfglyphtounicode{tfm:zd/a203}{2750}
+\pdfglyphtounicode{tfm:zd/a204}{2752}
+\pdfglyphtounicode{tfm:zd/a205}{276E}
+\pdfglyphtounicode{tfm:zd/a206}{2770}
+\pdfglyphtounicode{tfm:zd/a21}{2715}
+\pdfglyphtounicode{tfm:zd/a22}{2716}
+\pdfglyphtounicode{tfm:zd/a23}{2717}
+\pdfglyphtounicode{tfm:zd/a24}{2718}
+\pdfglyphtounicode{tfm:zd/a25}{2719}
+\pdfglyphtounicode{tfm:zd/a26}{271A}
+\pdfglyphtounicode{tfm:zd/a27}{271B}
+\pdfglyphtounicode{tfm:zd/a28}{271C}
+\pdfglyphtounicode{tfm:zd/a29}{2722}
+\pdfglyphtounicode{tfm:zd/a3}{2704}
+\pdfglyphtounicode{tfm:zd/a30}{2723}
+\pdfglyphtounicode{tfm:zd/a31}{2724}
+\pdfglyphtounicode{tfm:zd/a32}{2725}
+\pdfglyphtounicode{tfm:zd/a33}{2726}
+\pdfglyphtounicode{tfm:zd/a34}{2727}
+\pdfglyphtounicode{tfm:zd/a35}{2605}
+\pdfglyphtounicode{tfm:zd/a36}{2729}
+\pdfglyphtounicode{tfm:zd/a37}{272A}
+\pdfglyphtounicode{tfm:zd/a38}{272B}
+\pdfglyphtounicode{tfm:zd/a39}{272C}
+\pdfglyphtounicode{tfm:zd/a4}{260E}
+\pdfglyphtounicode{tfm:zd/a40}{272D}
+\pdfglyphtounicode{tfm:zd/a41}{272E}
+\pdfglyphtounicode{tfm:zd/a42}{272F}
+\pdfglyphtounicode{tfm:zd/a43}{2730}
+\pdfglyphtounicode{tfm:zd/a44}{2731}
+\pdfglyphtounicode{tfm:zd/a45}{2732}
+\pdfglyphtounicode{tfm:zd/a46}{2733}
+\pdfglyphtounicode{tfm:zd/a47}{2734}
+\pdfglyphtounicode{tfm:zd/a48}{2735}
+\pdfglyphtounicode{tfm:zd/a49}{2736}
+\pdfglyphtounicode{tfm:zd/a5}{2706}
+\pdfglyphtounicode{tfm:zd/a50}{2737}
+\pdfglyphtounicode{tfm:zd/a51}{2738}
+\pdfglyphtounicode{tfm:zd/a52}{2739}
+\pdfglyphtounicode{tfm:zd/a53}{273A}
+\pdfglyphtounicode{tfm:zd/a54}{273B}
+\pdfglyphtounicode{tfm:zd/a55}{273C}
+\pdfglyphtounicode{tfm:zd/a56}{273D}
+\pdfglyphtounicode{tfm:zd/a57}{273E}
+\pdfglyphtounicode{tfm:zd/a58}{273F}
+\pdfglyphtounicode{tfm:zd/a59}{2740}
+\pdfglyphtounicode{tfm:zd/a6}{271D}
+\pdfglyphtounicode{tfm:zd/a60}{2741}
+\pdfglyphtounicode{tfm:zd/a61}{2742}
+\pdfglyphtounicode{tfm:zd/a62}{2743}
+\pdfglyphtounicode{tfm:zd/a63}{2744}
+\pdfglyphtounicode{tfm:zd/a64}{2745}
+\pdfglyphtounicode{tfm:zd/a65}{2746}
+\pdfglyphtounicode{tfm:zd/a66}{2747}
+\pdfglyphtounicode{tfm:zd/a67}{2748}
+\pdfglyphtounicode{tfm:zd/a68}{2749}
+\pdfglyphtounicode{tfm:zd/a69}{274A}
+\pdfglyphtounicode{tfm:zd/a7}{271E}
+\pdfglyphtounicode{tfm:zd/a70}{274B}
+\pdfglyphtounicode{tfm:zd/a71}{25CF}
+\pdfglyphtounicode{tfm:zd/a72}{274D}
+\pdfglyphtounicode{tfm:zd/a73}{25A0}
+\pdfglyphtounicode{tfm:zd/a74}{274F}
+\pdfglyphtounicode{tfm:zd/a75}{2751}
+\pdfglyphtounicode{tfm:zd/a76}{25B2}
+\pdfglyphtounicode{tfm:zd/a77}{25BC}
+\pdfglyphtounicode{tfm:zd/a78}{25C6}
+\pdfglyphtounicode{tfm:zd/a79}{2756}
+\pdfglyphtounicode{tfm:zd/a8}{271F}
+\pdfglyphtounicode{tfm:zd/a81}{25D7}
+\pdfglyphtounicode{tfm:zd/a82}{2758}
+\pdfglyphtounicode{tfm:zd/a83}{2759}
+\pdfglyphtounicode{tfm:zd/a84}{275A}
+\pdfglyphtounicode{tfm:zd/a85}{276F}
+\pdfglyphtounicode{tfm:zd/a86}{2771}
+\pdfglyphtounicode{tfm:zd/a87}{2772}
+\pdfglyphtounicode{tfm:zd/a88}{2773}
+\pdfglyphtounicode{tfm:zd/a89}{2768}
+\pdfglyphtounicode{tfm:zd/a9}{2720}
+\pdfglyphtounicode{tfm:zd/a90}{2769}
+\pdfglyphtounicode{tfm:zd/a91}{276C}
+\pdfglyphtounicode{tfm:zd/a92}{276D}
+\pdfglyphtounicode{tfm:zd/a93}{276A}
+\pdfglyphtounicode{tfm:zd/a94}{276B}
+\pdfglyphtounicode{tfm:zd/a95}{2774}
+\pdfglyphtounicode{tfm:zd/a96}{2775}
+\pdfglyphtounicode{tfm:zd/a97}{275B}
+\pdfglyphtounicode{tfm:zd/a98}{275C}
+\pdfglyphtounicode{tfm:zd/a99}{275D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a1}{2701}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a10}{2721}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a100}{275E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a101}{2761}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a102}{2762}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a103}{2763}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a104}{2764}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a105}{2710}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a106}{2765}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a107}{2766}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a108}{2767}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a109}{2660}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a11}{261B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a110}{2665}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a111}{2666}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a112}{2663}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a117}{2709}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a118}{2708}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a119}{2707}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a12}{261E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a120}{2460}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a121}{2461}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a122}{2462}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a123}{2463}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a124}{2464}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a125}{2465}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a126}{2466}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a127}{2467}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a128}{2468}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a129}{2469}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a13}{270C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a130}{2776}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a131}{2777}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a132}{2778}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a133}{2779}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a134}{277A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a135}{277B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a136}{277C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a137}{277D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a138}{277E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a139}{277F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a14}{270D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a140}{2780}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a141}{2781}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a142}{2782}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a143}{2783}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a144}{2784}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a145}{2785}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a146}{2786}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a147}{2787}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a148}{2788}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a149}{2789}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a15}{270E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a150}{278A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a151}{278B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a152}{278C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a153}{278D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a154}{278E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a155}{278F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a156}{2790}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a157}{2791}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a158}{2792}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a159}{2793}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a16}{270F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a160}{2794}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a161}{2192}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a162}{27A3}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a163}{2194}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a164}{2195}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a165}{2799}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a166}{279B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a167}{279C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a168}{279D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a169}{279E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a17}{2711}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a170}{279F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a171}{27A0}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a172}{27A1}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a173}{27A2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a174}{27A4}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a175}{27A5}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a176}{27A6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a177}{27A7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a178}{27A8}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a179}{27A9}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a18}{2712}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a180}{27AB}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a181}{27AD}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a182}{27AF}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a183}{27B2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a184}{27B3}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a185}{27B5}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a186}{27B8}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a187}{27BA}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a188}{27BB}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a189}{27BC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a19}{2713}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a190}{27BD}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a191}{27BE}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a192}{279A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a193}{27AA}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a194}{27B6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a195}{27B9}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a196}{2798}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a197}{27B4}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a198}{27B7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a199}{27AC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a2}{2702}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a20}{2714}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a200}{27AE}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a201}{27B1}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a202}{2703}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a203}{2750}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a204}{2752}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a205}{276E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a206}{2770}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a21}{2715}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a22}{2716}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a23}{2717}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a24}{2718}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a25}{2719}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a26}{271A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a27}{271B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a28}{271C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a29}{2722}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a3}{2704}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a30}{2723}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a31}{2724}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a32}{2725}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a33}{2726}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a34}{2727}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a35}{2605}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a36}{2729}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a37}{272A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a38}{272B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a39}{272C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a4}{260E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a40}{272D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a41}{272E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a42}{272F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a43}{2730}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a44}{2731}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a45}{2732}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a46}{2733}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a47}{2734}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a48}{2735}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a49}{2736}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a5}{2706}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a50}{2737}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a51}{2738}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a52}{2739}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a53}{273A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a54}{273B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a55}{273C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a56}{273D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a57}{273E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a58}{273F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a59}{2740}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a6}{271D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a60}{2741}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a61}{2742}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a62}{2743}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a63}{2744}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a64}{2745}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a65}{2746}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a66}{2747}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a67}{2748}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a68}{2749}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a69}{274A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a7}{271E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a70}{274B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a71}{25CF}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a72}{274D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a73}{25A0}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a74}{274F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a75}{2751}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a76}{25B2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a77}{25BC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a78}{25C6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a79}{2756}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a8}{271F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a81}{25D7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a82}{2758}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a83}{2759}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a84}{275A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a85}{276F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a86}{2771}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a87}{2772}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a88}{2773}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a89}{2768}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a9}{2720}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a90}{2769}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a91}{276C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a92}{276D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a93}{276A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a94}{276B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a95}{2774}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a96}{2775}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a97}{275B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a98}{275C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a99}{275D}
+\pdfglyphtounicode{thabengali}{09A5}
+\pdfglyphtounicode{thadeva}{0925}
+\pdfglyphtounicode{thagujarati}{0AA5}
+\pdfglyphtounicode{thagurmukhi}{0A25}
+\pdfglyphtounicode{thalarabic}{0630}
+\pdfglyphtounicode{thalfinalarabic}{FEAC}
+\pdfglyphtounicode{thanthakhatlowleftthai}{F898}
+\pdfglyphtounicode{thanthakhatlowrightthai}{F897}
+\pdfglyphtounicode{thanthakhatthai}{0E4C}
+\pdfglyphtounicode{thanthakhatupperleftthai}{F896}
+\pdfglyphtounicode{theharabic}{062B}
+\pdfglyphtounicode{thehfinalarabic}{FE9A}
+\pdfglyphtounicode{thehinitialarabic}{FE9B}
+\pdfglyphtounicode{thehmedialarabic}{FE9C}
+\pdfglyphtounicode{thereexists}{2203}
+\pdfglyphtounicode{therefore}{2234}
+\pdfglyphtounicode{theta}{03B8}
+\pdfglyphtounicode{theta1}{03D1}
+\pdfglyphtounicode{thetasymbolgreek}{03D1}
+\pdfglyphtounicode{thieuthacirclekorean}{3279}
+\pdfglyphtounicode{thieuthaparenkorean}{3219}
+\pdfglyphtounicode{thieuthcirclekorean}{326B}
+\pdfglyphtounicode{thieuthkorean}{314C}
+\pdfglyphtounicode{thieuthparenkorean}{320B}
+\pdfglyphtounicode{thirteencircle}{246C}
+\pdfglyphtounicode{thirteenparen}{2480}
+\pdfglyphtounicode{thirteenperiod}{2494}
+\pdfglyphtounicode{thonangmonthothai}{0E11}
+\pdfglyphtounicode{thook}{01AD}
+\pdfglyphtounicode{thophuthaothai}{0E12}
+\pdfglyphtounicode{thorn}{00FE}
+\pdfglyphtounicode{thothahanthai}{0E17}
+\pdfglyphtounicode{thothanthai}{0E10}
+\pdfglyphtounicode{thothongthai}{0E18}
+\pdfglyphtounicode{thothungthai}{0E16}
+\pdfglyphtounicode{thousandcyrillic}{0482}
+\pdfglyphtounicode{thousandsseparatorarabic}{066C}
+\pdfglyphtounicode{thousandsseparatorpersian}{066C}
+\pdfglyphtounicode{three}{0033}
+\pdfglyphtounicode{threearabic}{0663}
+\pdfglyphtounicode{threebengali}{09E9}
+\pdfglyphtounicode{threecircle}{2462}
+\pdfglyphtounicode{threecircleinversesansserif}{278C}
+\pdfglyphtounicode{threedeva}{0969}
+\pdfglyphtounicode{threeeighths}{215C}
+\pdfglyphtounicode{threegujarati}{0AE9}
+\pdfglyphtounicode{threegurmukhi}{0A69}
+\pdfglyphtounicode{threehackarabic}{0663}
+\pdfglyphtounicode{threehangzhou}{3023}
+\pdfglyphtounicode{threeideographicparen}{3222}
+\pdfglyphtounicode{threeinferior}{2083}
+\pdfglyphtounicode{threemonospace}{FF13}
+\pdfglyphtounicode{threenumeratorbengali}{09F6}
+\pdfglyphtounicode{threeoldstyle}{0033}
+\pdfglyphtounicode{threeparen}{2476}
+\pdfglyphtounicode{threeperiod}{248A}
+\pdfglyphtounicode{threepersian}{06F3}
+\pdfglyphtounicode{threequarters}{00BE}
+\pdfglyphtounicode{threequartersemdash}{F6DE}
+\pdfglyphtounicode{threeroman}{2172}
+\pdfglyphtounicode{threesuperior}{00B3}
+\pdfglyphtounicode{threethai}{0E53}
+\pdfglyphtounicode{thzsquare}{3394}
+\pdfglyphtounicode{tihiragana}{3061}
+\pdfglyphtounicode{tikatakana}{30C1}
+\pdfglyphtounicode{tikatakanahalfwidth}{FF81}
+\pdfglyphtounicode{tikeutacirclekorean}{3270}
+\pdfglyphtounicode{tikeutaparenkorean}{3210}
+\pdfglyphtounicode{tikeutcirclekorean}{3262}
+\pdfglyphtounicode{tikeutkorean}{3137}
+\pdfglyphtounicode{tikeutparenkorean}{3202}
+\pdfglyphtounicode{tilde}{02DC}
+\pdfglyphtounicode{tildebelowcmb}{0330}
+\pdfglyphtounicode{tildecmb}{0303}
+\pdfglyphtounicode{tildecomb}{0303}
+\pdfglyphtounicode{tildedoublecmb}{0360}
+\pdfglyphtounicode{tildeoperator}{223C}
+\pdfglyphtounicode{tildeoverlaycmb}{0334}
+\pdfglyphtounicode{tildeverticalcmb}{033E}
+\pdfglyphtounicode{timescircle}{2297}
+\pdfglyphtounicode{tipehahebrew}{0596}
+\pdfglyphtounicode{tipehalefthebrew}{0596}
+\pdfglyphtounicode{tippigurmukhi}{0A70}
+\pdfglyphtounicode{titlocyrilliccmb}{0483}
+\pdfglyphtounicode{tiwnarmenian}{057F}
+\pdfglyphtounicode{tlinebelow}{1E6F}
+\pdfglyphtounicode{tmonospace}{FF54}
+\pdfglyphtounicode{toarmenian}{0569}
+\pdfglyphtounicode{tohiragana}{3068}
+\pdfglyphtounicode{tokatakana}{30C8}
+\pdfglyphtounicode{tokatakanahalfwidth}{FF84}
+\pdfglyphtounicode{tonebarextrahighmod}{02E5}
+\pdfglyphtounicode{tonebarextralowmod}{02E9}
+\pdfglyphtounicode{tonebarhighmod}{02E6}
+\pdfglyphtounicode{tonebarlowmod}{02E8}
+\pdfglyphtounicode{tonebarmidmod}{02E7}
+\pdfglyphtounicode{tonefive}{01BD}
+\pdfglyphtounicode{tonesix}{0185}
+\pdfglyphtounicode{tonetwo}{01A8}
+\pdfglyphtounicode{tonos}{0384}
+\pdfglyphtounicode{tonsquare}{3327}
+\pdfglyphtounicode{topatakthai}{0E0F}
+\pdfglyphtounicode{tortoiseshellbracketleft}{3014}
+\pdfglyphtounicode{tortoiseshellbracketleftsmall}{FE5D}
+\pdfglyphtounicode{tortoiseshellbracketleftvertical}{FE39}
+\pdfglyphtounicode{tortoiseshellbracketright}{3015}
+\pdfglyphtounicode{tortoiseshellbracketrightsmall}{FE5E}
+\pdfglyphtounicode{tortoiseshellbracketrightvertical}{FE3A}
+\pdfglyphtounicode{totaothai}{0E15}
+\pdfglyphtounicode{tpalatalhook}{01AB}
+\pdfglyphtounicode{tparen}{24AF}
+\pdfglyphtounicode{trademark}{2122}
+\pdfglyphtounicode{trademarksans}{2122}
+\pdfglyphtounicode{trademarkserif}{2122}
+\pdfglyphtounicode{tretroflexhook}{0288}
+\pdfglyphtounicode{triagdn}{25BC}
+\pdfglyphtounicode{triaglf}{25C4}
+\pdfglyphtounicode{triagrt}{25BA}
+\pdfglyphtounicode{triagup}{25B2}
+\pdfglyphtounicode{triangle}{25B3}
+\pdfglyphtounicode{triangledownsld}{25BC}
+\pdfglyphtounicode{triangleinv}{25BD}
+\pdfglyphtounicode{triangleleft}{25C1}
+\pdfglyphtounicode{triangleleftequal}{22B4}
+\pdfglyphtounicode{triangleleftsld}{25C0}
+\pdfglyphtounicode{triangleright}{25B7}
+\pdfglyphtounicode{trianglerightequal}{22B5}
+\pdfglyphtounicode{trianglerightsld}{25B6}
+\pdfglyphtounicode{trianglesolid}{25B2}
+\pdfglyphtounicode{ts}{02A6}
+\pdfglyphtounicode{tsadi}{05E6}
+\pdfglyphtounicode{tsadidagesh}{FB46}
+\pdfglyphtounicode{tsadidageshhebrew}{FB46}
+\pdfglyphtounicode{tsadihebrew}{05E6}
+\pdfglyphtounicode{tsecyrillic}{0446}
+\pdfglyphtounicode{tsere}{05B5}
+\pdfglyphtounicode{tsere12}{05B5}
+\pdfglyphtounicode{tsere1e}{05B5}
+\pdfglyphtounicode{tsere2b}{05B5}
+\pdfglyphtounicode{tserehebrew}{05B5}
+\pdfglyphtounicode{tserenarrowhebrew}{05B5}
+\pdfglyphtounicode{tserequarterhebrew}{05B5}
+\pdfglyphtounicode{tserewidehebrew}{05B5}
+\pdfglyphtounicode{tshecyrillic}{045B}
+\pdfglyphtounicode{tsuperior}{0074}
+\pdfglyphtounicode{ttabengali}{099F}
+\pdfglyphtounicode{ttadeva}{091F}
+\pdfglyphtounicode{ttagujarati}{0A9F}
+\pdfglyphtounicode{ttagurmukhi}{0A1F}
+\pdfglyphtounicode{tteharabic}{0679}
+\pdfglyphtounicode{ttehfinalarabic}{FB67}
+\pdfglyphtounicode{ttehinitialarabic}{FB68}
+\pdfglyphtounicode{ttehmedialarabic}{FB69}
+\pdfglyphtounicode{tthabengali}{09A0}
+\pdfglyphtounicode{tthadeva}{0920}
+\pdfglyphtounicode{tthagujarati}{0AA0}
+\pdfglyphtounicode{tthagurmukhi}{0A20}
+\pdfglyphtounicode{tturned}{0287}
+\pdfglyphtounicode{tuhiragana}{3064}
+\pdfglyphtounicode{tukatakana}{30C4}
+\pdfglyphtounicode{tukatakanahalfwidth}{FF82}
+\pdfglyphtounicode{turnstileleft}{22A2}
+\pdfglyphtounicode{turnstileright}{22A3}
+\pdfglyphtounicode{tusmallhiragana}{3063}
+\pdfglyphtounicode{tusmallkatakana}{30C3}
+\pdfglyphtounicode{tusmallkatakanahalfwidth}{FF6F}
+\pdfglyphtounicode{twelvecircle}{246B}
+\pdfglyphtounicode{twelveparen}{247F}
+\pdfglyphtounicode{twelveperiod}{2493}
+\pdfglyphtounicode{twelveroman}{217B}
+\pdfglyphtounicode{twentycircle}{2473}
+\pdfglyphtounicode{twentyhangzhou}{5344}
+\pdfglyphtounicode{twentyparen}{2487}
+\pdfglyphtounicode{twentyperiod}{249B}
+\pdfglyphtounicode{two}{0032}
+\pdfglyphtounicode{twoarabic}{0662}
+\pdfglyphtounicode{twobengali}{09E8}
+\pdfglyphtounicode{twocircle}{2461}
+\pdfglyphtounicode{twocircleinversesansserif}{278B}
+\pdfglyphtounicode{twodeva}{0968}
+\pdfglyphtounicode{twodotenleader}{2025}
+\pdfglyphtounicode{twodotleader}{2025}
+\pdfglyphtounicode{twodotleadervertical}{FE30}
+\pdfglyphtounicode{twogujarati}{0AE8}
+\pdfglyphtounicode{twogurmukhi}{0A68}
+\pdfglyphtounicode{twohackarabic}{0662}
+\pdfglyphtounicode{twohangzhou}{3022}
+\pdfglyphtounicode{twoideographicparen}{3221}
+\pdfglyphtounicode{twoinferior}{2082}
+\pdfglyphtounicode{twomonospace}{FF12}
+\pdfglyphtounicode{twonumeratorbengali}{09F5}
+\pdfglyphtounicode{twooldstyle}{0032}
+\pdfglyphtounicode{twoparen}{2475}
+\pdfglyphtounicode{twoperiod}{2489}
+\pdfglyphtounicode{twopersian}{06F2}
+\pdfglyphtounicode{tworoman}{2171}
+\pdfglyphtounicode{twostroke}{01BB}
+\pdfglyphtounicode{twosuperior}{00B2}
+\pdfglyphtounicode{twothai}{0E52}
+\pdfglyphtounicode{twothirds}{2154}
+\pdfglyphtounicode{u}{0075}
+\pdfglyphtounicode{uacute}{00FA}
+\pdfglyphtounicode{ubar}{0289}
+\pdfglyphtounicode{ubengali}{0989}
+\pdfglyphtounicode{ubopomofo}{3128}
+\pdfglyphtounicode{ubreve}{016D}
+\pdfglyphtounicode{ucaron}{01D4}
+\pdfglyphtounicode{ucircle}{24E4}
+\pdfglyphtounicode{ucircumflex}{00FB}
+\pdfglyphtounicode{ucircumflexbelow}{1E77}
+\pdfglyphtounicode{ucyrillic}{0443}
+\pdfglyphtounicode{udattadeva}{0951}
+\pdfglyphtounicode{udblacute}{0171}
+\pdfglyphtounicode{udblgrave}{0215}
+\pdfglyphtounicode{udeva}{0909}
+\pdfglyphtounicode{udieresis}{00FC}
+\pdfglyphtounicode{udieresisacute}{01D8}
+\pdfglyphtounicode{udieresisbelow}{1E73}
+\pdfglyphtounicode{udieresiscaron}{01DA}
+\pdfglyphtounicode{udieresiscyrillic}{04F1}
+\pdfglyphtounicode{udieresisgrave}{01DC}
+\pdfglyphtounicode{udieresismacron}{01D6}
+\pdfglyphtounicode{udotbelow}{1EE5}
+\pdfglyphtounicode{ugrave}{00F9}
+\pdfglyphtounicode{ugujarati}{0A89}
+\pdfglyphtounicode{ugurmukhi}{0A09}
+\pdfglyphtounicode{uhiragana}{3046}
+\pdfglyphtounicode{uhookabove}{1EE7}
+\pdfglyphtounicode{uhorn}{01B0}
+\pdfglyphtounicode{uhornacute}{1EE9}
+\pdfglyphtounicode{uhorndotbelow}{1EF1}
+\pdfglyphtounicode{uhorngrave}{1EEB}
+\pdfglyphtounicode{uhornhookabove}{1EED}
+\pdfglyphtounicode{uhorntilde}{1EEF}
+\pdfglyphtounicode{uhungarumlaut}{0171}
+\pdfglyphtounicode{uhungarumlautcyrillic}{04F3}
+\pdfglyphtounicode{uinvertedbreve}{0217}
+\pdfglyphtounicode{ukatakana}{30A6}
+\pdfglyphtounicode{ukatakanahalfwidth}{FF73}
+\pdfglyphtounicode{ukcyrillic}{0479}
+\pdfglyphtounicode{ukorean}{315C}
+\pdfglyphtounicode{umacron}{016B}
+\pdfglyphtounicode{umacroncyrillic}{04EF}
+\pdfglyphtounicode{umacrondieresis}{1E7B}
+\pdfglyphtounicode{umatragurmukhi}{0A41}
+\pdfglyphtounicode{umonospace}{FF55}
+\pdfglyphtounicode{underscore}{005F}
+\pdfglyphtounicode{underscoredbl}{2017}
+\pdfglyphtounicode{underscoremonospace}{FF3F}
+\pdfglyphtounicode{underscorevertical}{FE33}
+\pdfglyphtounicode{underscorewavy}{FE4F}
+\pdfglyphtounicode{union}{222A}
+\pdfglyphtounicode{uniondbl}{22D3}
+\pdfglyphtounicode{unionmulti}{228E}
+\pdfglyphtounicode{unionsq}{2294}
+\pdfglyphtounicode{universal}{2200}
+\pdfglyphtounicode{uogonek}{0173}
+\pdfglyphtounicode{uparen}{24B0}
+\pdfglyphtounicode{upblock}{2580}
+\pdfglyphtounicode{upperdothebrew}{05C4}
+\pdfglyphtounicode{uprise}{22CF}
+\pdfglyphtounicode{upsilon}{03C5}
+\pdfglyphtounicode{upsilondieresis}{03CB}
+\pdfglyphtounicode{upsilondieresistonos}{03B0}
+\pdfglyphtounicode{upsilonlatin}{028A}
+\pdfglyphtounicode{upsilontonos}{03CD}
+\pdfglyphtounicode{upslope}{29F8}
+\pdfglyphtounicode{uptackbelowcmb}{031D}
+\pdfglyphtounicode{uptackmod}{02D4}
+\pdfglyphtounicode{uragurmukhi}{0A73}
+\pdfglyphtounicode{uring}{016F}
+\pdfglyphtounicode{ushortcyrillic}{045E}
+\pdfglyphtounicode{usmallhiragana}{3045}
+\pdfglyphtounicode{usmallkatakana}{30A5}
+\pdfglyphtounicode{usmallkatakanahalfwidth}{FF69}
+\pdfglyphtounicode{ustraightcyrillic}{04AF}
+\pdfglyphtounicode{ustraightstrokecyrillic}{04B1}
+\pdfglyphtounicode{utilde}{0169}
+\pdfglyphtounicode{utildeacute}{1E79}
+\pdfglyphtounicode{utildebelow}{1E75}
+\pdfglyphtounicode{uubengali}{098A}
+\pdfglyphtounicode{uudeva}{090A}
+\pdfglyphtounicode{uugujarati}{0A8A}
+\pdfglyphtounicode{uugurmukhi}{0A0A}
+\pdfglyphtounicode{uumatragurmukhi}{0A42}
+\pdfglyphtounicode{uuvowelsignbengali}{09C2}
+\pdfglyphtounicode{uuvowelsigndeva}{0942}
+\pdfglyphtounicode{uuvowelsigngujarati}{0AC2}
+\pdfglyphtounicode{uvowelsignbengali}{09C1}
+\pdfglyphtounicode{uvowelsigndeva}{0941}
+\pdfglyphtounicode{uvowelsigngujarati}{0AC1}
+\pdfglyphtounicode{v}{0076}
+\pdfglyphtounicode{vadeva}{0935}
+\pdfglyphtounicode{vagujarati}{0AB5}
+\pdfglyphtounicode{vagurmukhi}{0A35}
+\pdfglyphtounicode{vakatakana}{30F7}
+\pdfglyphtounicode{vav}{05D5}
+\pdfglyphtounicode{vavdagesh}{FB35}
+\pdfglyphtounicode{vavdagesh65}{FB35}
+\pdfglyphtounicode{vavdageshhebrew}{FB35}
+\pdfglyphtounicode{vavhebrew}{05D5}
+\pdfglyphtounicode{vavholam}{FB4B}
+\pdfglyphtounicode{vavholamhebrew}{FB4B}
+\pdfglyphtounicode{vavvavhebrew}{05F0}
+\pdfglyphtounicode{vavyodhebrew}{05F1}
+\pdfglyphtounicode{vcircle}{24E5}
+\pdfglyphtounicode{vdotbelow}{1E7F}
+\pdfglyphtounicode{vector}{20D7}
+\pdfglyphtounicode{vecyrillic}{0432}
+\pdfglyphtounicode{veharabic}{06A4}
+\pdfglyphtounicode{vehfinalarabic}{FB6B}
+\pdfglyphtounicode{vehinitialarabic}{FB6C}
+\pdfglyphtounicode{vehmedialarabic}{FB6D}
+\pdfglyphtounicode{vekatakana}{30F9}
+\pdfglyphtounicode{venus}{2640}
+\pdfglyphtounicode{verticalbar}{007C}
+\pdfglyphtounicode{verticallineabovecmb}{030D}
+\pdfglyphtounicode{verticallinebelowcmb}{0329}
+\pdfglyphtounicode{verticallinelowmod}{02CC}
+\pdfglyphtounicode{verticallinemod}{02C8}
+\pdfglyphtounicode{vewarmenian}{057E}
+\pdfglyphtounicode{vhook}{028B}
+\pdfglyphtounicode{vikatakana}{30F8}
+\pdfglyphtounicode{viramabengali}{09CD}
+\pdfglyphtounicode{viramadeva}{094D}
+\pdfglyphtounicode{viramagujarati}{0ACD}
+\pdfglyphtounicode{visargabengali}{0983}
+\pdfglyphtounicode{visargadeva}{0903}
+\pdfglyphtounicode{visargagujarati}{0A83}
+\pdfglyphtounicode{visiblespace}{2423}
+\pdfglyphtounicode{visualspace}{2423}
+\pdfglyphtounicode{vmonospace}{FF56}
+\pdfglyphtounicode{voarmenian}{0578}
+\pdfglyphtounicode{voicediterationhiragana}{309E}
+\pdfglyphtounicode{voicediterationkatakana}{30FE}
+\pdfglyphtounicode{voicedmarkkana}{309B}
+\pdfglyphtounicode{voicedmarkkanahalfwidth}{FF9E}
+\pdfglyphtounicode{vokatakana}{30FA}
+\pdfglyphtounicode{vparen}{24B1}
+\pdfglyphtounicode{vtilde}{1E7D}
+\pdfglyphtounicode{vturned}{028C}
+\pdfglyphtounicode{vuhiragana}{3094}
+\pdfglyphtounicode{vukatakana}{30F4}
+\pdfglyphtounicode{w}{0077}
+\pdfglyphtounicode{wacute}{1E83}
+\pdfglyphtounicode{waekorean}{3159}
+\pdfglyphtounicode{wahiragana}{308F}
+\pdfglyphtounicode{wakatakana}{30EF}
+\pdfglyphtounicode{wakatakanahalfwidth}{FF9C}
+\pdfglyphtounicode{wakorean}{3158}
+\pdfglyphtounicode{wasmallhiragana}{308E}
+\pdfglyphtounicode{wasmallkatakana}{30EE}
+\pdfglyphtounicode{wattosquare}{3357}
+\pdfglyphtounicode{wavedash}{301C}
+\pdfglyphtounicode{wavyunderscorevertical}{FE34}
+\pdfglyphtounicode{wawarabic}{0648}
+\pdfglyphtounicode{wawfinalarabic}{FEEE}
+\pdfglyphtounicode{wawhamzaabovearabic}{0624}
+\pdfglyphtounicode{wawhamzaabovefinalarabic}{FE86}
+\pdfglyphtounicode{wbsquare}{33DD}
+\pdfglyphtounicode{wcircle}{24E6}
+\pdfglyphtounicode{wcircumflex}{0175}
+\pdfglyphtounicode{wdieresis}{1E85}
+\pdfglyphtounicode{wdotaccent}{1E87}
+\pdfglyphtounicode{wdotbelow}{1E89}
+\pdfglyphtounicode{wehiragana}{3091}
+\pdfglyphtounicode{weierstrass}{2118}
+\pdfglyphtounicode{wekatakana}{30F1}
+\pdfglyphtounicode{wekorean}{315E}
+\pdfglyphtounicode{weokorean}{315D}
+\pdfglyphtounicode{wgrave}{1E81}
+\pdfglyphtounicode{whitebullet}{25E6}
+\pdfglyphtounicode{whitecircle}{25CB}
+\pdfglyphtounicode{whitecircleinverse}{25D9}
+\pdfglyphtounicode{whitecornerbracketleft}{300E}
+\pdfglyphtounicode{whitecornerbracketleftvertical}{FE43}
+\pdfglyphtounicode{whitecornerbracketright}{300F}
+\pdfglyphtounicode{whitecornerbracketrightvertical}{FE44}
+\pdfglyphtounicode{whitediamond}{25C7}
+\pdfglyphtounicode{whitediamondcontainingblacksmalldiamond}{25C8}
+\pdfglyphtounicode{whitedownpointingsmalltriangle}{25BF}
+\pdfglyphtounicode{whitedownpointingtriangle}{25BD}
+\pdfglyphtounicode{whiteleftpointingsmalltriangle}{25C3}
+\pdfglyphtounicode{whiteleftpointingtriangle}{25C1}
+\pdfglyphtounicode{whitelenticularbracketleft}{3016}
+\pdfglyphtounicode{whitelenticularbracketright}{3017}
+\pdfglyphtounicode{whiterightpointingsmalltriangle}{25B9}
+\pdfglyphtounicode{whiterightpointingtriangle}{25B7}
+\pdfglyphtounicode{whitesmallsquare}{25AB}
+\pdfglyphtounicode{whitesmilingface}{263A}
+\pdfglyphtounicode{whitesquare}{25A1}
+\pdfglyphtounicode{whitestar}{2606}
+\pdfglyphtounicode{whitetelephone}{260F}
+\pdfglyphtounicode{whitetortoiseshellbracketleft}{3018}
+\pdfglyphtounicode{whitetortoiseshellbracketright}{3019}
+\pdfglyphtounicode{whiteuppointingsmalltriangle}{25B5}
+\pdfglyphtounicode{whiteuppointingtriangle}{25B3}
+\pdfglyphtounicode{wihiragana}{3090}
+\pdfglyphtounicode{wikatakana}{30F0}
+\pdfglyphtounicode{wikorean}{315F}
+\pdfglyphtounicode{wmonospace}{FF57}
+\pdfglyphtounicode{wohiragana}{3092}
+\pdfglyphtounicode{wokatakana}{30F2}
+\pdfglyphtounicode{wokatakanahalfwidth}{FF66}
+\pdfglyphtounicode{won}{20A9}
+\pdfglyphtounicode{wonmonospace}{FFE6}
+\pdfglyphtounicode{wowaenthai}{0E27}
+\pdfglyphtounicode{wparen}{24B2}
+\pdfglyphtounicode{wreathproduct}{2240}
+\pdfglyphtounicode{wring}{1E98}
+\pdfglyphtounicode{wsuperior}{02B7}
+\pdfglyphtounicode{wturned}{028D}
+\pdfglyphtounicode{wynn}{01BF}
+\pdfglyphtounicode{x}{0078}
+\pdfglyphtounicode{xabovecmb}{033D}
+\pdfglyphtounicode{xbopomofo}{3112}
+\pdfglyphtounicode{xcircle}{24E7}
+\pdfglyphtounicode{xdieresis}{1E8D}
+\pdfglyphtounicode{xdotaccent}{1E8B}
+\pdfglyphtounicode{xeharmenian}{056D}
+\pdfglyphtounicode{xi}{03BE}
+\pdfglyphtounicode{xmonospace}{FF58}
+\pdfglyphtounicode{xparen}{24B3}
+\pdfglyphtounicode{xsuperior}{02E3}
+\pdfglyphtounicode{y}{0079}
+\pdfglyphtounicode{yaadosquare}{334E}
+\pdfglyphtounicode{yabengali}{09AF}
+\pdfglyphtounicode{yacute}{00FD}
+\pdfglyphtounicode{yadeva}{092F}
+\pdfglyphtounicode{yaekorean}{3152}
+\pdfglyphtounicode{yagujarati}{0AAF}
+\pdfglyphtounicode{yagurmukhi}{0A2F}
+\pdfglyphtounicode{yahiragana}{3084}
+\pdfglyphtounicode{yakatakana}{30E4}
+\pdfglyphtounicode{yakatakanahalfwidth}{FF94}
+\pdfglyphtounicode{yakorean}{3151}
+\pdfglyphtounicode{yamakkanthai}{0E4E}
+\pdfglyphtounicode{yasmallhiragana}{3083}
+\pdfglyphtounicode{yasmallkatakana}{30E3}
+\pdfglyphtounicode{yasmallkatakanahalfwidth}{FF6C}
+\pdfglyphtounicode{yatcyrillic}{0463}
+\pdfglyphtounicode{ycircle}{24E8}
+\pdfglyphtounicode{ycircumflex}{0177}
+\pdfglyphtounicode{ydieresis}{00FF}
+\pdfglyphtounicode{ydotaccent}{1E8F}
+\pdfglyphtounicode{ydotbelow}{1EF5}
+\pdfglyphtounicode{yeharabic}{064A}
+\pdfglyphtounicode{yehbarreearabic}{06D2}
+\pdfglyphtounicode{yehbarreefinalarabic}{FBAF}
+\pdfglyphtounicode{yehfinalarabic}{FEF2}
+\pdfglyphtounicode{yehhamzaabovearabic}{0626}
+\pdfglyphtounicode{yehhamzaabovefinalarabic}{FE8A}
+\pdfglyphtounicode{yehhamzaaboveinitialarabic}{FE8B}
+\pdfglyphtounicode{yehhamzaabovemedialarabic}{FE8C}
+\pdfglyphtounicode{yehinitialarabic}{FEF3}
+\pdfglyphtounicode{yehmedialarabic}{FEF4}
+\pdfglyphtounicode{yehmeeminitialarabic}{FCDD}
+\pdfglyphtounicode{yehmeemisolatedarabic}{FC58}
+\pdfglyphtounicode{yehnoonfinalarabic}{FC94}
+\pdfglyphtounicode{yehthreedotsbelowarabic}{06D1}
+\pdfglyphtounicode{yekorean}{3156}
+\pdfglyphtounicode{yen}{00A5}
+\pdfglyphtounicode{yenmonospace}{FFE5}
+\pdfglyphtounicode{yeokorean}{3155}
+\pdfglyphtounicode{yeorinhieuhkorean}{3186}
+\pdfglyphtounicode{yerahbenyomohebrew}{05AA}
+\pdfglyphtounicode{yerahbenyomolefthebrew}{05AA}
+\pdfglyphtounicode{yericyrillic}{044B}
+\pdfglyphtounicode{yerudieresiscyrillic}{04F9}
+\pdfglyphtounicode{yesieungkorean}{3181}
+\pdfglyphtounicode{yesieungpansioskorean}{3183}
+\pdfglyphtounicode{yesieungsioskorean}{3182}
+\pdfglyphtounicode{yetivhebrew}{059A}
+\pdfglyphtounicode{ygrave}{1EF3}
+\pdfglyphtounicode{yhook}{01B4}
+\pdfglyphtounicode{yhookabove}{1EF7}
+\pdfglyphtounicode{yiarmenian}{0575}
+\pdfglyphtounicode{yicyrillic}{0457}
+\pdfglyphtounicode{yikorean}{3162}
+\pdfglyphtounicode{yinyang}{262F}
+\pdfglyphtounicode{yiwnarmenian}{0582}
+\pdfglyphtounicode{ymonospace}{FF59}
+\pdfglyphtounicode{yod}{05D9}
+\pdfglyphtounicode{yoddagesh}{FB39}
+\pdfglyphtounicode{yoddageshhebrew}{FB39}
+\pdfglyphtounicode{yodhebrew}{05D9}
+\pdfglyphtounicode{yodyodhebrew}{05F2}
+\pdfglyphtounicode{yodyodpatahhebrew}{FB1F}
+\pdfglyphtounicode{yohiragana}{3088}
+\pdfglyphtounicode{yoikorean}{3189}
+\pdfglyphtounicode{yokatakana}{30E8}
+\pdfglyphtounicode{yokatakanahalfwidth}{FF96}
+\pdfglyphtounicode{yokorean}{315B}
+\pdfglyphtounicode{yosmallhiragana}{3087}
+\pdfglyphtounicode{yosmallkatakana}{30E7}
+\pdfglyphtounicode{yosmallkatakanahalfwidth}{FF6E}
+\pdfglyphtounicode{yotgreek}{03F3}
+\pdfglyphtounicode{yoyaekorean}{3188}
+\pdfglyphtounicode{yoyakorean}{3187}
+\pdfglyphtounicode{yoyakthai}{0E22}
+\pdfglyphtounicode{yoyingthai}{0E0D}
+\pdfglyphtounicode{yparen}{24B4}
+\pdfglyphtounicode{ypogegrammeni}{037A}
+\pdfglyphtounicode{ypogegrammenigreekcmb}{0345}
+\pdfglyphtounicode{yr}{01A6}
+\pdfglyphtounicode{yring}{1E99}
+\pdfglyphtounicode{ysuperior}{02B8}
+\pdfglyphtounicode{ytilde}{1EF9}
+\pdfglyphtounicode{yturned}{028E}
+\pdfglyphtounicode{yuhiragana}{3086}
+\pdfglyphtounicode{yuikorean}{318C}
+\pdfglyphtounicode{yukatakana}{30E6}
+\pdfglyphtounicode{yukatakanahalfwidth}{FF95}
+\pdfglyphtounicode{yukorean}{3160}
+\pdfglyphtounicode{yusbigcyrillic}{046B}
+\pdfglyphtounicode{yusbigiotifiedcyrillic}{046D}
+\pdfglyphtounicode{yuslittlecyrillic}{0467}
+\pdfglyphtounicode{yuslittleiotifiedcyrillic}{0469}
+\pdfglyphtounicode{yusmallhiragana}{3085}
+\pdfglyphtounicode{yusmallkatakana}{30E5}
+\pdfglyphtounicode{yusmallkatakanahalfwidth}{FF6D}
+\pdfglyphtounicode{yuyekorean}{318B}
+\pdfglyphtounicode{yuyeokorean}{318A}
+\pdfglyphtounicode{yyabengali}{09DF}
+\pdfglyphtounicode{yyadeva}{095F}
+\pdfglyphtounicode{z}{007A}
+\pdfglyphtounicode{zaarmenian}{0566}
+\pdfglyphtounicode{zacute}{017A}
+\pdfglyphtounicode{zadeva}{095B}
+\pdfglyphtounicode{zagurmukhi}{0A5B}
+\pdfglyphtounicode{zaharabic}{0638}
+\pdfglyphtounicode{zahfinalarabic}{FEC6}
+\pdfglyphtounicode{zahinitialarabic}{FEC7}
+\pdfglyphtounicode{zahiragana}{3056}
+\pdfglyphtounicode{zahmedialarabic}{FEC8}
+\pdfglyphtounicode{zainarabic}{0632}
+\pdfglyphtounicode{zainfinalarabic}{FEB0}
+\pdfglyphtounicode{zakatakana}{30B6}
+\pdfglyphtounicode{zaqefgadolhebrew}{0595}
+\pdfglyphtounicode{zaqefqatanhebrew}{0594}
+\pdfglyphtounicode{zarqahebrew}{0598}
+\pdfglyphtounicode{zayin}{05D6}
+\pdfglyphtounicode{zayindagesh}{FB36}
+\pdfglyphtounicode{zayindageshhebrew}{FB36}
+\pdfglyphtounicode{zayinhebrew}{05D6}
+\pdfglyphtounicode{zbopomofo}{3117}
+\pdfglyphtounicode{zcaron}{017E}
+\pdfglyphtounicode{zcircle}{24E9}
+\pdfglyphtounicode{zcircumflex}{1E91}
+\pdfglyphtounicode{zcurl}{0291}
+\pdfglyphtounicode{zdot}{017C}
+\pdfglyphtounicode{zdotaccent}{017C}
+\pdfglyphtounicode{zdotbelow}{1E93}
+\pdfglyphtounicode{zecyrillic}{0437}
+\pdfglyphtounicode{zedescendercyrillic}{0499}
+\pdfglyphtounicode{zedieresiscyrillic}{04DF}
+\pdfglyphtounicode{zehiragana}{305C}
+\pdfglyphtounicode{zekatakana}{30BC}
+\pdfglyphtounicode{zero}{0030}
+\pdfglyphtounicode{zeroarabic}{0660}
+\pdfglyphtounicode{zerobengali}{09E6}
+\pdfglyphtounicode{zerodeva}{0966}
+\pdfglyphtounicode{zerogujarati}{0AE6}
+\pdfglyphtounicode{zerogurmukhi}{0A66}
+\pdfglyphtounicode{zerohackarabic}{0660}
+\pdfglyphtounicode{zeroinferior}{2080}
+\pdfglyphtounicode{zeromonospace}{FF10}
+\pdfglyphtounicode{zerooldstyle}{0030}
+\pdfglyphtounicode{zeropersian}{06F0}
+\pdfglyphtounicode{zerosuperior}{2070}
+\pdfglyphtounicode{zerothai}{0E50}
+\pdfglyphtounicode{zerowidthjoiner}{FEFF}
+\pdfglyphtounicode{zerowidthnonjoiner}{200C}
+\pdfglyphtounicode{zerowidthspace}{200B}
+\pdfglyphtounicode{zeta}{03B6}
+\pdfglyphtounicode{zhbopomofo}{3113}
+\pdfglyphtounicode{zhearmenian}{056A}
+\pdfglyphtounicode{zhebrevecyrillic}{04C2}
+\pdfglyphtounicode{zhecyrillic}{0436}
+\pdfglyphtounicode{zhedescendercyrillic}{0497}
+\pdfglyphtounicode{zhedieresiscyrillic}{04DD}
+\pdfglyphtounicode{zihiragana}{3058}
+\pdfglyphtounicode{zikatakana}{30B8}
+\pdfglyphtounicode{zinorhebrew}{05AE}
+\pdfglyphtounicode{zlinebelow}{1E95}
+\pdfglyphtounicode{zmonospace}{FF5A}
+\pdfglyphtounicode{zohiragana}{305E}
+\pdfglyphtounicode{zokatakana}{30BE}
+\pdfglyphtounicode{zparen}{24B5}
+\pdfglyphtounicode{zretroflexhook}{0290}
+\pdfglyphtounicode{zstroke}{01B6}
+\pdfglyphtounicode{zuhiragana}{305A}
+\pdfglyphtounicode{zukatakana}{30BA}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/config.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/config.h
new file mode 100644
index 00000000000..26a90a97b14
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/config.h
@@ -0,0 +1,43 @@
+#ifndef LCDF_TYPETOOLS_CONFIG_H
+#define LCDF_TYPETOOLS_CONFIG_H 1
+
+#include <autoconf.h>
+
+/* Allow compilation on Windows (thanks, Fabrice Popineau). */
+#ifdef WIN32
+# ifdef __MINGW32__
+# include <windows.h>
+# else
+# include <win32lib.h>
+# endif
+#else
+# include <stddef.h>
+# define CDECL /* nothing */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if necessary. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+/* Prototype strnlen if necessary. */
+#if !HAVE_DECL_STRNLEN
+size_t strnlen(const char *s, size_t maxlen);
+#endif
+
+/* Prototype good_strtod if necessary. */
+#if HAVE_BROKEN_STRTOD
+double good_strtod(const char *s, 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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afm.hh
new file mode 100644
index 00000000000..f462e0079a4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmparse.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmparse.hh
new file mode 100644
index 00000000000..c29d990ceab
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmw.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/afmw.hh
new file mode 100644
index 00000000000..4eda701b688
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/amfm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/amfm.hh
new file mode 100644
index 00000000000..6cc1db90b6e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/cff.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/cff.hh
new file mode 100644
index 00000000000..f965bd60c07
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/encoding.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/encoding.hh
new file mode 100644
index 00000000000..fd8d749acec
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/findmet.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/findmet.hh
new file mode 100644
index 00000000000..74b3ecee141
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/metrics.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/metrics.hh
new file mode 100644
index 00000000000..21a5f1796fb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otf.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otf.hh
new file mode 100644
index 00000000000..c7ea95a813d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otf.hh
@@ -0,0 +1,363 @@
+// -*- related-file-name: "../../libefont/otf.cc" -*-
+#ifndef EFONT_OTF_HH
+#define EFONT_OTF_HH
+#include <efont/otfdata.hh>
+#include <lcdf/hashcode.hh>
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+class Post;
+class Name;
+
+typedef int Glyph; // 16-bit integer
+
+class Tag {
+ public:
+ Tag() : _tag(0U) { }
+ explicit Tag(uint32_t tag) : _tag(tag) { }
+ Tag(const char *name);
+ Tag(const String &name);
+ // 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; }
+ bool check_checksums(ErrorHandler * = 0) const;
+ 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(); }
+
+ int ntables() const;
+ bool has_table(Tag tag) const;
+ String table(Tag tag) const;
+ uint32_t table_checksum(Tag tag) const;
+ Tag table_tag(int i) const;
+
+ static uint32_t checksum(const uint8_t *, const uint8_t *);
+ static uint32_t checksum(const String &);
+ static Font make(bool truetype, const Vector<Tag>& tags, const Vector<String>& data);
+
+ enum { HEADER_SIZE = 12, TABLE_DIR_ENTRY_SIZE = 16 };
+
+ private:
+ String _str;
+ int _error;
+
+ 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;
+ String size_params(int fid, const Name& name, ErrorHandler* = 0) 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 Vector<bool> &gmap) throw (); // used-bytemap coverage
+ Coverage(const String &str, ErrorHandler *errh = 0, bool check = true) throw ();
+ // default destructor
+
+ bool ok() const throw () { return _str.length() > 0; }
+ int size() const throw ();
+ bool has_fast_covers() const throw () {
+ return _str.length() > 0 && _str.data()[1] == T_X_BYTEMAP;
+ }
+
+ 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 &str, bool is_end);
+ };
+
+ iterator begin() const { return iterator(_str, false); }
+ iterator end() const { return iterator(_str, true); }
+ Glyph operator[](int) const throw ();
+
+ enum { T_LIST = 1, T_RANGES = 2, T_X_BYTEMAP = 3,
+ 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);
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+
+inline hashcode_t hashcode(Efont::OpenType::Tag t) {
+ return t.value();
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfcmap.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfcmap.hh
new file mode 100644
index 00000000000..f95a3dc5c41
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfcmap.hh
@@ -0,0 +1,55 @@
+// -*- 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;
+ inline void unmap_all(Vector<uint32_t> &g2c) const;
+
+ private:
+
+ String _str;
+ int _error;
+ int _ntables;
+ mutable 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 };
+ enum { USE_FIRST_UNICODE_TABLE = -2 };
+
+ 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> &g2c, ErrorHandler * = 0) const;
+
+};
+
+
+inline Glyph Cmap::map_uni(uint32_t c) const
+{
+ return map_table(USE_FIRST_UNICODE_TABLE, c, ErrorHandler::default_handler());
+}
+
+inline void Cmap::unmap_all(Vector<uint32_t> &g2c) const
+{
+ dump_table(USE_FIRST_UNICODE_TABLE, g2c, ErrorHandler::default_handler());
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfdata.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfdata.hh
new file mode 100644
index 00000000000..cdc004ce044
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfdata.hh
@@ -0,0 +1,239 @@
+// -*- 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)
+# error "configury disaster! Report this error to ekohler@gmail.com"
+#endif
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#endif
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+
+#if HAVE_PRECONDITION_CHECKING
+#define efont_precondition(x) assert((x))
+#else
+#define efont_precondition(x)
+#endif
+
+class Error {
+ public:
+ String description;
+ Error() : description(String::make_stable("unspecified error")) { }
+ Error(const String &d) : description(d) { }
+};
+
+class Bounds : public Error {
+ public:
+ Bounds() : Error(String::make_stable("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; }
+
+ operator bool() const { return _str; }
+ const uint8_t *udata() const { return _str.udata(); }
+ int length() const { return _str.length(); }
+
+ static inline uint16_t u16(const unsigned char* s);
+ static inline uint16_t u16_aligned(const unsigned char* s);
+ static inline int16_t s16(const unsigned char* s);
+ static inline int16_t s16_aligned(const unsigned char* s);
+ static inline uint32_t u32(const unsigned char* s);
+ static inline uint32_t u32_aligned16(const unsigned char* s);
+ static inline uint32_t u32_aligned(const unsigned char* s);
+ static inline int32_t s32(const unsigned char* s);
+ static inline int32_t s32_aligned16(const unsigned char* s);
+ static inline int32_t s32_aligned(const unsigned char* s);
+
+ 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);
+ inline uint8_t operator[](int offset) const throw (Bounds);
+ inline uint16_t u16(int offset) const throw (Bounds);
+ inline int16_t s16(int offset) const throw (Bounds);
+ inline uint32_t u32(int offset) const throw (Bounds);
+ inline int32_t s32(int offset) const throw (Bounds);
+
+ Data subtable(unsigned offset) const throw (Bounds);
+ Data offset_subtable(unsigned offset_offset) const throw (Bounds);
+ inline Data substring(int left, int len = -1) const throw ();
+
+ void align_long() { _str.align(4); }
+
+ 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(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohs(*reinterpret_cast<const uint16_t*>(s));
+#else
+ return (s[0] << 8) + s[1];
+#endif
+}
+
+inline uint16_t Data::u16_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return ntohs(*reinterpret_cast<const uint16_t*>(s));
+}
+
+inline int16_t Data::s16(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohs(*reinterpret_cast<const int16_t*>(s));
+#else
+ return (int16_t) ((s[0] << 8) + s[1]);
+#endif
+}
+
+inline int16_t Data::s16_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return ntohs(*reinterpret_cast<const int16_t*>(s));
+}
+
+inline uint32_t Data::u32(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohl(*reinterpret_cast<const uint32_t*>(s));
+#else
+ return (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+#endif
+}
+
+inline uint32_t Data::u32_aligned16(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohl(*reinterpret_cast<const uint32_t*>(s));
+#else
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return (u16_aligned(s) << 16) + u16_aligned(s + 2);
+#endif
+}
+
+inline uint32_t Data::u32_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 3) == 0);
+ return ntohl(*reinterpret_cast<const uint32_t*>(s));
+}
+
+inline int32_t Data::s32(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohl(*reinterpret_cast<const int32_t*>(s));
+#else
+ return (int32_t) ((s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]);
+#endif
+}
+
+inline int32_t Data::s32_aligned16(const unsigned char* s) {
+#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
+ return ntohl(*reinterpret_cast<const int32_t*>(s));
+#else
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return (int32_t) ((u16_aligned(s) << 16) + u16_aligned(s + 2));
+#endif
+}
+
+inline int32_t Data::s32_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 3) == 0);
+ return ntohl(*reinterpret_cast<const int32_t*>(s));
+}
+
+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 u16_aligned(_str.udata() + 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 s16_aligned(_str.udata() + 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 u32_aligned16(_str.udata() + offset);
+}
+
+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 s32_aligned16(_str.udata() + offset);
+}
+
+inline uint8_t Data::operator[](int offset) const throw (Bounds) {
+ return (*this)[unsigned(offset)];
+}
+
+inline uint16_t Data::u16(int offset) const throw (Bounds) {
+ return u16(unsigned(offset));
+}
+
+inline int16_t Data::s16(int offset) const throw (Bounds) {
+ return s16(unsigned(offset));
+}
+
+inline uint32_t Data::u32(int offset) const throw (Bounds) {
+ return u32(unsigned(offset));
+}
+
+inline int32_t Data::s32(int offset) const throw (Bounds) {
+ return s32(unsigned(offset));
+}
+
+inline Data Data::substring(int left, int len) const throw () {
+ return Data(_str.substring(left, len));
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgpos.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgpos.hh
new file mode 100644
index 00000000000..84de5a2126b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgpos.hh
@@ -0,0 +1,249 @@
+// -*- 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 _type; }
+ uint16_t flags() const { return _d.u16(2); }
+ bool unparse_automatics(Vector<Positioning> &, ErrorHandler * = 0) 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, L_EXTENSION = 9
+ };
+ private:
+ Data _d;
+ int _type;
+ Data subtable(int i) const;
+};
+
+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 &);
+ inline Position(Glyph g, int pdx, int pdy, int adx, int ady);
+ 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; }
+ inline void all_in_glyphs(Vector<Glyph> &gs) const;
+
+ 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 Position::Position(Glyph g_, int pdx_, int pdy_, int adx_, int ady_)
+ : g(g_), pdx(pdx_), pdy(pdy_), adx(adx_), ady(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();
+}
+
+inline void Positioning::all_in_glyphs(Vector<Glyph> &gs) const
+{
+ gs.clear();
+ if (_left.g != 0)
+ gs.push_back(_left.g);
+ if (_right.g != 0)
+ gs.push_back(_right.g);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgsub.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgsub.hh
new file mode 100644
index 00000000000..98a2e0f945a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfgsub.hh
@@ -0,0 +1,409 @@
+// -*- 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 _type; }
+ uint16_t flags() const { return _d.u16(2); }
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse_automatics(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) 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_EXTENSION = 7, L_REVCHAIN = 8
+ };
+ private:
+ Data _d;
+ int _type;
+ Data subtable(int i) const;
+};
+
+class GsubSingle { public:
+ GsubSingle(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ Glyph map(Glyph) const;
+ void mark_out_glyphs(Vector<bool> &gmap) const;
+ void unparse(Vector<Substitution> &subs, const Coverage &limit) 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 mark_out_glyphs(Vector<bool> &gmap) 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 mark_out_glyphs(Vector<bool> &gmap) 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 ();
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse(const Gsub &gsub, Vector<Substitution> &out_subs, const Coverage &limit) const;
+ enum { F3_HSIZE = 6, SUBRECSIZE = 4 };
+ private:
+ Data _d;
+ static void f3_mark_out_glyphs(const Data &data, int nsub, int subtab_offset, const Gsub &gsub, Vector<bool> &gmap);
+ static bool f3_unparse(const Data &data,
+ int nglyph, int glyphtab_offset, const Coverage &limit,
+ int nsub, int subtab_offset,
+ const Gsub &gsub, Vector<Substitution> &outsubs,
+ const Substitution &prototype_sub);
+ friend class GsubChainContext;
+};
+
+class GsubChainContext { public:
+ GsubChainContext(const Data &) throw (Error);
+ // default destructor
+ Coverage coverage() const throw ();
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) 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> &gs) const;
+ bool all_out_glyphs(Vector<Glyph> &gs) 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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfname.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfname.hh
new file mode 100644
index 00000000000..42f08e614be
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfname.hh
@@ -0,0 +1,122 @@
+// -*- 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, N_PREF_FAMILY = 16,
+ N_PREF_SUBFAMILY = 17, N_MAC_COMPAT_FULLNAME = 18,
+ N_SAMPLE_TEXT = 19, N_POSTSCRIPT_CID = 20 };
+ enum Platform { P_UNICODE = 0, P_MACINTOSH = 1, P_MICROSOFT = 3,
+ E_MS_UNICODE_BMP = 1, E_MAC_ROMAN = 0,
+ L_MS_ENGLISH_AMERICAN = 0x409 };
+ 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;
+ String utf8_name(const_iterator) const;
+ String english_name(int nameid) const;
+
+ // check version string for backwards compatibility
+ bool version_chaincontext_reverse_backtrack() 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 *);
+
+};
+
+
+inline int Name::nameid(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr) + 6);
+}
+
+inline int Name::platform(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr));
+}
+
+inline int Name::encoding(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr) + 2);
+}
+
+inline int Name::language(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&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 = Data::u16_aligned(_str.udata() + 2);
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE + NAMEREC_SIZE * count);
+ } else
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE);
+}
+
+
+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 == E_MAC_ROMAN && l == 0)
+ || (p == P_MICROSOFT && e == E_MS_UNICODE_BMP && l == L_MS_ENGLISH_AMERICAN);
+ } else
+ return false;
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfos2.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfos2.hh
new file mode 100644
index 00000000000..db26b674522
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfos2.hh
@@ -0,0 +1,75 @@
+// -*- 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_VENDORID = 58,
+ 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);
+ inline String vendor_id() const throw ();
+
+ 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);
+}
+
+inline String Os2::vendor_id() const throw ()
+{
+ return _data.substring(O_VENDORID, 4);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfpost.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfpost.hh
new file mode 100644
index 00000000000..58651583fcb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/otfpost.hh
@@ -0,0 +1,62 @@
+// -*- related-file-name: "../../libefont/otfpost.cc" -*-
+#ifndef EFONT_OTFPOST_HH
+#define EFONT_OTFPOST_HH
+#include <efont/otfdata.hh>
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Post { public:
+
+ Post(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ double italic_angle() const;
+ bool is_fixed_pitch() const;
+ inline int underline_position() const;
+ inline int underline_thickness() const;
+ inline uint32_t mem_type42(bool ismax) const;
+ int nglyphs() const { return _nglyphs; }
+ bool glyph_names(Vector<PermString> &gnames) const;
+
+ private:
+
+ Data _str;
+ int _error;
+ uint32_t _version;
+ int _nglyphs;
+ Vector<int> _extend_glyph_names;
+
+ enum { HEADER_SIZE = 32, N_MAC_GLYPHS = 258 };
+ int parse_header(ErrorHandler *);
+
+};
+
+inline int
+Post::underline_position() const
+{
+ // NB: "This is the suggested distance of the top of the underline from
+ // the baseline (negative values indicate below baseline). The PostScript
+ // definition of this FontInfo dictionary key (the y coordinate of the
+ // center of the stroke) is not used for historical reasons. The value of
+ // the PostScript key may be calculated by subtracting half the
+ // underlineThickness from the value of this field." -- OpenType spec
+ return ok() ? _str.s16(8) : 0;
+}
+
+inline int
+Post::underline_thickness() const
+{
+ return ok() ? _str.s16(10) : 0;
+}
+
+inline uint32_t
+Post::mem_type42(bool ismax) const
+{
+ return ok() ? _str.u32(ismax ? 20 : 16) : 0;
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/pairop.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/pairop.hh
new file mode 100644
index 00000000000..bbb42073e44
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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), _result(), _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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/psres.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/psres.hh
new file mode 100644
index 00000000000..ee302821fdb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1bounds.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1bounds.hh
new file mode 100644
index 00000000000..c5e50634f4c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1cs.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1cs.hh
new file mode 100644
index 00000000000..1a3f8e8f039
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1cs.hh
@@ -0,0 +1,340 @@
+// -*- 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;
+ virtual int units_per_em() 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)
+ : Charstring(), _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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1csgen.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1csgen.hh
new file mode 100644
index 00000000000..226497a4a6b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1csgen.hh
@@ -0,0 +1,123 @@
+// -*- 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() { return _ncs.data(); }
+ const char *data() const { return _ncs.data(); }
+ int length() const { return _ncs.length(); }
+
+ void gen_number(double, int kind = 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, bool always);
+
+ 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;
+
+ void gen_rational(int big_val, int divisor);
+ bool gen_stem3_stack(CharstringInterp &interp);
+
+};
+
+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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1font.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1font.hh
new file mode 100644
index 00000000000..4ec827e7e24
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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, const Vector<double> *xuid_extension);
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1interp.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1interp.hh
new file mode 100644
index 00000000000..0b693b08c70
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1item.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1item.hh
new file mode 100644
index 00000000000..056ba0e71d4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1mm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1mm.hh
new file mode 100644
index 00000000000..bf2e81a00e9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1rw.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1rw.hh
new file mode 100644
index 00000000000..d59f4089742
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1unparser.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/t1unparser.hh
new file mode 100644
index 00000000000..3a6e446e3c7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfcs.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfcs.hh
new file mode 100644
index 00000000000..a2c04461872
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfcs.hh
@@ -0,0 +1,41 @@
+// -*- related-file-name: "../../libefont/ttfcs.cc" -*-
+#ifndef EFONT_TTFCS_HH
+#define EFONT_TTFCS_HH
+#include <efont/t1cs.hh>
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont {
+
+class TrueTypeBoundsCharstringProgram : public CharstringProgram { public:
+
+ TrueTypeBoundsCharstringProgram(const OpenType::Font *);
+ ~TrueTypeBoundsCharstringProgram();
+
+ int units_per_em() const;
+
+ int nglyphs() const;
+ Charstring *glyph(int gi) const;
+ PermString glyph_name(int gi) const;
+ void glyph_names(Vector<PermString> &) const;
+
+ private:
+
+ const OpenType::Font *_otf;
+ int _nglyphs;
+ int _nhmtx;
+ bool _loca_long;
+ int _units_per_em;
+ OpenType::Data _loca;
+ OpenType::Data _glyf;
+ OpenType::Data _hmtx;
+ mutable Vector<Charstring *> _charstrings;
+ mutable Vector<PermString> _glyph_names;
+ mutable bool _got_glyph_names;
+ mutable Vector<uint32_t> _unicodes;
+ mutable bool _got_unicodes;
+
+};
+
+}
+#endif
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfhead.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfhead.hh
new file mode 100644
index 00000000000..2611a405b1b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfhead.hh
@@ -0,0 +1,41 @@
+// -*- related-file-name: "../../libefont/ttfhead.cc" -*-
+#ifndef EFONT_TTFHEAD_HH
+#define EFONT_TTFHEAD_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh> // for ntohl()
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Head { public:
+
+ Head(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ unsigned units_per_em() const;
+ unsigned index_to_loc_format() const;
+
+ private:
+
+ Data _d;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+inline unsigned Head::units_per_em() const
+{
+ return (_error >= 0 ? _d.u16(18) : 0);
+}
+
+inline unsigned Head::index_to_loc_format() const
+{
+ return (_error >= 0 ? _d.u16(50) : 0);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfkern.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfkern.hh
new file mode 100644
index 00000000000..717a72b6912
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/efont/ttfkern.hh
@@ -0,0 +1,42 @@
+// -*- related-file-name: "../../libefont/ttfkern.cc" -*-
+#ifndef EFONT_TTFKERN_HH
+#define EFONT_TTFKERN_HH
+#include <efont/otfgpos.hh>
+namespace Efont { namespace OpenType {
+
+class KernTable { public:
+
+ KernTable(const Data &, ErrorHandler * = 0) throw (Error);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+
+ bool unparse_automatics(Vector<Positioning> &, ErrorHandler * = 0) const;
+
+ private:
+
+ Data _d;
+ int _version;
+ int _error;
+
+ enum {
+ COV_V0_HORIZONTAL = 0x0001, COV_V0_MINIMUM = 0x0002,
+ COV_V0_CROSS_STREAM = 0x0004, COV_V0_OVERRIDE = 0x0008,
+ COV_V0_FORMAT = 0xFF00, COV_V0_FORMAT0 = 0x0000,
+ COV_V1_VERTICAL = 0x8000, COV_V1_CROSS_STREAM = 0x4000,
+ COV_V1_VARIATION = 0x2000,
+ COV_V1_FORMAT = 0x00FF, COV_V1_FORMAT0 = 0x0000
+ };
+
+ inline uint32_t ntables() const {
+ return _version == 0 ? _d.u16(2) : _d.u32(4);
+ }
+ inline uint32_t first_offset() const {
+ return _version == 0 ? 4 : 8;
+ }
+ inline Data subtable(uint32_t &off) const throw (Error);
+
+};
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/bezier.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/bezier.hh
new file mode 100644
index 00000000000..ebb93ce9aea
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/clp.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/clp.h
new file mode 100644
index 00000000000..1b658a17190
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/clp.h
@@ -0,0 +1,303 @@
+/* -*- 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-2012 Eddie Kohler, ekohler@gmail.com
+ *
+ * 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. */
+
+typedef struct Clp_Option Clp_Option;
+typedef struct Clp_Parser Clp_Parser;
+typedef struct Clp_ParserState Clp_ParserState;
+
+
+/** @brief Option description.
+ *
+ * CLP users declare arrays of Clp_Option structures to specify what options
+ * should be parsed.
+ * @sa Clp_NewParser, Clp_SetOptions */
+struct Clp_Option {
+ const char *long_name; /**< Name of long option, or NULL if the option
+ has no long name. */
+ int short_name; /**< Character defining short option, or 0 if
+ the option has no short name. */
+ int option_id; /**< User-specified ID defining option,
+ returned by Clp_Next. */
+ int val_type; /**< ID of option's value type, or 0 if option
+ takes no value. */
+ int flags; /**< Option parsing flags. */
+};
+
+/** @name Value types
+ * These values describe the type of an option's argument and are used in
+ * the Clp_Option val_type field. For example, if an option took integers, its
+ * Clp_Option structure would have val_type set to Clp_ValInt. */
+/**@{*/
+#define Clp_NoVal 0 /**< @brief Option takes no value. */
+#define Clp_ValString 1 /**< @brief Option value is an
+ arbitrary string. */
+#define Clp_ValStringNotOption 2 /**< @brief Option value is a
+ non-option string.
+
+ See Clp_DisallowOptions. */
+#define Clp_ValBool 3 /**< @brief Option value is a
+ boolean.
+
+ Accepts "true", "false", "yes", "no", "1", and "0", or any
+ prefixes thereof. The match is case-insensitive. */
+#define Clp_ValInt 4 /**< @brief Option value is a
+ signed int.
+
+ Accepts an optional "+" or "-" sign, followed by one or more
+ digits. The digits may be include a "0x" or "0X" prefix, for
+ a hexidecimal number, or a "0" prefix, for an octal number;
+ otherwise it is decimal. */
+#define Clp_ValUnsigned 5 /**< @brief Option value is an
+ unsigned int.
+
+ Accepts an optional "+" sign, followed by one or more
+ digits. The digits may be include a "0x" or "0X" prefix, for
+ a hexidecimal number, or a "0" prefix, for an octal number;
+ otherwise it is decimal. */
+#define Clp_ValDouble 6 /**< @brief Option value is a
+ double.
+ Accepts a real number as defined by strtod(). */
+#define Clp_ValFirstUser 10 /**< @brief Value types >=
+ Clp_ValFirstUser are available
+ for user types. */
+/**@}*/
+
+/** @name Option flags
+ * These flags are used in the Clp_Option flags field. */
+/**@{*/
+#define Clp_Mandatory (1<<0) /**< @brief Option flag: value
+ is mandatory.
+
+ It is an error if the option has no value. This is the
+ default if an option has arg_type != 0 and the Clp_Optional
+ flag is not provided. */
+#define Clp_Optional (1<<1) /**< @brief Option flag: value
+ is optional. */
+#define Clp_Negate (1<<2) /**< @brief Option flag: option
+ may be negated.
+
+ --no-[long_name] will be accepted in argument lists. */
+#define Clp_OnlyNegated (1<<3) /**< @brief Option flag: option
+ <em>must</em> be negated.
+
+ --no-[long_name] will be accepted in argument lists, but
+ --[long_name] will not. This is the default if long_name
+ begins with "no-". */
+#define Clp_PreferredMatch (1<<4) /**< @brief Option flag: prefer this
+ option when matching.
+
+ Prefixes of --[long_name] should map to this option, even if
+ other options begin with --[long_name]. */
+/**@}*/
+
+/** @name Option character types
+ * These flags are used in to define character types in Clp_SetOptionChar(). */
+/**@{*/
+/* Clp_NotOption 0 */
+#define Clp_Short (1<<0) /**< @brief Option character begins
+ a set of short options. */
+#define Clp_Long (1<<1) /**< @brief Option character begins
+ a long option. */
+#define Clp_ShortNegated (1<<2) /**< @brief Option character begins
+ a set of negated short options. */
+#define Clp_LongNegated (1<<3) /**< @brief Option character begins
+ a negated long option. */
+#define Clp_LongImplicit (1<<4) /**< @brief Option character can begin
+ a long option, and is part of that
+ long option. */
+/**@}*/
+
+#define Clp_NotOption 0 /**< @brief Clp_Next value: argument
+ was not an option. */
+#define Clp_Done -1 /**< @brief Clp_Next value: there are
+ no more arguments. */
+#define Clp_BadOption -2 /**< @brief Clp_Next value: argument
+ was an erroneous option. */
+#define Clp_Error -3 /**< @brief Clp_Next value: internal
+ CLP error. */
+
+#define Clp_ValSize 40 /**< @brief Minimum size of the
+ Clp_Parser val.cs field. */
+#define Clp_ValIntSize 10 /**< @brief Minimum size of the
+ Clp_Parser val.is field. */
+
+
+/** @brief A value parsing function.
+ * @param clp the parser
+ * @param vstr the value to be parsed
+ * @param complain if nonzero, report error messages via Clp_OptionError
+ * @param user_data user data passed to Clp_AddType()
+ * @return 1 if parsing succeeded, 0 otherwise
+ */
+typedef int (*Clp_ValParseFunc)(Clp_Parser *clp, const char *vstr,
+ int complain, void *user_data);
+
+/** @brief A function for reporting option errors.
+ * @param clp the parser
+ * @param message error message
+ */
+typedef void (*Clp_ErrorHandler)(Clp_Parser *clp, const char *message);
+
+
+/** @brief Command line parser.
+ *
+ * A Clp_Parser object defines an instance of CLP, including allowed options,
+ * value types, and current arguments.
+ * @sa Clp_NewParser, Clp_SetOptions, Clp_SetArguments */
+struct Clp_Parser {
+ int opt; /**< The last option. */
+
+ int negated; /**< Whether the last option was negated. */
+
+ int have_val; /**< Whether the last option had a value. */
+ const char *vstr; /**< The string value provided with the last
+ option. */
+
+ 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; /**< The parsed value provided with the last
+ option. */
+
+ void *user_data; /**< Uninterpreted by CLP; users can set
+ arbitrarily. */
+
+ struct Clp_Internal *internal;
+};
+
+/** @cond never */
+#if __GNUC__ >= 4
+# define CLP_SENTINEL __attribute__((sentinel))
+#else
+# define CLP_SENTINEL /* nothing */
+#endif
+/** @endcond never */
+
+
+/** @brief Create a new Clp_Parser. */
+Clp_Parser *Clp_NewParser(int argc, const char * const *argv,
+ int nopt, const Clp_Option *opt);
+
+/** @brief Destroy a Clp_Parser object. */
+void Clp_DeleteParser(Clp_Parser *clp);
+
+
+/** @brief Return @a clp's program name. */
+const char *Clp_ProgramName(Clp_Parser *clp);
+
+/** @brief Set @a clp's program name. */
+const char *Clp_SetProgramName(Clp_Parser *clp, const char *name);
+
+
+/** @brief Set @a clp's error handler function. */
+Clp_ErrorHandler Clp_SetErrorHandler(Clp_Parser *clp, Clp_ErrorHandler errh);
+
+/** @brief Set @a clp's UTF-8 mode. */
+int Clp_SetUTF8(Clp_Parser *clp, int utf8);
+
+/** @brief Return @a clp's treatment of character @a c. */
+int Clp_OptionChar(Clp_Parser *clp, int c);
+
+/** @brief Set @a clp's treatment of character @a c. */
+int Clp_SetOptionChar(Clp_Parser *clp, int c, int type);
+
+/** @brief Set @a clp's option definitions. */
+int Clp_SetOptions(Clp_Parser *clp, int nopt, const Clp_Option *opt);
+
+/** @brief Set @a clp's arguments. */
+void Clp_SetArguments(Clp_Parser *clp, int argc, const char * const *argv);
+
+/** @brief Set whether @a clp is searching for options. */
+int Clp_SetOptionProcessing(Clp_Parser *clp, int on);
+
+
+#define Clp_DisallowOptions (1<<0) /**< @brief Value type flag: value
+ can't be an option string.
+
+ See Clp_AddType(). */
+
+/** @brief Define a new value type for @a clp. */
+int Clp_AddType(Clp_Parser *clp, int val_type, int flags,
+ Clp_ValParseFunc parser, void *user_data);
+
+
+#define Clp_AllowNumbers (1<<0) /**< @brief String list flag: allow
+ explicit numbers.
+
+ See Clp_AddStringListType() and Clp_AddStringListTypeVec(). */
+
+/** @brief Define a new string list value type for @a clp. */
+int Clp_AddStringListTypeVec(Clp_Parser *clp, int val_type, int flags,
+ int nstrs, const char * const *strs,
+ const int *vals);
+
+/** @brief Define a new string list value type for @a clp. */
+int Clp_AddStringListType(Clp_Parser *clp, int val_type, int flags, ...)
+ CLP_SENTINEL;
+
+
+/** @brief Parse and return the next argument from @a clp. */
+int Clp_Next(Clp_Parser *clp);
+
+/** @brief Return the next argument from @a clp without option parsing. */
+const char *Clp_Shift(Clp_Parser *clp, int allow_options);
+
+
+/** @brief Create a new Clp_ParserState. */
+Clp_ParserState *Clp_NewParserState(void);
+
+/** @brief Destroy a Clp_ParserState object. */
+void Clp_DeleteParserState(Clp_ParserState *state);
+
+/** @brief Save @a clp's current state in @a state. */
+void Clp_SaveParser(const Clp_Parser *clp, Clp_ParserState *state);
+
+/** @brief Restore parser state from @a state into @a clp. */
+void Clp_RestoreParser(Clp_Parser *clp, const Clp_ParserState *state);
+
+
+/** @brief Report a parser error. */
+int Clp_OptionError(Clp_Parser *clp, const char *format, ...);
+
+/** @brief Extract the current option as a string. */
+int Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int len);
+
+/** @brief Extract the current option as a string. */
+const char *Clp_CurOptionName(Clp_Parser *clp);
+
+#undef CLP_SENTINEL
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/error.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/error.hh
new file mode 100644
index 00000000000..2af4a77763d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/error.hh
@@ -0,0 +1,881 @@
+// -*- 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
+#if __GNUC__ <= 3
+# define ERRH_SENTINEL
+#else
+# define ERRH_SENTINEL __attribute__((sentinel))
+#endif
+
+/** @class ErrorHandler
+ * @brief Error reporting class.
+ *
+ * Report errors through ErrorHandler objects, which represent
+ * error collectors and printers. ErrorHandlers are passed to configure() and
+ * initialize() methods explicitly, as well as to write handlers; the
+ * click_chatter() function calls ErrorHandler implicitly.
+ *
+ * <h3>Cooked error messages</h3>
+ *
+ * Most ErrorHandler interactions consist of a simple call like this:
+ * @code
+ * errh->error("not enough arguments (%d needed)", 5);
+ * // prints something like "not enough arguments (5 needed)\n"
+ * @endcode
+ *
+ * This function constructs an error message string from the format arguments,
+ * annotates the string with a default error level (here, el_error), and
+ * prints it. Alternate versions take a landmark specifying where the error
+ * took place:
+ * @code
+ * errh->lwarning("file.click:2", "syntax error at '%s'", word.c_str());
+ * // prints something like "file.click:2: syntax error at 'foo'\n"
+ * @endcode
+ *
+ * <h3>Raw error messages</h3>
+ *
+ * For finer control over error levels and annotations, construct an error
+ * message string directly. An error message is a string consisting of one or
+ * more lines. Each line begins with a set of optional textual @em
+ * annotations. The following error message has a @em level annotation
+ * determining how serious the error is (this one is critical, since
+ * el_critical == 2), and a @em landmark annotation, which specifies where the
+ * error took place (here, "x.click:1"):
+ *
+ * <tt>"<2>{l:x.click:1}syntax error"</tt>
+ *
+ * The default ErrorHandlers understand the level and landmark
+ * annotations. Users can add other arbitrary annotations, which can be
+ * useful to pass error metadata. A pair of braces ends the annotation area.
+ * This example has one user annotation <tt>eoc</tt>, and a message area that
+ * would be mistaken for an annotation were it not for the <tt>{}</tt>:
+ *
+ * <tt>"<2>{l:x.click:1}{eoc:520}{}{not:an annotation}"</tt>
+ *
+ * <h3>Stacking handlers</h3>
+ *
+ * Some ErrorHandlers stack on top of others, adding useful functionality like
+ * automatic context description and prefixing. For example,
+ * ContextErrorHandler can be used to print messages like "In function
+ * 'xxx':".
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "While counting to 2:\n"
+ * // " An error occurred.\n"
+ * // " Another error occurred.\n"
+ * @endcode */
+class ErrorHandler { public:
+
+ /** @brief Error level constants.
+ *
+ * Lower values represent more serious errors. Levels 0-7 correspond to
+ * Linux's error levels. Negative levels request immediate exit; at user
+ * level, the exit status is the absolute value of the
+ * error level. */
+ enum Level {
+ el_abort = -999, ///< Error level that triggers abort().
+ el_fatal = -1, ///< Fatal exit error level.
+ /// Exit status equals -(level).
+ el_emergency = 0, ///< Emergency error level: system is unusable.
+ el_alert = 1, ///< Alert error level: action must be taken.
+ el_critical = 2, ///< Error level for critical conditions.
+ el_error = 3, ///< Error level for normal error conditions.
+ el_warning = 4, ///< Error level for warning conditions.
+ el_notice = 5, ///< Error level for normal, but significant
+ /// conditions.
+ el_info = 6, ///< Error level for informational messages.
+ el_debug = 7 ///< Error level for debug messages.
+ };
+
+ /** @brief Error level indicators. */
+ static const char e_abort[],
+ e_fatal[],
+ e_emergency[],
+ e_alert[],
+ e_critical[],
+ e_error[],
+ e_warning[],
+ e_warning_annotated[],
+ e_notice[],
+ e_info[],
+ e_debug[];
+
+ /** @brief Construct an ErrorHandler. */
+ ErrorHandler()
+ : _nerrors(0) {
+ }
+
+ virtual ~ErrorHandler() {
+ }
+
+
+ /** @brief Initialize the ErrorHandler implementation.
+ * @param errh default error handler
+ * @return @a errh
+ *
+ * Call this function to initialize the ErrorHandler implementation. The
+ * function installs the default conversions, creates the
+ * silent_handler(), and installs @a errh as the default error handler
+ * (see default_handler()).
+ *
+ * @note The @a errh object becomes the property of the ErrorHandler
+ * implementation and must not be deleted.
+ * (ErrorHandler::static_cleanup() will delete it.) Only the first call
+ * to static_initialize() has any effect. */
+ static ErrorHandler *static_initialize(ErrorHandler *errh);
+
+ /** @brief Tear down the ErrorHandler implementation.
+ *
+ * Deletes the internal ErrorHandlers and uninstalls default
+ * conversions. */
+ static void static_cleanup();
+
+
+ /** @brief Return the default ErrorHandler.
+ * @sa static_initialize() */
+ static ErrorHandler *default_handler() {
+ return the_default_handler;
+ }
+
+ /** @brief Set the default ErrorHandler to @a errh.
+ * @note @a errh becomes property of the ErrorHandler implementation,
+ * and will be freed by static_cleanup(). However, any prior default
+ * handler is @em not destroyed. Callers should delete the prior handler
+ * when necessary. */
+ static void set_default_handler(ErrorHandler *errh);
+
+ /** @brief Return the global silent ErrorHandler. */
+ static ErrorHandler *silent_handler() {
+ return the_silent_handler;
+ }
+
+
+ static const int ok_result; ///< Equals 0, used for error levels
+ /// <5> and above
+ static const int error_result; ///< Equals -EINVAL, used for error
+ /// levels <4> and below
+
+
+ /** @brief Print a debug message (level el_debug).
+ *
+ * @a fmt and any following arguments are parsed as by format(), and the
+ * resulting string is passed to xmessage(). */
+ void debug(const char *fmt, ...);
+ /** @brief Print an informational message (level el_info). */
+ void message(const char *fmt, ...);
+ /** @brief Print a warning message (level el_warning).
+ * @return error_result
+ *
+ * The string "warning: " is prepended to every line of the message. */
+ int warning(const char *fmt, ...);
+ /** @brief Print an error message (level el_error).
+ * @return error_result */
+ int error(const char *fmt, ...);
+ /** @brief Print a fatal error message (level el_fatal).
+ * @return error_result
+ *
+ * In many ErrorHandlers, calling fatal() will cause the process to
+ * abort. */
+ int fatal(const char *fmt, ...);
+
+ /** @brief Print a debug message with a landmark annotation. */
+ void ldebug(const String &landmark, const char *fmt, ...);
+ /** @brief Print an informational message with a landmark annotation. */
+ void lmessage(const String &landmark, const char *fmt, ...);
+ /** @brief Print a warning message with a landmark annotation. */
+ int lwarning(const String &landmark, const char *fmt, ...);
+ /** @brief Print an error message with a landmark annotation. */
+ int lerror(const String &landmark, const char *fmt, ...);
+ /** @brief Print a fatal error message with a landmark annotation. */
+ int lfatal(const String &landmark, const char *fmt, ...);
+
+
+ /** @brief Print an annotated error message.
+ * @return ok_result if the minimum error level was el_notice or higher,
+ * otherwise error_result
+ *
+ * This function drives the virtual functions actually responsible for
+ * error message decoration and printing. It passes @a str to decorate(),
+ * separates the result into lines, calls emit() for each line, and calls
+ * account() with the minimum error level of any line.
+ *
+ * Most users will call shorthand functions like error(), warning(), or
+ * lmessage(), which add relevant annotations to the message. */
+ int xmessage(const String &str);
+ /** @brief Print an error message, adding annotations.
+ * @param anno annotations
+ * @param str error message
+ *
+ * Shorthand for xmessage(combine_anno(@a str, @a anno)). */
+ int xmessage(const String &anno, const String &str) {
+ return xmessage(combine_anno(str, anno));
+ }
+ /** @brief Format and print an error message, adding annotations.
+ * @param anno annotations
+ * @param fmt error message format
+ * @param val format arguments
+ *
+ * Shorthand for xmessage(@a anno, vformat(@a fmt, @a val)). */
+ int vxmessage(const String &anno, const char *fmt, va_list val) {
+ return xmessage(anno, vformat(fmt, val));
+ }
+ /** @brief Print an error message, adding landmark and other annotations.
+ * @param landmark landmark annotation
+ * @param anno additional annotations
+ * @param str error message
+ *
+ * Shorthand for xmessage(combine_anno(@a anno, make_landmark_anno(@a
+ * landmark)), @a str). */
+ int xmessage(const String &landmark, const String &anno,
+ const String &str) {
+ return xmessage(combine_anno(anno, make_landmark_anno(landmark)), str);
+ }
+ /** @brief Format and print an error message, adding landmark and other
+ * annotations.
+ * @param landmark landmark annotation
+ * @param anno additional annotations
+ * @param fmt error message format
+ * @param val format arguments
+ *
+ * Shorthand for xmessage(@a landmark, @a anno, vformat(@a fmt, @a
+ * val)). */
+ int vxmessage(const String &landmark, const String &anno,
+ const char *fmt, va_list val) {
+ return xmessage(landmark, anno, vformat(fmt, val));
+ }
+
+
+ /** @brief Return the number of errors reported via this handler.
+ *
+ * An error is any message that contains at least one line with error
+ * level 3 (#el_error) or below.
+ *
+ * @note The error count will also contain errors reported via stacked
+ * handlers. For instance:
+ * @code
+ * SilentErrorHandler errh1;
+ * PrefixErrorHandler errh2(&errh1, "");
+ * assert(errh1.nerrors() == 0);
+ * errh2.error("blah");
+ * assert(errh1.nerrors() == 1);
+ * @endcode
+ *
+ * @sa account, clear */
+ int nerrors() const {
+ return _nerrors;
+ }
+
+
+ /** @brief Format an error string.
+ * @param default_flags default ConversionFlags
+ * @param fmt printf-like format string
+ * @return formatted error string
+ *
+ * Formats an error string using printf-like % conversions. Conversions
+ * include:
+ *
+ * <table>
+ *
+ * <tr><td><tt>\%d</tt>, <tt>\%i</tt></td><td>Format an <tt>int</tt> as a
+ * decimal string. Understands flags in <tt>#0- +</tt>, field widths
+ * (including <tt>*</tt>), and precisions.</td></tr>
+ *
+ * <tr><td><tt>\%hd</tt>, <tt>\%ld</tt>, <tt>\%lld</tt>,
+ * <tt>\%zd</tt></td><td>Format a <tt>short</tt>, <tt>long</tt>, <tt>long
+ * long</tt>, or <tt>size_t</tt>.</td></tr>
+ *
+ * <tr><td><tt>\%^16d</tt>, <tt>\%^32d</tt>, <tt>\%^64d</tt></td>
+ * <td>Format a 16-, 32-, or 64-bit integer.</td></tr>
+ *
+ * <tr><td><tt>\%o</tt>, <tt>\%u</tt>, <tt>\%x</tt>,
+ * <tt>\%X</tt></td><td>Format an unsigned integer in octal, decimal, or
+ * hexadecimal (with lower-case or upper-case letters).</td></tr>
+ *
+ * <tr><td><tt>\%s</tt></td><td>Format a C string (<tt>const char *</tt>).
+ * The alternate form <tt>\%\#s</tt> calls String::printable() on the
+ * input string. Both <tt>\%\#s</tt> and the alternate form <tt>\%'s</tt>
+ * ensure that no part of the string is mistaken for an error
+ * annotation.</td></tr>
+ *
+ * <tr><td><tt>\%c</tt></td><td>Format a character. Prints a C-like
+ * escape if the input character isn't printable ASCII.</td></tr>
+ *
+ * <tr><td><tt>\%p</tt></td><td>Format a pointer as a hexadecimal
+ * value.</td></tr>
+ *
+ * <tr><td><tt>\%e</tt>, <tt>\%E</tt>, <tt>\%f</tt>, <tt>\%F</tt>,
+ * <tt>\%g</tt>, <tt>\%G</tt></td><td>Format a <tt>double</tt> (user-level
+ * only).</td></tr>
+ *
+ * <tr><td><tt>\%p{...}</tt><td>Call a user-provided conversion function.
+ * For example, <tt>\%p{ip_ptr}</tt> reads an <tt>IPAddress *</tt> argument
+ * from the argument list, and formats the pointed-to address using
+ * IPAddress::unparse().</td></tr>
+ *
+ * <tr><td><tt>\%\%</tt></td><td>Format a literal \% character.</td></tr>
+ *
+ * <tr><td><tt>\%\<</tt></td><td>Format a left quote string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * <tr><td><tt>\%\></tt></td><td>Format a right quote string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * <tr><td><tt>\%,</tt></td><td>Format an apostrophe string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * </table> */
+ static String xformat(int default_flags, const char *fmt, ...);
+ /** @overload */
+ static String vxformat(int default_flags, const char *fmt, va_list val);
+ /** @overload */
+ static String xformat(const char *fmt, ...);
+ /** @overload */
+ static String vxformat(const char *fmt, va_list val) {
+ return vxformat(0, fmt, val);
+ }
+
+
+ /** @brief Format an error string.
+ * @param fmt format string
+ * @param val argument list
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * This virtual function is called to format an error message. The
+ * default implementation returns the result of vxformat(@a fmt, @a val). */
+ virtual String vformat(const char *fmt, va_list val);
+
+ /** @brief Format an error string.
+ * @param fmt format string
+ *
+ * @warning ErrorHandler users don't usually need to call this function
+ * directly.
+ *
+ * This is a convenience function that calls vformat(const char *fmt,
+ * va_list val) for a va_list taken from the ellipsis arguments. */
+ String format(const char *fmt, ...);
+
+ /** @brief Decorate an error message.
+ * @param str error message, possibly with annotations
+ * @return decorated error message
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * This virtual function is called to decorate an error message before it
+ * is emitted. The input @a str is an error message string, possibly
+ * annotated. The default implementation returns @a str unchanged. Other
+ * ErrorHandlers might add context lines (ContextErrorHandler), prefixes
+ * (PrefixErrorHandler), or a default landmark (LandmarkErrorHandler). */
+ virtual String decorate(const String &str);
+
+ /** @brief Output an error message line.
+ * @param str error message line, possibly with annotations
+ * @param user_data callback data, 0 for first line in a message
+ * @param more true iff this is the last line in the current message
+ * @return @a user_data to be passed to emit() for the next line
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * After calling decorate(), ErrorHandler splits the message into
+ * individual lines and calls emit() once per line. ErrorHandler
+ * subclasses should output the error lines as appropriate; for example,
+ * FileErrorHandler outputs the error message to a file.
+ *
+ * @a str does not contain a newline, but may contain annotations,
+ * including a landmark annotation. Most ErrorHandlers use parse_anno()
+ * to extract the landmark annotation, clean it with clean_landmark(), and
+ * print it ahead of the error message proper.
+ *
+ * ErrorHandler can handle multi-line error messages. However, the emit()
+ * function takes a line at a time; this is more useful in practice for
+ * most error message printers. The @a user_data and @a more arguments
+ * can help an ErrorHandler combine the lines of a multi-line error
+ * message. @a user_data is null for the first line; for second and
+ * subsequent lines, ErrorHandler passes the result of the last line's
+ * emit() call. @a more is true iff this is the last line in the current
+ * message.
+ *
+ * The default emit() implementation does nothing. */
+ virtual void *emit(const String &str, void *user_data, bool more);
+
+ /** @brief Account for an error message at level @a level.
+ * @param level minimum error level in the message
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * After calling emit() for the lines of an error message, ErrorHandler
+ * calls account(), passing the minimum (worst) error level of any message
+ * line (or 1000 if no line had a level). The default implementation
+ * updates the nerrors() counter. Some other ErrorHandlers
+ * add account() behavior that, for example, exits after printing messages
+ * at el_fatal level or below. */
+ virtual void account(int level) {
+ if (level <= el_error)
+ ++_nerrors;
+ }
+
+ /** @brief Clear accumulated error state.
+ *
+ * The default implementation sets the nerrors() counter to zero. */
+ virtual void clear() {
+ _nerrors = 0;
+ }
+
+
+ /** @brief Create an error annotation.
+ * @param name annotation name
+ * @param value annotation value
+ * @return annotation string
+ *
+ * Returns an error annotation that associates annotation @a name with @a
+ * value.
+ *
+ * If @a name equals "<>", then returns a level annotation of the form
+ * "<@a value>". @a value must be valid number; if it isn't, the function
+ * returns the empty string.
+ *
+ * Otherwise, @a name must be a nonempty series of letters and digits.
+ * make_anno() returns a string of the form "{@a name:@a value}", where
+ * special characters in @a value are quoted with backslashes. */
+ static String make_anno(const char *name, const String &value);
+
+ /** @brief Apply annotations from @a anno to every line in @a str.
+ * @param str string
+ * @param anno annotation string
+ *
+ * The annotations from @a anno are applied to every line in @a str. New
+ * annotations do not override existing annotations with the same names.
+ * If the @a anno string ends with non-annotation characters, this
+ * substring is prefixed to every line in @a str.
+ *
+ * For example:
+ * @code
+ * combine_anno("Line 1\n{l:old}{x:x}Line 2\n", "<0>{l:new} ")
+ * // returns "<0>{l:new} Line 1\n<0>{l:old}{x:x} Line 2\n"
+ * @endcode */
+ static String combine_anno(const String &str, const String &anno);
+
+ /** @brief Parse error annotations from a string.
+ * @param str the string
+ * @param begin pointer within @a str to start of annotation area
+ * @param end pointer to end of error region, usually @a str.end()
+ * @return pointer to first character after annotation area
+ * @pre @a str.begin() <= {@a begin, @a end} <= @a str.end()
+ * @post @a begin <= returned value <= @a end
+ *
+ * Use this function to skip an error line's annotation area, possibly
+ * extracting named annotations.
+ *
+ * The variable arguments portion consists of a series of pairs of C
+ * strings and value pointers, terminated by a null character pointer.
+ * Each C string is an annotation name. The corresponding annotation
+ * value, if found, is stored as a String object in the value pointer.
+ * You can also store the <tt>int</tt> value of an annotation by prefixing
+ * an annotation name with the '#' character.
+ *
+ * For example:
+ * @code
+ * String line = "{l:file:30}<4.5>error message\n";
+ * String landmark_str, level_str;
+ * const char *s = ErrorHandler::parse_anno(line, line.begin(), line.end(),
+ * "l", &landmark_str, "<>", &level_str, (const char *) 0);
+ * // Results: s points to "error message\n",
+ * // landmark_str == "file:30", level_str == "4.5"
+ *
+ * int level;
+ * s = ErrorHandler::parse_anno(line, line.begin(), line.end(),
+ * "#<>", &level, (const char *) 0);
+ * // Results: s points to "error message\n", level_str == 4
+ * @endcode */
+ static const char *parse_anno(const String &str,
+ const char *begin, const char *end, ...) ERRH_SENTINEL;
+
+ /** @brief Skip a string's error annotations.
+ * @param begin pointer to start of string
+ * @param end pointer one past end of string
+ * @return pointer to first character after annotation area
+ * @post @a begin <= returned value <= @a end
+ *
+ * Use this function to skip an error line's annotation area. The error
+ * line is defined as a pair of iterators. */
+ static const char *skip_anno(const char *begin, const char *end) {
+ String name, value;
+ const char *x = begin;
+ do {
+ x = skip_anno(String(), x, end, &name, &value, false);
+ } while (name);
+ return x;
+ }
+
+
+ /** @brief Return a landmark annotation equal to @a x.
+ * @param x landmark
+ *
+ * If @a x is empty, returns the empty string. Otherwise, if @a x looks
+ * like a formatted annotation (it starts with an open brace), returns @a
+ * x unchanged. Otherwise, returns make_anno("l", @a x). */
+ static String make_landmark_anno(const String &x) {
+ if (x && x[0] == '{')
+ return x;
+ else if (x)
+ return make_anno("l", x);
+ else
+ return String();
+ }
+
+ /** @brief Clean the @a landmark.
+ * @param landmark landmark text
+ * @param colon if true, append <tt>": "</tt> to a nonempty landmark
+ *
+ * Removes trailing space and an optional trailing colon from @a landmark
+ * and returns the result. If @a colon is true, and the cleaned landmark
+ * isn't the empty string, then appends <tt>": "</tt> to the result. */
+ static String clean_landmark(const String &landmark, bool colon = false);
+
+
+ // error conversions
+ struct Conversion;
+ typedef String (*ConversionFunction)(int flags, VA_LIST_REF_T);
+ enum ConversionFlags {
+ cf_zero_pad = 1, ///< Set for conversions using the '0' flag.
+ cf_plus_positive = 2, ///< Set for conversions using the '+' flag.
+ cf_space_positive = 4, ///< Set for conversions using the ' ' flag.
+ cf_left_just = 8, ///< Set for conversions using the '-' flag.
+ cf_alternate_form = 16, ///< Set for conversions using the '#' flag.
+ cf_singlequote = 32, ///< Set for conversions using the '\'' flag.
+ cf_uppercase = 64, ///< Set for 'X' conversions (not 'x').
+ cf_signed = 128, ///< Set for conversions of signed numbers.
+ cf_negative = 256, ///< Set for conversions of negative numbers.
+ cf_utf8 = 1024 ///< Set to use UTF-8 characters on output.
+ };
+ static Conversion *add_conversion(const String &name, ConversionFunction func);
+ static int remove_conversion(Conversion *conversion);
+
+ private:
+
+ int _nerrors;
+
+ static ErrorHandler *the_default_handler;
+ static ErrorHandler *the_silent_handler;
+
+ static const char *skip_anno(const String &str,
+ const char *begin, const char *end,
+ String *name_result, String *value_result,
+ bool raw);
+
+};
+
+
+/** @class SilentErrorHandler
+ * @brief An ErrorHandler that does not report messages.
+ *
+ * Use SilentErrorHandler when an ErrorHandler object is required, but error
+ * messages should not be printed. */
+class SilentErrorHandler : public ErrorHandler { public:
+
+ SilentErrorHandler() {
+ }
+
+};
+
+
+/** @class ErrorVeneer
+ * @brief Base class for ErrorHandlers that forward messages.
+ *
+ * ErrorHandlers can stack. Stacking ErrorHandlers simplify modify a message
+ * and then pass the result to a base ErrorHandler, which does the actual
+ * printing. The ErrorVeneer base class simplifies the implementation of
+ * stacking ErrorHandlers. It provides versions of ErrorHandler's format(),
+ * decorate(), emit(), and account() methods that forward to the underlying
+ * handler. Note that the clear() method is <em>not</em> automatically
+ * forwarded. */
+class ErrorVeneer : public ErrorHandler { public:
+
+ /** @brief Construct an ErrorVeneer.
+ * @param errh base ErrorHandler
+ *
+ * If @a errh is 0, then the ErrorVeneer acts like a
+ * SilentErrorHandler. */
+ ErrorVeneer(ErrorHandler *errh)
+ : _errh(errh) {
+ }
+
+ String vformat(const char *fmt, va_list val);
+ String decorate(const String &str);
+ void *emit(const String &str, void *user_data, bool more);
+ void account(int level);
+
+ private:
+
+ ErrorHandler *_errh;
+
+};
+
+
+#ifndef __KERNEL__
+/** @class FileErrorHandler
+ * @brief An ErrorHandler that prints error messages to a given file.
+ *
+ * FileErrorHandler is the typical base ErrorHandler used at user level. It
+ * prints messages to a file passed in to the constructor, and calls exit() or
+ * abort() based on the error level. */
+class FileErrorHandler : public ErrorHandler { public:
+
+ /** @brief Construct a FileErrorHandler.
+ * @param f file to print errors
+ * @param prefix string to prefix every error line */
+ FileErrorHandler(FILE *f, const String &prefix = String());
+
+ void set_default_flags(int default_flags) {
+ _default_flags = default_flags;
+ }
+
+ String vformat(const char *fmt, va_list val);
+ void *emit(const String &str, void *user_data, bool more);
+ void account(int level);
+
+ private:
+
+ FILE *_f;
+ String _context;
+ int _default_flags;
+
+};
+#endif
+
+
+/** @class LocalErrorHandler
+ * @brief A convenience stackable ErrorHandler.
+ *
+ * It's often convenient to pass a null ErrorHandler pointer when errors
+ * should not be printed. The LocalErrorHandler class simplifies dealing with
+ * ErrorHandler pointers that may or may not be null. LocalErrorHandler is a
+ * transparent layer on the base handler; but if the base handler is null, it
+ * acts like a SilentErrorHandler. For example:
+ * @code
+ * void f(ErrorHandler *errh) { // errh might or might not be null
+ * LocalErrorHandler lerrh(errh);
+ * ... lerrh.message("message") ...
+ * }
+ * @endcode */
+class LocalErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a LocalErrorHandler. */
+ LocalErrorHandler(ErrorHandler *errh)
+ : ErrorVeneer(errh) {
+ }
+
+};
+
+
+/** @class ContextErrorHandler
+ * @brief A stackable ErrorHandler that prints context lines.
+ *
+ * The stackable ContextErrorHandler adds context to the first error
+ * message printed, and optionally indent error messages so that they appear
+ * grouped underneath the context.
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "While counting to 2:\n"
+ * // " An error occurred.\n"
+ * // " Another error occurred.\n"
+ * @endcode
+ *
+ * To prevent ContextErrorHandler from indenting or printing context for a
+ * message, add a "{context:no}" annotation to the message's first line. To
+ * turn off the indent but keep the context, add a "{context:noindent}"
+ * annotation.
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("{context:no}An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "An error occurred.\n"
+ * // "While counting to 2:\n"
+ * // " Another error occurred.\n"
+ *
+ * FileErrorHandler errh1(stderr);
+ * PrefixErrorHandler noctx_errh(stderr, "{context:no}");
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "An error occurred.\n"
+ * // "Another error occurred.\n"
+ * @endcode
+ *
+ * ContextErrorHandler adds the "{context:context}" annotation to context
+ * lines. */
+class ContextErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a ContextErrorHandler.
+ * @param errh base ErrorHandler
+ * @param fmt format for context lines
+ *
+ * The context message is formed by @a errh->format() using @a fmt and
+ * any additional arguments. */
+ ContextErrorHandler(ErrorHandler *errh, const char *fmt, ...);
+
+ /** @brief Return true iff the context has already been printed. */
+ bool context_printed() const {
+ return _context_printed;
+ }
+
+ /** @brief Set whether the context has been printed. */
+ void set_context_printed(bool x) {
+ _context_printed = x;
+ }
+
+ /** @brief Set the context string to @a str. */
+ void set_context(const String &str) {
+ _context = str;
+ }
+
+ /** @brief Set the indent string to @a str.
+ *
+ * The indent string is prepended to all non-context messages. It can
+ * contain landmarks as well as non-landmark text. The default indent
+ * string is " " (two spaces). */
+ void set_indent(const String &str) {
+ _indent = str;
+ }
+
+ /** @brief Set the context landmark to @a str.
+ *
+ * The context landmark is used to decorate the context, and also applied
+ * to any error messages that lack landmarks of their own. The default
+ * context landmark is empty.
+ *
+ * @note The input @a str is passed to
+ * ErrorHandler::make_landmark_anno(). */
+ void set_context_landmark(const String &str) {
+ _context_landmark = make_landmark_anno(str);
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ String _context;
+ String _indent;
+ String _context_landmark;
+ bool _context_printed;
+
+};
+
+
+/** @class PrefixErrorHandler
+ * @brief A stackable ErrorHandler that adds a prefix to error messages.
+ *
+ * The stackable ContextErrorHandler adds a prefix to every error line
+ * printed. For example:
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * PrefixErrorHandler errh2(&errh1, "Blah--");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "Blah--An error occurred.\n"
+ * // "Blah--Another error occurred.\n"
+ * @endcode */
+class PrefixErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a PrefixErrorHandler.
+ * @param errh base ErrorHandler
+ * @param prefix string to prefix to error lines */
+ PrefixErrorHandler(ErrorHandler *errh, const String &prefix);
+
+ String decorate(const String &str);
+
+ private:
+
+ String _prefix;
+
+};
+
+
+/** @class LandmarkErrorHandler
+ * @brief A stackable ErrorHandler that adds a default landmark to error
+ * messages.
+ *
+ * The stackable ContextErrorHandler adds a default landmark to every error
+ * line printed. Error lines' own landmarks are preserved when they exist.
+ * For example:
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * LandmarkErrorHandler errh2(&errh1, "file:1");
+ * errh2.error("An error occurred.");
+ * errh2.lerror("file:2", "Another error occurred.");
+ * // prints "file:1: An error occurred.\n"
+ * // "file:2: Another error occurred.\n"
+ * @endcode */
+class LandmarkErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a LandmarkErrorHandler.
+ * @param errh base ErrorHandler
+ * @param landmark default landmark */
+ LandmarkErrorHandler(ErrorHandler *errh, const String &landmark);
+
+ /** @brief Set the default landmark applied to error messages. */
+ void set_landmark(const String &landmark) {
+ _landmark = make_landmark_anno(landmark);
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ String _landmark;
+
+};
+
+
+#ifndef __KERNEL__
+/** @class BailErrorHandler
+ * @brief A stackable ErrorHandler that exits when errors occur.
+ *
+ * The stackable BailErrorHandler, available only at user level, causes the
+ * process to exit if an error worse than a configurable level occurs. */
+class BailErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a BailErrorHandler.
+ * @param errh base ErrorHandler
+ * @param level error level that causes premature exit
+ *
+ * An error message with level less than or equal to @a el_error will
+ * cause the process to exit with status 1. */
+ BailErrorHandler(ErrorHandler *errh, int level = el_error);
+
+ void account(int level);
+
+ private:
+
+ int _level;
+
+};
+#endif
+
+#undef ERRH_SENTINEL
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/filename.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/filename.hh
new file mode 100644
index 00000000000..9424a4c04fa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/globmatch.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/globmatch.hh
new file mode 100644
index 00000000000..963035e0ead
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashcode.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashcode.hh
new file mode 100644
index 00000000000..53a0e428989
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashcode.hh
@@ -0,0 +1,31 @@
+#ifndef LCDF_HASHCODE_HH
+#define LCDF_HASHCODE_HH
+#include <stddef.h>
+
+typedef size_t hashcode_t; ///< Typical type for a hashcode() value.
+
+inline hashcode_t
+hashcode(int x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(unsigned x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(long x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(unsigned long x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.cc
new file mode 100644
index 00000000000..4851463c560
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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, const V &value)
+{
+ check_capacity();
+ int i = bucket(key);
+ if (!(bool)_e[i].key) {
+ _e[i].key = key;
+ _e[i].value = 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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.hh
new file mode 100644
index 00000000000..3d4179e5b5f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/hashmap.hh
@@ -0,0 +1,210 @@
+#ifndef LCDF_HASHMAP_HH
+#define LCDF_HASHMAP_HH
+#include <assert.h>
+#include <lcdf/hashcode.hh>
+
+// 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
+// hashcode_t hashcode(const K &)
+// If hashcode(k1) != hashcode(k2), then k1 != k2.
+// Actually any unsigned integer type may be used.
+//
+// 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; }
+ const V &default_value() const { return _default_value; }
+ 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 &, const V &);
+ inline 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);
+ hashcode_t 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 V &
+HashMap<K, V>::find_force(const K &key)
+{
+ return find_force(key, _default_value);
+}
+
+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;
+}
+
+#include <lcdf/hashmap.cc> // necessary to support GCC 3.3
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/inttypes.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/inttypes.h
new file mode 100644
index 00000000000..b88e9e9faf0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/landmark.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/landmark.hh
new file mode 100644
index 00000000000..183ab936ee8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/md5.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/md5.h
new file mode 100644
index 00000000000..7d7f8641d23
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/md5.h
@@ -0,0 +1,48 @@
+/* -*- related-file-name: "../../liblcdf/md5.c" -*-
+ * 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 LCDF_MD5_H
+#define LCDF_MD5_H
+#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 /* LCDF_MD5_H */
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/permstr.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/permstr.hh
new file mode 100644
index 00000000000..684878ed464
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/permstr.hh
@@ -0,0 +1,194 @@
+// -*- related-file-name: "../../liblcdf/permstr.cc" -*-
+#ifndef LCDF_PERMSTR_HH
+#define LCDF_PERMSTR_HH
+#include <assert.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <string.h>
+#include <lcdf/inttypes.h>
+#include <lcdf/hashcode.hh>
+class PermString;
+inline bool operator==(PermString a, PermString b);
+inline bool operator!=(PermString a, PermString b);
+
+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)
+ : _rep(one_char_doodad[(unsigned char) c].data) {
+ }
+ inline PermString(const char *s);
+ inline PermString(const char *s, int len);
+ inline PermString(const char *begin, const char *end);
+
+ typedef int (PermString::*unspecified_bool_type)() const;
+ inline operator unspecified_bool_type() const;
+ inline bool operator!() const;
+
+ inline int length() const;
+ char operator[](int i) const;
+
+ inline const char *c_str() const {
+ return _rep;
+ }
+ inline char operator*() const {
+ return *_rep;
+ }
+
+ inline const char *begin() const;
+ inline const char *end() const;
+
+ inline bool equals(const char *s, int len) const;
+ friend inline bool operator==(PermString a, PermString b);
+ friend inline bool operator!=(PermString a, PermString b);
+
+ 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 unspecified_bool_type() const
+{
+ return _rep != zero_char_doodad.data ? &PermString::length : 0;
+}
+
+inline bool PermString::operator!() const
+{
+ return _rep == zero_char_doodad.data;
+}
+
+inline int PermString::length() const
+{
+ return doodad()->length;
+}
+
+inline const char *PermString::begin() const
+{
+ return _rep;
+}
+
+inline const char *PermString::end() const
+{
+ return _rep + doodad()->length;
+}
+
+inline char PermString::operator[](int i) const
+{
+ assert((unsigned) i < (unsigned) length());
+ return c_str()[i];
+}
+
+inline bool operator==(PermString a, PermString b)
+{
+ return a._rep == b._rep;
+}
+
+inline bool operator==(PermString a, const char *b)
+{
+ return (!a || !b ? !a && !b : strcmp(a.c_str(), b) == 0);
+}
+
+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 bool operator<(PermString a, PermString b)
+{
+ // NOT lexicographic ordering!
+ return a.begin() < b.begin();
+}
+
+inline bool PermString::equals(const char *s, int len) const
+{
+ if (len > 0)
+ return len == length() && memcmp(s, _rep, len) == 0;
+ else
+ return strcmp(s, _rep) == 0;
+}
+
+inline PermString::Capsule PermString::capsule() const
+{
+ return doodad();
+}
+
+inline PermString PermString::decapsule(Capsule c)
+{
+ return PermString(c);
+}
+
+inline hashcode_t hashcode(PermString s)
+{
+ return (uintptr_t) s.c_str();
+}
+
+PermString permprintf(const char *format, ...);
+PermString vpermprintf(const char *format, va_list val);
+
+PermString permcat(PermString a, PermString b);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/point.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/point.hh
new file mode 100644
index 00000000000..aad59b53ccf
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/slurper.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/slurper.hh
new file mode 100644
index 00000000000..2e400d3c3f2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/straccum.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/straccum.hh
new file mode 100644
index 00000000000..f62c2984978
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/straccum.hh
@@ -0,0 +1,603 @@
+// -*- related-file-name: "../../liblcdf/straccum.cc" -*-
+#ifndef LCDF_STRACCUM_HH
+#define LCDF_STRACCUM_HH
+#include <string.h>
+#include <assert.h>
+#include <lcdf/string.hh>
+#if HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+#if __GNUC__ > 4
+# define LCDF_SNPRINTF_ATTR __attribute__((__format__(__printf__, 3, 4)))
+#else
+# define LCDF_SNPRINTF_ATTR /* nothing */
+#endif
+template<typename T> class Vector;
+
+/** @file <lcdf/straccum.hh>
+ @brief Click's StringAccum class, used to construct Strings efficiently from pieces.
+*/
+
+class StringAccum { public:
+
+ /** @brief Construct an empty StringAccum (with length 0). */
+ StringAccum()
+ : _s(0), _len(0), _cap(0) {
+ }
+
+ /** @brief Construct a StringAccum with room for at least @a capacity
+ * characters.
+ * @param capacity initial capacity
+ *
+ * If @a capacity <= 0, the StringAccum is created empty. If @a capacity
+ * is too large (so that @a capacity bytes of memory can't be allocated),
+ * the StringAccum falls back to a smaller capacity (possibly zero). */
+ explicit inline StringAccum(int capacity);
+
+ /** @brief Construct a StringAccum containing the characters in @a s. */
+ explicit inline StringAccum(const char *cstr)
+ : _s(0), _len(0), _cap(0) {
+ append(cstr);
+ }
+
+ /** @brief Construct a StringAccum containing the characters in @a s. */
+ inline StringAccum(const char *s, int len)
+ : _s(0), _len(0), _cap(0) {
+ append(s, len);
+ }
+
+ /** @brief Construct a StringAccum containing the characters in @a str. */
+ StringAccum(const String &str)
+ : _s(0), _len(0), _cap(0) {
+ append(str.begin(), str.end());
+ }
+
+ /** @brief Construct a StringAccum containing a copy of @a x. */
+ StringAccum(const StringAccum &x)
+ : _s(0), _len(0), _cap(0) {
+ append(x.data(), x.length());
+ }
+
+ /** @brief Destroy a StringAccum, freeing its memory. */
+ ~StringAccum() {
+ if (_cap > 0)
+ delete[] (_s - MEMO_SPACE);
+ }
+
+
+ /** @brief Return the contents of the StringAccum.
+ * @return The StringAccum's contents.
+ *
+ * The return value is null if the StringAccum is empty or out-of-memory.
+ * The returned data() value points to writable memory (unless the
+ * StringAccum itself is const). */
+ inline const char *data() const {
+ return reinterpret_cast<const char *>(_s);
+ }
+
+ /** @overload */
+ inline char *data() {
+ return reinterpret_cast<char *>(_s);
+ }
+
+ inline const unsigned char* udata() const {
+ return _s;
+ }
+
+ inline unsigned char* udata() {
+ return _s;
+ }
+
+ /** @brief Return true iff the StringAccum is empty or out-of-memory. */
+ bool empty() const {
+ return _len == 0;
+ }
+
+ /** @brief Return the length of the StringAccum. */
+ int length() const {
+ return _len;
+ }
+
+ /** @brief Return the StringAccum's current capacity.
+ *
+ * The capacity is the maximum length the StringAccum can hold without
+ * incurring a memory allocation. Returns -1 for out-of-memory
+ * StringAccums. */
+ int capacity() const {
+ return _cap;
+ }
+
+
+ typedef const char *const_iterator;
+ typedef char *iterator;
+
+ /** @brief Return an iterator for the first character in the StringAccum.
+ *
+ * StringAccum iterators are simply pointers into string data, so they are
+ * quite efficient. @sa StringAccum::data */
+ inline const_iterator begin() const {
+ return reinterpret_cast<char *>(_s);
+ }
+
+ /** @overload */
+ inline iterator begin() {
+ return reinterpret_cast<char *>(_s);
+ }
+
+ /** @brief Return an iterator for the end of the StringAccum.
+ *
+ * The return value points one character beyond the last character in the
+ * StringAccum. */
+ inline StringAccum::const_iterator end() const {
+ return reinterpret_cast<char *>(_s + _len);
+ }
+
+ /** @overload */
+ inline iterator end() {
+ return reinterpret_cast<char *>(_s + _len);
+ }
+
+
+ typedef int (StringAccum::*unspecified_bool_type)() const;
+
+ /** @brief Return true iff the StringAccum contains characters.
+ *
+ * Returns false for empty and out-of-memory StringAccums. */
+ operator unspecified_bool_type() const {
+ return _len != 0 ? &StringAccum::capacity : 0;
+ }
+
+ /** @brief Return true iff the StringAccum does not contain characters.
+ *
+ * Returns true for empty and out-of-memory StringAccums. */
+ bool operator!() const {
+ return _len == 0;
+ }
+
+ /** @brief Return true iff the StringAccum is out-of-memory. */
+ bool out_of_memory() const {
+ return _cap < 0;
+ }
+
+
+ /** @brief Null-terminate this StringAccum and return its data.
+ *
+ * Note that the null character does not contribute to the StringAccum's
+ * length(), and later append() and similar operations can overwrite it.
+ * If appending the null character fails, the StringAccum becomes
+ * out-of-memory and the returned value is a null string. */
+ const char *c_str();
+
+
+ /** @brief Return the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+ char operator[](int i) const {
+ assert((unsigned) i < (unsigned) _len);
+ return static_cast<char>(_s[i]);
+ }
+
+ /** @brief Return a reference to the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+ char &operator[](int i) {
+ assert((unsigned) i < (unsigned) _len);
+ return reinterpret_cast<char &>(_s[i]);
+ }
+
+ /** @brief Return the first character in the string.
+ * @pre length() > 0 */
+ char front() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[0]);
+ }
+
+ /** @brief Return a reference to the first character in the string.
+ * @pre length() > 0 */
+ char &front() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[0]);
+ }
+
+ /** @brief Return the last character in the string.
+ * @pre length() > 0 */
+ char back() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[_len - 1]);
+ }
+
+ /** @brief Return a reference to the last character in the string.
+ * @pre length() > 0 */
+ char &back() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[_len - 1]);
+ }
+
+
+ /** @brief Clear the StringAccum's comments.
+ *
+ * All characters in the StringAccum are erased. Also resets the
+ * StringAccum's out-of-memory status. */
+ inline void clear() {
+ if (_cap < 0) {
+ _cap = 0;
+ _s = 0;
+ }
+ _len = 0;
+ }
+
+
+ /** @brief Reserve space for at least @a n characters.
+ * @return a pointer to at least @a n characters, or null if allocation
+ * fails
+ * @pre @a n >= 0
+ *
+ * reserve() does not change the string's length(), only its capacity().
+ * In a frequent usage pattern, code calls reserve(), passing an upper
+ * bound on the characters that could be written by a series of
+ * operations. After writing into the returned buffer, adjust_length() is
+ * called to account for the number of characters actually written.
+ *
+ * On failure, null is returned and errno is set to ENOMEM. */
+ inline char *reserve(int n) {
+ assert(n >= 0);
+ if (_len + n <= _cap)
+ return reinterpret_cast<char *>(_s + _len);
+ else
+ return grow(_len + n);
+ }
+
+ /** @brief Set the StringAccum's length to @a len.
+ * @param len new length in characters
+ * @pre 0 <= @a len <= capacity()
+ * @sa adjust_length */
+ inline void set_length(int len) {
+ assert(len >= 0 && _len <= _cap);
+ _len = len;
+ }
+
+ /** @brief Set the StringAccum's length to @a len.
+ * @pre @a len >= 0
+ * @return 0 on success, -ENOMEM on failure */
+ int resize(int len);
+
+ /** @brief Adjust the StringAccum's length.
+ * @param delta length adjustment
+ * @pre If @a delta > 0, then length() + @a delta <= capacity().
+ * If @a delta < 0, then length() + delta >= 0.
+ *
+ * The StringAccum's length after adjust_length(@a delta) equals its old
+ * length plus @a delta. Generally adjust_length() is used after a call
+ * to reserve(). @sa set_length */
+ inline void adjust_length(int delta) {
+ assert(_len + delta >= 0 && _len + delta <= _cap);
+ _len += delta;
+ }
+
+ /** @brief Reserve space and adjust length in one operation.
+ * @param nadjust number of characters to reserve and adjust length
+ * @param nreserve additional characters to reserve
+ * @pre @a nadjust >= 0 and @a nreserve >= 0
+ *
+ * This operation combines the effects of reserve(@a nadjust + @a
+ * nreserve) and adjust_length(@a nadjust). Returns the result of the
+ * reserve() call. */
+ inline char *extend(int nadjust, int nreserve = 0) {
+ assert(nadjust >= 0 && nreserve >= 0);
+ if (_len + nadjust + nreserve <= _cap) {
+ char *x = reinterpret_cast<char *>(_s + _len);
+ _len += nadjust;
+ return x;
+ } else
+ return hard_extend(nadjust, nreserve);
+ }
+
+
+ /** @brief Remove characters from the end of the StringAccum.
+ * @param n number of characters to remove
+ * @pre @a n >= 0 and @a n <= length()
+ *
+ * Same as adjust_length(-@a n). */
+ inline void pop_back(int n = 1) {
+ assert(n >= 0 && _len >= n);
+ _len -= n;
+ }
+
+
+
+ /** @brief Append character @a c to the StringAccum.
+ * @param c character to append */
+ inline void append(char c) {
+ if (_len < _cap || grow(_len))
+ _s[_len++] = c;
+ }
+ /** @overload */
+ inline void append(unsigned char c) {
+ append(static_cast<char>(c));
+ }
+
+ /** @brief Append @a len copies of character @a c to the StringAccum. */
+ void append_fill(int c, int len);
+
+ /** @brief Append the UTF-8 encoding of Unicode character @a ch. */
+ inline void append_utf8(unsigned ch) {
+ if (ch < 0x80)
+ append((unsigned char) ch);
+ else
+ append_utf8_hard(ch);
+ }
+
+ /** @brief Append the null-terminated C string @a s to this StringAccum.
+ * @param s data to append */
+ void append(const char *s);
+ /** @brief Append the first @a len characters of @a s to this StringAccum.
+ * @param s data to append
+ * @param len length of data
+ * @pre @a len >= 0 */
+ inline void append(const char *s, int len);
+ /** @overload */
+ inline void append(const unsigned char *s, int len);
+
+ /** @brief Append the data from @a begin to @a end to the end of this
+ * StringAccum.
+ *
+ * Does nothing if @a begin >= @a end. */
+ inline void append(const char *begin, const char *end);
+ /** @overload */
+ inline void append(const unsigned char *begin, const unsigned char *end);
+
+ // word joining
+ void append_break_lines(const String &text, int linelen, const String &leftmargin = String());
+
+ /** @brief Append result of snprintf() to this StringAccum.
+ * @param n maximum number of characters to print
+ * @param format format argument to snprintf()
+ *
+ * The terminating null character is not appended to the string.
+ *
+ * @note The safe vsnprintf() variant is called if it exists. It does in
+ * the Linux kernel, and on modern Unix variants. However, if it does not
+ * exist on your machine, then this function is actually unsafe, and you
+ * should make sure that the printf() invocation represented by your
+ * arguments will never write more than @a n characters, not including the
+ * terminating null. */
+ StringAccum &snprintf(int n, const char *format, ...) LCDF_SNPRINTF_ATTR;
+
+
+ /** @brief Return a String object with this StringAccum's contents.
+ *
+ * This operation donates the StringAccum's memory to the returned String.
+ * After a call to take_string(), the StringAccum object becomes empty,
+ * and any future append() operations may cause memory allocations. If
+ * the StringAccum is out-of-memory, the returned String is also
+ * out-of-memory, but the StringAccum's out-of-memory state is reset. */
+ String take_string();
+
+
+ /** @brief Assign this StringAccum to @a x. */
+ StringAccum &operator=(const StringAccum &x) {
+ if (&x != this) {
+ if (out_of_memory())
+ _s = 0, _cap = 0;
+ _len = 0;
+ append(x.data(), x.length());
+ }
+ return *this;
+ }
+
+ /** @brief Swap this StringAccum's contents with @a x. */
+ void swap(StringAccum &x);
+
+ // see also operator<< declarations below
+
+ private:
+
+ enum {
+ MEMO_SPACE = String::MEMO_SPACE
+ };
+
+ unsigned char *_s;
+ int _len;
+ int _cap;
+
+ char *grow(int);
+ void assign_out_of_memory();
+
+ char *hard_extend(int nadjust, int nreserve);
+ void hard_append(const char *s, int len);
+ void append_utf8_hard(unsigned ch);
+
+ friend StringAccum &operator<<(StringAccum &sa, const char *s);
+ friend StringAccum &operator<<(StringAccum &sa, const String &str);
+#if HAVE_PERMSTRING
+ friend StringAccum &operator<<(StringAccum &sa, PermString s);
+#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 capacity)
+ : _len(0)
+{
+ assert(capacity >= 0);
+ if (capacity
+ && (_s = new unsigned char[capacity + MEMO_SPACE])) {
+ _s += MEMO_SPACE;
+ _cap = capacity;
+ } else {
+ _s = 0;
+ _cap = 0;
+ }
+}
+
+inline void StringAccum::append(const char *s, int len) {
+ assert(len >= 0);
+ if (_len + len <= _cap) {
+ memcpy(_s + _len, s, len);
+ _len += len;
+ } else
+ hard_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)
+ append(begin, end - begin);
+}
+
+inline void StringAccum::append(const unsigned char *begin, const unsigned char *end) {
+ if (begin < end)
+ append(begin, end - begin);
+}
+
+/** @relates StringAccum
+ @brief Append character @a c to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a c). */
+inline StringAccum &
+operator<<(StringAccum &sa, char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append character @a c to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a c). */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append null-terminated C string @a cstr to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a cstr). */
+inline StringAccum &
+operator<<(StringAccum &sa, const char *cstr)
+{
+ sa.append(cstr);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append "true" or "false" to @a sa, depending on @a b.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, bool b)
+{
+ static const char truefalse[] = "truefalse";
+ if (b)
+ sa.append(truefalse, 4);
+ else
+ sa.append(truefalse + 4, 5);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, short i)
+{
+ return sa << static_cast<long>(i);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned short u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, int i)
+{
+ return sa << static_cast<long>(i);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+/** @relates StringAccum
+ @brief Append the contents of @a str to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, const String &str)
+{
+ if (!str.out_of_memory())
+ sa.hard_append(str.begin(), str.length());
+ else
+ sa.assign_out_of_memory();
+ return sa;
+}
+
+#ifdef HAVE_PERMSTRING
+inline StringAccum &
+operator<<(StringAccum &sa, PermString s)
+{
+ sa.append(s.c_str(), s.length());
+ return sa;
+}
+#endif
+
+/** @relates StringAccum
+ @brief Append the contents of @a sb to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, const StringAccum &sb)
+{
+ sa.append(sb.begin(), sb.end());
+ 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;
+}
+
+#undef LCDF_SNPRINTF_ATTR
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/string.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/string.hh
new file mode 100644
index 00000000000..ad83d7cb496
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/string.hh
@@ -0,0 +1,880 @@
+// -*- related-file-name: "../../liblcdf/string.cc" -*-
+#ifndef LCDF_STRING_HH
+#define LCDF_STRING_HH
+#include <lcdf/hashcode.hh>
+#ifdef HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+#include <assert.h>
+class StringAccum;
+
+class String { public:
+
+ /** @brief Construct an empty String (with length 0). */
+ inline String() {
+ assign_memo(&null_data, 0, 0);
+ }
+
+ /** @brief Construct a copy of the String @a x. */
+ inline String(const String &x) {
+ assign(x);
+ }
+
+ /** @brief Construct a String containing the C string @a cstr.
+ * @param cstr a null-terminated C string
+ * @return A String containing the characters of @a cstr, up to but not
+ * including the terminating null character.
+ *
+ * If @a cstr equals String::out_of_memory_data(), returns an
+ * out-of-memory string. */
+ inline String(const char *cstr) {
+ assign(cstr, -1, false);
+ }
+
+ /** @brief Construct a String containing the first @a len characters of
+ * string @a s.
+ * @param s a string
+ * @param len number of characters to take from @a s. If @a len @< 0,
+ * then takes @c strlen(@a s) characters.
+ * @return A String containing @a len characters of @a s.
+ *
+ * If @a s equals String::out_of_memory_data(), returns an out-of-memory
+ * string. */
+ inline String(const char *s, int len) {
+ assign(s, len, false);
+ }
+ /** @overload */
+ inline String(const unsigned char *s, int len) {
+ assign(reinterpret_cast<const char *>(s), len, false);
+ }
+
+ /** @brief Construct a String containing the characters from @a begin
+ * to @a end.
+ * @param begin first character in string (begin iterator)
+ * @param end pointer one past last character in string (end iterator)
+ * @return A String containing the characters from @a begin to @a end.
+ *
+ * Returns a null string if @a begin @>= @a end. If @a begin equals
+ * String::out_of_memory_data(), returns an out-of-memory string. */
+ inline String(const char *begin, const char *end) {
+ assign(begin, (end > begin ? end - begin : 0), false);
+ }
+ /** @overload */
+ inline String(const unsigned char *begin, const unsigned char *end) {
+ assign(reinterpret_cast<const char *>(begin),
+ (end > begin ? end - begin : 0), false);
+ }
+
+ /** @brief Construct a String equal to "true" or "false" depending on the
+ * value of @a x. */
+ explicit inline String(bool x) {
+ assign_memo(bool_data + (x ? 0 : 5), x ? 4 : 5, 0);
+ }
+
+ /** @brief Construct a String containing the single character @a c. */
+ explicit inline String(char c) {
+ assign(&c, 1, false);
+ }
+
+ /** @overload */
+ explicit inline String(unsigned char c) {
+ assign(reinterpret_cast<char *>(&c), 1, false);
+ }
+
+ /** @brief Construct a base-10 string representation of @a x. */
+ explicit String(int x);
+ /** @overload */
+ explicit String(unsigned x);
+ /** @overload */
+ explicit String(long x);
+ /** @overload */
+ explicit String(unsigned long x);
+ /** @overload */
+ explicit String(double x);
+#if HAVE_PERMSTRING
+ inline String(PermString x) {
+ assign(x);
+ }
+#endif
+
+ /** @brief Destroy a String, freeing memory if necessary. */
+ inline ~String() {
+ deref();
+ }
+
+
+ /** @brief Return a const reference to an empty String.
+ *
+ * May be quicker than String::String(). */
+ static inline const String &make_empty() {
+ return reinterpret_cast<const String &>(null_string_rep);
+ }
+
+ /** @brief Return a String containing @a len unknown characters. */
+ static String make_uninitialized(int len) {
+ String s;
+ s.append_uninitialized(len);
+ return s;
+ }
+
+ /** @brief Return a String that directly references the first @a len
+ * characters of @a s.
+ *
+ * This function is suitable for static constant strings whose data is
+ * known to stay around forever, such as C string constants. If @a len @<
+ * 0, treats @a s as a null-terminated C string.
+ *
+ * @warning The String implementation may access @a s[@a len], which
+ * should remain constant even though it's not part of the String. */
+ static String make_stable(const char *s, int len = -1);
+
+ /** @brief Return a String that directly references the character data in
+ * [@a begin, @a end).
+ * @param begin pointer to the first character in the character data
+ * @param end pointer one beyond the last character in the character data
+ * (but see the warning)
+ *
+ * This function is suitable for static constant strings whose data is
+ * known to stay around forever, such as C string constants. Returns an
+ * empty string if @a begin @>= @a end.
+ *
+ * @warning The String implementation may access *@a end, which should
+ * remain constant even though it's not part of the String. */
+ static inline String make_stable(const char *begin, const char *end) {
+ if (begin < end)
+ return String::make_stable(begin, end - begin);
+ else
+ return String();
+ }
+ static String make_fill(int c, int n); // n copies of c
+
+
+ /** @brief Return the string's length. */
+ inline int length() const {
+ return _r.length;
+ }
+
+ /** @brief Return a pointer to the string's data.
+ *
+ * Only the first length() characters are valid, and the string data
+ * might not be null-terminated. */
+ inline const char *data() const {
+ return _r.data;
+ }
+
+ /** @brief Return a pointer to the string's data as unsigned chars.
+ *
+ * Only the first length() characters are valid, and the string data
+ * might not be null-terminated. @sa data() */
+ inline const unsigned char *udata() const {
+ return reinterpret_cast<const unsigned char *>(_r.data);
+ }
+
+
+ typedef const char *const_iterator;
+ typedef const_iterator iterator;
+
+ /** @brief Return an iterator for the first character in the string.
+ *
+ * String iterators are simply pointers into string data, so they are
+ * quite efficient. @sa String::data */
+ inline const_iterator begin() const {
+ return _r.data;
+ }
+
+ /** @brief Return an iterator for the end of the string.
+ *
+ * The return value points one character beyond the last character in the
+ * string. */
+ inline const_iterator end() const {
+ return _r.data + _r.length;
+ }
+
+
+ typedef int (String::*unspecified_bool_type)() const;
+ /** @brief Return true iff the string is nonempty. */
+ inline operator unspecified_bool_type() const {
+ return _r.length != 0 ? &String::length : 0;
+ }
+
+ /** @brief Return true iff the string is empty. */
+ inline bool empty() const {
+ return _r.length == 0;
+ }
+
+ /** @brief Return true iff the string is empty. */
+ inline bool operator!() const {
+ return empty();
+ }
+
+
+ /** @brief Return the @a i th character in the string.
+ *
+ * Does not check bounds. @sa String::at */
+ inline char operator[](int i) const {
+ return _r.data[i];
+ }
+
+ /** @brief Return the @a i th character in the string.
+ *
+ * Checks bounds: an assertion will fail if @a i is less than 0 or not
+ * less than length(). @sa String::operator[] */
+ inline char at(int i) const {
+ assert((unsigned) i < (unsigned) _r.length);
+ return _r.data[i];
+ }
+
+ /** @brief Return the first character in the string.
+ *
+ * Does not check bounds. Same as (*this)[0]. */
+ inline char front() const {
+ return _r.data[0];
+ }
+
+ /** @brief Return the last character in the string.
+ *
+ * Does not check bounds. Same as (*this)[length() - 1]. */
+ inline char back() const {
+ return _r.data[_r.length - 1];
+ }
+
+
+ /** @brief Null-terminate the string.
+ *
+ * The terminating null character isn't considered part of the string, so
+ * this->length() doesn't change. Returns a corresponding C string
+ * pointer. The returned pointer is semi-temporary; it will persist until
+ * the string is destroyed or appended to. */
+ inline const char *c_str() const {
+ // We may already have a '\0' in the right place. If _memo has no
+ // capacity, then this is one of the special strings (null or
+ // stable). We are guaranteed, in these strings, that _data[_length]
+ // exists. Otherwise must check that _data[_length] exists.
+ const char *end_data = _r.data + _r.length;
+ if ((_r.memo && end_data >= _r.memo->real_data + _r.memo->dirty)
+ || *end_data != '\0') {
+ if (char *x = const_cast<String *>(this)->append_uninitialized(1)) {
+ *x = '\0';
+ --_r.length;
+ }
+ }
+ return _r.data;
+ }
+
+#if HAVE_PERMSTRING
+ operator PermString() const {
+ return PermString(_r.data, _r.length);
+ }
+#endif
+
+
+ /** @brief Return a 32-bit hash function of the characters in [begin, end).
+ *
+ * Uses Paul Hsieh's "SuperFastHash" algorithm, described at
+ * http://www.azillionmonkeys.com/qed/hash.html
+ * This hash function uses all characters in the string.
+ *
+ * @invariant If end1 - begin1 == end2 - begin2 and memcmp(begin1, begin2,
+ * end1 - begin1) == 0, then hashcode(begin1, end1) == hashcode(begin2,
+ * end2). */
+ static hashcode_t hashcode(const char *begin, const char *end);
+
+ /** @overload */
+ static inline hashcode_t hashcode(const unsigned char *begin,
+ const unsigned char *end) {
+ return hashcode(reinterpret_cast<const char *>(begin),
+ reinterpret_cast<const char *>(end));
+ }
+
+ /** @brief Returns a 32-bit hash function of this string's characters.
+ *
+ * Equivalent to String::hashcode(begin(), end()). Uses Paul Hsieh's
+ * "SuperFastHash."
+ *
+ * @invariant If s1 == s2, then s1.hashcode() == s2.hashcode(). */
+ inline hashcode_t hashcode() const {
+ return length() ? hashcode(begin(), end()) : 0;
+ }
+
+
+ /** @brief Return true iff this string is equal to the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * Same as String::compare(*this, String(s, len)) == 0. If @a len @< 0,
+ * then treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ bool equals(const char *s, int len) 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 &);
+
+
+ /** @brief Compare two strings.
+ * @param a first string to compare
+ * @param b second string to compare
+ *
+ * Returns 0 if @a a == @a b, negative if @a a @< @a b in lexicographic
+ * order, and positive if @a a @> @a b in lexicographic order. The
+ * lexicographic order treats all characters as unsigned. */
+ static inline int compare(const String &a, const String &b) {
+ return a.compare(b);
+ }
+
+ /** @brief Compare this string with string @a x.
+ *
+ * Same as String::compare(*this, @a x).
+ * @sa String::compare(const String &a, const String &b) */
+ inline int compare(const String &x) const {
+ return compare(x._r.data, x._r.length);
+ }
+
+ /** @brief Compare this string with the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * Same as String::compare(*this, String(s, len)). If @a len @< 0, then
+ * treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ int compare(const char *s, int len) const;
+
+ // bool operator<(const String &, const String &);
+ // bool operator<=(const String &, const String &);
+ // bool operator>(const String &, const String &);
+ // bool operator>=(const String &, const String &);
+
+
+ /** @brief Return a substring of the current string starting at @a begin
+ * and ending before @a end.
+ * @param begin pointer to the first substring character
+ * @param end pointer one beyond the last substring character
+ *
+ * Returns an empty string if @a begin @>= @a end. Also returns an empty
+ * string if @a begin or @a end is out of range (i.e., either less than
+ * this->begin() or greater than this->end()), but this should be
+ * considered a programming error; a future version may generate a warning
+ * for this case. */
+ inline String substring(const char *begin, const char *end) const {
+ if (begin < end && begin >= _r.data && end <= _r.data + _r.length)
+ return String(begin, end - begin, _r.memo);
+ else
+ return String();
+ }
+
+ /** @overload */
+ inline String substring(const unsigned char* first, const unsigned char* last) const {
+ return substring(reinterpret_cast<const char*>(first),
+ reinterpret_cast<const char*>(last));
+ }
+
+ /** @brief Return a substring of this string, consisting of the @a len
+ * characters starting at index @a pos.
+ * @param pos substring's first position relative to the string
+ * @param len length of substring
+ *
+ * If @a pos is negative, starts that far from the end of the string. If
+ * @a len is negative, leaves that many characters off the end of the
+ * string. If @a pos and @a len specify a substring that is partly
+ * outside the string, only the part within the string is returned. If
+ * the substring is beyond either end of the string, returns an empty
+ * string (but this should be considered a programming error; a future
+ * version may generate a warning for this case).
+ *
+ * @note String::substring() is intended to behave like Perl's substr(). */
+ String substring(int pos, int len) const;
+
+ /** @brief Return the suffix of the current string starting at index @a pos.
+ *
+ * If @a pos is negative, starts that far from the end of the string. If
+ * @a pos is so negative that the suffix starts outside the string, then
+ * the entire string is returned. If the substring is beyond the end of
+ * the string (@a pos > length()), returns an empty string (but this
+ * should be considered a programming error; a future version may generate
+ * a warning for this case).
+ *
+ * @note String::substring() is intended to behave like Perl's substr(). */
+ inline String substring(int pos) const {
+ return substring((pos <= -_r.length ? 0 : pos), _r.length);
+ }
+
+
+ /** @brief Search for a character in a string.
+ * @param c character to search for
+ * @param start initial search position
+ *
+ * Return the index of the leftmost occurence of @a c, starting at index
+ * @a start and working up to the end of the string. Returns -1 if @a c
+ * is not found. */
+ int find_left(char c, int start = 0) const;
+
+ /** @brief Search for a substring in a string.
+ * @param x substring to search for
+ * @param start initial search position
+ *
+ * Return the index of the leftmost occurence of the substring @a str,
+ * starting at index @a start and working up to the end of the string.
+ * Returns -1 if @a str is not found. */
+ int find_left(const String &x, int start = 0) const;
+
+ /** @brief Search for a character in a string.
+ * @param c character to search for
+ * @param start initial search position
+ *
+ * Return the index of the rightmost occurence of the character @a c,
+ * starting at index @a start and working back to the beginning of the
+ * string. Returns -1 if @a c is not found. @a start may start beyond
+ * the end of the string. */
+ int find_right(char c, int start = 0x7FFFFFFF) const;
+
+ /** @brief Return true iff this string begins with prefix @a x.
+ *
+ * Same as String::starts_with(@a x.data(), @a x.length()). */
+ inline bool starts_with(const String &x) const {
+ return starts_with(x._r.data, x._r.length);
+ }
+
+ /** @brief Return true iff this string begins with the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * If @a len @< 0, then treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ bool starts_with(const char *s, int len) const;
+
+ String lower() const;
+ String upper() const;
+ String printable(int type = 0) const;
+
+
+ /** @brief Assign this string to @a x. */
+ inline String &operator=(const String &x) {
+ if (&x != this) {
+ deref();
+ assign(x);
+ }
+ return *this;
+ }
+
+ /** @brief Assign this string to the C string @a cstr. */
+ inline String &operator=(const char *cstr) {
+ assign(cstr, -1, true);
+ return *this;
+ }
+
+#ifdef HAVE_PERMSTRING
+ inline String &operator=(PermString p) {
+ deref();
+ assign(p);
+ return *this;
+ }
+#endif
+
+ /** @brief Append the null-terminated C string @a cstr to this string.
+ * @param cstr data to append */
+ inline void append(const char *cstr) {
+ append(cstr, -1, 0);
+ }
+
+ /** @brief Append the first @a len characters of @a s to this string.
+ * @param s data to append
+ * @param len length of data
+ * @pre @a len @>= 0 */
+ inline void append(const char *s, int len) {
+ append(s, len, 0);
+ }
+
+ /** @brief Appends the data from @a begin to @a end to the end of this
+ * string.
+ *
+ * Does nothing if @a begin @>= @a end. */
+ inline void append(const char *begin, const char *end) {
+ if (begin < end)
+ append(begin, end - begin);
+ }
+
+ /** @brief Append @a len copies of character @a c to this string. */
+ void append_fill(int c, int len);
+
+ /** @brief Append @a len unknown characters to this string.
+ * @return Modifiable pointer to the appended characters.
+ *
+ * The caller may safely modify the returned memory. Null is returned if
+ * the string becomes out-of-memory. */
+ char *append_uninitialized(int len);
+
+
+ /** @brief Append a copy of @a x to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(const String &x) {
+ append(x._r.data, x._r.length, x._r.memo);
+ return *this;
+ }
+
+ /** @brief Append a copy of the C string @a cstr to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(const char *cstr) {
+ append(cstr);
+ return *this;
+ }
+
+ /** @brief Append the character @a c to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(char c) {
+ append(&c, 1);
+ return *this;
+ }
+
+#if HAVE_PERMSTRING
+ inline String &operator+=(PermString p) {
+ append(p.c_str(), p.length());
+ return *this;
+ }
+#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);
+
+
+ /** @brief Return true iff the String's data is shared or immutable. */
+ inline bool data_shared() const {
+ return !_r.memo || _r.memo->refcount != 1;
+ }
+
+ /** @brief Return a compact version of this String.
+ *
+ * The compact version shares no more than 256 bytes of data with any
+ * other non-stable String. */
+ inline String compact() const {
+ if (!_r.memo || _r.memo->refcount == 1
+ || (uint32_t) _r.length + 256 >= _r.memo->capacity)
+ return *this;
+ else
+ return String(_r.data, _r.data + _r.length);
+ }
+
+ /** @brief Ensure the string's data is unshared and return a mutable
+ * pointer to it. */
+ char *mutable_data();
+
+ /** @brief Null-terminate the string and return a mutable pointer to its
+ * data.
+ * @sa String::c_str */
+ char *mutable_c_str();
+
+ unsigned char *mutable_udata() {
+ return reinterpret_cast<unsigned char *>(mutable_data());
+ }
+
+ void align(int);
+
+
+ /** @brief Return true iff this is an out-of-memory string. */
+ inline bool out_of_memory() const {
+ return _r.data == &oom_data;
+ }
+
+ /** @brief Return a const reference to an out-of-memory String. */
+ static inline const String &make_out_of_memory() {
+ return reinterpret_cast<const String &>(oom_string_rep);
+ }
+
+ /** @brief Return the data pointer used for out-of-memory strings.
+ *
+ * The returned value may be dereferenced; it points to a null
+ * character. */
+ static inline const char *out_of_memory_data() {
+ return &oom_data;
+ }
+
+ private:
+
+ /** @cond never */
+ struct memo_t {
+ volatile uint32_t refcount;
+ uint32_t capacity;
+ volatile uint32_t dirty;
+#if HAVE_STRING_PROFILING > 1
+ memo_t **pprev;
+ memo_t *next;
+#endif
+ char real_data[8]; // but it might be more or less
+ };
+
+ enum {
+ MEMO_SPACE = sizeof(memo_t) - 8
+ };
+
+ struct rep_t {
+ const char *data;
+ int length;
+ memo_t *memo;
+ };
+ /** @endcond never */
+
+ mutable rep_t _r; // mutable for c_str()
+
+#if HAVE_STRING_PROFILING
+ static uint64_t live_memo_count;
+ static uint64_t memo_sizes[55];
+ static uint64_t live_memo_sizes[55];
+ static uint64_t live_memo_bytes[55];
+# if HAVE_STRING_PROFILING > 1
+ static memo_t *live_memos[55];
+# endif
+
+ static inline int profile_memo_size_bucket(uint32_t dirty, uint32_t capacity) {
+ if (capacity <= 16)
+ return dirty;
+ else if (capacity <= 32)
+ return 17 + (capacity - 17) / 2;
+ else if (capacity <= 64)
+ return 25 + (capacity - 33) / 8;
+ else
+ return 29 + 26 - ffs_msb(capacity - 1);
+ }
+
+ static void profile_update_memo_dirty(memo_t *memo, uint32_t old_dirty, uint32_t new_dirty, uint32_t capacity) {
+ if (capacity <= 16 && new_dirty != old_dirty) {
+ ++memo_sizes[new_dirty];
+ ++live_memo_sizes[new_dirty];
+ live_memo_bytes[new_dirty] += capacity;
+ --live_memo_sizes[old_dirty];
+ live_memo_bytes[old_dirty] -= capacity;
+# if HAVE_STRING_PROFILING > 1
+ if ((*memo->pprev = memo->next))
+ memo->next->pprev = memo->pprev;
+ memo->pprev = &live_memos[new_dirty];
+ if ((memo->next = *memo->pprev))
+ memo->next->pprev = &memo->next;
+ *memo->pprev = memo;
+# else
+ (void) memo;
+# endif
+ }
+ }
+
+ static void one_profile_report(StringAccum &sa, int i, int examples);
+#endif
+
+ inline void assign_memo(const char *data, int length, memo_t *memo) const {
+ _r.data = data;
+ _r.length = length;
+ if ((_r.memo = memo))
+ ++memo->refcount;
+ }
+
+ inline String(const char *data, int length, memo_t *memo) {
+ assign_memo(data, length, memo);
+ }
+
+ inline void assign(const String &x) const {
+ assign_memo(x._r.data, x._r.length, x._r.memo);
+ }
+
+ inline void deref() const {
+ if (_r.memo && --_r.memo->refcount == 0)
+ delete_memo(_r.memo);
+ }
+
+ void assign(const char *cstr, int len, bool need_deref);
+#if HAVE_PERMSTRING
+ inline void assign(PermString x) const {
+ assign_memo(x.c_str(), x.length(), 0);
+ }
+#endif
+ void assign_out_of_memory();
+ void append(const char *s, int len, memo_t *memo);
+ static memo_t *create_memo(char *space, int dirty, int capacity);
+ static void delete_memo(memo_t *memo);
+
+ static const char null_data;
+ static const char oom_data;
+ static const char bool_data[11];
+ static const char int_data[20];
+ static const rep_t null_string_rep;
+ static const rep_t oom_string_rep;
+
+ static String make_claim(char *, int, int); // claim memory
+
+ friend struct rep_t;
+ friend class StringAccum;
+
+};
+
+
+/** @relates String
+ * @brief Compares two strings for equality.
+ *
+ * Returns true iff the two operands have the same lengths and the same
+ * characters in the same order. At most one of the operands can be a
+ * null-terminated C string.
+ * @sa String::compare
+ */
+inline bool operator==(const String &a, const String &b) {
+ return a.equals(b.data(), b.length());
+}
+
+/** @relates String */
+inline bool operator==(const char *a, const String &b) {
+ return b.equals(a, -1);
+}
+
+/** @relates String */
+inline bool operator==(const String &a, const char *b) {
+ return a.equals(b, -1);
+}
+
+/** @relates String
+ * @brief Compare two Strings for inequality.
+ *
+ * Returns true iff !(@a a == @a b). At most one of the operands can be a
+ * null-terminated C string. */
+inline bool operator!=(const String &a, const String &b) {
+ return !a.equals(b.data(), b.length());
+}
+
+/** @relates String */
+inline bool operator!=(const char *a, const String &b) {
+ return !b.equals(a, -1);
+}
+
+/** @relates String */
+inline bool operator!=(const String &a, const char *b) {
+ return !a.equals(b, -1);
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @< @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator<(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) < 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @<= @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator<=(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) <= 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @> @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator>(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) > 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @>= @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator>=(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) >= 0;
+}
+
+/** @relates String
+ * @brief Concatenate the operands and return the result.
+ *
+ * At most one of the two operands can be a null-terminated C string. */
+inline String operator+(String a, const String &b) {
+ a += b;
+ return a;
+}
+
+/** @relates String */
+inline String operator+(String a, const char *b) {
+ a.append(b);
+ return a;
+}
+
+/** @relates String */
+inline String operator+(const char *a, const String &b) {
+ String s1(a);
+ s1 += b;
+ return s1;
+}
+
+/** @relates String
+ * @brief Concatenate the operands and return the result.
+ *
+ * The second operand is a single character. */
+inline String operator+(String a, char b) {
+ a.append(&b, 1);
+ return a;
+}
+
+#if HAVE_PERMSTRING
+
+inline bool operator==(PermString a, const String &b) {
+ return b.equals(a.c_str(), a.length());
+}
+
+inline bool operator==(const String &a, PermString b) {
+ return a.equals(b.c_str(), b.length());
+}
+
+inline bool operator!=(PermString a, const String &b) {
+ return !b.equals(a.c_str(), a.length());
+}
+
+inline bool operator!=(const String &a, PermString b) {
+ return !a.equals(b.c_str(), b.length());
+}
+
+inline String operator+(String a, PermString b) {
+ a.append(b.c_str(), b.length());
+ return a;
+}
+
+inline String operator+(PermString a, String b) {
+ return String(a) + b;
+}
+
+inline String operator+(PermString a, const char *b) {
+ return String(a) + b;
+}
+
+inline String operator+(const char *a, PermString b) {
+ return String(a) + b;
+}
+
+inline String operator+(PermString a, PermString b) {
+ return String(a) + b;
+}
+
+#endif
+
+inline hashcode_t hashcode(const String &str) {
+ return str.hashcode();
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/strtonum.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/strtonum.h
new file mode 100644
index 00000000000..ee8745a4a42
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/transform.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/transform.hh
new file mode 100644
index 00000000000..496658a4911
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.cc
new file mode 100644
index 00000000000..8ad11c18810
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.cc
@@ -0,0 +1,202 @@
+#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
+ * Copyright (c) 1999-2012 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.
+ */
+
+/* #include <lcdf/vector.hh> */
+
+template <class T>
+Vector<T>::Vector(const Vector<T> &x)
+ : _l(0), _n(0), _capacity(0)
+{
+ *this = x;
+}
+
+template <class T>
+Vector<T>::~Vector()
+{
+ for (size_type 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 (size_type i = 0; i < _n; i++)
+ _l[i].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ if (_l && _n)
+ VALGRIND_MAKE_MEM_NOACCESS(_l, _n * sizeof(T));
+#endif
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ if (_l && _n)
+ VALGRIND_MAKE_MEM_UNDEFINED(_l, _n * sizeof(T));
+#endif
+ for (size_type i = 0; i < _n; i++)
+ new(velt(i)) T(o._l[i]);
+ }
+ }
+ return *this;
+}
+
+template <class T> Vector<T> &
+Vector<T>::assign(size_type n, const T &x)
+{
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ return assign(n, x_copy);
+ } else {
+ resize(0, x);
+ resize(n, x);
+ return *this;
+ }
+}
+
+template <class T> typename Vector<T>::iterator
+Vector<T>::insert(iterator it, const T &x)
+{
+ assert(it >= begin() && it <= end());
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ return insert(it, x_copy);
+ }
+ if (_n == _capacity) {
+ size_type pos = it - begin();
+ if (!reserve(RESERVE_GROW))
+ return end();
+ it = begin() + pos;
+ }
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(velt(_n), sizeof(T));
+#endif
+ for (iterator j = end(); j > it; ) {
+ --j;
+ new((void*) (j + 1)) T(*j);
+ j->~T();
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(j, sizeof(T));
+#endif
+ }
+ new((void*) it) T(x);
+ _n++;
+ return it;
+}
+
+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();
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(i, sizeof(T));
+#endif
+ new((void*) i) T(*j);
+ }
+ for (; i < end(); i++)
+ i->~T();
+ _n -= b - a;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(_l + _n, (b - a) * sizeof(T));
+#endif
+ return a;
+ } else
+ return b;
+}
+
+template <class T> bool
+Vector<T>::reserve_and_push_back(size_type want, const T *push_x)
+{
+ if (push_x && push_x >= begin() && push_x < end()) {
+ T x_copy(*push_x);
+ return reserve_and_push_back(want, &x_copy);
+ }
+
+ if (want < 0)
+ want = (_capacity > 0 ? _capacity * 2 : 4);
+
+ if (want > _capacity) {
+ T *new_l = (T *)new unsigned char[sizeof(T) * want];
+ if (!new_l)
+ return false;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(new_l + _n, (want - _n) * sizeof(T));
+#endif
+
+ for (size_type 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;
+ }
+
+ if (push_x)
+ push_back(*push_x);
+ return true;
+}
+
+template <class T> void
+Vector<T>::resize(size_type n, const T &x)
+{
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ resize(n, x_copy);
+ } else if (n <= _capacity || reserve(n)) {
+ for (size_type i = n; i < _n; i++)
+ _l[i].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ if (n < _n)
+ VALGRIND_MAKE_MEM_NOACCESS(_l + n, (_n - n) * sizeof(T));
+ if (_n < n)
+ VALGRIND_MAKE_MEM_UNDEFINED(_l + _n, (n - _n) * sizeof(T));
+#endif
+ for (size_type i = _n; i < n; i++)
+ new(velt(i)) T(x);
+ _n = n;
+ }
+}
+
+template <class T> void
+Vector<T>::swap(Vector<T> &x)
+{
+ T *l = _l;
+ _l = x._l;
+ x._l = l;
+
+ size_type n = _n;
+ _n = x._n;
+ x._n = n;
+
+ size_type cap = _capacity;
+ _capacity = x._capacity;
+ x._capacity = cap;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.hh
new file mode 100644
index 00000000000..86e64e238ba
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/include/lcdf/vector.hh
@@ -0,0 +1,324 @@
+#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
+#if HAVE_VALGRIND && HAVE_VALGRIND_MEMCHECK_H
+# include <valgrind/memcheck.h>
+#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 const T& const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = (size_type) -1 };
+
+ 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> &x);
+ ~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 n) { return reserve_and_push_back(n, 0); }
+
+ // element access
+ T &operator[](size_type i) {
+ assert((unsigned) i < (unsigned) _n);
+ return _l[i];
+ }
+ const T &operator[](size_type i) const {
+ assert((unsigned) i < (unsigned) _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& x);
+ inline void pop_back();
+ inline void push_front(const T& x);
+ inline void pop_front();
+ iterator insert(iterator it, const T& x);
+ inline iterator erase(iterator it);
+ iterator erase(iterator a, iterator b);
+ void swap(Vector<T>& x);
+ 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]; }
+ bool reserve_and_push_back(size_type n, const T *x);
+
+};
+
+template <class T> inline void
+Vector<T>::push_back(const T& x)
+{
+ if (_n < _capacity) {
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(velt(_n), sizeof(T));
+#endif
+ new(velt(_n)) T(x);
+ ++_n;
+ } else
+ reserve_and_push_back(RESERVE_GROW, &x);
+}
+
+template <class T> inline void
+Vector<T>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+ _l[_n].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(&_l[_n], sizeof(T));
+#endif
+}
+
+template <class T> inline typename Vector<T>::iterator
+Vector<T>::erase(iterator it)
+{
+ return (it < end() ? erase(it, it + 1) : it);
+}
+
+template <class T> inline void
+Vector<T>::push_front(const T& x)
+{
+ insert(begin(), x);
+}
+
+template <class T> inline void
+Vector<T>::pop_front()
+{
+ erase(begin());
+}
+
+
+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 void* const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = (size_type) -1 };
+
+ 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* x = 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 n, void* x = 0);
+ size_type capacity() const { return _capacity; }
+ bool empty() const { return _n == 0; }
+ bool reserve(size_type n);
+
+ // 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* x);
+ inline void pop_back();
+ inline void push_front(void* x);
+ inline void pop_front();
+ iterator insert(iterator it, void* x);
+ inline iterator erase(iterator it);
+ iterator erase(iterator a, iterator b);
+ void swap(Vector<void*> &x);
+ void clear() { _n = 0; }
+
+ private:
+
+ void **_l;
+ size_type _n;
+ size_type _capacity;
+
+};
+
+inline void
+Vector<void*>::push_back(void* x)
+{
+ if (_n < _capacity || reserve(RESERVE_GROW)) {
+ _l[_n] = x;
+ _n++;
+ }
+}
+
+inline void
+Vector<void*>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(&_l[_n], sizeof(void *));
+#endif
+}
+
+inline Vector<void*>::iterator
+Vector<void*>::erase(Vector<void*>::iterator it)
+{
+ return (it < end() ? erase(it, it + 1) : it);
+}
+
+inline void
+Vector<void*>::push_front(void* x)
+{
+ insert(begin(), x);
+}
+
+inline void
+Vector<void*>::pop_front()
+{
+ erase(begin());
+}
+
+
+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 T* const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = Base::RESERVE_GROW };
+
+ typedef T** iterator;
+ typedef T* const* const_iterator;
+
+ explicit Vector() : Base() { }
+ explicit Vector(size_type n, T* x) : Base(n, (void *)x) { }
+ Vector(const Vector<T*>& x) : Base(x) { }
+ ~Vector() { }
+
+ Vector<T*>& operator=(const Vector<T*>& x)
+ { Base::operator=(x); return *this; }
+ Vector<T*>& assign(size_type n, T* x = 0)
+ { Base::assign(n, (void*)x); 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* x = 0) { Base::resize(n, (void*)x); }
+ 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* x) { Base::push_back((void*)x); }
+ void pop_back() { Base::pop_back(); }
+ void push_front(T* x) { Base::push_front((void*)x); }
+ void pop_front() { Base::pop_front(); }
+ iterator insert(iterator it, T* x) { return (iterator)Base::insert((void**)it, (void*)x); }
+ iterator erase(iterator it) { return (iterator)Base::erase((void**)it); }
+ iterator erase(iterator a, iterator b) { return (iterator)Base::erase((void**)a, (void**)b); }
+ void swap(Vector<T*>& x) { Base::swap(x); }
+ void clear() { Base::clear(); }
+
+};
+
+#include <lcdf/vector.cc>
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/lcdf-typetools.spec b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/lcdf-typetools.spec
new file mode 100644
index 00000000000..f8f235104f1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/lcdf-typetools.spec
@@ -0,0 +1,99 @@
+Summary: Programs to manipulate OpenType and multiple-master fonts
+Name: lcdf-typetools
+Version: 2.98
+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 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)
+
+ t1reencode reencodes a Type 1 font, replacing its internal encoding with
+ one you specify
+
+ t1testpage creates a PostScript test page for a specified
+ font file (preliminary)
+
+ ttftotype42 creates a Type 42 wrapper for a TrueType or TrueType-flavored
+ OpenType font.
+
+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}/t1reencode
+%{_bindir}/t1testpage
+%{_bindir}/ttftotype42
+%{_mandir}/man*/*
+%{_datadir}/lcdf-typetools/*
+
+%changelog
+
+* Fri Aug 3 2007 Eddie Kohler <kohler@cs.ucla.edu>
+- Updates.
+
+* Wed Sep 8 2004 Claire Connelly <cmc@math.hmc.edu> - 2.12-hmcmath.1
+- Initial packaging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.am
new file mode 100644
index 00000000000..eb09a9686ad
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.am
@@ -0,0 +1,43 @@
+## 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 \
+ otfpost.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 \
+ ttfcs.cc \
+ ttfhead.cc \
+ ttfkern.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+INCLUDES = -I$(srcdir)/../include
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.in
new file mode 100644
index 00000000000..613540197f9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/Makefile.in
@@ -0,0 +1,649 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = lcdf-typetools-2.98/libefont
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+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) otfpost.$(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) ttfcs.$(OBJEXT) \
+ ttfhead.$(OBJEXT) ttfkern.$(OBJEXT)
+libefont_a_OBJECTS = $(am_libefont_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libefont_a_SOURCES)
+DIST_SOURCES = $(libefont_a_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+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 \
+ otfpost.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 \
+ ttfcs.cc \
+ ttfhead.cc \
+ ttfkern.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+INCLUDES = -I$(srcdir)/../include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/libefont/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libefont.a: $(libefont_a_OBJECTS) $(libefont_a_DEPENDENCIES) $(EXTRA_libefont_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libefont.a
+ $(AM_V_AR)$(libefont_a_AR) libefont.a $(libefont_a_OBJECTS) $(libefont_a_LIBADD)
+ $(AM_V_at)$(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)/otfpost.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@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfcs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfhead.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfkern.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afm.cc
new file mode 100644
index 00000000000..9705f91c97f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afm.cc
@@ -0,0 +1,586 @@
+// -*- related-file-name: "../include/efont/afm.hh" -*-
+
+/* afm.{cc,hh} -- Adobe Font Metrics files
+ *
+ * Copyright (c) 1998-2012 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->vxmessage(_l.landmark(), ErrorHandler::e_warning, format, val);
+ va_end(val);
+}
+
+void
+AfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->vxmessage(_l.landmark(), ErrorHandler::e_error, 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 %+s", (PermString *) 0))
+ break;
+ if (l.isall("CharWidth %g %g", (double *)0, (double *)0))
+ break;
+ if (l.isall("Comment %+s", (PermString *) 0))
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmparse.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmparse.cc
new file mode 100644
index 00000000000..313b63ec362
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmparse.cc
@@ -0,0 +1,365 @@
+// -*- related-file-name: "../include/efont/afmparse.hh" -*-
+
+/* afmparse.{cc,hh} -- Adobe Font Metrics parsing
+ *
+ * Copyright (c) 1998-2012 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>
+#if HAVE_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': {
+ union { unsigned char *uc; char *c; } new_str;
+ int v = strtol((char *)str, &new_str.c, 10);
+ if (new_str.uc == str) FAIL("should be an integer");
+
+ str = new_str.uc;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'x': {
+ union { unsigned char *uc; char *c; } new_str;
+ int v = strtol((char *)str, &new_str.c, 16);
+ if (new_str.uc == str) FAIL("should be a hex integer");
+
+ str = new_str.uc;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'e':
+ case 'f':
+ case 'g': {
+ union { unsigned char *uc; char *c; } new_str;
+ double v = strtonumber((char *)str, &new_str.c);
+ if (v < MIN_KNOWN_DOUBLE) v = MIN_KNOWN_DOUBLE;
+ if (new_str.uc == str) FAIL("should be a real number");
+
+ str = new_str.uc;
+ 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::make_uninitialized(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((unsigned char) *f))
+ f++;
+ const char *l = f;
+ while (isalnum((unsigned char) *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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmw.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmw.cc
new file mode 100644
index 00000000000..20840be1332
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/afmw.cc
@@ -0,0 +1,190 @@
+// -*- related-file-name: "../include/efont/afmw.hh" -*-
+
+/* afmw.{cc,hh} -- Adobe Font Metrics writing
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/amfm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/amfm.cc
new file mode 100644
index 00000000000..b38532d55fb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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->vxmessage(_l.landmark(), ErrorHandler::e_warning, format, val);
+ va_end(val);
+}
+
+void
+AmfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->vxmessage(_l.landmark(), ErrorHandler::e_error, 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/cff.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/cff.cc
new file mode 100644
index 00000000000..822d57ec94d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/cff.cc
@@ -0,0 +1,1689 @@
+// -*- related-file-name: "../include/efont/cff.hh" -*-
+
+/* cff.{cc,hh} -- Compact Font Format fonts
+ *
+ * Copyright (c) 1998-2012 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;
+ static Cff::Font *cfffont;
+ if (!cfffont) {
+ cff = new Cff(String::make_stable((const char *) default_dict_cff_data, sizeof(default_dict_cff_data)), ErrorHandler::default_handler());
+ cfffont = (Cff::Font *) cff->font();
+ }
+ return cfffont->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 == 0)
+ return errh->error("not a PostScript-flavored OpenType font"), -EFAULT;
+ if (_len < HEADER_SIZE)
+ return errh->error("CFF file too small for header (have %d, want %d)", _len, HEADER_SIZE), -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((unsigned char) 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/encoding.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/encoding.cc
new file mode 100644
index 00000000000..a55ecc4db25
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/encoding.cc
@@ -0,0 +1,29 @@
+// -*- related-file-name: "../include/efont/encoding.hh" -*-
+
+/* encoding.{cc,hh} -- 8-bit encodings
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/findmet.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/findmet.cc
new file mode 100644
index 00000000000..aa5b8167156
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/findmet.cc
@@ -0,0 +1,321 @@
+// -*- related-file-name: "../include/efont/findmet.hh" -*-
+
+/* findmet.{cc,hh} -- find font metrics
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/metrics.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/metrics.cc
new file mode 100644
index 00000000000..0dd308056e2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/metrics.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/efont/metrics.hh" -*-
+
+/* metrics.{cc,hh} -- generic font metrics
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otf.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otf.cc
new file mode 100644
index 00000000000..187dd10dd92
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otf.cc
@@ -0,0 +1,1490 @@
+// -*- related-file-name: "../include/efont/otf.hh" -*-
+
+/* otf.{cc,hh} -- OpenType font basics
+ *
+ * Copyright (c) 2002-2012 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()
+#include <efont/otfname.hh>
+
+#ifndef static_assert
+#define static_assert(c) switch (c) case 0: case (c):
+#endif
+
+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 = Data::u16_aligned(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 = Data::u32_aligned(data + loc);
+ uint32_t offset = Data::u32_aligned(data + loc + 8);
+ uint32_t length = Data::u32_aligned(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;
+}
+
+bool
+Font::check_checksums(ErrorHandler *errh) const
+{
+ if (error() < 0)
+ return false;
+ int nt = ntables();
+ bool ok = true;
+ for (int i = 0; i < nt; i++) {
+ const uint8_t *entry = data() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ String tbl = _str.substring(Data::u32_aligned(entry + 8),
+ Data::u32_aligned(entry + 12));
+ uint32_t sum = checksum(tbl);
+ if (Data::u32_aligned(entry) == 0x68656164 // 'head'
+ && tbl.length() >= 12)
+ sum -= Data::u32_aligned(tbl.udata() + 8);
+ if (sum != Data::u32_aligned(entry + 4)) {
+ if (errh)
+ errh->error("table %<%s%> checksum error: %x vs. %x", Tag(Data::u32_aligned(entry)).text().c_str(), sum, Data::u32_aligned(entry + 4));
+ ok = false;
+ }
+ }
+ return ok;
+}
+
+int
+Font::ntables() const
+{
+ if (error() < 0)
+ return 0;
+ else
+ return Data::u16_aligned(data() + 4);
+}
+
+String
+Font::table(Tag tag) const
+{
+ if (error() < 0)
+ return String();
+ const uint8_t *entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ if (entry)
+ return _str.substring(Data::u32_aligned(entry + 8), Data::u32_aligned(entry + 12));
+ else
+ return String();
+}
+
+bool
+Font::has_table(Tag tag) const
+{
+ const uint8_t *entry = 0;
+ if (error() >= 0)
+ entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ return entry != 0;
+}
+
+uint32_t
+Font::table_checksum(Tag tag) const
+{
+ if (error() < 0)
+ return 0;
+ const uint8_t *entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ if (entry)
+ return Data::u32_aligned(entry + 4);
+ else
+ return 0;
+}
+
+Tag
+Font::table_tag(int i) const
+{
+ if (error() < 0 || i < 0 || i >= ntables())
+ return Tag();
+ else
+ return Tag(Data::u32_aligned(data() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i));
+}
+
+uint32_t
+Font::checksum(const uint8_t *begin, const uint8_t *end)
+{
+ uint32_t sum = 0;
+ if (reinterpret_cast<uintptr_t>(begin) % 4)
+ for (; begin + 3 < end; begin += 4)
+ sum += Data::u32(begin);
+ else
+ for (; begin + 3 < end; begin += 4)
+ sum += Data::u32_aligned(begin);
+ uint32_t leftover = 0;
+ for (int i = 0; i < 4; i++)
+ leftover = (leftover << 8) + (begin < end ? *begin++ : 0);
+ return sum + leftover;
+}
+
+uint32_t
+Font::checksum(const String &s)
+{
+ return checksum(reinterpret_cast<const uint8_t *>(s.begin()), reinterpret_cast<const uint8_t *>(s.end()));
+}
+
+namespace {
+class TagCompar { public:
+ TagCompar(const Vector<Tag> &tags) : _tags(tags) { }
+ bool operator()(int a, int b) { return _tags[a] < _tags[b]; }
+ const Vector<Tag> &_tags;
+};
+}
+
+Font
+Font::make(bool truetype, const Vector<Tag>& tags, const Vector<String>& data)
+{
+ StringAccum sa;
+
+ // create offset table
+ {
+ union {
+ uint8_t c[HEADER_SIZE];
+ uint16_t s[HEADER_SIZE / 2];
+ uint32_t l[HEADER_SIZE / 4];
+ } hdr;
+ hdr.l[0] = (truetype ? htonl(0x00010000) : htonl(0x4F54544F));
+ hdr.s[2] = htons(tags.size());
+ int entrySelector;
+ for (entrySelector = 0; (2 << entrySelector) <= tags.size(); entrySelector++)
+ /* nada */;
+ hdr.s[3] = htons((1 << entrySelector) * 16);
+ hdr.s[4] = htons(entrySelector);
+ hdr.s[5] = htons((tags.size() - (1 << entrySelector)) * 16);
+ sa.append(&hdr.c[0], HEADER_SIZE);
+ }
+
+ // sort tags
+ Vector<int> permut;
+ for (int i = 0; i < tags.size(); i++)
+ permut.push_back(i);
+ std::sort(permut.begin(), permut.end(), TagCompar(tags));
+
+ // table listing
+ uint32_t offset = HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * tags.size();
+ for (int *tp = permut.begin(); tp < permut.end(); tp++) {
+ union {
+ uint8_t c[TABLE_DIR_ENTRY_SIZE];
+ uint32_t l[TABLE_DIR_ENTRY_SIZE / 4];
+ } tdir;
+ tdir.l[0] = htonl(tags[*tp].value());
+
+ // discount current checksum adjustment in head table
+ uint32_t sum = checksum(data[*tp]);
+ if (tags[*tp] == Tag("head") && data[*tp].length() >= 12)
+ sum -= Data::u32(data[*tp].udata() + 8);
+ tdir.l[1] = htonl(sum);
+
+ tdir.l[2] = htonl(offset);
+ tdir.l[3] = htonl(data[*tp].length());
+ sa.append(&tdir.c[0], TABLE_DIR_ENTRY_SIZE);
+ offset += (data[*tp].length() + 3) & ~3;
+ }
+
+ // actual tables
+ for (int *tp = permut.begin(); tp < permut.end(); tp++) {
+ sa << data[*tp];
+ while (sa.length() % 4)
+ sa << '\0';
+ }
+
+ // fix 'head' table
+ for (int i = 0; i < tags.size(); i++) {
+ unsigned char *thdr = sa.udata() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ if (Data::u32(thdr) == 0x68656164 && Data::u32(thdr + 12) >= 12) {
+ uint32_t offset = Data::u32(thdr + 8);
+ char *head = sa.data() + offset;
+ memset(head + 8, '\0', 4);
+ uint32_t allsum = checksum(reinterpret_cast<uint8_t *>(sa.data()), reinterpret_cast<uint8_t *>(sa.data() + sa.length()));
+ uint32_t *adj = reinterpret_cast<uint32_t *>(head + 8);
+ *adj = htonl(0xB1B0AFBA - allsum);
+ }
+ }
+
+ return Font(sa.take_string());
+}
+
+
+/**************************
+ * 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, r = n;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *entry = table + m * entry_size;
+ uint32_t m_tag = Data::u32_aligned16(entry);
+ if (_tag < m_tag)
+ r = m;
+ 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 = Data::u16_aligned(_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, Data::u16_aligned(data), SCRIPT_RECSIZE))
+ return Data::u16_aligned(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 = Data::u16_aligned(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 = Data::u16_aligned(data + script_off + 2);
+ if (const uint8_t *entry = langsys.table_entry(data + script_off + SCRIPT_HEADERSIZE, langSysCount, LANGSYS_RECSIZE))
+ return script_off + Data::u16_aligned(entry + 4);
+
+ // return default
+ int defaultLangSys = Data::u16_aligned(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 = Data::u16_aligned(data);
+ for (int i = 0; i < nscripts; i++) {
+ Tag script_tag(Data::u32_aligned16(data + SCRIPTLIST_HEADERSIZE + i*SCRIPT_RECSIZE));
+ int script_off = Data::u16_aligned(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 (Data::u16_aligned(script_table) != 0) // default LangSys
+ script.push_back(script_tag), langsys.push_back(Tag());
+ int nlangsys = Data::u16_aligned(script_table + 2);
+ for (int j = 0; j < nlangsys; j++) {
+ Tag langsys_tag(Data::u32_aligned16(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 = Data::u16_aligned(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 = Data::u16_aligned(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(Data::u16_aligned(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 = Data::u16_aligned(_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 = Data::u16_aligned(data);
+ if (fid >= 0 && fid < nfeatures)
+ return Tag(Data::u32_aligned16(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 = Data::u16_aligned(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID '%d' out of range", fid), String();
+ int foff = Data::u16_aligned(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 = Data::u16_aligned(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);
+}
+
+String
+FeatureList::size_params(int fid, const Name &name, ErrorHandler *errh) const
+{
+ // implement 'size' checks from Read Roberts
+ for (int i = 0; i < 2; i++) {
+ String s = params(fid, 10, errh, i != 0);
+ const uint8_t *data = s.udata();
+ // errh->message("trying %d %d %d %d %d\n", Data::u16_aligned(data), Data::u16_aligned(data + 2), Data::u16_aligned(data + 4), Data::u16_aligned(data + 6), Data::u16_aligned(data + 8));
+ if (Data::u16_aligned(data) == 0) // design size == 0
+ continue;
+ if (Data::u16_aligned(data + 2) == 0 // subfamily ID == 0
+ && Data::u16_aligned(data + 6) == 0 // range start == 0
+ && Data::u16_aligned(data + 8) == 0 // range end == 0
+ && Data::u16_aligned(data + 4) == 0) // menu name ID == 0
+ return s;
+ if (Data::u16_aligned(data + 6) >= Data::u16_aligned(data + 8) // range start >= range end
+ || Data::u16_aligned(data + 4) < 256 // menu name ID < 256
+ || Data::u16_aligned(data + 4) > 32767 // menu name ID > 32767
+ || !name.english_name(Data::u16_aligned(data + 4))) // menu name ID is a name ID defined by the font
+ continue;
+ if (Data::u16_aligned(data) + 1 >= Data::u16_aligned(data + 6) // design size >= range start (with 1 dp grace)
+ && Data::u16_aligned(data) <= Data::u16_aligned(data + 8) + 1) // design size <= range end (with 1 dp grace)
+ return s;
+ else if (i == 1 // old-style feature
+ && Data::u16_aligned(data + 8) <= 1440 // range end <= 144 point
+ && Data::u16_aligned(data) <= 1440) { // design size <= 144 point
+ // some old fonts define a bogus feature with design size
+ // not in range (John Owens, Read Roberts)
+ if (errh)
+ errh->warning("invalid 'size' feature: design size not in range");
+ return s;
+ }
+ }
+ if (errh)
+ errh->error("no valid 'size' feature data in the 'size' feature");
+ return String();
+}
+
+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 = Data::u16_aligned(data);
+ for (const int *fidp = fids.begin(); fidp != fids.end(); fidp++)
+ if (*fidp >= 0 && *fidp < nfeatures) {
+ uint32_t ftag = Data::u32_aligned16(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 = Data::u16_aligned(data);
+ while (i < fids.size() && j < sorted_ftags.size() && fids[i] < nfeatures) {
+ uint32_t ftag = Data::u32_aligned16(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 = Data::u16_aligned(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID '%d' out of range", fid);
+ int foff = Data::u16_aligned(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE + 4);
+ int lookupCount;
+ if (len < foff + FEATURE_HEADERSIZE
+ || (lookupCount = Data::u16_aligned(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(Data::u16_aligned(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 Vector<bool> &gmap) throw ()
+{
+ int end = gmap.size();
+ while (end > 0 && !gmap[end - 1])
+ --end;
+ if (end > 0) {
+ _str = String::make_uninitialized(8 + end);
+ _str.align(4);
+ uint8_t *data = _str.mutable_udata();
+ memset(data, 0, 8 + end);
+ data[1] = 3;
+
+ uint32_t n = 0;
+ const bool *it = gmap.begin();
+ data += 8;
+ for (int i = 0; i < end; ++i, ++it, ++data)
+ if (*it) {
+ *data = 1;
+ ++n;
+ }
+
+ n = htonl(n);
+ memcpy(_str.mutable_udata() + 4, &n, 4);
+ }
+}
+
+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 = Data::u16_aligned(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 = Data::u16_aligned(data);
+ int count = Data::u16_aligned(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 Data::u16_aligned(data + 4) + Data::u16_aligned(data + 2) - Data::u16_aligned(data) + 1;
+ } else if (data[1] == T_X_BYTEMAP)
+ return Data::u32_aligned(data + 4);
+ 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 = Data::u16_aligned(data + 2);
+ if (data[1] == T_LIST) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ int mval = Data::u16_aligned(data + m * LIST_RECSIZE);
+ if (g < mval)
+ r = m;
+ else if (g == mval)
+ return m;
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else if (data[1] == T_RANGES) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < Data::u16_aligned(rec))
+ r = m;
+ else if (g <= Data::u16_aligned(rec + 2))
+ return Data::u16_aligned(rec + 4) + g - Data::u16_aligned(rec);
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else if (data[1] == T_X_BYTEMAP) {
+ if (g >= 0 && g < _str.length() - 8 && data[8 + g])
+ return g;
+ else
+ 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 = Data::u16_aligned(data + 2);
+ if (data[1] == T_LIST)
+ return (cindex < count ? Data::u16_aligned(data + cindex * LIST_RECSIZE) : 0);
+ else if (data[1] == T_RANGES) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ int start_cindex = Data::u16_aligned(rec + 4);
+ if (cindex < start_cindex)
+ r = m;
+ else if (cindex < start_cindex + Data::u16_aligned(rec + 2) - Data::u16_aligned(rec))
+ return Data::u16_aligned(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 = Data::u16_aligned(data + 2);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << Data::u16_aligned(data + HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = Data::u16_aligned(data + pos);
+ Glyph end = Data::u16_aligned(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';
+
+ if (b.has_fast_covers()) {
+ for (Coverage::iterator ai = a.begin(); ai; ++ai)
+ if (b.covers(*ai)) {
+ uint16_t x = *ai;
+ sa << (char)(x >> 8) << (char)(x & 0xFF);
+ }
+
+ } else {
+ 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, bool is_end)
+ : _str(str), _value(0)
+{
+ // XXX assume _str has been checked
+ if (!_str.length()) {
+ _pos = 0;
+ return;
+ }
+
+ // shrink _str to fit the coverage table
+ const uint8_t *data = _str.udata();
+ int n = Data::u16_aligned(data + 2);
+ switch (Data::u16_aligned(data)) {
+ case T_LIST:
+ _str = _str.substring(0, HEADERSIZE + n*LIST_RECSIZE);
+ normal_pos_setting:
+ _pos = is_end ? _str.length() : HEADERSIZE;
+ _value = _pos >= _str.length() ? 0 : Data::u16_aligned(data + _pos);
+ break;
+ case T_RANGES:
+ _str = _str.substring(0, HEADERSIZE + n*RANGES_RECSIZE);
+ goto normal_pos_setting;
+ case T_X_BYTEMAP:
+ for (_pos = 8; _pos < _str.length() && !data[_pos]; ++_pos)
+ /* do nothing */;
+ _value = _pos >= _str.length() ? 0 : _pos - 8;
+ break;
+ default:
+ _str = String();
+ _pos = 0;
+ _value = 0;
+ break;
+ }
+}
+
+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 if (data[1] == T_RANGES)
+ return Data::u16_aligned(data + _pos + 4) + _value - Data::u16_aligned(data + _pos);
+ else
+ return _pos - 8;
+}
+
+void
+Coverage::iterator::operator++(int)
+{
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ if (_pos >= len
+ || (data[1] == T_RANGES && ++_value <= Data::u16_aligned(data + _pos + 2)))
+ return;
+ switch (data[1]) {
+ case T_LIST:
+ _pos += LIST_RECSIZE;
+ normal_pos_setting:
+ _value = _pos >= len ? 0 : Data::u16_aligned(data + _pos);
+ break;
+ case T_RANGES:
+ _pos += RANGES_RECSIZE;
+ goto normal_pos_setting;
+ case T_X_BYTEMAP:
+ for (++_pos; _pos < len && !data[_pos]; ++_pos)
+ /* do nothing */;
+ _value = _pos >= len ? 0 : _pos - 8;
+ break;
+ }
+}
+
+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 <= Data::u16_aligned(data + _pos)) {
+ _value = Data::u16_aligned(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;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ Glyph g = Data::u16_aligned(data + m * LIST_RECSIZE);
+ if (find < g)
+ r = m;
+ else if (find == g)
+ l = r = m;
+ else
+ l = m + 1;
+ }
+ _pos = HEADERSIZE + l * LIST_RECSIZE;
+ _value = (_pos >= _str.length() ? 0 : Data::u16_aligned(data - HEADERSIZE + _pos));
+
+ } else if (data[1] == T_RANGES) {
+ // check for "common" case: this or next element
+ if (find <= Data::u16_aligned(data + _pos + 2)) {
+ assert(find >= Data::u16_aligned(data + _pos));
+ _value = find;
+ return true;
+ }
+ _pos += RANGES_RECSIZE;
+ if (_pos >= _str.length())
+ return false;
+ else if (find <= Data::u16_aligned(data + _pos + 2)) {
+ _value = (find >= Data::u16_aligned(data + _pos) ? find : Data::u16_aligned(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;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ if (find < Data::u16_aligned(data + m * RANGES_RECSIZE))
+ r = m;
+ else if (find <= Data::u16_aligned(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 : Data::u16_aligned(data - HEADERSIZE + _pos));
+
+ } else if (data[1] == T_X_BYTEMAP) {
+ _pos = 8 + find;
+ while (_pos < _str.length() && !data[_pos])
+ ++_pos;
+ _pos = _pos >= _str.length() ? _str.length() : _pos;
+ _value = _pos >= _str.length() ? 0 : _pos - 8;
+ }
+
+ 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 = Data::u16_aligned(data);
+
+ int len;
+ if (classFormat == T_LIST) {
+ int count = Data::u16_aligned(data + 4);
+ len = LIST_HEADERSIZE + count*LIST_RECSIZE;
+ // XXX don't check sorting
+ } else if (classFormat == T_RANGES) {
+ int count = Data::u16_aligned(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 = Data::u16_aligned(data);
+
+ if (coverageFormat == T_LIST) {
+ Glyph start = Data::u16_aligned(data + 2);
+ int count = Data::u16_aligned(data + 4);
+ if (g < start || g >= start + count)
+ return 0;
+ else
+ return Data::u16_aligned(data + LIST_HEADERSIZE + (g - start) * LIST_RECSIZE);
+ } else if (coverageFormat == T_RANGES) {
+ int l = 0, r = Data::u16_aligned(data + 2);
+ data += RANGES_HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < Data::u16_aligned(rec))
+ r = m;
+ else if (g <= Data::u16_aligned(rec + 2))
+ return Data::u16_aligned(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 = Data::u16_aligned(data + 2);
+ int count = Data::u16_aligned(data + 4);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << start + i << '=' << Data::u16_aligned(data + LIST_HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = RANGES_HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = Data::u16_aligned(data + pos);
+ Glyph end = Data::u16_aligned(data + pos + 2);
+ if (pos > RANGES_HEADERSIZE) sa << ',';
+ sa << start;
+ if (end != start) sa << '.' << '.' << end;
+ sa << '=' << Data::u16_aligned(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 (Data::u16_aligned(data)) {
+ case T_LIST: {
+ Glyph start = Data::u16_aligned(data + 2);
+ int nglyphs = Data::u16_aligned(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 = Data::u16_aligned(data + RANGES_HEADERSIZE);
+ int nranges = Data::u16_aligned(data + 2);
+ _str = _str.substring(0, RANGES_HEADERSIZE + nranges*RANGES_RECSIZE);
+ if (!_coviter) {
+ Glyph end = Data::u16_aligned(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 < Data::u16_aligned(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 - Data::u16_aligned(data + 2));
+ if (_pos >= len)
+ break;
+ else if (Data::u16_aligned(data + _pos) == 0) // _class == 0
+ return;
+ _coviter++;
+ } else {
+ if (g < Data::u16_aligned(data + _pos)) // in a zero range
+ return;
+ else if (g > Data::u16_aligned(data + _pos + 2))
+ _pos += RANGES_RECSIZE;
+ else if (Data::u16_aligned(data + _pos + 4) == 0) // _class == 0
+ return;
+ else
+ _coviter.forward_to(Data::u16_aligned(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 - Data::u16_aligned(data + 2));
+ if (_pos >= len || Data::u16_aligned(data + _pos) == _class)
+ return;
+ _coviter++;
+ } else {
+ while (_pos < len && (g > Data::u16_aligned(data + _pos + 2)
+ || Data::u16_aligned(data + _pos + 4) != _class))
+ _pos += RANGES_RECSIZE;
+ // now, _pos >= len, or g <= rec.end && class == rec.class
+ if (_pos >= len || g >= Data::u16_aligned(data + _pos))
+ return;
+ _coviter.forward_to(Data::u16_aligned(data + _pos));
+ }
+ }
+
+ _pos = len;
+}
+
+
+}}
+
+
+// template instantiations
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfcmap.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfcmap.cc
new file mode 100644
index 00000000000..d7a74c85968
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfcmap.cc
@@ -0,0 +1,480 @@
+// -*- related-file-name: "../include/efont/otfcmap.hh" -*-
+
+/* otfcmap.{cc,hh} -- OpenType cmap table
+ *
+ * Copyright (c) 2002-2012 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) (Data::u16_aligned(d))
+#define SHORT_AT(d) (Data::s16_aligned(d))
+#define ULONG_AT(d) (Data::u32_aligned(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_language = -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 + 8 > (uint32_t) len) {
+ length_error:
+ return errh->error("encoding data for entry %d out of range", i);
+ }
+ int format = USHORT_AT(data + offset);
+ int language;
+ if (format == F_BYTE || format == F_HIBYTE || format == F_SEGMENTED
+ || format == F_TRIMMED) {
+ if (USHORT_AT(data + offset + 2) < 6)
+ goto length_error;
+ language = USHORT_AT(data + offset + 4);
+ } else if (format == F_HIBYTE32 || format == F_TRIMMED32
+ || format == F_SEGMENTED32) {
+ if (offset + 12 > (uint32_t) len || ULONG_AT(data + offset + 4) < 12)
+ goto length_error;
+ language = ULONG_AT(data + offset + 8);
+ } else
+ continue;
+ if (!(platform > last_platform
+ || (platform == last_platform
+ && (encoding > last_encoding
+ || (encoding == last_encoding
+ && language > last_language)))))
+ 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_language = language;
+ }
+
+ _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 (t == USE_FIRST_UNICODE_TABLE && _first_unicode_table == -1) {
+ errh->warning("font appears not to support Unicode");
+ _first_unicode_table = 0;
+ }
+ if (t == USE_FIRST_UNICODE_TABLE)
+ t = _first_unicode_table;
+ 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 t;
+}
+
+Glyph
+Cmap::map_table(int t, uint32_t uni, ErrorHandler *errh) const
+{
+ if ((t = 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;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ uint32_t endCount = USHORT_AT(endCounts + (m << 1));
+ uint32_t startCount = USHORT_AT(startCounts + (m << 1));
+ if (uni < startCount)
+ r = m;
+ 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;
+ const uint8_t *groups = data + 16;
+ while (l < r) {
+ uint32_t m = l + (r - l) / 2;
+ uint32_t startCharCode = ULONG_AT(groups + m * 12);
+ uint32_t endCharCode = ULONG_AT(groups + m * 12 + 4);
+ if (uni < startCharCode)
+ r = m;
+ 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> &g2c, ErrorHandler *errh) const
+{
+ if ((t = 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:
+ g2c.resize(256, 0);
+ for (int c = 0; c < 256; c++)
+ if (int g = data[6 + c])
+ if (!g2c[g])
+ g2c[g] = c;
+ 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))) {
+ g = (idDelta + g) & 65535;
+ if (g >= g2c.size())
+ g2c.resize(g + 1, 0);
+ if (!g2c[g])
+ g2c[g] = (hi_byte << 8) + firstCode + i;
+ }
+ }
+ 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++) {
+ Glyph g = (c + idDelta) & 65535;
+ if (g >= g2c.size())
+ g2c.resize(g + 1, 0);
+ if (!g2c[g])
+ g2c[g] = c;
+ }
+ } else {
+ const uint8_t *gdata = idRangeOffsets + i + idRangeOffset;
+ for (int c = startCount; c <= endCount; c++, gdata += 2)
+ if (int g = USHORT_AT(gdata)) {
+ g = (g + idDelta) & 65535;
+ if (g >= g2c.size())
+ g2c.resize(g + 1, 0);
+ if (!g2c[g])
+ g2c[g] = c;
+ }
+ }
+ }
+ 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))) {
+ if (g >= g2c.size())
+ g2c.resize(g + 1, 0);
+ if (!g2c[g])
+ g2c[g] = firstCode + i;
+ }
+ 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);
+ if (startGlyphID + nCharCodes >= (uint32_t) g2c.size())
+ g2c.resize(startGlyphID + nCharCodes + 1, 0);
+ for (uint32_t i = 0; i <= nCharCodes; i++)
+ if (!g2c[startGlyphID + i])
+ g2c[startGlyphID + i] = startCharCode + i;
+ }
+ break;
+ }
+
+ default:
+ break;
+
+ }
+}
+
+int
+Cmap::map_uni(const Vector<uint32_t> &vin, Vector<Glyph> &vout) const
+{
+ int t;
+ if ((t = check_table(USE_FIRST_UNICODE_TABLE)) < 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdata.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdata.cc
new file mode 100644
index 00000000000..46c7c885c59
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdescrip.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdescrip.cc
new file mode 100644
index 00000000000..307f0b3cb61
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfdescrip.cc
@@ -0,0 +1,717 @@
+/* otfdescrip.cc -- descriptions for OpenType tags
+ *
+ * Copyright (c) 2002-2012 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("armi"), "Imperial Aramaic" },
+ { T("armn"), "Armenian" },
+ { T("avst"), "Avestan" },
+ { T("bali"), "Balinese" },
+ { T("bamu"), "Bamum" },
+ { T("batk"), "Batak" },
+ { T("beng"), "Bengali" },
+ { T("bng2"), "Bengali v.2" },
+ { T("bopo"), "Bopomofo" },
+ { T("brah"), "Brahmi" },
+ { T("brai"), "Braille" },
+ { T("bugi"), "Buginese" },
+ { T("buhd"), "Buhid" },
+ { T("byzm"), "Byzantine Music" },
+ { T("cakm"), "Chakma" },
+ { T("cans"), "Canadian Syllabics" },
+ { T("cari"), "Carian" },
+ { T("cham"), "Cham" },
+ { T("cher"), "Cherokee" },
+ { T("copt"), "Coptic" },
+ { T("cprt"), "Cypriot Syllabary" },
+ { T("cyrl"), "Cyrillic" },
+ { T("dev2"), "Devanagari v.2" },
+ { T("deva"), "Devanagari" },
+ { T("dsrt"), "Deseret" },
+ { T("egyp"), "Egyptian heiroglyphs" },
+ { T("ethi"), "Ethiopic" },
+ { T("geor"), "Georgian" },
+ { T("gjr2"), "Gujarati v.2" },
+ { T("glag"), "Glagolitic" },
+ { T("goth"), "Gothic" },
+ { T("grek"), "Greek" },
+ { T("gujr"), "Gujarati" },
+ { T("gur2"), "Gurmukhi v.2" },
+ { T("guru"), "Gurmukhi" },
+ { T("hang"), "Hangul" },
+ { T("hani"), "CJK Ideographic" },
+ { T("hano"), "Hanunoo" },
+ { T("hebr"), "Hebrew" },
+ { T("ital"), "Old Italic" },
+ { T("jamo"), "Hangul Jamo" },
+ { T("java"), "Javanese" },
+ { T("kali"), "Kayah Li" },
+ { T("kana"), "Hiragana/Katakana" },
+ { T("khar"), "Kharosthi" },
+ { T("khmr"), "Khmer" },
+ { T("knd2"), "Kannada v.2" },
+ { T("knda"), "Kannada" },
+ { T("kthi"), "Kaithi" },
+ { T("lana"), "Tai Tham (Lanna)" },
+ { T("lao "), "Lao" },
+ { T("latn"), "Latin" },
+ { T("lepc"), "Lepcha" },
+ { T("limb"), "Limbu" },
+ { T("linb"), "Linear B" },
+ { T("lisu"), "Lisu (Fraser)" },
+ { T("lyci"), "Lycian" },
+ { T("lydi"), "Lydian" },
+ { T("mand"), "Mandaic, Mandaean" },
+ { T("math"), "Mathematical Alphanumeric Symbols" },
+ { T("merc"), "Meroitic Cursive" },
+ { T("mero"), "Meroitic Hieroglyphs" },
+ { T("mlm2"), "Malayalam v.2" },
+ { T("mlym"), "Malayalam" },
+ { T("mong"), "Mongolian" },
+ { T("mtei"), "Meitei Mayek (Meithei, Meetei)" },
+ { T("musc"), "Musical Symbols" },
+ { T("mymr"), "Myanmar" },
+ { T("nko "), "N'Ko" },
+ { T("ogam"), "Ogham" },
+ { T("olck"), "Ol Chiki" },
+ { T("orkh"), "Old Turkic, Orkhon Runic" },
+ { T("ory2"), "Odia v.2 (formerly Oriya v.2)" },
+ { T("orya"), "Odia (formerly Oriya)" },
+ { T("osma"), "Osmanya" },
+ { T("phag"), "Phags-pa" },
+ { T("phli"), "Inscriptional Pahlavi" },
+ { T("phnx"), "Phoenician" },
+ { T("prti"), "Inscriptional Parthian" },
+ { T("rjng"), "Rejang" },
+ { T("runr"), "Runic" },
+ { T("samr"), "Samaritan" },
+ { T("sarb"), "Old South Arabian" },
+ { T("saur"), "Saurashtra" },
+ { T("shaw"), "Shavian" },
+ { T("shrd"), "Sharada" },
+ { T("sinh"), "Sinhala" },
+ { T("sora"), "Sora Sompeng" },
+ { T("sund"), "Sundanese" },
+ { T("sylo"), "Syloti Nagri" },
+ { T("syrc"), "Syriac" },
+ { T("tagb"), "Tagbanwa" },
+ { T("takr"), "Takri" },
+ { T("tale"), "Tai Le" },
+ { T("talu"), "New Tai Lue" },
+ { T("taml"), "Tamil" },
+ { T("tavt"), "Tai Viet" },
+ { T("tel2"), "Telugu v.2" },
+ { T("telu"), "Telugu" },
+ { T("tfng"), "Tifinagh" },
+ { T("tglg"), "Tagalog" },
+ { T("thaa"), "Thaana" },
+ { T("thai"), "Thai" },
+ { T("tibt"), "Tibetan" },
+ { T("tml2"), "Tamil v.2" },
+ { T("ugar"), "Ugaritic Cuneiform" },
+ { T("vai "), "Vai" },
+ { T("xpeo"), "Old Persian Cuneiform" },
+ { T("xsux"), "Sumero-Akkadian Cuneiform" },
+ { 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("ALS "), "Alsatian" },
+ { T("ALT "), "Altai" },
+ { T("AMH "), "Amharic" },
+ { T("APPH"), "Phonetic transcription—Americanist conventions" },
+ { 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("BOS "), "Bosnian" },
+ { 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("COS "), "Corsican" },
+ { 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" },
+ { T("DGR "), "Dogri" },
+ { T("DHV "), "Dhivehi" }, // deprecated
+ { T("DIV "), "Dhivehi" },
+ { T("DJR "), "Djerma" },
+ { T("DNG "), "Dangme" },
+ { T("DNK "), "Dinka" },
+ { T("DRI "), "Dari" },
+ { 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" },
+ { 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("IPPH"), "Phonetic transcription—IPA conventions" },
+ { 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("KOH "), "Korean Old Hangul" },
+ { 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("LTZ "), "Luxembourgish" },
+ { 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("MAP "), "Mapudungun" },
+ { 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("MOH "), "Mohawk" },
+ { 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("NGR "), "Nagari" },
+ { T("NHC "), "Norway House Cree" },
+ { T("NIS "), "Nisi" },
+ { T("NIU "), "Niuean" },
+ { T("NKL "), "Nkole" },
+ { T("NKO "), "N'Ko" },
+ { T("NLD "), "Dutch" },
+ { T("NOG "), "Nogai" },
+ { T("NOR "), "Norwegian" },
+ { T("NSM "), "Northern Sami" },
+ { T("NTA "), "Northern Tai" },
+ { T("NTO "), "Esperanto" },
+ { T("NYN "), "Nynorsk" },
+ { T("OCI "), "Occitan" },
+ { T("OCR "), "Oji-Cree" },
+ { T("OJB "), "Ojibway" },
+ { T("ORI "), "Odia (formerly 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 "), "Filipino" },
+ { 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" }, // deprecated?
+ { 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("XBD "), "Tai Lue" },
+ { T("XHS "), "Xhosa" },
+ { T("YAK "), "Sakha" },
+ { T("YBA "), "Yoruba" },
+ { T("YCR "), "Y-Cree" },
+ { T("YIC "), "Yi Classic" },
+ { T("YIM "), "Yi Modern" },
+ { T("ZHH "), "Chinese, Hong Kong SAR" },
+ { 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("cfar"), "Conjunct Form After Ro" },
+ { T("cjct"), "Conjunct Forms" },
+ { T("clig"), "Contextual Ligatures" },
+ { T("cpct"), "Centered CJK Punctuation" },
+ { T("cpsp"), "Capital Spacing" },
+ { T("cswh"), "Contextual Swash" },
+ { T("curs"), "Cursive Positioning" },
+ { T("cv01"), "Character Variants 1" },
+ { T("cv02"), "Character Variants 2" },
+ { T("cv03"), "Character Variants 3" },
+ { T("cv04"), "Character Variants 4" },
+ { T("cv05"), "Character Variants 5" },
+ { T("cv06"), "Character Variants 6" },
+ // ... up to cv99
+ { 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("hojo"), "Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms)" },
+ { T("hwid"), "Half Widths" },
+ { T("init"), "Initial Forms" },
+ { T("isol"), "Isolated Forms" },
+ { T("ital"), "Italics" },
+ { T("jalt"), "Justification Alternates" },
+ { T("jp04"), "JIS2004 Forms" },
+ { 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("ltra"), "Left-to-right alternates" },
+ { T("ltrm"), "Left-to-right mirrored 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("pkna"), "Proportional Kana" },
+ { 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("rkrf"), "Rakar Forms" },
+ { T("rlig"), "Required Ligatures" },
+ { T("rphf"), "Reph Forms" },
+ { T("rtbd"), "Right Bounds" },
+ { T("rtla"), "Right-to-left Alternates" },
+ { T("rtlm"), "Right-to-left Mirrored Forms" },
+ { 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;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ if (maps[m].tag < tag)
+ l = m + 1;
+ else if (maps[m].tag == tag)
+ return maps[m].description;
+ else
+ r = m;
+ }
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgpos.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgpos.cc
new file mode 100644
index 00000000000..eb477256c5c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgpos.cc
@@ -0,0 +1,328 @@
+// -*- related-file-name: "../include/efont/otfgpos.hh" -*-
+
+/* otfgpos.{cc,hh} -- OpenType GPOS table
+ *
+ * Copyright (c) 2003-2012 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");
+ _type = _d.u16(0);
+ if (_type == L_EXTENSION && _d.u16(4) != 0) {
+ Data first_subtable = _d.offset_subtable(HEADERSIZE);
+ if (first_subtable.length() < 8 || first_subtable.u16(0) != 1)
+ throw Format("GPOS Extension Lookup table");
+ _type = first_subtable.u16(2);
+ }
+}
+
+Data
+GposLookup::subtable(int i) const
+{
+ Data subd = _d.offset_subtable(HEADERSIZE + i*RECSIZE);
+ if (_d.u16(0) != L_EXTENSION)
+ return subd;
+ else if (subd.length() >= 8 && subd.u16(0) == 1 && subd.u16(2) == _type)
+ return subd.subtable(subd.u32(4));
+ else
+ return Data();
+}
+
+bool
+GposLookup::unparse_automatics(Vector<Positioning> &v, ErrorHandler *errh) const
+{
+ int nlookup = _d.u16(4), success = 0;
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++)
+ try {
+ GposSingle s(subtable(i));
+ s.unparse(v);
+ success++;
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ return success > 0;
+ case L_PAIR:
+ for (int i = 0; i < nlookup; i++)
+ try {
+ GposPair p(subtable(i));
+ p.unparse(v);
+ success++;
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ return success > 0;
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgsub.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgsub.cc
new file mode 100644
index 00000000000..10597847270
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfgsub.cc
@@ -0,0 +1,1285 @@
+// -*- related-file-name: "../include/efont/otfgsub.hh" -*-
+
+/* otfgsub.{cc,hh} -- OpenType GSUB table
+ *
+ * Copyright (c) 2003-2012 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> &gs) const
+{
+ bool ok = true;
+ gs.clear();
+ if (_left_is != T_NONE)
+ ok &= extract_glyphs(_left, _left_is, gs, false);
+ ok &= extract_glyphs(_in, _in_is, gs, false);
+ if (_right_is != T_NONE)
+ ok &= extract_glyphs(_right, _right_is, gs, 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());
+ _chaincontext_reverse_backtrack = nametable.version_chaincontext_reverse_backtrack();
+ } 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");
+ _type = _d.u16(0);
+ if (_type == L_EXTENSION && _d.u16(4) != 0) {
+ Data first_subtable = _d.offset_subtable(HEADERSIZE);
+ if (first_subtable.length() < 8 || first_subtable.u16(0) != 1)
+ throw Format("GSUB Extension Lookup table");
+ _type = first_subtable.u16(2);
+ }
+}
+
+Data
+GsubLookup::subtable(int i) const
+{
+ Data subd = _d.offset_subtable(HEADERSIZE + i*RECSIZE);
+ if (_d.u16(0) != L_EXTENSION)
+ return subd;
+ else if (subd.length() >= 8 && subd.u16(0) == 1 && subd.u16(2) == _type)
+ return subd.subtable(subd.u32(4));
+ else
+ return Data();
+}
+
+void
+GsubLookup::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i)); // this pattern makes gcc-3.3.4 happier
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_CONTEXT:
+ for (int i = 0; i < nlookup; i++) {
+ GsubContext x(subtable(i));
+ x.mark_out_glyphs(gsub, gmap);
+ }
+ return;
+ case L_CHAIN:
+ for (int i = 0; i < nlookup; i++) {
+ GsubChainContext x(subtable(i));
+ x.mark_out_glyphs(gsub, gmap);
+ }
+ return;
+ }
+}
+
+bool
+GsubLookup::unparse_automatics(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i)); // this pattern makes gcc-3.3.4 happier
+ x.unparse(v, limit);
+ }
+ return true;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.unparse(v);
+ }
+ return true;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.unparse(v, true);
+ }
+ return true;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ x.unparse(v);
+ }
+ return true;
+ case L_CONTEXT: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++) {
+ GsubContext x(subtable(i));
+ understood &= x.unparse(gsub, v, limit);
+ }
+ return understood;
+ }
+ case L_CHAIN: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++) {
+ GsubChainContext x(subtable(i));
+ understood &= x.unparse(gsub, v, limit);
+ }
+ return understood;
+ }
+ default:
+ return false;
+ }
+}
+
+bool
+GsubLookup::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i));
+ if (x.apply(g, pos, n, s))
+ return true;
+ }
+ return false;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ if (x.apply(g, pos, n, s))
+ return true;
+ }
+ return false;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ if (x.apply(g, pos, n, s, true))
+ return true;
+ }
+ return false;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ if (x.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::mark_out_glyphs(Vector<bool> &gmap) const
+{
+ if (_d[1] == 1) {
+ int delta = _d.s16(4);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ gmap[*i + delta] = true;
+ } else {
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ gmap[_d.u16(HEADERSIZE + i.coverage_index()*FORMAT2_RECSIZE)] = true;
+ }
+}
+
+void
+GsubSingle::unparse(Vector<Substitution> &v, const Coverage &limit) const
+{
+ if (_d[1] == 1) {
+ int delta = _d.s16(4);
+ for (Coverage::iterator it = coverage().begin(); it; ++it)
+ if (limit.covers(*it))
+ v.push_back(Substitution(*it, *it + delta));
+ } else {
+ for (Coverage::iterator it = coverage().begin(); it; ++it)
+ if (limit.covers(*it))
+ v.push_back(Substitution(*it, _d.u16(HEADERSIZE + it.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::mark_out_glyphs(Vector<bool> &gmap) const
+{
+ for (Coverage::iterator i = coverage().begin(); i; ++i) {
+ Data seq = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ for (int j = 0; j < seq.u16(0); ++j)
+ gmap[seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE)] = 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::mark_out_glyphs(Vector<bool> &gmap) 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);
+ gmap[lig.u16(0)] = true;
+ }
+ }
+}
+
+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();
+}
+
+void
+GsubContext::f3_mark_out_glyphs(const Data &data, int nsub, int subtab_offset, const Gsub &gsub, Vector<bool> &gmap)
+{
+ for (int j = 0; j < nsub; ++j) {
+ int lookup_index = data.u16(subtab_offset + SUBRECSIZE*j + 2);
+ gsub.lookup(lookup_index).mark_out_glyphs(gsub, gmap);
+ }
+}
+
+void
+GsubContext::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ if (_d.u16(0) != 3) // XXX
+ return;
+ int nglyph = _d.u16(2);
+ int nsubst = _d.u16(4);
+ f3_mark_out_glyphs(_d, nsubst, F3_HSIZE + nglyph*2, gsub, gmap);
+}
+
+bool
+GsubContext::f3_unparse(const Data &data,
+ int nglyph, int glyphtab_offset, const Coverage &limit,
+ 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 & limit).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 Coverage &limit) 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, limit, 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);
+}
+
+void
+GsubChainContext::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ if (_d.u16(0) != 3)
+ return;
+
+ 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);
+
+ GsubContext::f3_mark_out_glyphs(_d, nsubst, subst_offset + F3_SUBST_HSIZE, gsub, gmap);
+}
+
+bool
+GsubChainContext::unparse(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) 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)) & limit);
+ } else {
+ for (int i = nbacktrack - 1; i >= 0; i--)
+ backtrackc.push_back(Coverage(_d.offset_subtable(F3_HSIZE + i*2)) & limit);
+ }
+ for (int i = 0; i < nlookahead; i++)
+ lookaheadc.push_back(Coverage(_d.offset_subtable(lookahead_offset + F3_LOOKAHEAD_HSIZE + i*2)) & limit);
+
+ // give up if would generate too many substitutions
+ double n = 1;
+ for (int i = 0; i < nbacktrack; ++i)
+ n *= backtrackc[i].size();
+ for (int i = 0; i < nlookahead; ++i)
+ n *= lookaheadc[i].size();
+ for (int i = 0; i < ninput; ++i)
+ n *= (Coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE + i*2)) & limit).size();
+ if (n > 1000000) // arbitrary cutoff
+ return false;
+
+ 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, limit, 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfname.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfname.cc
new file mode 100644
index 00000000000..ee2151b92ca
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfname.cc
@@ -0,0 +1,194 @@
+// -*- related-file-name: "../include/efont/otfname.hh" -*-
+
+/* otfname.{cc,hh} -- OpenType name table
+ *
+ * Copyright (c) 2003-2012 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 <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+#define USHORT_AT(d) (Data::u16_aligned(d))
+
+namespace Efont { namespace OpenType {
+
+static const uint16_t mac_roman_encoding[] = {
+ // 0x80-0x8F
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, // Adieresis Aring Ccedilla Eacute
+ 0x00D1, 0x00D6, 0x00DC, 0x00E1, // Ntilde Odieresis Udieresis aacute
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, // agrave acircumflex adieresis atilde
+ 0x00E5, 0x00E7, 0x00E9, 0x00E8, // aring ccedilla eacute egrave
+ // 0x90-0x9F
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, // ecircumflex edieresis iacute igrave
+ 0x00EE, 0x00EF, 0x00F1, 0x00F3, // icircumflex idieresis ntilde oacute
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, // ograve ocircumflex odieresis otilde
+ 0x00FA, 0x00F9, 0x00FB, 0x00FC, // uacute ugrave ucircumflex udieresis
+ // 0xA0-0xAF
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, // dagger degree cent sterling
+ 0x00A7, 0x2022, 0x00B6, 0x00DF, // section bullet paragraph germandbls
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, // registered copyright trademark acute
+ 0x00A8, 0x2260, 0x00C6, 0x00D8, // dieresis notequal AE Oslash
+ // 0xB0-0xBF
+ 0x221E, 0x00B1, 0x2264, 0x2265, // infinity plusminus lessequal greaterequal
+ 0x00A5, 0x00B5, 0x2202, 0x2211, // yen mu partialdiff summation
+ 0x220F, 0x03C0, 0x222B, 0x00AA, // product pi integral ordfeminine
+ 0x00BA, 0x03A9, 0x00E6, 0x00F8, // ordmasculine Omegagreek ae oslash
+ // 0xC0-0xCF
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, // questiondown exclamdown logicalnot radical
+ 0x0192, 0x2248, 0x2206, 0x00AB, // florin approxequal increment guillemotleft
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, // guillemotright ellipsis nbspace Agrave
+ 0x00C3, 0x00D5, 0x0152, 0x0153, // Atilde Otilde OE oe
+ // 0xD0-0xDF
+ 0x2013, 0x2014, 0x201C, 0x201D, // endash emdash quotedblleft quotedblright
+ 0x2018, 0x2019, 0x00F7, 0x25CA, // quoteleft quoteright divide lozenge
+ 0x00FF, 0x0178, 0x2044, 0x20AC, // ydieresis Ydieresis fraction Euro
+ 0x2039, 0x203A, 0xFB01, 0xFB02, // guilsinglleft guilsinglright fi fl
+ // 0xE0-0xEF
+ 0x2021, 0x00B7, 0x201A, 0x201E, // daggerdbl middot quotesinglbase quotedblbase
+ 0x2030, 0x00C2, 0x00CA, 0x00C1, // perthousand Acircumflex Ecircumflex Aacute
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, // Edieresis Egrave Iacute Icircumflex
+ 0x00CF, 0x00CC, 0x00D3, 0x00D4, // Idieresis Igrave Oacute Ocircumflex
+ // 0xF0-0xFF
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, // apple Ograve Uacute Ucircumflex
+ 0x00D9, 0x0131, 0x02C6, 0x02DC, // Ugrave dotlessi circumflex tilde
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, // macron breve dotaccent ring
+ 0x00B8, 0x02DD, 0x02DB, 0x02C7 // cedilla hungarumlaut ogonek caron
+};
+
+
+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 (len == 0)
+ return errh->error("font has no %<name%> table"), -EFAULT;
+ if (HEADER_SIZE > len)
+ return errh->error("%<name%> table too small"), -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("%<name%> table too small"), -EFAULT;
+ return 0;
+}
+
+String
+Name::name(const_iterator i) const
+{
+ if (i < end()) {
+ int stringOffset = USHORT_AT(_str.udata() + 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();
+}
+
+String
+Name::utf8_name(const_iterator i) const
+{
+ // This code can handle Microsoft Unicode BMP and Mac Roman encodings,
+ // but that's it
+ if (!(i < end()))
+ return String();
+ int stringOffset = USHORT_AT(_str.udata() + 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 String();
+ const unsigned char *begins = _str.udata() + stringOffset + offset;
+ const unsigned char *ends = begins + length;
+ if (platform(*i) == P_MICROSOFT && encoding(*i) == E_MS_UNICODE_BMP) {
+ StringAccum sa;
+ for (const unsigned char *s = begins; s + 1 < ends; s += 2)
+ sa.append_utf8(Data::u16(s));
+ return sa.take_string();
+ } else if (platform(*i) == P_MACINTOSH && encoding(*i) == E_MAC_ROMAN) {
+ StringAccum sa;
+ for (const unsigned char *s = begins; s < ends; s++)
+ if (*s >= 0x80) {
+ sa.append(begins, s);
+ sa.append_utf8(mac_roman_encoding[*s & 0x7F]);
+ begins = s + 1;
+ }
+ if (!sa)
+ return _str.substring(begins, ends);
+ else {
+ sa.append(begins, ends);
+ return sa.take_string();
+ }
+ } else
+ return _str.substring(begins, ends);
+}
+
+String
+Name::english_name(int nameid) const
+{
+ const_iterator end = this->end();
+ const_iterator it = std::find_if(begin(), end, PlatformPred(nameid, P_MICROSOFT, E_MS_UNICODE_BMP, L_MS_ENGLISH_AMERICAN));
+ if (it == end)
+ it = std::find_if(begin(), end, PlatformPred(nameid, P_MACINTOSH, E_MAC_ROMAN, 0));
+ return utf8_name(it);
+}
+
+bool
+Name::version_chaincontext_reverse_backtrack() const
+{
+ String vstr = name(std::find_if(begin(), end(), PlatformPred(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;
+ return true;
+ }
+ try_core:
+ v = vstr.begin();
+ if (v + 16 > endv
+ || v[0] != 'C' || v[1] != 'o' || v[2] != 'r' || v[3] != 'e')
+ return false;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 12 > endv || memcmp(v, ";makeotf.lib", 12) != 0)
+ return false;
+ return true;
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfos2.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfos2.cc
new file mode 100644
index 00000000000..9831fb49543
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfos2.cc
@@ -0,0 +1,47 @@
+// -*- related-file-name: "../include/efont/otfos2.hh" -*-
+
+/* otfos2.{cc,hh} -- OpenType OS/2 table
+ *
+ * Copyright (c) 2005-2012 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
+ if (HEADER_SIZE > _data.length())
+ return errh->error("OTF OS/2 too small for header"), -EFAULT;
+ if (_data.u16(0) > 4)
+ return errh->error("unexpected OS/2 version number %d", _data.u16(0)), -ERANGE;
+ return 0;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfpost.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfpost.cc
new file mode 100644
index 00000000000..eb45845d468
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/otfpost.cc
@@ -0,0 +1,212 @@
+// -*- related-file-name: "../include/efont/otfpost.hh" -*-
+
+/* otfpost.{cc,hh} -- OpenType post table
+ *
+ * Copyright (c) 2006-2012 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/otfpost.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <efont/otfdata.hh> // for ntohl()
+
+#define USHORT_AT(d) (Data::u16_aligned(d))
+#define SHORT_AT(d) (Data::s16_aligned(d))
+#define ULONG_AT(d) (Data::u32_aligned(d))
+#define LONG_AT(d) (Data::s32_aligned(d))
+
+namespace Efont { namespace OpenType {
+
+static const char * const mac_names[] = {
+ ".notdef", ".null", "nonmarkingreturn", "space", // 0-3
+ "exclam", "quotedbl", "numbersign", "dollar", // 4-7
+ "percent", "ampersand", "quotesingle", "parenleft", // 8-11
+ "parenright", "asterisk", "plus", "comma", // 12-15
+ "hyphen", "period", "slash", "zero", // 16-19
+ "one", "two", "three", "four", // 20-23
+ "five", "six", "seven", "eight", // 24-27
+ "nine", "colon", "semicolon", "less", // 28-31
+ "equal", "greater", "question", "at", // 32-35
+ "A", "B", "C", "D", // 36-39
+ "E", "F", "G", "H", // 40-43
+ "I", "J", "K", "L", // 44-47
+ "M", "N", "O", "P", // 48-51
+ "Q", "R", "S", "T", // 52-55
+ "U", "V", "W", "X", // 56-59
+ "Y", "Z", "bracketleft", "backslash", // 60-63
+ "bracketright", "asciicircum", "underscore", "grave", // 64-67
+ "a", "b", "c", "d", // 68-71
+ "e", "f", "g", "h", // 72-75
+ "i", "j", "k", "l", // 76-79
+ "m", "n", "o", "p", // 80-83
+ "q", "r", "s", "t", // 84-87
+ "u", "v", "w", "x", // 88-91
+ "y", "z", "braceleft", "bar", // 92-95
+ "braceright", "asciitilde", "Adieresis", "Aring", // 96-99
+ "Ccedilla", "Eacute", "Ntilde", "Odieresis", // 100-103
+ "Udieresis", "aacute", "agrave", "acircumflex", // 104-107
+ "adieresis", "atilde", "aring", "ccedilla", // 108-111
+ "eacute", "egrave", "ecircumflex", "edieresis", // 112-115
+ "iacute", "igrave", "icircumflex", "idieresis", // 116-119
+ "ntilde", "oacute", "ograve", "ocircumflex", // 120-123
+ "odieresis", "otilde", "uacute", "ugrave", // 124-127
+ "ucircumflex", "udieresis", "dagger", "degree", // 128-131
+ "cent", "sterling", "section", "bullet", // 132-135
+ "paragraph", "germandbls", "registered", "copyright", // 136-139
+ "trademark", "acute", "dieresis", "notequal", // 140-143
+ "AE", "Oslash", "infinity", "plusminus", // 144-147
+ "lessequal", "greaterequal", "yen", "mu", // 148-151
+ "partialdiff", "summation", "product", "pi", // 152-155
+ "integral", "ordfeminine", "ordmasculine", "Omega", // 156-159
+ "ae", "oslash", "questiondown", "exclamdown", // 160-163
+ "logicalnot", "radical", "florin", "approxequal", // 164-167
+ "Delta", "guillemotleft", "guillemotright", "ellipsis", // 168-171
+ "nonbreakingspace", "Agrave", "Atilde", "Otilde", // 172-175
+ "OE", "oe", "endash", "emdash", // 176-179
+ "quotedblleft", "quotedblright", "quoteleft", "quoteright", // 180-183
+ "divide", "lozenge", "ydieresis", "Ydieresis", // 184-187
+ "fraction", "currency", "guilsinglleft", "guilsinglright", // 188-191
+ "fi", "fl", "daggerdbl", "periodcentered", // 192-195
+ "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", // 196-199
+ "Ecircumflex", "Aacute", "Edieresis", "Egrave", // 200-203
+ "Iacute", "Icircumflex", "Idieresis", "Igrave", // 204-207
+ "Oacute", "Ocircumflex", "apple", "Ograve", // 208-211
+ "Uacute", "Ucircumflex", "Ugrave", "dotlessi", // 212-215
+ "circumflex", "tilde", "macron", "breve", // 216-219
+ "dotaccent", "ring", "cedilla", "hungarumlaut", // 220-223
+ "ogonek", "caron", "Lslash", "lslash", // 224-227
+ "Scaron", "scaron", "Zcaron", "zcaron", // 228-231
+ "brokenbar", "Eth", "eth", "Yacute", // 232-235
+ "yacute", "Thorn", "thorn", "minus", // 236-239
+ "multiply", "onesuperior", "twosuperior", "threesuperior", // 240-243
+ "onehalf", "onequarter", "threequarters", "franc", // 244-247
+ "Gbreve", "gbreve", "Idotaccent", "Scedilla", // 248-251
+ "scedilla", "Cacute", "cacute", "Ccaron", // 252-255
+ "ccaron", "dcroat" // 256-257
+};
+
+
+Post::Post(const String &s, ErrorHandler *errh)
+ : _str(s), _version(0)
+{
+ _str.align_long();
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Post::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // 0 FIXED version
+ // 4 FIXED italicAngle
+ // 8 FWORD underlinePosition
+ // 10 FWORD underlineThickness
+ // 12 ULONG isFixedPitch
+ // 16 ULONG minMemType42
+ // 20 ULONG maxMemType42
+ // 24 ULONG minMemType1
+ // 28 ULONG maxMemType1
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF post too small for header"), -EFAULT;
+ _version = USHORT_AT(data); // ignore minor version number
+ // except that version 2.5 isn't compatible
+ if (_version < 1 || _version > 3
+ || (_version == 2 && USHORT_AT(data + 2) == 0x5000))
+ return errh->error("bad post version number"), -ERANGE;
+ if (_version == 2) {
+ // VERSION 2.0 GLYPH NAMES FORMAT:
+ // 32 USHORT numberOfGlyphs
+ // 34 USHORT glyphNameIndex[mumberOfGlyphs]
+ // CHAR names[...]
+ if (HEADER_SIZE + 2 > len
+ || ((_nglyphs = USHORT_AT(data + HEADER_SIZE)),
+ HEADER_SIZE + 2 + 2 * _nglyphs > len))
+ return errh->error("OTF post too small for glyph map"), -EFAULT;
+ const uint8_t *gni = data + HEADER_SIZE + 2;
+ const uint8_t *names = gni + 2 * _nglyphs;
+ int next_name = N_MAC_GLYPHS, g;
+ bool gni_error_reported = false;
+ for (int i = 0; i < _nglyphs; i++, gni += 2)
+ // Some fonts have more than 32768 glyphs. Although the 'post'
+ // spec says name indexes 32768-65535 are reserved, some large
+ // fonts treat those indexes as valid.
+ if ((g = USHORT_AT(gni)) >= 32768 && g >= _nglyphs) {
+ if (!gni_error_reported)
+ errh->error("bad glyph name index in post");
+ gni_error_reported = true;
+ } else
+ while (g >= next_name) {
+ if (names - data > len
+ || (names + 1 + names[0]) - data > len)
+ return errh->error("OTF post too small for glyph names"), -EFAULT;
+ _extend_glyph_names.push_back(names - data);
+ names += 1 + names[0];
+ next_name++;
+ }
+ } else if (_version == 1)
+ _nglyphs = N_MAC_GLYPHS;
+ else
+ _nglyphs = -1;
+
+ return 0;
+}
+
+double
+Post::italic_angle() const
+{
+ if (error() < 0)
+ return -1;
+ return (double) LONG_AT(_str.udata() + 4) / 65536.;
+}
+
+bool
+Post::is_fixed_pitch() const
+{
+ if (error() < 0)
+ return false;
+ return ULONG_AT(_str.udata() + 12) != 0;
+}
+
+bool
+Post::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.clear();
+ if (error() < 0)
+ return false;
+ if (_version == 1) {
+ for (int i = 0; i < N_MAC_GLYPHS; i++)
+ gnames.push_back(mac_names[i]);
+ return true;
+ } else if (_version == 2) {
+ const uint8_t *data = _str.udata();
+ const uint8_t *gni = data + HEADER_SIZE + 2;
+ for (int i = 0; i < _nglyphs; i++, gni += 2) {
+ int g = USHORT_AT(gni);
+ if (g < N_MAC_GLYPHS)
+ gnames.push_back(mac_names[g]);
+ else {
+ const uint8_t *n = data + _extend_glyph_names[g - N_MAC_GLYPHS];
+ gnames.push_back(PermString((const char *) n + 1, *n));
+ }
+ }
+ return true;
+ } else
+ return false;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/pairop.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/pairop.cc
new file mode 100644
index 00000000000..5b64be1ac41
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/pairop.cc
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../include/efont/pairop.hh" -*-
+
+/* pairop.{cc,hh} -- ligature/kern font metrics
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/psres.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/psres.cc
new file mode 100644
index 00000000000..2136a6b3237
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/psres.cc
@@ -0,0 +1,419 @@
+// -*- related-file-name: "../include/efont/psres.hh" -*-
+
+/* psres.{cc,hh} -- PSres.upr files
+ *
+ * Copyright (c) 1999-2012 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 {
+
+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 String::make_empty();
+}
+
+const String &
+PsresDatabase::unescaped_value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->unescaped_value(key);
+ else
+ return String::make_empty();
+}
+
+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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1bounds.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1bounds.cc
new file mode 100644
index 00000000000..ccea404d4d3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1bounds.cc
@@ -0,0 +1,161 @@
+// -*- related-file-name: "../include/efont/t1bounds.hh" -*-
+
+/* t1bounds.{cc,hh} -- charstring bounding box finder
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1cs.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1cs.cc
new file mode 100644
index 00000000000..4db3afa5a9d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1cs.cc
@@ -0,0 +1,370 @@
+// -*- related-file-name: "../include/efont/t1cs.hh" -*-
+
+/* t1cs.{cc,hh} -- Type 1/2 charstrings
+ *
+ * Copyright (c) 1998-2012 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;
+}
+
+int
+CharstringProgram::units_per_em() const
+{
+ return 1000;
+}
+
+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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1csgen.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1csgen.cc
new file mode 100644
index 00000000000..b24c8f21307
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1csgen.cc
@@ -0,0 +1,633 @@
+// -*- related-file-name: "../include/efont/t1csgen.hh" -*-
+
+/* t1csgen.{cc,hh} -- Type 1 charstring generation
+ *
+ * Copyright (c) 1998-2012 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;
+ clear();
+}
+
+void
+Type1CharstringGen::clear()
+{
+ _ncs.clear();
+ _true = _false = Point(0, 0);
+ _state = S_INITIAL;
+}
+
+
+void
+Type1CharstringGen::gen_rational(int big_val, int divisor)
+{
+ int frac = big_val % divisor;
+ int val = (frac == 0 ? big_val / divisor : 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)(divisor + 139));
+ _ncs.append((char)Charstring::cEscape);
+ _ncs.append((char)(Charstring::cDiv - Charstring::cEscapeDelta));
+ }
+}
+
+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);
+
+ gen_rational(big_val, _precision);
+
+ 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;
+ }
+}
+
+bool
+Type1CharstringGen::gen_stem3_stack(CharstringInterp &interp)
+{
+ // special handling to ensure rounding doesn't generate an invalid stem3
+ // hint
+ if (interp.size() < 6)
+ return false;
+
+ // sort hints
+ int i0, i1, i2;
+ if (interp.at(0) > interp.at(2))
+ i0 = 2, i1 = 0;
+ else
+ i0 = 0, i1 = 2;
+ if (interp.at(4) < interp.at(i0))
+ i2 = i1, i1 = i0, i0 = 4;
+ else if (interp.at(4) < interp.at(i1))
+ i2 = i1, i1 = 4;
+ else
+ i2 = 4;
+
+ // check constraints. count "almost equal" as equal
+ double stemw0 = interp.at(i0+1), stemw2 = interp.at(i2+1);
+ if ((int)(1024*(stemw0 - stemw2) + .5) != 0)
+ return false;
+
+ double c0 = interp.at(i0) + interp.at(i0+1)/2;
+ double c1 = interp.at(i1) + interp.at(i1+1)/2;
+ double c2 = interp.at(i2) + interp.at(i2+1)/2;
+ if ((int)(1024*((c1 - c0) - (c2 - c1)) + .5) != 0)
+ return false;
+
+ // if all constraints are satisfied now, make sure they are also satisfied
+ // after rounding
+ int big_v0 = (int)floor(interp.at(i0) * _f_precision + 0.50001);
+ int big_v2 = (int)floor(interp.at(i2) * _f_precision + 0.50001);
+ int big_stemw0 = (int)floor(stemw0 * _f_precision + 0.50001);
+ int big_stemw1 = (int)floor(interp.at(i1+1) * _f_precision + 0.50001);
+
+ int big_v1_times2 = big_v0 + big_v2 + big_stemw0 - big_stemw1;
+
+ gen_rational(big_v0, _precision);
+ gen_rational(big_stemw0, _precision);
+ if (big_v1_times2 % 2)
+ gen_rational(big_v1_times2, 2 * _precision);
+ else
+ gen_rational(big_v1_times2 / 2, _precision);
+ gen_rational(big_stemw1, _precision);
+ gen_rational(big_v2, _precision);
+ gen_rational(big_stemw0, _precision);
+
+ interp.clear();
+ return true;
+}
+
+void
+Type1CharstringGen::gen_stack(CharstringInterp &interp, int for_cmd)
+{
+ const char *str = ((unsigned)for_cmd <= Charstring::cLastCommand ? command_desc[for_cmd] : (const char *)0);
+ if ((for_cmd == Charstring::cHstem3 || for_cmd == Charstring::cVstem3)
+ && gen_stem3_stack(interp))
+ return;
+
+ 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, bool always)
+{
+ // make sure we generate some moveto on the first command
+
+ Point d = p - _true;
+ int big_dx = (int)floor(d.x * _f_precision + 0.50001);
+ int big_dy = (int)floor(d.y * _f_precision + 0.50001);
+
+ if (big_dx == 0 && big_dy == 0 && _state != S_INITIAL && !always)
+ /* do nothing */;
+ else {
+ if (closepath)
+ gen_command(Charstring::cClosepath);
+ if (big_dy == 0) {
+ gen_number(d.x, 'x');
+ gen_command(Charstring::cHmoveto);
+ } else if (big_dx == 0) {
+ gen_number(d.y, 'y');
+ gen_command(Charstring::cVmoveto);
+ } else {
+ gen_number(d.x, 'x');
+ gen_number(d.y, 'y');
+ gen_command(Charstring::cRmoveto);
+ }
+ }
+
+ _true = p;
+}
+
+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::make_fill('\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, false);
+ _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, false);
+ _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, false);
+ _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, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p1, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p2, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p3_4, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p5, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p6, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p7, false, true);
+ _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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1font.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1font.cc
new file mode 100644
index 00000000000..05b97fa346e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1font.cc
@@ -0,0 +1,914 @@
+// -*- related-file-name: "../include/efont/t1font.hh" -*-
+
+/* t1font.{cc,hh} -- Type 1 font
+ *
+ * Copyright (c) 1998-2012 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)
+{
+ int &g = _glyph_map.find_force(s->name(), _glyphs.size());
+ if (g == _glyphs.size())
+ _glyphs.push_back(s);
+ else {
+ delete _glyphs[g];
+ _glyphs[g] = s;
+ }
+}
+
+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);
+ if (_subrs[fcs->subrno()]) // hybrid font program
+ delete _subrs[fcs->subrno()];
+ _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::make_fill('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((unsigned char) x[17]) || !x[17])) {
+ // allow arbitrary whitespace after "currentfile eexec".
+ // note: strlen("currentfile eexec") == 17
+ for (x += 17; isspace((unsigned char) *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;
+}
+
+static char *skip_comment_space(char *s)
+{
+ while (1) {
+ if (isspace((unsigned char) *s))
+ ++s;
+ else if (*s == '%') {
+ for (++s; *s != '\r' && *s != '\n' && *s != '\0'; ++s)
+ /* nada */;
+ } else
+ return s;
+ }
+}
+
+void
+Type1Font::read_encoding(Type1Reader &reader, const char *first_line)
+{
+ while (isspace((unsigned char) *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((unsigned char) pos[0]))
+ ++pos;
+ if (pos[0] == '%')
+ pos = skip_comment_space(pos);
+ if (pos[0] != 'd' || pos[1] != 'u' || pos[2] != 'p' || !isspace((unsigned char) pos[3]))
+ break;
+
+ // look for `INDEX */'
+ char *scan;
+ int char_value = strtol(pos + 4, &scan, 10);
+ if (scan[0] == '#' && char_value > 0 && char_value < 37
+ && isalnum((unsigned char) scan[1]))
+ char_value = strtol(scan + 1, &scan, char_value);
+ while (isspace((unsigned char) scan[0]))
+ scan++;
+ if (char_value < 0 || char_value >= 256 || scan[0] != '/')
+ break;
+
+ // look for `CHARNAME put'
+ scan++;
+ char *name_pos = scan;
+ while (!isspace((unsigned char) scan[0]) && scan[0] != '\0')
+ ++scan;
+ char *name_end = scan;
+ while (isspace((unsigned char) 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((unsigned char) 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((unsigned char) 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::make_stable("\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((unsigned char) value[pos - 1])) {
+ while (pos >= 1 && isdigit((unsigned char) 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((unsigned char) value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit((unsigned char) 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1fontskel.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1fontskel.cc
new file mode 100644
index 00000000000..e5e48023348
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1fontskel.cc
@@ -0,0 +1,433 @@
+/* t1fontskel.cc -- Type 1 font skeleton
+ *
+ * Copyright (c) 1998-2012 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::make_stable("\216\213\014\020\014\021\014\021\014\041\013", 11)), " |");
+ // - 1: "0 1 callothersubr return"
+ set_subr(1, Type1Charstring(String::make_stable("\213\214\014\020\013", 5)), " |");
+ // - 2: "0 2 callothersubr return"
+ set_subr(2, Type1Charstring(String::make_stable("\213\215\014\020\013", 5)), " |");
+ // - 3: "return"
+ set_subr(3, Type1Charstring(String::make_stable("\013", 1)), " |");
+ // - 4: "1 3 callothersubr pop callsubr return"
+ set_subr(4, Type1Charstring(String::make_stable("\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, const Vector<double> *xuid_extension)
+{
+ 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);
+ if (!xuid_extension)
+ add_number_def(output, dF, "UniqueID", font);
+ add_copy_def(output, dF, "XUID", font, "readonly def");
+ if (xuid_extension) {
+ Vector<double> xuid;
+ if (Type1Definition *xuid_def = output->dict("XUID"))
+ xuid_def->value_numvec(xuid);
+ if (!xuid.size()) {
+ Type1Definition *uid_def = font->dict("UniqueID");
+ int uid;
+ if (uid_def && uid_def->value_int(uid)) {
+ xuid.push_back(1);
+ xuid.push_back(uid);
+ }
+ }
+ if (xuid.size()) {
+ for (int i = 0; i < xuid_extension->size(); i++)
+ xuid.push_back((*xuid_extension)[i]);
+ Type1Definition *xuid_def = output->ensure(dF, "XUID");
+ xuid_def->set_numvec(xuid);
+ }
+ }
+ 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);
+ if (!xuid_extension)
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1interp.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1interp.cc
new file mode 100644
index 00000000000..7b607bb407d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1item.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1item.cc
new file mode 100644
index 00000000000..5e169b66f13
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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
+#if HAVE_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((unsigned char) *s))
+ s++;
+ if (*s != '/')
+ return 0;
+ s++;
+ int name_start_pos = s - accum.data();
+
+ // find NAME LENGTH
+ while (!isspace((unsigned char) *s) && *s != '[' && *s != '{' && *s != '('
+ && *s != ']' && *s != '}' && *s != ')' && *s)
+ s++;
+ if (!*s)
+ return 0;
+ int name_end_pos = s - accum.data();
+
+ while (isspace((unsigned char) *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((unsigned char) *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((unsigned char) *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((unsigned char) _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((unsigned char) *s))
+ s++;
+ if (isdigit((unsigned char) *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((unsigned char) *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((unsigned char) *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((unsigned char) *s))
+ s++;
+ if (*s == '/')
+ s++;
+ if (isalnum((unsigned char) *s)) {
+ const char *start = s;
+ while (*s && !isspace((unsigned char) *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((unsigned char) 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((unsigned char) *s) && *s)
+ s++;
+ name = PermString(nstart, s - nstart);
+
+ } else {
+ // dup [subrno] ...
+ s += 3;
+ while (isspace((unsigned char) *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((unsigned char) _value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit((unsigned char) _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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1mm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1mm.cc
new file mode 100644
index 00000000000..404335a8f20
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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->vxmessage(ErrorHandler::e_error, 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1rw.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1rw.cc
new file mode 100644
index 00000000000..846297e6b67
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1rw.cc
@@ -0,0 +1,613 @@
+// -*- related-file-name: "../include/efont/t1rw.hh" -*-
+
+/* t1rw.{cc,hh} -- Type 1 font reading and writing
+ *
+ * Copyright (c) 1998-2012 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((unsigned char) s[3])) {
+ s += 4;
+ // 17.Jan.2000 -- some fonts have extra space here.
+ while (isspace((unsigned char) *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((unsigned char) *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 {
+ ssize_t result = fwrite(c, 1, l, _f);
+ (void) result;
+ }
+}
+
+
+/*****
+ * 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);
+ ssize_t result = fwrite(_save.data(), 1, _save.length(), _f);
+ (void) result;
+ _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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1unparser.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/t1unparser.cc
new file mode 100644
index 00000000000..993253deec9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfcs.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfcs.cc
new file mode 100644
index 00000000000..d427cf17bcc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfcs.cc
@@ -0,0 +1,212 @@
+// -*- related-file-name: "../include/efont/ttfcs.hh" -*-
+
+/* ttfcs.{cc,hh} -- TrueType "charstring" emulation
+ *
+ * Copyright (c) 2006-2012 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/ttfcs.hh>
+#include <efont/ttfhead.hh>
+#include <efont/t1csgen.hh>
+#include <efont/otfpost.hh>
+#include <efont/otfcmap.hh>
+#include <lcdf/hashmap.hh>
+namespace Efont {
+
+TrueTypeBoundsCharstringProgram::TrueTypeBoundsCharstringProgram(const OpenType::Font *otf)
+ : _otf(otf), _nglyphs(-1), _loca_long(false), _units_per_em(1024),
+ _loca(otf->table("loca")), _glyf(otf->table("glyf")),
+ _hmtx(otf->table("hmtx")), _got_glyph_names(false), _got_unicodes(false)
+{
+ OpenType::Data maxp(otf->table("maxp"));
+ if (maxp.length() >= 6)
+ _nglyphs = maxp.u16(4);
+
+ OpenType::Head head(otf->table("head"), 0);
+ if (head.ok()) {
+ _loca_long = head.index_to_loc_format() != 0;
+ _units_per_em = head.units_per_em();
+ }
+ if (_loca_long)
+ _loca.align_long();
+ int loca_onesize = (_loca_long ? 4 : 2);
+ if (_nglyphs >= _loca.length() / loca_onesize)
+ _nglyphs = (_loca.length() / loca_onesize) - 1;
+
+ // horizontal metrics
+ OpenType::Data hhea(_otf->table("hhea"));
+ // HHEA format:
+ // 0 Fixed Table version number 0x00010000 for version 1.0.
+ // 4 FWORD Ascender
+ // 6 FWORD Descender
+ // 8 FWORD LineGap
+ // 10 UFWORD advanceWidthMax
+ // 12 FWORD minLeftSideBearing
+ // 14 FWORD minRightSideBearing
+ // 16 FWORD xMaxExtent
+ // 18 SHORT caretSlopeRise
+ // 20 SHORT caretSlopeRun
+ // 22 SHORT caretOffset
+ // 24 SHORT (reserved)
+ // 26 SHORT (reserved)
+ // 28 SHORT (reserved)
+ // 30 SHORT (reserved)
+ // 32 SHORT metricDataFormat
+ // 34 USHORT numberOfHMetrics
+ if (hhea.length() >= 36
+ && hhea.u32(0) == 0x10000)
+ _nhmtx = hhea.u16(34);
+ if (_nhmtx * 4 > _hmtx.length())
+ _nhmtx = _hmtx.length() / 4;
+}
+
+TrueTypeBoundsCharstringProgram::~TrueTypeBoundsCharstringProgram()
+{
+ for (Charstring **cs = _charstrings.begin(); cs < _charstrings.end(); cs++)
+ delete *cs;
+}
+
+int
+TrueTypeBoundsCharstringProgram::units_per_em() const
+{
+ return _units_per_em;
+}
+
+int
+TrueTypeBoundsCharstringProgram::nglyphs() const
+{
+ return _nglyphs;
+}
+
+PermString
+TrueTypeBoundsCharstringProgram::glyph_name(int gi) const
+{
+ // generate glyph names based on what pdftex can understand
+ if (gi == 0)
+ return PermString(".notdef");
+
+ // try 'post' table glyph names
+ if (!_got_glyph_names) {
+ OpenType::Post post(_otf->table("post"));
+ if (post.ok())
+ post.glyph_names(_glyph_names);
+ _got_glyph_names = true;
+ }
+ if (gi >= 0 && gi < _glyph_names.size())
+ return _glyph_names[gi];
+
+ // try 'uniXXXX' names
+ if (!_got_unicodes) {
+ OpenType::Cmap cmap(_otf->table("cmap"));
+ if (cmap.ok())
+ cmap.unmap_all(_unicodes);
+ // make sure we only use uniquely identified glyphs
+ HashMap<uint32_t, int> unicode_usage(-1);
+ for (int g = 0; g < _unicodes.size(); g++)
+ if (_unicodes[g]) {
+ int i = unicode_usage.find_force(_unicodes[g], g);
+ if (i != g)
+ _unicodes[i] = _unicodes[g] = 0;
+ }
+ _got_unicodes = true;
+ }
+
+ if (gi >= 0 && gi < _unicodes.size() && _unicodes[gi] > 0 && _unicodes[gi] <= 0xFFFF) {
+ char buf[10];
+ sprintf(buf, "uni%04X", _unicodes[gi]);
+ return PermString(buf);
+ } else
+ return permprintf("index%d", gi);
+}
+
+void
+TrueTypeBoundsCharstringProgram::glyph_names(Vector<PermString> &gn) const
+{
+ gn.clear();
+ for (int gi = 0; gi < _nglyphs; gi++)
+ gn.push_back(glyph_name(gi));
+}
+
+Charstring *
+TrueTypeBoundsCharstringProgram::glyph(int gi) const
+{
+ if (gi < 0 || gi >= _nglyphs)
+ return 0;
+ if (_charstrings.size() <= gi)
+ _charstrings.resize(gi + 1, (Charstring *) 0);
+ if (!_charstrings[gi]) {
+ // calculate glyf offsets
+ uint32_t offset, end_offset;
+ if (_loca_long) {
+ offset = _loca.u32(gi * 4);
+ end_offset = _loca.u32(gi * 4 + 4);
+ } else {
+ offset = _loca.u16(gi * 2) * 2;
+ end_offset = _loca.u16(gi * 2 + 2) * 2;
+ }
+
+ // fetch bounding box from glyf
+ int ncontours, xmin, ymin, xmax, ymax;
+ if (offset != end_offset) {
+ if (offset > end_offset || offset + 10 > end_offset
+ || end_offset > (uint32_t) _glyf.length())
+ return 0;
+
+ ncontours = _glyf.s16(offset);
+ xmin = _glyf.s16(offset + 2);
+ ymin = _glyf.s16(offset + 4);
+ xmax = _glyf.s16(offset + 6);
+ ymax = _glyf.s16(offset + 8);
+ } else
+ ncontours = xmin = ymin = xmax = ymax = 0;
+
+ // fetch horizontal metrics
+ int advance_width, lsb;
+ if (gi >= _nhmtx) {
+ advance_width = (_nhmtx ? _hmtx.u16((_nhmtx - 1) * 4) : 0);
+ int hmtx_offset = _nhmtx * 4 + (gi - _nhmtx) * 2;
+ lsb = (hmtx_offset + 2 <= _hmtx.length() ? _hmtx.s16(hmtx_offset) : 0);
+ } else {
+ advance_width = _hmtx.u16(gi * 4);
+ lsb = _hmtx.s16(gi * 4 + 2);
+ }
+
+ // make charstring
+ Type1CharstringGen gen;
+ if (ncontours == 0) {
+ gen.gen_number(0, 'X');
+ gen.gen_number(advance_width);
+ gen.gen_command(Charstring::cHsbw);
+ } else {
+ gen.gen_number(lsb, 'X');
+ gen.gen_number(advance_width);
+ gen.gen_command(Charstring::cHsbw);
+ gen.gen_moveto(Point(xmin, ymin), false, false);
+ if (xmax != xmin || ymax == ymin)
+ gen.gen_number(xmax - xmin, 'x');
+ if (ymax != ymin)
+ gen.gen_number(ymax - ymin, 'y');
+ gen.gen_command(ymax == ymin ? Charstring::cHlineto
+ : (xmax == xmin ? Charstring::cVlineto
+ : Charstring::cRlineto));
+ gen.gen_command(Charstring::cClosepath);
+ }
+ gen.gen_command(Charstring::cEndchar);
+
+ _charstrings[gi] = gen.output();
+ }
+ return _charstrings[gi];
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfhead.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfhead.cc
new file mode 100644
index 00000000000..5be8676c64c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfhead.cc
@@ -0,0 +1,69 @@
+// -*- related-file-name: "../include/efont/ttfhead.hh" -*-
+
+/* ttfhead.{cc,hh} -- TrueType head table
+ *
+ * Copyright (c) 2007-2012 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/ttfhead.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+Head::Head(const String &s, ErrorHandler *errh)
+ : _d(s)
+{
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Head::parse_header(ErrorHandler *errh)
+{
+ // HEAD format:
+ // 0 Fixed Table version number 0x00010000 (ver. 1.0)
+ // 4 Fixed fontRevision
+ // 8 ULONG checkSumAdjustment
+ // 12 ULONG magicNumber Set to 0x5F0F3CF5
+ // 16 USHORT flags
+ // 18 USHORT unitsPerEm
+ // 20 LONGDATETIME created
+ // 28 LONGDATETIME modified
+ // 36 USHORT xMin
+ // 38 SHORT yMin
+ // 40 SHORT xMax
+ // 42 SHORT yMax
+ // 44 USHORT macStyle
+ // 46 USHORT lowestRecPPEM
+ // 48 SHORT fontDirectionHint
+ // 50 SHORT indexToLocFormat
+ // 52 SHORT glyphDataFormat
+ int len = _d.length();
+ const uint8_t *data = _d.udata();
+ if (len == 0)
+ return errh->error("font has no 'head' table"), -EFAULT;
+ if (54 > len)
+ return errh->error("'head' table too small"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\001'))
+ return errh->error("bad 'head' version number"), -ERANGE;
+ if (_d.u32(12) != 0x5F0F3CF5)
+ return errh->error("bad 'head' magic number"), -ERANGE;
+ return 0;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfkern.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfkern.cc
new file mode 100644
index 00000000000..824922457ac
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/libefont/ttfkern.cc
@@ -0,0 +1,116 @@
+// -*- related-file-name: "../include/efont/ttfkern.hh" -*-
+
+/* ttfkern.{cc,hh} -- TrueType kern table
+ *
+ * Copyright (c) 2009-2012 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/ttfkern.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+inline Data
+KernTable::subtable(uint32_t &off_in_out) const throw (Error)
+{
+ uint32_t off = off_in_out, len;
+ if (_version == 0) {
+ if (_d.u16(off) != 0)
+ throw new Format("kern subtable");
+ len = _d.u16(off + 2);
+ } else
+ len = _d.u32(off);
+ if (len < 6 || off + len > (uint32_t) _d.length())
+ throw new Bounds();
+ off_in_out = off + len;
+ return _d.substring(off, len);
+}
+
+KernTable::KernTable(const Data &d, ErrorHandler *) throw (Error)
+ : _d(d), _error(-1)
+{
+ // USHORT Version
+ // USHORT nTables
+ if (d.length() == 0)
+ throw BlankTable("kern");
+
+ uint32_t ntables, off;
+ if (d.u16(0) == 0) {
+ ntables = d.u16(2);
+ _version = 0;
+ off = 4;
+ } else if (d.u16(0) == 1) {
+ ntables = d.u32(4);
+ _version = 1;
+ off = 8;
+ } else
+ throw Format("kern");
+
+ for (uint32_t i = 0; i < ntables; ++i)
+ (void) subtable(off);
+
+ _error = 0;
+}
+
+bool
+KernTable::unparse_automatics(Vector<Positioning> &v, ErrorHandler *errh) const
+{
+ uint32_t ntables = this->ntables();
+ uint32_t off = first_offset();
+ int success = 0;
+ if (_error < 0)
+ return false;
+
+ for (uint16_t i = 0; i < ntables; ++i) {
+ Data subt = _d.subtable(off);
+ uint16_t coverage = subt.u16(4);
+
+ if (_version == 0) {
+ if ((coverage & COV_V0_HORIZONTAL) == 0
+ || (coverage & (COV_V0_MINIMUM | COV_V0_CROSS_STREAM
+ | COV_V0_OVERRIDE)) != 0
+ || (coverage & COV_V0_FORMAT) != COV_V0_FORMAT0)
+ continue;
+ } else {
+ if ((coverage & (COV_V1_VERTICAL | COV_V1_CROSS_STREAM
+ | COV_V1_VARIATION)) != 0
+ || (coverage & COV_V1_FORMAT) != COV_V1_FORMAT0)
+ continue;
+ }
+
+ try {
+ uint32_t off = (_version ? 16 : 14);
+ uint16_t npairs = subt.u16(off - 8);
+ for (uint16_t j = 0; j < npairs; ++j, off += 6) {
+ v.push_back(Positioning(Position(subt.u16(off), 0, 0, subt.s16(off + 4), 0),
+ Position(subt.u16(off + 2), 0, 0, 0, 0)));
+ ++success;
+ }
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ }
+
+ return success > 0;
+}
+
+}}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.am
new file mode 100644
index 00000000000..0cc406d4e70
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.am
@@ -0,0 +1,31 @@
+## 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 \
+ md5.c \
+ permstr.cc \
+ point.cc \
+ slurper.cc \
+ straccum.cc \
+ string.cc \
+ strtonum.c \
+ transform.cc \
+ vectorv.cc
+
+if FIXLIBC
+liblcdf_a_SOURCES += fixlibc.c
+endif FIXLIBC
+
+liblcdf_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+INCLUDES = -I$(srcdir)/../include
+
+EXTRA_DIST = fixlibc.c
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.in
new file mode 100644
index 00000000000..8043b2bb72e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/Makefile.in
@@ -0,0 +1,646 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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@
+@FIXLIBC_TRUE@am__append_1 = fixlibc.c
+subdir = lcdf-typetools-2.98/liblcdf
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+liblcdf_a_AR = $(AR) $(ARFLAGS)
+liblcdf_a_DEPENDENCIES =
+am__liblcdf_a_SOURCES_DIST = bezier.cc clp.c error.cc filename.cc \
+ globmatch.cc landmark.cc md5.c permstr.cc point.cc slurper.cc \
+ straccum.cc string.cc strtonum.c transform.cc vectorv.cc \
+ fixlibc.c
+@FIXLIBC_TRUE@am__objects_1 = fixlibc.$(OBJEXT)
+am_liblcdf_a_OBJECTS = bezier.$(OBJEXT) clp.$(OBJEXT) error.$(OBJEXT) \
+ filename.$(OBJEXT) globmatch.$(OBJEXT) landmark.$(OBJEXT) \
+ md5.$(OBJEXT) permstr.$(OBJEXT) point.$(OBJEXT) \
+ slurper.$(OBJEXT) straccum.$(OBJEXT) string.$(OBJEXT) \
+ strtonum.$(OBJEXT) transform.$(OBJEXT) vectorv.$(OBJEXT) \
+ $(am__objects_1)
+liblcdf_a_OBJECTS = $(am_liblcdf_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(liblcdf_a_SOURCES)
+DIST_SOURCES = $(am__liblcdf_a_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+noinst_LIBRARIES = liblcdf.a
+liblcdf_a_SOURCES = bezier.cc clp.c error.cc filename.cc globmatch.cc \
+ landmark.cc md5.c permstr.cc point.cc slurper.cc straccum.cc \
+ string.cc strtonum.c transform.cc vectorv.cc $(am__append_1)
+liblcdf_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+INCLUDES = -I$(srcdir)/../include
+EXTRA_DIST = fixlibc.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/liblcdf/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+liblcdf.a: $(liblcdf_a_OBJECTS) $(liblcdf_a_DEPENDENCIES) $(EXTRA_liblcdf_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f liblcdf.a
+ $(AM_V_AR)$(liblcdf_a_AR) liblcdf.a $(liblcdf_a_OBJECTS) $(liblcdf_a_LIBADD)
+ $(AM_V_at)$(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)/fixlibc.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)/md5.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@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/bezier.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/bezier.cc
new file mode 100644
index 00000000000..95c8d8b9fb0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/bezier.cc
@@ -0,0 +1,376 @@
+// -*- related-file-name: "../include/lcdf/bezier.hh" -*-
+
+/* bezier.{cc,hh} -- cubic Bezier curves
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/clp.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/clp.c
new file mode 100644
index 00000000000..b8aaafd2096
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/clp.c
@@ -0,0 +1,2351 @@
+/* -*- 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-2012 Eddie Kohler, ekohler@gmail.com
+ *
+ * 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
+
+
+/** @file clp.h
+ * @brief Functions for parsing command line options.
+ *
+ * The CLP functions are used to parse command line arugments into options.
+ * It automatically handles value parsing, error messages, long options with
+ * minimum prefix matching, short options, and negated options.
+ *
+ * The CLP model works like this.
+ *
+ * <ol>
+ * <li>The user declares an array of Clp_Option structures that define the
+ * options their program accepts.</li>
+ * <li>The user creates a Clp_Parser object using Clp_NewParser(), passing in
+ * the command line arguments to parse and the Clp_Option structures.</li>
+ * <li>A loop repeatedly calls Clp_Next() to parse the arguments.</li>
+ * </ol>
+ *
+ * Unlike many command line parsing libraries, CLP steps through all arguments
+ * one at a time, rather than slurping up all options at once. This makes it
+ * meaningful to give an option more than once.
+ *
+ * Here's an example.
+ *
+ * @code
+ * #define ANIMAL_OPT 1
+ * #define VEGETABLE_OPT 2
+ * #define MINERALS_OPT 3
+ * #define USAGE_OPT 4
+ *
+ * static const Clp_Option options[] = {
+ * { "animal", 'a', ANIMAL_OPT, Clp_ValString, 0 },
+ * { "vegetable", 'v', VEGETABLE_OPT, Clp_ValString, Clp_Negate | Clp_Optional },
+ * { "minerals", 'm', MINERALS_OPT, Clp_ValInt, 0 },
+ * { "usage", 0, USAGE_OPT, 0, 0 }
+ * };
+ *
+ * int main(int argc, char *argv[]) {
+ * Clp_Parser *clp = Clp_NewParser(argc, argv,
+ * sizeof(options) / sizeof(options[0]), options);
+ * int opt;
+ * while ((opt = Clp_Next(clp)) != Clp_Done)
+ * switch (opt) {
+ * case ANIMAL_OPT:
+ * fprintf(stderr, "animal is %s\n", clp->val.s);
+ * break;
+ * case VEGETABLE_OPT:
+ * if (clp->negated)
+ * fprintf(stderr, "no vegetables!\n");
+ * else if (clp->have_val)
+ * fprintf(stderr, "vegetable is %s\n", clp->val.s);
+ * else
+ * fprintf(stderr, "vegetables OK\n");
+ * break;
+ * case MINERALS_OPT:
+ * fprintf(stderr, "%d minerals\n", clp->val.i);
+ * break;
+ * case USAGE_OPT:
+ * fprintf(stderr, "Usage: 20q [--animal=ANIMAL] [--vegetable[=VEGETABLE]] [--minerals=N]\n");
+ * break;
+ * case Clp_NotOption:
+ * fprintf(stderr, "non-option %s\n", clp->vstr);
+ * break;
+ * }
+ * }
+ * }
+ * @endcode
+ *
+ * Here are a couple of executions.
+ *
+ * <pre>
+ * % ./20q --animal=cat
+ * animal is cat
+ * % ./20q --animal=cat -a dog -afish --animal bird --an=snake
+ * animal is cat
+ * animal is dog
+ * animal is fish
+ * animal is bird
+ * animal is snake
+ * % ./20q --no-vegetables
+ * no vegetables!
+ * % ./20q -v
+ * vegetables OK
+ * % ./20q -vkale
+ * vegetable is kale
+ * % ./20q -m10
+ * 10 minerals
+ * % ./20q -m foo
+ * '-m' expects an integer, not 'foo'
+ * </pre>
+ */
+
+
+/* Option types for Clp_SetOptionChar */
+#define Clp_DoubledLong (Clp_LongImplicit * 2)
+
+#define Clp_InitialValType 8
+#define MAX_AMBIGUOUS_VALUES 4
+
+typedef struct {
+ int val_type;
+ Clp_ValParseFunc func;
+ int flags;
+ void *user_data;
+} Clp_ValType;
+
+typedef struct {
+ unsigned ilong : 1;
+ unsigned ishort : 1;
+ unsigned imandatory : 1;
+ unsigned ioptional : 1;
+ unsigned ipos : 1;
+ unsigned ineg : 1;
+ unsigned iprefmatch : 1;
+ unsigned lmmpos_short : 1;
+ unsigned lmmneg_short : 1;
+ unsigned char ilongoff;
+ int lmmpos;
+ int lmmneg;
+} Clp_InternOption;
+
+
+#define Clp_OptionCharsSize 5
+
+typedef struct {
+ int c;
+ int type;
+} Clp_Oclass;
+#define Clp_OclassSize 10
+
+typedef struct Clp_Internal {
+ const Clp_Option *opt;
+ Clp_InternOption *iopt;
+ int nopt;
+ unsigned opt_generation;
+
+ Clp_ValType *valtype;
+ int nvaltype;
+
+ const char * const *argv;
+ int argc;
+
+ Clp_Oclass oclass[Clp_OclassSize];
+ int noclass;
+ int long1pos;
+ int long1neg;
+ int utf8;
+
+ char option_chars[Clp_OptionCharsSize];
+ const char *xtext;
+
+ const char *program_name;
+ void (*error_handler)(Clp_Parser *, const char *);
+
+ int option_processing;
+ int current_option;
+
+ unsigned char is_short;
+ unsigned char whole_negated; /* true if negated by an option character */
+ unsigned char could_be_short;
+ unsigned char current_short;
+ unsigned char negated_by_no;
+
+ int ambiguous;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES];
+} Clp_Internal;
+
+
+struct Clp_ParserState {
+ const char * const *argv;
+ int argc;
+
+ char option_chars[Clp_OptionCharsSize];
+ const char *xtext;
+
+ int option_processing;
+
+ unsigned opt_generation;
+ int current_option;
+ unsigned char is_short;
+ unsigned char whole_negated;
+ unsigned char current_short;
+ unsigned char negated_by_no;
+};
+
+
+typedef struct Clp_StringList {
+
+ Clp_Option *items;
+ Clp_InternOption *iopt;
+ int nitems;
+
+ int allow_int;
+ int nitems_invalid_report;
+
+} Clp_StringList;
+
+
+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 *, const Clp_Option *,
+ const Clp_InternOption *, const char *, const char *,
+ ...);
+
+
+/*******
+ * utf8
+ **/
+
+#define U_REPLACEMENT 0xFFFD
+
+static char *
+encode_utf8(char *s, int n, int c)
+{
+ if (c < 0 || c >= 0x110000 || (c >= 0xD800 && c <= 0xDFFF))
+ c = U_REPLACEMENT;
+ if (c <= 0x7F && n >= 1)
+ *s++ = c;
+ else if (c <= 0x7FF && n >= 2) {
+ *s++ = 0xC0 | (c >> 6);
+ goto char1;
+ } else if (c <= 0xFFFF && n >= 3) {
+ *s++ = 0xE0 | (c >> 12);
+ goto char2;
+ } else if (n >= 4) {
+ *s++ = 0xF0 | (c >> 18);
+ *s++ = 0x80 | ((c >> 12) & 0x3F);
+ char2:
+ *s++ = 0x80 | ((c >> 6) & 0x3F);
+ char1:
+ *s++ = 0x80 | (c & 0x3F);
+ }
+ return s;
+}
+
+static int
+decode_utf8(const char *s, const char **cp)
+{
+ int c;
+ if ((unsigned char) *s <= 0x7F) /* 1 byte: 0x000000-0x00007F */
+ c = *s++;
+ else if ((unsigned char) *s <= 0xC1) /* bad/overlong encoding */
+ goto replacement;
+ else if ((unsigned char) *s <= 0xDF) { /* 2 bytes: 0x000080-0x0007FF */
+ if ((s[1] & 0xC0) != 0x80) /* bad encoding */
+ goto replacement;
+ c = (*s++ & 0x1F) << 6;
+ goto char1;
+ } else if ((unsigned char) *s <= 0xEF) { /* 3 bytes: 0x000800-0x00FFFF */
+ if ((s[1] & 0xC0) != 0x80 /* bad encoding */
+ || (s[2] & 0xC0) != 0x80 /* bad encoding */
+ || ((unsigned char) *s == 0xE0 /* overlong encoding */
+ && (s[1] & 0xE0) == 0x80)
+ || ((unsigned char) *s == 0xED /* encoded surrogate */
+ && (s[1] & 0xE0) == 0xA0))
+ goto replacement;
+ c = (*s++ & 0x0F) << 12;
+ goto char2;
+ } else if ((unsigned char) *s <= 0xF4) { /* 4 bytes: 0x010000-0x10FFFF */
+ if ((s[1] & 0xC0) != 0x80 /* bad encoding */
+ || (s[2] & 0xC0) != 0x80 /* bad encoding */
+ || (s[3] & 0xC0) != 0x80 /* bad encoding */
+ || ((unsigned char) *s == 0xF0 /* overlong encoding */
+ && (s[1] & 0xF0) == 0x80)
+ || ((unsigned char) *s == 0xF4 /* encoded value > 0x10FFFF */
+ && (unsigned char) s[1] >= 0x90))
+ goto replacement;
+ c = (*s++ & 0x07) << 18;
+ c += (*s++ & 0x3F) << 12;
+ char2:
+ c += (*s++ & 0x3F) << 6;
+ char1:
+ c += (*s++ & 0x3F);
+ } else {
+ replacement:
+ c = U_REPLACEMENT;
+ for (s++; (*s & 0xC0) == 0x80; s++)
+ /* nothing */;
+ }
+ if (cp)
+ *cp = s;
+ return c;
+}
+
+static int
+utf8_charlen(const char *s)
+{
+ const char *sout;
+ (void) decode_utf8(s, &sout);
+ return sout - s;
+}
+
+static int
+clp_utf8_charlen(const Clp_Internal *cli, const char *s)
+{
+ return (cli->utf8 ? utf8_charlen(s) : 1);
+}
+
+
+/*******
+ * Clp_NewParser, etc.
+ **/
+
+static int
+min_different_chars(const char *s, const char *t)
+ /* Returns the minimum number of bytes 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
+long_as_short(const Clp_Internal *cli, const Clp_Option *o,
+ Clp_InternOption *io, int failure)
+{
+ if ((cli->long1pos || cli->long1neg) && io->ilong) {
+ const char *name = o->long_name + io->ilongoff;
+ if (cli->utf8) {
+ int c = decode_utf8(name, &name);
+ if (!*name && c && c != U_REPLACEMENT)
+ return c;
+ } else if (name[0] && !name[1])
+ return (unsigned char) name[0];
+ }
+ return failure;
+}
+
+static void
+compare_options(Clp_Parser *clp, const Clp_Option *o1, Clp_InternOption *io1,
+ const Clp_Option *o2, Clp_InternOption *io2)
+{
+ Clp_Internal *cli = clp->internal;
+ int short1, shortx1;
+
+ /* ignore meaningless combinations */
+ if ((!io1->ishort && !io1->ilong) || (!io2->ishort && !io2->ilong)
+ || !((io1->ipos && io2->ipos) || (io1->ineg && io2->ineg))
+ || o1->option_id == o2->option_id)
+ return;
+
+ /* look for duplication of short options */
+ short1 = (io1->ishort ? o1->short_name : -1);
+ shortx1 = long_as_short(cli, o1, io1, -2);
+ if (short1 >= 0 || shortx1 >= 0) {
+ int short2 = (io2->ishort ? o2->short_name : -3);
+ int shortx2 = long_as_short(cli, o2, io2, -4);
+ if (short1 == short2)
+ Clp_OptionError(clp, "CLP internal error: more than 1 option has short name %<%c%>", short1);
+ else if ((short1 == shortx2 || shortx1 == short2 || shortx1 == shortx2)
+ && ((io1->ipos && io2->ipos && cli->long1pos)
+ || (io1->ineg && io2->ineg && cli->long1neg)))
+ Clp_OptionError(clp, "CLP internal error: 1-char long name conflicts with short name %<%c%>", (short1 == shortx2 ? shortx2 : shortx1));
+ }
+
+ /* analyze longest minimum match */
+ if (io1->ilong) {
+ const char *name1 = o1->long_name + io1->ilongoff;
+
+ /* long name's first character matches short name */
+ if (io2->ishort && !io1->iprefmatch) {
+ int name1char = (cli->utf8 ? decode_utf8(name1, 0) : (unsigned char) *name1);
+ if (name1char == o2->short_name) {
+ if (io1->ipos && io2->ipos)
+ io1->lmmpos_short = 1;
+ if (io1->ineg && io2->ineg)
+ io1->lmmneg_short = 1;
+ }
+ }
+
+ /* match long name to long name */
+ if (io2->ilong) {
+ const char *name2 = o2->long_name + io2->ilongoff;
+ if (strcmp(name1, name2) == 0)
+ Clp_OptionError(clp, "CLP internal error: duplicate long name %<%s%>", name1);
+ if (io1->ipos && io2->ipos && !strncmp(name1, name2, io1->lmmpos)
+ && (!io1->iprefmatch || strncmp(name1, name2, strlen(name1))))
+ io1->lmmpos = min_different_chars(name1, name2);
+ if (io1->ineg && io2->ineg && !strncmp(name1, name2, io1->lmmneg)
+ && (!io1->iprefmatch || strncmp(name1, name2, strlen(name1))))
+ io1->lmmneg = min_different_chars(name1, name2);
+ }
+ }
+}
+
+/** @param argc number of arguments
+ * @param argv argument array
+ * @param nopt number of option definitions
+ * @param opt option definition array
+ * @return the parser
+ *
+ * The new Clp_Parser that will parse the arguments in @a argv according to
+ * the option definitions in @a opt.
+ *
+ * The Clp_Parser is created with the following characteristics:
+ *
+ * <ul>
+ * <li>The "-" character introduces short options (<tt>Clp_SetOptionChar(clp,
+ * '-', Clp_Short)</tt>).</li>
+ * <li>Clp_ProgramName is set from the first argument in @a argv, if any. The
+ * first argument returned by Clp_Next() will be the second argument in @a
+ * argv. Note that this behavior differs from Clp_SetArguments.</li>
+ * <li>UTF-8 support is on iff the <tt>LANG</tt> environment variable contains
+ * one of the substrings "UTF-8", "UTF8", or "utf8". Override this with
+ * Clp_SetUTF8().</li>
+ * <li>The Clp_ValString, Clp_ValStringNotOption, Clp_ValInt, Clp_ValUnsigned,
+ * Clp_ValBool, and Clp_ValDouble types are installed.</li>
+ * <li>Errors are reported to standard error.</li>
+ * </ul>
+ *
+ * You may also create a Clp_Parser with no arguments or options
+ * (<tt>Clp_NewParser(0, 0, 0, 0)</tt>) and set the arguments and options
+ * later.
+ *
+ * Returns NULL if there isn't enough memory to construct the parser.
+ *
+ * @note The CLP library will not modify the contents of @a argv or @a opt.
+ * The calling program must not modify @a opt. It may modify @a argv in
+ * limited cases.
+ */
+Clp_Parser *
+Clp_NewParser(int argc, const char * const *argv, int nopt, const Clp_Option *opt)
+{
+ Clp_Parser *clp = (Clp_Parser *)malloc(sizeof(Clp_Parser));
+ Clp_Internal *cli = (Clp_Internal *)malloc(sizeof(Clp_Internal));
+ Clp_InternOption *iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nopt);
+ if (cli)
+ cli->valtype = (Clp_ValType *)malloc(sizeof(Clp_ValType) * Clp_InitialValType);
+ if (!clp || !cli || !iopt || !cli->valtype)
+ goto failed;
+
+ clp->opt = -1;
+ clp->negated = 0;
+ clp->have_val = 0;
+ clp->vstr = 0;
+ clp->user_data = 0;
+ clp->internal = cli;
+
+ cli->opt = opt;
+ cli->nopt = nopt;
+ cli->iopt = iopt;
+ cli->opt_generation = 0;
+ cli->error_handler = 0;
+
+ /* Assign program name (now so we can call Clp_OptionError) */
+ if (argc > 0) {
+ const char *slash = strrchr(argv[0], '/');
+ cli->program_name = slash ? slash + 1 : argv[0];
+ } else
+ cli->program_name = 0;
+
+ /* Assign arguments, skipping program name */
+ Clp_SetArguments(clp, argc - 1, argv + 1);
+
+ /* Initialize UTF-8 status and option classes */
+ {
+ char *s = getenv("LANG");
+ cli->utf8 = (s && (strstr(s, "UTF-8") != 0 || strstr(s, "UTF8") != 0
+ || strstr(s, "utf8") != 0));
+ }
+ cli->oclass[0].c = '-';
+ cli->oclass[0].type = Clp_Short;
+ cli->noclass = 1;
+ cli->long1pos = cli->long1neg = 0;
+
+ /* Add default type parsers */
+ cli->nvaltype = 0;
+ Clp_AddType(clp, Clp_ValString, 0, parse_string, 0);
+ Clp_AddType(clp, Clp_ValStringNotOption, Clp_DisallowOptions, parse_string, 0);
+ Clp_AddType(clp, Clp_ValInt, 0, parse_int, 0);
+ Clp_AddType(clp, Clp_ValUnsigned, 0, parse_int, (void *)cli);
+ Clp_AddType(clp, Clp_ValBool, 0, parse_bool, 0);
+ Clp_AddType(clp, Clp_ValDouble, 0, parse_double, 0);
+
+ /* Set options */
+ Clp_SetOptions(clp, nopt, opt);
+
+ return clp;
+
+ failed:
+ if (cli && cli->valtype)
+ free(cli->valtype);
+ if (cli)
+ free(cli);
+ if (clp)
+ free(clp);
+ if (iopt)
+ free(iopt);
+ return 0;
+}
+
+/** @param clp the parser
+ *
+ * All memory associated with @a clp is freed. */
+void
+Clp_DeleteParser(Clp_Parser *clp)
+{
+ int i;
+ Clp_Internal *cli;
+ if (!clp)
+ return;
+
+ cli = clp->internal;
+
+ /* get rid of any string list types */
+ for (i = 0; i < cli->nvaltype; i++)
+ if (cli->valtype[i].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *)cli->valtype[i].user_data;
+ free(clsl->items);
+ free(clsl->iopt);
+ free(clsl);
+ }
+
+ free(cli->valtype);
+ free(cli->iopt);
+ free(cli);
+ free(clp);
+}
+
+
+/** @param clp the parser
+ * @param errh error handler function
+ * @return previous error handler function
+ *
+ * The error handler function is called when CLP encounters an error while
+ * parsing the command line. It is called with the arguments "<tt>(*errh)(@a
+ * clp, s)</tt>", where <tt>s</tt> is a description of the error terminated by
+ * a newline. The <tt>s</tt> descriptions produced by CLP itself are prefixed
+ * by the program name, if any. */
+Clp_ErrorHandler
+Clp_SetErrorHandler(Clp_Parser *clp, void (*errh)(Clp_Parser *, const char *))
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_ErrorHandler old = cli->error_handler;
+ cli->error_handler = errh;
+ return old;
+}
+
+/** @param clp the parser
+ * @param utf8 does the parser support UTF-8?
+ * @return previous UTF-8 mode
+ *
+ * In UTF-8 mode, all input strings (arguments and long names for options) are
+ * assumed to be encoded via UTF-8, and all character names
+ * (Clp_SetOptionChar() and short names for options) may cover the whole
+ * Unicode range. Out of UTF-8 mode, all input strings are treated as binary,
+ * and all character names must be unsigned char values.
+ *
+ * Furthermore, error messages in UTF-8 mode may contain Unicode quote
+ * characters. */
+int
+Clp_SetUTF8(Clp_Parser *clp, int utf8)
+{
+ Clp_Internal *cli = clp->internal;
+ int i, j, old_utf8 = cli->utf8;
+ cli->utf8 = utf8;
+ for (i = 0; i < cli->nopt; ++i) {
+ cli->iopt[i].lmmpos = cli->iopt[i].lmmneg = 1;
+ cli->iopt[i].lmmpos_short = cli->iopt[i].lmmneg_short = 0;
+ for (j = 0; j < cli->nopt; ++j)
+ compare_options(clp, &cli->opt[i], &cli->iopt[i],
+ &cli->opt[j], &cli->iopt[j]);
+ }
+ return old_utf8;
+}
+
+/** @param clp the parser
+ * @param c character
+ * @return option character treatment
+ *
+ * Returns an integer specifying how CLP treats arguments that begin
+ * with character @a c. See Clp_SetOptionChar for possibilities.
+ */
+int
+Clp_OptionChar(Clp_Parser *clp, int c)
+{
+ Clp_Internal *cli = clp->internal;
+ int i, oclass = 0;
+ if (cli->noclass > 0 && cli->oclass[0].c == 0)
+ oclass = cli->oclass[0].type;
+ for (i = 0; i < cli->noclass; ++i)
+ if (cli->oclass[i].c == c)
+ oclass = cli->oclass[i].type;
+ return oclass;
+}
+
+/** @param clp the parser
+ * @param c character
+ * @param type option character treatment
+ * @return previous option character treatment, or -1 on error
+ *
+ * @a type specifies how CLP treats arguments that begin with character @a c.
+ * Possibilities are:
+ *
+ * <dl>
+ * <dt>Clp_NotOption (or 0)</dt>
+ * <dd>The argument cannot be an option.</dd>
+ * <dt>Clp_Long</dt>
+ * <dd>The argument is a long option.</dd>
+ * <dt>Clp_Short</dt>
+ * <dd>The argument is a set of short options.</dd>
+ * <dt>Clp_Short|Clp_Long</dt>
+ * <dd>The argument is either a long option or, if no matching long option is
+ * found, a set of short options.</dd>
+ * <dt>Clp_LongNegated</dt>
+ * <dd>The argument is a negated long option. For example, after
+ * Clp_SetOptionChar(@a clp, '^', Clp_LongNegated), the argument "^foo" is
+ * equivalent to "--no-foo".</dd>
+ * <dt>Clp_ShortNegated</dt>
+ * <dd>The argument is a set of negated short options.</dd>
+ * <dt>Clp_ShortNegated|Clp_LongNegated</dt>
+ * <dd>The argument is either a negated long option or, if no matching long
+ * option is found, a set of negated short options.</dd>
+ * <dt>Clp_LongImplicit</dt>
+ * <dd>The argument may be a long option, where the character @a c is actually
+ * part of the long option name. For example, after Clp_SetOptionChar(@a clp,
+ * 'f', Clp_LongImplicit), the argument "foo" may be equivalent to
+ * "--foo".</dd>
+ * </dl>
+ *
+ * In UTF-8 mode, @a c may be any Unicode character. Otherwise, @a c must be
+ * an unsigned char value. The special character 0 assigns @a type to @em
+ * every character.
+ *
+ * It is an error if @a c is out of range, @a type is illegal, or there are
+ * too many character definitions stored in @a clp already. The function
+ * returns -1 on error.
+ *
+ * A double hyphen "--" always introduces a long option. This behavior cannot
+ * currently be changed with Clp_SetOptionChar().
+ */
+int
+Clp_SetOptionChar(Clp_Parser *clp, int c, int type)
+{
+ int i, j, long1pos, long1neg;
+ int old = Clp_OptionChar(clp, c);
+ Clp_Internal *cli = clp->internal;
+
+ if (type != Clp_NotOption && type != Clp_Short && type != Clp_Long
+ && type != Clp_ShortNegated && type != Clp_LongNegated
+ && type != Clp_LongImplicit && type != (Clp_Short | Clp_Long)
+ && type != (Clp_ShortNegated | Clp_LongNegated))
+ return -1;
+ if (c < 0 || c >= (cli->utf8 ? 0x110000 : 256))
+ return -1;
+
+ if (c == 0)
+ cli->noclass = 0;
+ for (i = 0; i < cli->noclass; ++i)
+ if (cli->oclass[i].c == c)
+ break;
+ if (i == Clp_OclassSize)
+ return -1;
+
+ cli->oclass[i].c = c;
+ cli->oclass[i].type = type;
+ if (cli->noclass == i)
+ cli->noclass = i + 1;
+
+ long1pos = long1neg = 0;
+ for (i = 0; i < cli->noclass; ++i) {
+ if ((cli->oclass[i].type & Clp_Short)
+ && (cli->oclass[i].type & Clp_Long))
+ long1pos = 1;
+ if ((cli->oclass[i].type & Clp_ShortNegated)
+ && (cli->oclass[i].type & Clp_LongNegated))
+ long1neg = 1;
+ }
+
+ if (long1pos != cli->long1pos || long1neg != cli->long1neg) {
+ /* Must recheck option set */
+ cli->long1pos = long1pos;
+ cli->long1neg = long1neg;
+ for (i = 0; i < cli->nopt; ++i) {
+ cli->iopt[i].lmmpos = cli->iopt[i].lmmneg = 1;
+ cli->iopt[i].lmmpos_short = cli->iopt[i].lmmneg_short = 0;
+ for (j = 0; j < cli->nopt; ++j)
+ compare_options(clp, &cli->opt[i], &cli->iopt[i],
+ &cli->opt[j], &cli->iopt[j]);
+ }
+ }
+
+ return old;
+}
+
+/** @param clp the parser
+ * @param nopt number of option definitions
+ * @param opt option definition array
+ * @return 0 on success, -1 on failure
+ *
+ * Installs the option definitions in @a opt. Future option parsing will
+ * use @a opt to search for options.
+ *
+ * Also checks @a opt's option definitions for validity. "CLP internal
+ * errors" are reported via Clp_OptionError() if:
+ *
+ * <ul>
+ * <li>An option has a negative ID.</li>
+ * <li>Two different short options have the same name.</li>
+ * <li>Two different long options have the same name.</li>
+ * <li>A short and a long option are ambiguous, in that some option character
+ * might introduce either a short or a long option (e.g., Clp_SetOptionChar(@a
+ * clp, '-', Clp_Long|Clp_Short)), and a short name equals a long name.</li>
+ * </ul>
+ *
+ * If necessary memory cannot be allocated, this function returns -1 without
+ * modifying the parser.
+ *
+ * @note The CLP library will not modify the contents of @a argv or @a opt.
+ * The calling program must not modify @a opt either until another call to
+ * Clp_SetOptions() or the parser is destroyed.
+ */
+int
+Clp_SetOptions(Clp_Parser *clp, int nopt, const Clp_Option *opt)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_InternOption *iopt;
+ int i, j;
+ static unsigned opt_generation = 0;
+
+ if (nopt > cli->nopt) {
+ iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nopt);
+ if (!iopt)
+ return -1;
+ free(cli->iopt);
+ cli->iopt = iopt;
+ }
+
+ cli->opt = opt;
+ cli->nopt = nopt;
+ cli->opt_generation = ++opt_generation;
+ iopt = cli->iopt;
+ cli->current_option = -1;
+
+ /* Massage the options to make them usable */
+ for (i = 0; i < nopt; i++) {
+ /* Ignore negative option_ids, which are internal to CLP */
+ if (opt[i].option_id < 0) {
+ Clp_OptionError(clp, "CLP internal error: option %d has negative option_id", i);
+ iopt[i].ilong = iopt[i].ishort = iopt[i].ipos = iopt[i].ineg = 0;
+ continue;
+ }
+
+ /* Set flags based on input flags */
+ iopt[i].ilong = (opt[i].long_name != 0 && opt[i].long_name[0] != 0);
+ iopt[i].ishort = (opt[i].short_name > 0
+ && opt[i].short_name < (cli->utf8 ? 0x110000 : 256));
+ iopt[i].ipos = 1;
+ iopt[i].ineg = (opt[i].flags & Clp_Negate) != 0;
+ iopt[i].imandatory = (opt[i].flags & Clp_Mandatory) != 0;
+ iopt[i].ioptional = (opt[i].flags & Clp_Optional) != 0;
+ iopt[i].iprefmatch = (opt[i].flags & Clp_PreferredMatch) != 0;
+ iopt[i].ilongoff = 0;
+
+ /* Enforce invariants */
+ if (opt[i].val_type <= 0)
+ iopt[i].imandatory = iopt[i].ioptional = 0;
+ if (opt[i].val_type > 0 && !iopt[i].ioptional)
+ iopt[i].imandatory = 1;
+
+ /* Options that start with 'no-' should be changed to OnlyNegated */
+ if (iopt[i].ilong && strncmp(opt[i].long_name, "no-", 3) == 0) {
+ iopt[i].ipos = 0;
+ iopt[i].ineg = 1;
+ iopt[i].ilongoff = 3;
+ if (strncmp(opt[i].long_name + 3, "no-", 3) == 0)
+ Clp_OptionError(clp, "CLP internal error: option %d begins with \"no-no-\"", i);
+ } else if (opt[i].flags & Clp_OnlyNegated) {
+ iopt[i].ipos = 0;
+ iopt[i].ineg = 1;
+ }
+ }
+
+ /* Check option set */
+ for (i = 0; i < nopt; ++i) {
+ iopt[i].lmmpos = iopt[i].lmmneg = 1;
+ iopt[i].lmmpos_short = iopt[i].lmmneg_short = 0;
+ for (j = 0; j < nopt; ++j)
+ compare_options(clp, &opt[i], &iopt[i], &opt[j], &iopt[j]);
+ }
+
+ return 0;
+}
+
+/** @param clp the parser
+ * @param argc number of arguments
+ * @param argv argument array
+ *
+ * Installs the arguments in @a argv for parsing. Future option parsing will
+ * analyze @a argv.
+ *
+ * Unlike Clp_NewParser(), this function does not treat @a argv[0] specially.
+ * The first subsequent call to Clp_Next() will analyze @a argv[0].
+ *
+ * This function also sets option processing to on, as by
+ * Clp_SetOptionProcessing(@a clp, 1).
+ *
+ * @note The CLP library will not modify the contents of @a argv. The calling
+ * program should not generally modify the element of @a argv that CLP is
+ * currently analyzing.
+ */
+void
+Clp_SetArguments(Clp_Parser *clp, int argc, const char * const *argv)
+{
+ Clp_Internal *cli = clp->internal;
+
+ cli->argc = argc + 1;
+ cli->argv = argv - 1;
+
+ cli->is_short = 0;
+ cli->whole_negated = 0;
+ cli->option_processing = 1;
+ cli->current_option = -1;
+}
+
+
+/** @param clp the parser
+ * @param on whether to search for options
+ * @return previous option processing setting
+ *
+ * When option processing is off, every call to Clp_Next() returns
+ * Clp_NotOption. By default the option <tt>"--"</tt> turns off option
+ * processing and is otherwise ignored.
+ */
+int
+Clp_SetOptionProcessing(Clp_Parser *clp, int on)
+{
+ Clp_Internal *cli = clp->internal;
+ int old = cli->option_processing;
+ cli->option_processing = on;
+ return old;
+}
+
+
+/*******
+ * functions for Clp_Option lists
+ **/
+
+/* 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(Clp_Parser *clp, const char *arg,
+ int nopt, const Clp_Option *opt,
+ const Clp_InternOption *iopt,
+ int *ambiguous, int *ambiguous_values)
+ /* 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;
+ int negated = clp && clp->negated;
+ int first_charlen = (clp ? clp_utf8_charlen(clp->internal, arg) : 1);
+
+ retry:
+ for (i = 0; i < nopt; i++) {
+ int len, lmm;
+ if (!iopt[i].ilong || (negated ? !iopt[i].ineg : !iopt[i].ipos))
+ continue;
+
+ lmm = (negated ? iopt[i].lmmneg : iopt[i].lmmpos);
+ if (clp && clp->internal->could_be_short
+ && (negated ? iopt[i].lmmneg_short : iopt[i].lmmpos_short))
+ lmm = (first_charlen >= lmm ? first_charlen + 1 : lmm);
+ len = argcmp(opt[i].long_name + iopt[i].ilongoff, 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
+ **/
+
+static int
+val_type_binsearch(Clp_Internal *cli, int val_type)
+{
+ unsigned l = 0, r = cli->nvaltype;
+ while (l < r) {
+ unsigned m = l + (r - l) / 2;
+ if (cli->valtype[m].val_type == val_type)
+ return m;
+ else if (cli->valtype[m].val_type < val_type)
+ l = m + 1;
+ else
+ r = m;
+ }
+ return l;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags value type flags
+ * @param parser parser function
+ * @param user_data user data for @a parser function
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * @a parser will be passed argument values for type @a val_type. It should
+ * parse the argument into values (usually in @a clp->val, but sometimes
+ * elsewhere), report errors if necessary, and return whether the parse was
+ * successful.
+ *
+ * Any prior argument parser match @a val_type is removed. @a val_type must
+ * be greater than zero.
+ *
+ * @a flags specifies additional parsing flags. At the moment the only
+ * relevant flag is Clp_DisallowOptions, which means that separated values
+ * must not look like options. For example, assume argument
+ * <tt>--a</tt>/<tt>-a</tt> has mandatory value type Clp_ValStringNotOption
+ * (which has Clp_DisallowOptions). Then:
+ *
+ * <ul>
+ * <li><tt>--a=--b</tt> will parse with value <tt>--b</tt>.</li>
+ * <li><tt>-a--b</tt> will parse with value <tt>--b</tt>.</li>
+ * <li><tt>--a --b</tt> will not parse, since the mandatory value looks like
+ * an option.</li>
+ * <li><tt>-a --b</tt> will not parse, since the mandatory value looks like
+ * an option.</li>
+ * </ul>
+ */
+int
+Clp_AddType(Clp_Parser *clp, int val_type, int flags,
+ Clp_ValParseFunc parser, void *user_data)
+{
+ Clp_Internal *cli = clp->internal;
+ int vtpos;
+
+ if (val_type <= 0 || !parser)
+ return -1;
+
+ vtpos = val_type_binsearch(cli, val_type);
+
+ if (vtpos == cli->nvaltype || cli->valtype[vtpos].val_type != val_type) {
+ if (cli->nvaltype != 0 && (cli->nvaltype % Clp_InitialValType) == 0) {
+ Clp_ValType *new_valtype =
+ (Clp_ValType *) realloc(cli->valtype, sizeof(Clp_ValType) * (cli->nvaltype + Clp_InitialValType));
+ if (!new_valtype)
+ return -1;
+ cli->valtype = new_valtype;
+ }
+ memmove(&cli->valtype[vtpos + 1], &cli->valtype[vtpos],
+ sizeof(Clp_ValType) * (cli->nvaltype - vtpos));
+ cli->nvaltype++;
+ cli->valtype[vtpos].func = 0;
+ }
+
+ if (cli->valtype[vtpos].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *) cli->valtype[vtpos].user_data;
+ free(clsl->items);
+ free(clsl->iopt);
+ free(clsl);
+ }
+
+ cli->valtype[vtpos].val_type = val_type;
+ cli->valtype[vtpos].func = parser;
+ cli->valtype[vtpos].flags = flags;
+ cli->valtype[vtpos].user_data = user_data;
+ return 0;
+}
+
+
+/*******
+ * Default argument parsers
+ **/
+
+static int
+parse_string(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ (void)complain, (void)user_data;
+ clp->val.s = arg;
+ return 1;
+}
+
+static int
+parse_int(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ const char *val;
+ if (*arg == 0 || isspace((unsigned char) *arg)
+ || (user_data != 0 && *arg == '-'))
+ val = arg;
+ else if (user_data != 0) { /* unsigned */
+#if HAVE_STRTOUL
+ clp->val.u = strtoul(arg, (char **) &val, 0);
+#else
+ /* don't bother really trying to do it right */
+ if (arg[0] == '-')
+ val = arg;
+ else
+ clp->val.u = strtol(arg, (char **) &val, 0);
+#endif
+ } else
+ clp->val.i = strtol(arg, (char **) &val, 0);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain) {
+ const char *message = user_data != 0
+ ? "%<%O%> expects a nonnegative integer, not %<%s%>"
+ : "%<%O%> expects an integer, not %<%s%>";
+ return Clp_OptionError(clp, message, arg);
+ } else
+ return 0;
+}
+
+static int
+parse_double(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ const char *val;
+ (void)user_data;
+ if (*arg == 0 || isspace((unsigned char) *arg))
+ val = arg;
+ else
+ clp->val.d = strtod(arg, (char **) &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 *user_data)
+{
+ int i;
+ char lcarg[6];
+ (void)user_data;
+ if (strlen(arg) > 5 || strchr(arg, '=') != 0)
+ goto error;
+
+ for (i = 0; arg[i] != 0; i++)
+ lcarg[i] = tolower((unsigned char) 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 *user_data)
+{
+ Clp_StringList *sl = (Clp_StringList *)user_data;
+ int idx, ambiguous = 0;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES + 1];
+
+ /* actually look for a string value */
+ idx = find_prefix_opt
+ (0, arg, sl->nitems, sl->items, sl->iopt,
+ &ambiguous, ambiguous_values);
+ 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;
+ if (ambiguous)
+ complaint = "ambiguous value %<%s%> for option %<%O%>";
+ else {
+ complaint = "unknown value %<%s%> for option %<%O%>";
+ ambiguous = sl->nitems_invalid_report;
+ for (idx = 0; idx < ambiguous; idx++)
+ ambiguous_values[idx] = idx;
+ }
+ return ambiguity_error
+ (clp, ambiguous, ambiguous_values, sl->items, sl->iopt,
+ "", complaint, arg);
+ } else
+ return 0;
+}
+
+
+static int
+finish_string_list(Clp_Parser *clp, int val_type, int flags,
+ Clp_Option *items, int nitems, int itemscap)
+{
+ int i, j;
+ Clp_StringList *clsl = (Clp_StringList *)malloc(sizeof(Clp_StringList));
+ Clp_InternOption *iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nitems);
+ if (!clsl || !iopt)
+ goto error;
+
+ clsl->items = items;
+ clsl->iopt = iopt;
+ 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++) {
+ iopt[i].ilong = iopt[i].ipos = 1;
+ iopt[i].ishort = iopt[i].ineg = iopt[i].ilongoff = iopt[i].iprefmatch = 0;
+ iopt[i].lmmpos = 1;
+ iopt[i].lmmpos_short = 0;
+ }
+ for (i = 0; i < nitems; i++)
+ for (j = 0; j < nitems; j++)
+ compare_options(clp, &items[i], &iopt[i], &items[j], &iopt[j]);
+
+ if (Clp_AddType(clp, val_type, 0, parse_string_list, clsl) >= 0)
+ return 0;
+
+ error:
+ if (clsl)
+ free(clsl);
+ if (iopt)
+ free(iopt);
+ return -1;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags string list flags
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * sets @a clp->val.i to an integer. The value string is matched against
+ * strings provided in the ellipsis arguments. For example, the
+ * Clp_AddStringListType() call below has the same effect as the
+ * Clp_AddStringListTypeVec() call:
+ *
+ * For example:
+ * @code
+ * Clp_AddStringListType(clp, 100, Clp_AllowNumbers, "cat", 1,
+ * "cattle", 2, "dog", 3, (const char *) NULL);
+ *
+ * const char * const strs[] = { "cat", "cattle", "dog" };
+ * const int vals[] = { 1, 2, 3 };
+ * Clp_AddStringListTypeVec(clp, 100, Clp_AllowNumbers, 3, strs, vals);
+ * @endcode
+ *
+ * @note The CLP library will not modify any of the passed-in strings. The
+ * calling program must not modify or free them either until the parser is
+ * destroyed.
+ */
+int
+Clp_AddStringListType(Clp_Parser *clp, int val_type, int flags, ...)
+{
+ 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, val_type, flags, items, nitems, itemscap) >= 0)
+ return 0;
+
+ error:
+ va_end(val);
+ if (items)
+ free(items);
+ return -1;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags string list flags
+ * @param nstrs number of strings in list
+ * @param strs array of strings
+ * @param vals array of values
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * sets @a clp->val.i to an integer. The value string is matched against the
+ * @a strs. If there's a unique match, the corresponding entry from @a vals
+ * is returned. Unique prefix matches also work. Finally, if @a flags
+ * contains the Clp_AllowNumbers flag, then integers are also accepted.
+ *
+ * For example:
+ * @code
+ * const char * const strs[] = { "cat", "cattle", "dog" };
+ * const int vals[] = { 1, 2, 3 };
+ * Clp_AddStringListTypeVec(clp, 100, Clp_AllowNumbers, 3, strs, vals);
+ * @endcode
+ *
+ * Say that option <tt>--animal</tt> takes value type 100. Then:
+ *
+ * <ul>
+ * <li><tt>--animal=cat</tt> will succeed and set @a clp->val.i = 1.</li>
+ * <li><tt>--animal=cattle</tt> will succeed and set @a clp->val.i = 2.</li>
+ * <li><tt>--animal=dog</tt> will succeed and set @a clp->val.i = 3.</li>
+ * <li><tt>--animal=d</tt> will succeed and set @a clp->val.i = 3.</li>
+ * <li><tt>--animal=c</tt> will fail, since <tt>c</tt> is ambiguous.</li>
+ * <li><tt>--animal=4</tt> will succeed and set @a clp->val.i = 4.</li>
+ * </ul>
+ *
+ * @note The CLP library will not modify the contents of @a strs or @a vals.
+ * The calling program can modify the @a strs array, but the actual strings
+ * (for instance, @a strs[0] and @a strs[1]) must not be modified or freed
+ * until the parser is destroyed.
+ */
+int
+Clp_AddStringListTypeVec(Clp_Parser *clp, int val_type, int flags,
+ int nstrs, const char * const *strs,
+ const int *vals)
+ /* 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 = (nstrs < 5 ? 5 : nstrs);
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+ if (!items)
+ return -1;
+
+ /* copy over items */
+ for (i = 0; i < nstrs; i++) {
+ items[i].long_name = strs[i];
+ items[i].option_id = vals[i];
+ items[i].flags = 0;
+ }
+
+ if (finish_string_list(clp, val_type, flags, items, nstrs, itemscap) >= 0)
+ return 0;
+ else {
+ free(items);
+ return -1;
+ }
+}
+
+
+/*******
+ * Returning information
+ **/
+
+const char *
+Clp_ProgramName(Clp_Parser *clp)
+{
+ return clp->internal->program_name;
+}
+
+/** @param clp the parser
+ * @param name new program name
+ * @return previous program name
+ *
+ * The calling program should not modify or free @a name until @a clp itself
+ * is destroyed. */
+const char *
+Clp_SetProgramName(Clp_Parser *clp, const char *name)
+{
+ const char *old = clp->internal->program_name;
+ clp->internal->program_name = name;
+ return old;
+}
+
+
+/******
+ * Clp_ParserStates
+ **/
+
+/** @return the parser state
+ *
+ * A Clp_ParserState object can store a parsing state of a Clp_Parser object.
+ * This state specifies exactly how far the Clp_Parser has gotten in parsing
+ * an argument list. The Clp_SaveParser() and Clp_RestoreParser() functions
+ * can be used to save this state and then restore it later, allowing a
+ * Clp_Parser to switch among argument lists.
+ *
+ * The initial state is empty, in that after Clp_RestoreParser(clp, state),
+ * Clp_Next(clp) would return Clp_Done.
+ *
+ * Parser states can be saved and restored among different parser objects.
+ *
+ * @sa Clp_DeleteParserState, Clp_SaveParser, Clp_RestoreParser
+ */
+Clp_ParserState *
+Clp_NewParserState(void)
+{
+ Clp_ParserState *state = (Clp_ParserState *)malloc(sizeof(Clp_ParserState));
+ if (state) {
+ state->argv = 0;
+ state->argc = 0;
+ state->option_chars[0] = 0;
+ state->xtext = 0;
+ state->option_processing = 0;
+ state->opt_generation = 0;
+ state->current_option = -1;
+ state->is_short = 0;
+ state->whole_negated = 0;
+ state->current_short = 0;
+ state->negated_by_no = 0;
+ }
+ return state;
+}
+
+/** @param state parser state
+ *
+ * The memory associated with @a state is freed.
+ */
+void
+Clp_DeleteParserState(Clp_ParserState *state)
+{
+ free(state);
+}
+
+/** @param clp the parser
+ * @param state parser state
+ * @sa Clp_NewParserState, Clp_RestoreParser
+ */
+void
+Clp_SaveParser(const Clp_Parser *clp, Clp_ParserState *state)
+{
+ Clp_Internal *cli = clp->internal;
+ state->argv = cli->argv;
+ state->argc = cli->argc;
+ memcpy(state->option_chars, cli->option_chars, Clp_OptionCharsSize);
+ state->xtext = cli->xtext;
+
+ state->option_processing = cli->option_processing;
+ state->opt_generation = cli->opt_generation;
+ state->current_option = cli->current_option;
+ state->is_short = cli->is_short;
+ state->whole_negated = cli->whole_negated;
+ state->current_short = cli->current_short;
+ state->negated_by_no = cli->negated_by_no;
+}
+
+
+/** @param clp the parser
+ * @param state parser state
+ *
+ * The parser state in @a state is restored into @a clp. The next call to
+ * Clp_Next() will return the same result as it would have at the time @a
+ * state was saved (probably by Clp_SaveParser(@a clp, @a state)).
+ *
+ * A parser state contains information about arguments (argc and argv; see
+ * Clp_SetArguments()) and option processing (Clp_SetOptionProcessing()), but
+ * not about options (Clp_SetOptions()). Changes to options and value types
+ * are preserved across Clp_RestoreParser().
+ *
+ * @sa Clp_NewParserState, Clp_SaveParser
+ */
+void
+Clp_RestoreParser(Clp_Parser *clp, const Clp_ParserState *state)
+{
+ Clp_Internal *cli = clp->internal;
+ cli->argv = state->argv;
+ cli->argc = state->argc;
+ memcpy(cli->option_chars, state->option_chars, Clp_OptionCharsSize);
+ cli->xtext = state->xtext;
+ cli->option_processing = state->option_processing;
+ cli->is_short = state->is_short;
+ cli->whole_negated = state->whole_negated;
+ cli->current_short = state->current_short;
+ cli->negated_by_no = state->negated_by_no;
+ if (cli->opt_generation == state->opt_generation)
+ cli->current_option = state->current_option;
+ else
+ cli->current_option = -1;
+}
+
+
+/*******
+ * Clp_Next and its helpers
+ **/
+
+static void
+set_option_text(Clp_Internal *cli, const char *text, int n_option_chars)
+{
+ assert(n_option_chars < Clp_OptionCharsSize);
+ memcpy(cli->option_chars, text, n_option_chars);
+ cli->option_chars[n_option_chars] = 0;
+ cli->xtext = text + n_option_chars;
+}
+
+static int
+get_oclass(Clp_Parser *clp, const char *text, int *ocharskip)
+{
+ int c;
+ if (clp->internal->utf8) {
+ const char *s;
+ c = decode_utf8(text, &s);
+ *ocharskip = s - text;
+ } else {
+ c = (unsigned char) text[0];
+ *ocharskip = 1;
+ }
+ return Clp_OptionChar(clp, c);
+}
+
+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_val = 1, and sets clp->vstr 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 oclass, ocharskip;
+
+ /* clear relevant flags */
+ clp->have_val = 0;
+ clp->vstr = 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->xtext += clp_utf8_charlen(cli, cli->xtext);
+ if (cli->xtext[0] == 0)
+ cli->is_short = 0;
+ else if (want_argument > 0) {
+ /* handle -O[=]argument case */
+ clp->have_val = 1;
+ if (cli->xtext[0] == '=')
+ clp->vstr = cli->xtext + 1;
+ else
+ clp->vstr = cli->xtext;
+ 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->xtext = 0;
+
+ if (cli->argc <= 1)
+ return 0;
+
+ cli->argc--;
+ cli->argv++;
+ text = cli->argv[0];
+
+ if (want_argument > 1)
+ goto not_option;
+
+ if (text[0] == '-' && text[1] == '-') {
+ oclass = Clp_DoubledLong;
+ ocharskip = 2;
+ } else
+ oclass = get_oclass(clp, text, &ocharskip);
+
+ /* 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 ((oclass & (Clp_Short | Clp_ShortNegated))
+ && (oclass & (Clp_Long | Clp_LongNegated))) {
+ oclass &= ~(Clp_Short | Clp_ShortNegated);
+ if (text[ocharskip])
+ cli->could_be_short = 1;
+ }
+
+ switch (oclass) {
+
+ 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[ocharskip])
+ goto not_option;
+ set_option_text(cli, text, ocharskip);
+ 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, ocharskip);
+ break;
+
+ not_option:
+ case Clp_NotOption:
+ cli->is_short = 0;
+ clp->have_val = 1;
+ clp->vstr = 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 ocharskip, oclass = get_oclass(clp, text, &ocharskip);
+ assert(cli->could_be_short);
+ cli->is_short = 1;
+ cli->whole_negated = (oclass & Clp_ShortNegated ? 1 : 0);
+ set_option_text(cli, cli->argv[0], ocharskip);
+}
+
+
+static int
+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_val = 1 and clp->vstr to that argument. Sets cli->ambiguous
+ to 1 iff there was no match because the argument was ambiguous. */
+{
+ Clp_Internal *cli = clp->internal;
+ int optno, len, lmm;
+ const Clp_Option *opt = cli->opt;
+ const Clp_InternOption *iopt;
+ int first_negative_ambiguous;
+
+ /* Look for a normal option. */
+ optno = find_prefix_opt
+ (clp, arg, cli->nopt, opt, cli->iopt,
+ &cli->ambiguous, cli->ambiguous_values);
+ if (optno >= 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;
+ optno = find_prefix_opt
+ (clp, arg, cli->nopt, opt, cli->iopt,
+ &cli->ambiguous, cli->ambiguous_values);
+ if (optno >= 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 -1;
+
+ worked:
+ iopt = &cli->iopt[optno];
+ lmm = (clp->negated ? iopt->lmmneg : iopt->lmmpos);
+ if (cli->could_be_short
+ && (clp->negated ? iopt->lmmneg_short : iopt->lmmpos_short)) {
+ int first_charlen = clp_utf8_charlen(cli, arg);
+ lmm = (first_charlen >= lmm ? first_charlen + 1 : lmm);
+ }
+ len = argcmp(opt[optno].long_name + iopt->ilongoff, arg, lmm, 1);
+ assert(len > 0);
+ if (arg[len] == '=') {
+ clp->have_val = 1;
+ clp->vstr = arg + len + 1;
+ }
+ return optno;
+}
+
+
+static int
+find_short(Clp_Parser *clp, const char *text)
+ /* If short_name corresponds to one of clp's options, returns it. */
+{
+ Clp_Internal *cli = clp->internal;
+ const Clp_Option *opt = cli->opt;
+ const Clp_InternOption *iopt = cli->iopt;
+ int i, c;
+ if (clp->internal->utf8)
+ c = decode_utf8(text, 0);
+ else
+ c = (unsigned char) *text;
+
+ for (i = 0; i < cli->nopt; i++)
+ if (iopt[i].ishort && opt[i].short_name == c
+ && (clp->negated ? iopt[i].ineg : iopt[i].ipos))
+ return i;
+
+ return -1;
+}
+
+
+/** @param clp the parser
+ * @return option ID of next option
+ *
+ * Parse the next argument from the argument list, store information about
+ * that argument in the fields of @a clp, and return the option's ID.
+ *
+ * If an argument was successfully parsed, that option's ID is returned.
+ * Other possible return values are:
+ *
+ * <dl>
+ * <dt>Clp_Done</dt>
+ * <dd>There are no more arguments.</dd>
+ * <dt>Clp_NotOption</dt>
+ * <dd>The next argument was not an option. The argument's text is @a
+ * clp->vstr (and @a clp->val.s).</dd>
+ * <dt>Clp_BadOption</dt>
+ * <dd>The next argument was a bad option: either an option that wasn't
+ * understood, or an option lacking a required value, or an option whose value
+ * couldn't be parsed. The option has been skipped.</dd>
+ * <dt>Clp_Error</dt>
+ * <dd>There was an internal error. This should never occur unless a user
+ * messes with, for example, a Clp_Option array.</dd>
+ * </dl>
+ *
+ * The fields of @a clp are set as follows.
+ *
+ * <dl>
+ * <dt><tt>negated</tt></dt>
+ * <dd>1 if the option was negated, 0 if it wasn't.</dd>
+ * <dt><tt>have_val</tt></dt>
+ * <dd>1 if the option had a value, 0 if it didn't. Note that negated options
+ * are not allowed to have values.</dd>
+ * <dt><tt>vstr</tt></dt>
+ * <dd>The value string, if any. NULL if there was no value.</dd>
+ * <dt><tt>val</tt></dt>
+ * <dd>An option's value type will parse the value string into this
+ * union.</dd>
+ * </dl>
+ *
+ * The parsed argument is shifted off the argument list, so that sequential
+ * calls to Clp_Next() step through the arugment list.
+ */
+int
+Clp_Next(Clp_Parser *clp)
+{
+ Clp_Internal *cli = clp->internal;
+ int optno;
+ const Clp_Option *opt;
+ Clp_ParserState clpsave;
+ int vtpos, complain;
+
+ /* Set up clp */
+ cli->current_option = -1;
+ cli->ambiguous = 0;
+
+ /* Get the next argument or option */
+ if (!next_argument(clp, cli->option_processing ? 0 : 2)) {
+ clp->val.s = clp->vstr;
+ clp->opt = clp->have_val ? Clp_NotOption : Clp_Done;
+ return clp->opt;
+ }
+
+ clp->negated = cli->whole_negated;
+ if (cli->is_short)
+ optno = find_short(clp, cli->xtext);
+ else
+ optno = find_long(clp, cli->xtext);
+
+ /* If there's ambiguity between long & short options, and we couldn't
+ find a long option, look for a short option */
+ if (optno < 0 && cli->could_be_short) {
+ switch_to_short_argument(clp);
+ optno = find_short(clp, cli->xtext);
+ }
+
+ /* If we didn't find an option... */
+ if (optno < 0 || (clp->negated && !cli->iopt[optno].ineg)) {
+ /* 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->iopt, cli->option_chars,
+ "option %<%s%s%> is ambiguous",
+ cli->option_chars, cli->xtext);
+ else if (cli->is_short && !cli->could_be_short)
+ Clp_OptionError(clp, "unrecognized option %<%s%C%>",
+ cli->option_chars, cli->xtext);
+ else
+ Clp_OptionError(clp, "unrecognized option %<%s%s%>",
+ cli->option_chars, cli->xtext);
+
+ return (clp->opt = Clp_BadOption);
+ }
+
+ /* Set the current option */
+ cli->current_option = optno;
+ 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
+ || (!cli->iopt[optno].imandatory && !cli->iopt[optno].ioptional)) {
+ if (clp->have_val) {
+ Clp_OptionError(clp, "%<%O%> can%,t take an argument");
+ clp->opt = Clp_BadOption;
+ } else
+ clp->opt = cli->opt[optno].option_id;
+ return clp->opt;
+ }
+
+ /* Get an argument if we need one, or if it's optional */
+ /* Sanity-check the argument type. */
+ opt = &cli->opt[optno];
+ if (opt->val_type <= 0)
+ return (clp->opt = Clp_Error);
+ vtpos = val_type_binsearch(cli, opt->val_type);
+ if (vtpos == cli->nvaltype || cli->valtype[vtpos].val_type != opt->val_type)
+ return (clp->opt = Clp_Error);
+
+ /* complain == 1 only if the argument was explicitly given,
+ or it is mandatory. */
+ complain = (clp->have_val != 0) || cli->iopt[optno].imandatory;
+ Clp_SaveParser(clp, &clpsave);
+
+ if (cli->iopt[optno].imandatory && !clp->have_val) {
+ /* 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 = (cli->valtype[vtpos].flags & Clp_DisallowOptions) != 0;
+ next_argument(clp, disallow ? 1 : 2);
+ if (!clp->have_val) {
+ int got_option = cli->xtext != 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->opt = Clp_BadOption);
+ }
+
+ } else if (cli->is_short && !clp->have_val
+ && cli->xtext[clp_utf8_charlen(cli, cli->xtext)]) {
+ /* The -[option]argument case:
+ Assume that the rest of the current string is the argument. */
+ next_argument(clp, 1);
+ complain = 1;
+ }
+
+ /* Parse the argument */
+ if (clp->have_val) {
+ Clp_ValType *atr = &cli->valtype[vtpos];
+ if (atr->func(clp, clp->vstr, complain, atr->user_data) <= 0) {
+ /* parser failed */
+ clp->have_val = 0;
+ if (complain)
+ return (clp->opt = Clp_BadOption);
+ else
+ Clp_RestoreParser(clp, &clpsave);
+ }
+ }
+
+ return (clp->opt = opt->option_id);
+}
+
+
+/** @param clp the parser
+ * @param allow_options whether options will be allowed
+ *
+ * Remove and return the next argument from @a clp's argument array. If there
+ * are no arguments left, or if the next argument is an option and @a
+ * allow_options != 0, then returns null.
+ */
+const char *
+Clp_Shift(Clp_Parser *clp, int allow_options)
+ /* 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_options ? 2 : 1);
+ if (!clp->have_val)
+ Clp_RestoreParser(clp, &clpsave);
+ return clp->vstr;
+}
+
+
+/*******
+ * 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)
+{
+ Clp_Internal *cli = clp->internal;
+ const char *percent;
+ int c;
+
+ if (!bs)
+ bs = new_build_string();
+ if (!bs)
+ return 0;
+ if (cli->program_name && cli->program_name[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': {
+ const char *s = va_arg(val, const char *);
+ if (s)
+ append_build_string(bs, s, -1);
+ else
+ append_build_string(bs, "(null)", 6);
+ break;
+ }
+
+ case 'C': {
+ const char *s = va_arg(val, const char *);
+ if (cli->utf8)
+ c = decode_utf8(s, 0);
+ else
+ c = (unsigned char) *s;
+ goto char_c;
+ }
+
+ case 'c':
+ c = va_arg(val, int);
+ goto char_c;
+
+ char_c:
+ 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 if (cli->utf8 && c >= 127 && c < 0x110000) {
+ bs->pos = encode_utf8(bs->pos, 4, c);
+ } else if (c >= 127 && c <= 255) {
+ sprintf(bs->pos, "\\%03o", c & 0xFF);
+ bs->pos += 4;
+ } else {
+ *bs->pos++ = '\\';
+ *bs->pos++ = '?';
+ }
+ }
+ 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': {
+ int optno = cli->current_option;
+ const Clp_Option *opt = &cli->opt[optno];
+ if (optno < 0)
+ 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, 5)) {
+ if (cli->utf8)
+ bs->pos = encode_utf8(bs->pos, 5, opt->short_name);
+ else
+ *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 + cli->iopt[optno].ilongoff, -1);
+ } else {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, opt->long_name + cli->iopt[optno].ilongoff, -1);
+ }
+ break;
+ }
+
+ case '%':
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = '%';
+ break;
+
+ case '`': /* backwards compatibility */
+ case '<':
+ append_build_string(bs, (cli->utf8 ? "\342\200\230" : "'"), -1);
+ break;
+
+ case '\'': /* backwards compatibility */
+ case ',':
+ case '>':
+ append_build_string(bs, (cli->utf8 ? "\342\200\231" : "'"), -1);
+ 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)(clp, text);
+ else
+ fputs(text, stderr);
+}
+
+/** @param clp the parser
+ * @param format error format
+ *
+ * Format an error message from @a format and any additional arguments in the
+ * ellipsis. The resulting error string by printing it to standard error or
+ * passing it to Clp_SetErrorHandler.
+ *
+ * The following format characters are accepted:
+ *
+ * <dl>
+ * <dt><tt>%</tt><tt>c</tt></dt>
+ * <dd>A character (type <tt>int</tt>). Control characters are printed in
+ * caret notation. If the parser is in UTF-8 mode, the character is formatted
+ * in UTF-8. Otherwise, special characters are printed with backslashes and
+ * octal notation.</dd>
+ * <dt><tt>%</tt><tt>s</tt></dt>
+ * <dd>A string (type <tt>const char *</tt>).</dd>
+ * <dt><tt>%</tt><tt>C</tt></dt>
+ * <dd>The argument is a string (type <tt>const char *</tt>). The first
+ * character in this string is printed. If the parser is in UTF-8 mode, this
+ * may involve multiple bytes.</dd>
+ * <dt><tt>%</tt><tt>d</tt></dt>
+ * <dd>An integer (type <tt>int</tt>). Printed in decimal.</dd>
+ * <dt><tt>%</tt><tt>O</tt></dt>
+ * <dd>The current option. No values are read from the argument list; the
+ * current option is defined in the Clp_Parser object itself.</dd>
+ * <dt><tt>%%</tt></dt>
+ * <dd>Prints a percent character.</dd>
+ * <dt><tt>%</tt><tt>&lt;</tt></dt>
+ * <dd>Prints an open quote string. In UTF-8 mode, prints a left single
+ * quote. Otherwise prints a single quote.</dd>
+ * <dt><tt>%</tt><tt>&gt;</tt></dt>
+ * <dd>Prints a closing quote string. In UTF-8 mode, prints a right single
+ * quote. Otherwise prints a single quote.</dd>
+ * <dt><tt>%</tt><tt>,</tt></dt>
+ * <dd>Prints an apostrophe. In UTF-8 mode, prints a right single quote.
+ * Otherwise prints a single quote.</dd>
+ * </dl>
+ *
+ * Note that no flag characters, precision, or field width characters are
+ * currently supported.
+ *
+ * @sa Clp_SetErrorHandler
+ */
+int
+Clp_OptionError(Clp_Parser *clp, const char *format, ...)
+{
+ Clp_BuildString *bs;
+ va_list val;
+ va_start(val, format);
+ bs = Clp_VaOptionError(clp, 0, format, 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,
+ const Clp_Option *opt, const Clp_InternOption *iopt,
+ const char *prefix, const char *fmt, ...)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_BuildString *bs;
+ int i;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ if (!bs) goto done;
+
+ if (clp->internal->program_name && clp->internal->program_name[0]) {
+ append_build_string(bs, clp->internal->program_name, -1);
+ append_build_string(bs, ": ", 2);
+ }
+ 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, (cli->utf8 ? "\342\200\230" : "'"), -1);
+ append_build_string(bs, prefix, -1);
+ append_build_string(bs, no_dash, -1);
+ append_build_string(bs, opt[value].long_name + iopt[value].ilongoff, -1);
+ append_build_string(bs, (cli->utf8 ? "\342\200\231" : "'"), -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;
+}
+
+/** @param clp the parser
+ * @param buf output buffer
+ * @param len length of output buffer
+ * @return number of characters written to the buffer, not including the terminating NUL
+ *
+ * A string that looks like the last option parsed by @a clp is extracted into
+ * @a buf. The correct option characters are put into the string first,
+ * followed by the option text. The output buffer is null-terminated unless
+ * @a len == 0.
+ *
+ * @sa Clp_CurOptionName
+ */
+int
+Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int len)
+{
+ Clp_Internal *cli = clp->internal;
+ int optno = cli->current_option;
+ int pos = 0;
+ if (optno < 0)
+ pos += copy_string(buf, len, pos, "(no current option!)");
+ else if (cli->current_short) {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ if (cli->utf8)
+ pos = (encode_utf8(buf + pos, len - pos - 1, cli->opt[optno].short_name) - buf);
+ else if (pos < len - 1)
+ buf[pos++] = cli->opt[optno].short_name;
+ } else if (cli->negated_by_no) {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ pos += copy_string(buf, len, pos, "no-");
+ pos += copy_string(buf, len, pos, cli->opt[optno].long_name + cli->iopt[optno].ilongoff);
+ } else {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ pos += copy_string(buf, len, pos, cli->opt[optno].long_name + cli->iopt[optno].ilongoff);
+ }
+ if (pos < len)
+ buf[pos] = 0;
+ return pos;
+}
+
+/** @param clp the parser
+ * @return string describing the current option
+ *
+ * This function acts like Clp_CurOptionNameBuf(), but returns a pointer into
+ * a static buffer that will be rewritten on the next call to
+ * Clp_CurOptionName().
+ *
+ * @note This function is not thread safe.
+ *
+ * @sa Clp_CurOptionName
+ */
+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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/error.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/error.cc
new file mode 100644
index 00000000000..cfef2f07de9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/error.cc
@@ -0,0 +1,1169 @@
+// -*- 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-2013 Eddie Kohler
+ * Copyright (c) 2008 Meraki, Inc.
+ *
+ * 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>
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+#endif
+
+/** @file error.hh
+ * @brief Flexible error handling classes.
+ */
+
+struct ErrorHandler::Conversion {
+ String name;
+ ConversionFunction hook;
+ Conversion *next;
+};
+static ErrorHandler::Conversion *error_items;
+
+const char ErrorHandler::e_abort[] = "<-999>";
+const char ErrorHandler::e_fatal[] = "<-1>";
+const char ErrorHandler::e_emergency[] = "<0>";
+const char ErrorHandler::e_alert[] = "<1>";
+const char ErrorHandler::e_critical[] = "<2>";
+const char ErrorHandler::e_error[] = "<3>";
+const char ErrorHandler::e_warning[] = "<4>";
+const char ErrorHandler::e_warning_annotated[] = "<4>warning: ";
+const char ErrorHandler::e_notice[] = "<5>";
+const char ErrorHandler::e_info[] = "<6>";
+const char ErrorHandler::e_debug[] = "<7>";
+
+const int ErrorHandler::ok_result = 0;
+const int ErrorHandler::error_result = -EINVAL;
+
+ErrorHandler *ErrorHandler::the_default_handler = 0;
+ErrorHandler *ErrorHandler::the_silent_handler = 0;
+
+
+// ANNOTATION MANAGEMENT
+
+static const char *
+parse_level(const char *begin, const char *end, int *result)
+{
+ int x = 0;
+ const char *s = begin;
+
+ bool negative = false;
+ if (s != end && *s == '-') {
+ negative = true;
+ ++s;
+ } else if (s != end && *s == '+')
+ ++s;
+
+ const char *digits = s;
+ for (; s != end && *s >= '0' && *s <= '9'; ++s)
+ x = x * 10 + *s - '0';
+
+ if (s != end && *s == '.')
+ for (++s; s != end && *s >= '0' && *s <= '9'; ++s)
+ /* nada */;
+
+ if (s == digits || (s == digits + 1 && s[-1] == '.'))
+ return begin;
+ if (result)
+ *result = (negative ? -x : x);
+ return s;
+}
+
+String
+ErrorHandler::make_anno(const char *name, const String &value)
+{
+ StringAccum sa;
+ sa.reserve(value.length() + 10);
+
+ // level annotation requires special handling
+ if (name[0] == '<' && name[1] == '>' && name[2] == 0) {
+ if (parse_level(value.begin(), value.end(), 0) == value.end()) {
+ sa << '<' << value << '>';
+ return sa.take_string();
+ } else
+ return String();
+ }
+
+ sa << '{' << name << ':';
+ const char *last = value.begin(), *end = value.end();
+ for (const char *s = value.begin(); s != end; ++s)
+ if (*s == '\\' || *s == '}') {
+ sa.append(last, s);
+ sa << '\\' << *s;
+ last = s + 1;
+ } else if (*s == '\n') {
+ sa.append(last, s);
+ sa << '\\' << 'n';
+ last = s + 1;
+ }
+ sa.append(last, end);
+ sa << '}';
+ return sa.take_string();
+}
+
+const char *
+ErrorHandler::skip_anno(const String &str, const char *begin, const char *end,
+ String *name_result, String *value_result, bool raw)
+{
+ String name, value;
+ const char *s = begin;
+
+ if (s + 3 <= end && *s == '<') {
+ const char *x = parse_level(s + 1, end, 0);
+ if (x != s + 1 && x != end && *x == '>') {
+ name = String::make_stable("<>", 2);
+ if (str)
+ value = str.substring(begin + 1, x);
+ begin = x + 1;
+ }
+
+ } else if (s + 2 <= end && *s == '{' && s[1] == '}')
+ begin = s + 2;
+
+ else if (s + 3 <= end && *s == '{' && str) {
+ for (++s; s != end && isalnum((unsigned char) *s); ++s)
+ /* nada */;
+ if (s == end || s == begin + 1 || (*s != '}' && *s != ':'))
+ /* not an annotation */;
+ else if (*s == '}' && str) {
+ name = str.substring(begin + 1, s);
+ begin = s + 1;
+ } else if (*s == '}') {
+ name = String::make_stable("{}", 2);
+ begin = s + 1;
+ } else if (str) {
+ const char *x, *last = s + 1;
+ StringAccum sa;
+ for (x = s + 1; x != end && *x != '\n' && *x != '}'; ++x)
+ if (*x == '\\' && x + 1 != end && x[1] != '\n') {
+ if (!raw) {
+ sa.append(last, x);
+ sa << (x[1] == 'n' ? '\n' : x[1]);
+ last = x + 2;
+ }
+ ++x;
+ }
+ if (x != end && *x == '}') {
+ name = str.substring(begin + 1, s);
+ if (sa) {
+ sa.append(last, x);
+ value = sa.take_string();
+ } else
+ value = str.substring(s + 1, x);
+ begin = x + 1;
+ }
+ } else {
+ const char *x;
+ for (x = s + 1; x != end && *x != '\n' && *x != '}'; ++x)
+ if (*x == '\\' && x + 1 != end && x[1] != '\n')
+ ++x;
+ if (x != end && *x == '}') {
+ name = String::make_stable("{}", 2);
+ begin = x + 1;
+ }
+ }
+ }
+
+ if (name_result)
+ *name_result = name;
+ if (value_result)
+ *value_result = value;
+ return begin;
+}
+
+const char *
+ErrorHandler::parse_anno(const String &str, const char *begin, const char *end,
+ ...)
+{
+ const char *names[8];
+ void *values[8];
+ int nanno = 0;
+
+ va_list val;
+ va_start(val, end);
+ while (const char *n = va_arg(val, const char *)) {
+ assert(nanno < 8);
+ names[nanno] = n;
+ if (n[0] == '#')
+ values[nanno] = va_arg(val, int *);
+ else
+ values[nanno] = va_arg(val, String *);
+ ++nanno;
+ }
+
+ String name, value;
+ while (1) {
+ begin = skip_anno(str, begin, end, &name, &value, false);
+ if (!name)
+ break;
+ for (int i = 0; i < nanno; ++i)
+ if (names[i][0] == '#') {
+ if (name == (names[i] + 1))
+ parse_level(value.begin(), value.end(), (int *) values[i]);
+ } else {
+ if (name == names[i])
+ *(String *) values[i] = value;
+ }
+ }
+
+ return begin;
+}
+
+String
+ErrorHandler::combine_anno(const String &text, const String &anno)
+{
+ if (!anno)
+ return text;
+
+ String names[8], values[8];
+ int nanno = 0;
+ const char *abegin = anno.begin();
+ while (abegin != anno.end()) {
+ assert(nanno < 8);
+ abegin = skip_anno(anno, abegin, anno.end(), &names[nanno], &values[nanno], true);
+ if (names[nanno])
+ ++nanno;
+ else
+ break;
+ }
+
+ const char *last = text.begin(), *s = last;
+ String name;
+ StringAccum sa;
+ while (s != text.end()) {
+ const char *line = s;
+ uint32_t mask = (1U << nanno) - 1;
+ while (1) {
+ s = skip_anno(text, s, text.end(), &name, 0, false);
+ if (!name)
+ break;
+ for (int i = 0; i < nanno; ++i)
+ if (name == names[i])
+ mask &= ~(1U << i);
+ }
+
+ if (mask) {
+ sa.append(last, line);
+ for (int i = 0; i < nanno; ++i)
+ if (mask & (1U << i)) {
+ if (names[i].equals("<>", 2))
+ sa << '<' << values[i] << '>';
+ else
+ sa << '{' << names[i] << ':' << values[i] << '}';
+ }
+ last = line;
+ }
+ if (abegin != anno.end()) {
+ sa.append(last, s);
+ sa.append(abegin, anno.end());
+ last = s;
+ }
+
+ while (s != text.end() && *s != '\n')
+ ++s;
+ if (s != text.end())
+ ++s;
+ }
+
+ if (sa) {
+ sa.append(last, text.end());
+ return sa.take_string();
+ } else
+ return text;
+}
+
+String
+ErrorHandler::clean_landmark(const String &landmark, bool with_colon)
+{
+ const char *end = landmark.end();
+ while (end != landmark.begin() && isspace((unsigned char) end[-1]))
+ --end;
+ if (end != landmark.begin() && end[-1] == ':')
+ --end;
+ if (end == landmark.begin())
+ return String();
+ else if (with_colon)
+ return landmark.substring(landmark.begin(), end) + ": ";
+ else
+ return landmark.substring(landmark.begin(), end);
+}
+
+
+// FORMATTING
+
+#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::cf_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 cf_alternate_form for zero results in base 16
+ if ((flags & ErrH::cf_alternate_form) && base == 16 && *pos == '0')
+ flags &= ~ErrH::cf_alternate_form;
+
+ // account for zero padding
+ if (precision >= 0)
+ while (after_last - pos < precision)
+ *--pos = '0';
+ else if (flags & ErrH::cf_zero_pad) {
+ if ((flags & ErrH::cf_alternate_form) && base == 16)
+ field_width -= 2;
+ if ((flags & ErrH::cf_negative)
+ || (flags & (ErrH::cf_plus_positive | ErrH::cf_space_positive)))
+ field_width--;
+ while (after_last - pos < field_width)
+ *--pos = '0';
+ }
+
+ // alternate forms
+ if ((flags & ErrH::cf_alternate_form) && base == 8 && pos[1] != '0')
+ *--pos = '0';
+ else if ((flags & ErrH::cf_alternate_form) && base == 16) {
+ *--pos = ((flags & ErrH::cf_uppercase) ? 'X' : 'x');
+ *--pos = '0';
+ }
+
+ // sign
+ if (flags & ErrH::cf_negative)
+ *--pos = '-';
+ else if (flags & ErrH::cf_plus_positive)
+ *--pos = '+';
+ else if (flags & ErrH::cf_space_positive)
+ *--pos = ' ';
+
+ return pos;
+}
+
+String
+ErrorHandler::vxformat(int default_flags, const char *s, va_list val)
+{
+ StringAccum msg;
+
+ char numbuf[NUMBUF_SIZE]; // for numerics
+ numbuf[NUMBUF_SIZE-1] = 0;
+
+ String strstore; // to ensure temporaries aren't destroyed
+
+ // 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, '%');
+ if (!pct) {
+ if (*s)
+ msg << s;
+ break;
+ }
+ if (pct != s) {
+ msg.append(s, pct - s);
+ s = pct;
+ }
+
+ // parse flags
+ flags = default_flags;
+ flags:
+ switch (*++s) {
+ case '#': flags |= cf_alternate_form; goto flags;
+ case '0': flags |= cf_zero_pad; goto flags;
+ case '-': flags |= cf_left_just; goto flags;
+ case ' ': flags |= cf_space_positive; goto flags;
+ case '+': flags |= cf_plus_positive; goto flags;
+ case '\'': flags |= cf_singlequote; goto flags;
+ case '_': flags &= ~cf_utf8; 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 |= cf_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': case 'l':
+ if (width_flag == *s)
+ width_flag = *s + 'A' - 'a';
+ else if (width_flag)
+ break;
+ else
+ width_flag = *s;
+ s++;
+ goto width_flags;
+ case 'z':
+ if (width_flag)
+ break;
+ width_flag = *s++;
+ break;
+ case '^':
+ if (!isdigit((unsigned char) s[1]) || width_flag)
+ break;
+ for (s++; isdigit((unsigned char) *s); s++)
+ width_flag = width_flag * 10 + *s - '0';
+ width_flag = -width_flag;
+ break;
+ }
+
+ // 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)";
+
+ // fetch length
+ int len;
+ if (precision < 0)
+ len = strlen(s1);
+ else
+ len = strnlen(s1, precision);
+
+ // transform string if alternate form
+ if (flags & cf_alternate_form) {
+ strstore = String(s1, len).printable();
+ if (precision < 0 || strstore.length() < precision)
+ len = strstore.length();
+ }
+
+ // quote characters that look like annotations, readjusting length
+ if (flags & (cf_singlequote | cf_alternate_form)) {
+ if (!(flags & cf_alternate_form))
+ strstore = String(s1, len);
+
+ // check first line, considering trailing part of 'msg'
+ const char *mbegin = msg.end();
+ while (mbegin != msg.begin() && mbegin[-1] != '\n')
+ --mbegin;
+ if (skip_anno(strstore.begin(), strstore.end()) != strstore.begin()
+ && skip_anno(mbegin, msg.end()) == msg.end()) {
+ strstore = String::make_stable("{}", 2) + strstore;
+ len += 2;
+ }
+
+ // check subsequent lines
+ const char *s = std::find(strstore.begin(), strstore.end(), '\n');
+ while (s != strstore.end() && s + 1 != strstore.end()) {
+ size_t nextpos = (s + 1) - strstore.begin();
+ if (skip_anno(s + 1, strstore.end()) != s + 1) {
+ strstore = strstore.substring(strstore.begin(), s + 1)
+ + String::make_stable("{}", 2)
+ + strstore.substring(s + 1, strstore.end());
+ len += 2;
+ }
+ s = std::find(strstore.begin() + nextpos, strstore.end(), '\n');
+ }
+ }
+
+ // obtain begin and end pointers
+ if (flags & (cf_singlequote | cf_alternate_form))
+ s1 = strstore.begin();
+ s2 = s1 + len;
+ 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 '<':
+ s1 = (flags & cf_utf8 ? "\342\200\230" : "\'");
+ s2 = s1 + strlen(s1);
+ break;
+
+ case '>':
+ case ',':
+ s1 = (flags & cf_utf8 ? "\342\200\231" : "\'");
+ s2 = s1 + strlen(s1);
+ break;
+
+ case 'd':
+ case 'i':
+ flags |= cf_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;
+ switch (width_flag) {
+ case 'H':
+ case -8:
+ num = (unsigned char) va_arg(val, int);
+ if ((flags & cf_signed) && (signed char) num < 0)
+ num = -(signed char) num, flags |= cf_negative;
+ break;
+ case 'h':
+ case -16:
+ num = (unsigned short) va_arg(val, int);
+ if ((flags & cf_signed) && (short) num < 0)
+ num = -(short) num, flags |= cf_negative;
+ break;
+ case 0:
+ case -32:
+#if SIZEOF_LONG == 4
+ case 'l':
+#endif
+#if SIZEOF_SIZE_T == 4
+ case 'z':
+#endif
+ num = va_arg(val, unsigned);
+ if ((flags & cf_signed) && (int) num < 0)
+ num = -(int) num, flags |= cf_negative;
+ break;
+#if HAVE_INT64_TYPES
+# if SIZEOF_LONG == 8
+ case 'l':
+# endif
+# if SIZEOF_LONG_LONG == 8
+ case 'L':
+# endif
+# if SIZEOF_SIZE_T == 8
+ case 'z':
+# endif
+ case -64: {
+ uint64_t qnum = va_arg(val, uint64_t);
+ if ((flags & cf_signed) && (int64_t)qnum < 0)
+ qnum = -(int64_t) qnum, flags |= cf_negative;
+ StringAccum sa;
+ sa.append_numeric(static_cast<String::uintmax_t>(qnum), base, (flags & cf_uppercase));
+ s1 = s2 - sa.length();
+ memcpy(const_cast<char*>(s1), sa.data(), s2 - s1);
+ goto got_number;
+ }
+#endif
+ default:
+ goto error;
+ }
+ s1 = do_number(num, (char *)s2, base, flags);
+
+#if 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 |= cf_uppercase;
+ case 'x':
+ base = 16;
+ goto number;
+
+ case 'p': {
+ if (*s == '{') {
+ s1 = s2 = s + 1;
+ while (*s2 && *s2 != '}' && !isspace((unsigned char) *s2))
+ ++s2;
+ if (*s2 == '}')
+ goto braces;
+ }
+ 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 | cf_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 & cf_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 & ~cf_alternate_form, -1, field_width);
+ break;
+ }
+#endif
+
+ case '{':
+ s1 = s2 = s;
+ while (*s2 && *s2 != '}' && !isspace((unsigned char) *s2))
+ ++s2;
+ if (*s2 != '}')
+ goto error;
+ goto braces;
+
+ braces:
+ s = s2 + 1;
+ for (Conversion *item = error_items; item; item = item->next)
+ if (item->name.equals(s1, s2 - s1)) {
+ strstore = item->hook(flags, VA_LIST_REF(val));
+ s1 = strstore.begin();
+ s2 = strstore.end();
+ goto got_result;
+ }
+ goto error;
+
+ error:
+ 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 & cf_left_just) {
+ memcpy(dest, s1, slen);
+ memset(dest + slen, ' ', field_width - slen);
+ } else {
+ memcpy(dest + field_width - slen, s1, slen);
+ memset(dest, (flags & cf_zero_pad ? '0' : ' '), field_width - slen);
+ }
+ }
+
+ return msg.take_string();
+}
+
+String
+ErrorHandler::xformat(int default_flags, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vxformat(default_flags, fmt, val);
+ va_end(val);
+ return s;
+}
+
+String
+ErrorHandler::xformat(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vxformat(0, fmt, val);
+ va_end(val);
+ return s;
+}
+
+String
+ErrorHandler::format(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vformat(fmt, val);
+ va_end(val);
+ return s;
+}
+
+
+// ERROR MESSAGE SHORTHAND
+
+void
+ErrorHandler::debug(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ vxmessage(String::make_stable(e_debug, 3), fmt, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::message(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ vxmessage(String::make_stable(e_info, 3), fmt, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::warning(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ int r = vxmessage(String::make_stable(e_warning_annotated, 12), fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::error(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ int r = vxmessage(String::make_stable(e_error, 3), fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::fatal(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ int r = vxmessage(String::make_stable(e_fatal, 4), fmt, val);
+ va_end(val);
+ return r;
+}
+
+void
+ErrorHandler::ldebug(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ vxmessage(String::make_stable(e_debug, 3) + l, fmt, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::lmessage(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ vxmessage(String::make_stable(e_info, 3) + l, fmt, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::lwarning(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ int r = vxmessage(l + String::make_stable(e_warning_annotated, 12), fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::lerror(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ int r = vxmessage(String::make_stable(e_error, 3) + l, fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::lfatal(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ int r = vxmessage(String::make_stable(e_fatal, 4) + l, fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::xmessage(const String &str)
+{
+ String xstr = decorate(str);
+
+ int min_level = 1000, xlevel = 1000;
+ const char *s = xstr.begin(), *end = xstr.end();
+ void *user_data = 0;
+ while (s != end) {
+ const char *l = parse_anno(xstr, s, end, "#<>", &xlevel,
+ (const char *) 0);
+ const char *nl = std::find(l, end, '\n');
+ String line = xstr.substring(s, nl);
+ s = nl + (nl != end);
+ user_data = emit(line, user_data, s != end);
+ min_level = (xlevel < min_level ? xlevel : min_level);
+ }
+
+ account(min_level);
+
+ return (min_level <= el_warning ? error_result : ok_result);
+}
+
+String
+ErrorHandler::vformat(const char *fmt, va_list val)
+{
+ return vxformat(0, fmt, val);
+}
+
+String
+ErrorHandler::decorate(const String &str)
+{
+ return str;
+}
+
+void *
+ErrorHandler::emit(const String &, void *user_data, bool)
+{
+ return user_data;
+}
+
+
+#ifndef __KERNEL__
+//
+// FILE ERROR HANDLER
+//
+
+FileErrorHandler::FileErrorHandler(FILE *f, const String &context)
+ : _f(f), _context(context), _default_flags(0)
+{
+# if HAVE_UNISTD_H
+ if (isatty(fileno(_f))) {
+# endif
+ char *s = getenv("LANG");
+ if (s && (strstr(s, "UTF-8") != 0 || strstr(s, "UTF8") != 0
+ || strstr(s, "utf8") != 0))
+ _default_flags |= cf_utf8;
+# if HAVE_UNISTD_H
+ }
+# endif
+}
+
+String
+FileErrorHandler::vformat(const char *fmt, va_list val)
+{
+ return vxformat(_default_flags, fmt, val);
+}
+
+void *
+FileErrorHandler::emit(const String &str, void *, bool)
+{
+ String landmark;
+ const char *s = parse_anno(str, str.begin(), str.end(),
+ "l", &landmark, (const char *) 0);
+ StringAccum sa;
+ sa << _context << clean_landmark(landmark, true)
+ << str.substring(s, str.end()) << '\n';
+ ssize_t result = fwrite(sa.begin(), 1, sa.length(), _f);
+ (void) result;
+ return 0;
+}
+
+void
+FileErrorHandler::account(int level)
+{
+ ErrorHandler::account(level);
+ if (level <= el_abort)
+ abort();
+ else if (level <= el_fatal)
+ exit(-level);
+}
+
+#endif
+
+
+//
+// STATIC ERROR HANDLERS
+//
+
+ErrorHandler::Conversion *
+ErrorHandler::add_conversion(const String &name, ConversionFunction function)
+{
+ if (Conversion *c = new Conversion) {
+ c->name = name;
+ c->hook = function;
+ 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)
+{
+ if (!the_silent_handler) {
+ the_default_handler = default_handler;
+ the_silent_handler = new SilentErrorHandler;
+ }
+ return 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;
+ }
+}
+
+void
+ErrorHandler::set_default_handler(ErrorHandler *errh)
+{
+ the_default_handler = errh;
+}
+
+
+//
+// ERROR VENEER
+//
+
+String
+ErrorVeneer::vformat(const char *fmt, va_list val)
+{
+ if (_errh)
+ return _errh->vformat(fmt, val);
+ else
+ return ErrorHandler::vformat(fmt, val);
+}
+
+String
+ErrorVeneer::decorate(const String &str)
+{
+ if (_errh)
+ return _errh->decorate(str);
+ else
+ return ErrorHandler::decorate(str);
+}
+
+void *
+ErrorVeneer::emit(const String &str, void *user_data, bool more)
+{
+ if (_errh)
+ return _errh->emit(str, user_data, more);
+ else
+ return ErrorHandler::emit(str, user_data, more);
+}
+
+void
+ErrorVeneer::account(int level)
+{
+ ErrorHandler::account(level);
+ if (_errh)
+ _errh->account(level);
+}
+
+
+//
+// CONTEXT ERROR HANDLER
+//
+
+ContextErrorHandler::ContextErrorHandler(ErrorHandler *errh, const char *fmt,
+ ...)
+ : ErrorVeneer(errh), _indent(String::make_stable(" ", 2)),
+ _context_printed(false)
+{
+ va_list val;
+ va_start(val, fmt);
+ _context = ErrorVeneer::vformat(fmt, val);
+ va_end(val);
+ if (_context)
+ _context = combine_anno(_context, String::make_stable("{context:context}", 17));
+}
+
+String
+ContextErrorHandler::decorate(const String &str)
+{
+ String context_anno;
+ const char *str_endanno = parse_anno(str, str.begin(), str.end(),
+ "context", &context_anno,
+ (const char *) 0);
+ if (context_anno.equals("no", 2))
+ return ErrorVeneer::decorate(str);
+
+ String istr;
+ if (context_anno.equals("noindent", 8))
+ istr = combine_anno(str, _context_landmark);
+ else
+ istr = combine_anno(str, _context_landmark + _indent);
+
+ if (!_context_printed && !context_anno.equals("nocontext", 9)) {
+ String astr = combine_anno(combine_anno(_context, _context_landmark),
+ str.substring(str.begin(), str_endanno));
+ if (astr && astr.back() != '\n')
+ astr += '\n';
+ _context_printed = true;
+ return ErrorVeneer::decorate(astr + istr);
+ } else
+ return ErrorVeneer::decorate(istr);
+}
+
+
+//
+// PREFIX ERROR HANDLER
+//
+
+PrefixErrorHandler::PrefixErrorHandler(ErrorHandler *errh,
+ const String &prefix)
+ : ErrorVeneer(errh), _prefix(prefix)
+{
+}
+
+String
+PrefixErrorHandler::decorate(const String &str)
+{
+ return ErrorVeneer::decorate(combine_anno(str, _prefix));
+}
+
+
+//
+// LANDMARK ERROR HANDLER
+//
+
+LandmarkErrorHandler::LandmarkErrorHandler(ErrorHandler *errh, const String &landmark)
+ : ErrorVeneer(errh), _landmark(make_landmark_anno(landmark))
+{
+}
+
+String
+LandmarkErrorHandler::decorate(const String &str)
+{
+ return ErrorVeneer::decorate(combine_anno(str, _landmark));
+}
+
+
+//
+// BAIL ERROR HANDLER
+//
+
+#ifndef __KERNEL__
+
+BailErrorHandler::BailErrorHandler(ErrorHandler *errh, int l)
+ : ErrorVeneer(errh), _level(l)
+{
+}
+
+void
+BailErrorHandler::account(int level)
+{
+ ErrorVeneer::account(level);
+ if (level <= _level)
+ exit(1);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/filename.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/filename.cc
new file mode 100644
index 00000000000..396e81cd3c5
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/filename.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/lcdf/filename.hh" -*-
+
+/* filename.{cc,hh} -- filenames
+ *
+ * Copyright (c) 1999-2012 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(), "wb");
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/fixlibc.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/fixlibc.c
new file mode 100644
index 00000000000..d41238daf85
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/fixlibc.c
@@ -0,0 +1,73 @@
+/* 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
+
+#if !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
+
+#if !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
+
+#if HAVE_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((unsigned char) (*endptr)[-1]))
+ (*endptr)--;
+ return d;
+}
+#endif
+
+#if !HAVE_STRNLEN || HAVE_BROKEN_STRNLEN
+size_t
+strnlen(const char *s, size_t maxlen)
+{
+ const char *p = (const char *) memchr(s, 0, maxlen);
+ return p ? p - s : maxlen;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/globmatch.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/globmatch.cc
new file mode 100644
index 00000000000..dcd7afc135c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/landmark.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/landmark.cc
new file mode 100644
index 00000000000..68511055ddc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/landmark.cc
@@ -0,0 +1,36 @@
+// -*- related-file-name: "../include/lcdf/landmark.hh" -*-
+
+/* landmark.{cc,hh} -- FILE:LINE type landmarks
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/md5.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/md5.c
new file mode 100644
index 00000000000..557a39bef95
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/md5.c
@@ -0,0 +1,357 @@
+/* -*- mode: c; c-basic-offset: 8; related-file-name: "../include/lcdf/md5.h" -*- */
+/* 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 <lcdf/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/****************
+ * Rotate a 32 bit integer by n bits
+ */
+#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;
+
+#if WORDS_BIGENDIAN
+ {
+ 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++;
+ }
+ }
+#elif WORDS_LITTLEENDIAN
+ memcpy(correct_words, data, 64);
+#else
+# error "Neither WORDS_BIGENDIAN nor WORDS_LITTLEENDIAN is defined!"
+#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;
+#if WORDS_BIGENDIAN
+#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \
+ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
+#elif WORDS_LITTLEENDIAN
+ /*#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)
+#else
+# error "Neither WORDS_BIGENDIAN nor WORDS_LITTLEENDIAN is defined!"
+#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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/permstr.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/permstr.cc
new file mode 100644
index 00000000000..c6aebab31e7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/permstr.cc
@@ -0,0 +1,319 @@
+// -*- related-file-name: "../include/lcdf/permstr.hh" -*-
+
+/* permstr.{cc,hh} -- permanent strings
+ *
+ * Copyright (c) 1998-2012 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)
+{
+ const unsigned char* m = reinterpret_cast<const unsigned char*>(s);
+ const 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 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;
+}
+
+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':
+ assert(iflag == -1 /* Too many decimal flags in permprintf */);
+ iflag = 0;
+ while (*s >= '0' && *s <= '9') {
+ iflag = iflag * 10 + *s - '0';
+ s++;
+ }
+ break;
+
+ case '*':
+ assert(iflag == -1 /* 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 a, PermString b)
+{
+ if (!a || !b)
+ return a ? a : b;
+ unsigned al = a.length();
+ unsigned bl = b.length();
+ char *s = new char[al + bl];
+ memcpy(s, a.c_str(), al);
+ memcpy(s + al, b.c_str(), bl);
+ PermString p(s, al + bl);
+ delete[] s;
+ return p;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/point.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/point.cc
new file mode 100644
index 00000000000..8b23fdcb571
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/point.cc
@@ -0,0 +1,57 @@
+// -*- related-file-name: "../include/lcdf/point.hh" -*-
+
+/* point.{cc,hh} -- 2D points
+ *
+ * Copyright (c) 1998-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/slurper.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/slurper.cc
new file mode 100644
index 00000000000..e089617705d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/straccum.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/straccum.cc
new file mode 100644
index 00000000000..f31b9e216fc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/straccum.cc
@@ -0,0 +1,304 @@
+// -*- 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-2012 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>
+#include <errno.h>
+
+/** @class StringAccum
+ * @brief Efficiently build up Strings from pieces.
+ *
+ * Like the String class, StringAccum represents a string of characters.
+ * However, unlike a String, a StringAccum is inherently mutable, and
+ * efficiently supports building up a large string from many smaller pieces.
+ *
+ * StringAccum objects support operator<<() operations for most fundamental
+ * data types. A StringAccum is generally built up by operator<<(), and then
+ * turned into a String by the take_string() method. Extracting the String
+ * from a StringAccum does no memory allocation or copying; the StringAccum's
+ * memory is donated to the String.
+ *
+ * <h3>Out-of-memory StringAccums</h3>
+ *
+ * When there is not enough memory to add requested characters to a
+ * StringAccum object, the object becomes a special "out-of-memory"
+ * StringAccum. Out-of-memory objects are contagious: the result of any
+ * concatenation operation involving an out-of-memory StringAccum is another
+ * out-of-memory StringAccum. Appending an out-of-memory String with "sa <<
+ * s" makes "sa" out-of-memory. (However, other usually-equivalent calls,
+ * such as "sa.append(s.begin(), s.end())", <em>do not</em> make "sa"
+ * out-of-memory.) Calling take_string() on an out-of-memory StringAccum
+ * returns an out-of-memory String.
+ *
+ * Out-of-memory StringAccum objects have length zero.
+ */
+
+
+void
+StringAccum::assign_out_of_memory()
+{
+ assert(_cap >= 0);
+ if (_cap > 0)
+ delete[] (_s - MEMO_SPACE);
+ _s = reinterpret_cast<unsigned char *>(const_cast<char *>(String::out_of_memory_data()));
+ _cap = -1;
+ _len = 0;
+}
+
+char *
+StringAccum::grow(int want)
+{
+ // can't append to out-of-memory strings
+ if (_cap < 0) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ int ncap = (_cap ? (_cap + MEMO_SPACE) * 2 : 128) - MEMO_SPACE;
+ while (ncap <= want)
+ ncap = (ncap + MEMO_SPACE) * 2 - MEMO_SPACE;
+
+ unsigned char *n = new unsigned char[ncap + MEMO_SPACE];
+ if (!n) {
+ assign_out_of_memory();
+ errno = ENOMEM;
+ return 0;
+ }
+ n += MEMO_SPACE;
+
+ if (_s) {
+ memcpy(n, _s, _len);
+ delete[] (_s - MEMO_SPACE);
+ }
+ _s = n;
+ _cap = ncap;
+ return reinterpret_cast<char *>(_s + _len);
+}
+
+int
+StringAccum::resize(int len)
+{
+ assert(len >= 0);
+ if (len > _cap && !grow(len))
+ return -ENOMEM;
+ else {
+ _len = len;
+ return 0;
+ }
+}
+
+char *
+StringAccum::hard_extend(int nadjust, int nreserve)
+{
+ char *x = grow(_len + nadjust + nreserve);
+ if (x)
+ _len += nadjust;
+ return x;
+}
+
+const char *
+StringAccum::c_str()
+{
+ if (_len < _cap || grow(_len))
+ _s[_len] = '\0';
+ return reinterpret_cast<char *>(_s);
+}
+
+void
+StringAccum::append_fill(int c, int len)
+{
+ if (char *s = extend(len))
+ memset(s, c, len);
+}
+
+void
+StringAccum::append_utf8_hard(unsigned ch)
+{
+ if (ch < 0x80)
+ append((unsigned char) ch);
+ else if (ch < 0x800) {
+ append((unsigned char) (0xC0 + ((ch >> 6) & 0x1F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else if (ch < 0x10000) {
+ append((unsigned char) (0xE0 + ((ch >> 12) & 0x0F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else if (ch < 0x110000) {
+ append((unsigned char) (0xF0 + ((ch >> 18) & 0x07)));
+ append((unsigned char) (0x80 + ((ch >> 12) & 0x3F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else
+ append((unsigned char) '?');
+}
+
+void
+StringAccum::hard_append(const char *s, int len)
+{
+ // We must be careful about calls like "sa.append(sa.begin(), sa.end())";
+ // a naive implementation might use sa's data after freeing it.
+ const char *my_s = reinterpret_cast<char *>(_s);
+
+ if (_len + len <= _cap) {
+ success:
+ memcpy(_s + _len, s, len);
+ _len += len;
+ } else if (s < my_s || s >= my_s + _cap) {
+ if (grow(_len + len))
+ goto success;
+ } else {
+ unsigned char *old_s = _s;
+ int old_len = _len;
+
+ _s = 0;
+ _len = 0;
+ _cap = 0;
+
+ if (char *new_s = extend(old_len + len)) {
+ memcpy(new_s, old_s, old_len);
+ memcpy(new_s + old_len, s, len);
+ }
+
+ delete[] (old_s - MEMO_SPACE);
+ }
+}
+
+void
+StringAccum::append(const char *s)
+{
+ hard_append(s, strlen(s));
+}
+
+String
+StringAccum::take_string()
+{
+ int len = length();
+ int cap = _cap;
+ char *str = reinterpret_cast<char *>(_s);
+ if (len > 0) {
+ _s = 0;
+ _len = _cap = 0;
+ return String::make_claim(str, len, cap);
+ } else if (!out_of_memory())
+ return String();
+ else {
+ clear();
+ return String::make_out_of_memory();
+ }
+}
+
+void
+StringAccum::swap(StringAccum &o)
+{
+ unsigned char *os = o._s;
+ int olen = o._len, ocap = o._cap;
+ o._s = _s;
+ o._len = _len, o._cap = _cap;
+ _s = os;
+ _len = olen, _cap = ocap;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+StringAccum &
+operator<<(StringAccum &sa, long i)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%ld", i);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+StringAccum &
+operator<<(StringAccum &sa, unsigned long u)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%lu", u);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+StringAccum &
+operator<<(StringAccum &sa, double d)
+{
+ if (char *x = sa.reserve(256)) {
+ int len = sprintf(x, "%.12g", d);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+StringAccum &
+StringAccum::snprintf(int n, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ if (char *x = reserve(n + 1)) {
+#if HAVE_VSNPRINTF
+ int len = vsnprintf(x, n + 1, format, val);
+#else
+ int len = vsprintf(x, format, val);
+ assert(len <= n);
+#endif
+ adjust_length(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((unsigned char) *s))
+ s++;
+ const char* word = s;
+ while (s < ends && !isspace((unsigned char) *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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/string.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/string.cc
new file mode 100644
index 00000000000..ec14c378f20
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/string.cc
@@ -0,0 +1,786 @@
+// -*- 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-2012 Eddie Kohler
+ * Copyright (c) 2008-2009 Meraki, Inc.
+ *
+ * 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>
+
+#ifndef likely
+#define likely(x) (x)
+#endif
+#ifndef unlikely
+#define unlikely(x) (x)
+#endif
+
+/** @file string.hh
+ * @brief The LCDF String class.
+ */
+
+/** @class String
+ * @brief A string of characters.
+ *
+ * The String class represents a string of characters. Strings may be
+ * constructed from C strings, characters, numbers, and so forth. They may
+ * also be added together. The underlying character arrays are dynamically
+ * allocated; String operations allocate and free memory as needed. A String
+ * and its substrings generally share memory. Accessing a character by index
+ * takes O(1) time; so does creating a substring.
+ *
+ * <h3>Out-of-memory strings</h3>
+ *
+ * When there is not enough memory to create a particular string, a special
+ * "out-of-memory" string is returned instead. Out-of-memory strings are
+ * contagious: the result of any concatenation operation involving an
+ * out-of-memory string is another out-of-memory string. Thus, the final
+ * result of a series of String operations will be an out-of-memory string,
+ * even if the out-of-memory condition occurs in the middle.
+ *
+ * Out-of-memory strings have zero characters, but they aren't equal to other
+ * empty strings. If @a s is a normal String (even an empty string), and @a
+ * oom is an out-of-memory string, then @a s @< @a oom.
+ *
+ * All out-of-memory strings are equal and share the same data(), which is
+ * different from the data() of any other string. See
+ * String::out_of_memory_data(). The String::make_out_of_memory() function
+ * returns an out-of-memory string.
+ */
+
+const char String::null_data = '\0';
+const char String::oom_data = '\0';
+const char String::bool_data[] = "true\0false";
+const char String::int_data[] = "0\0001\0002\0003\0004\0005\0006\0007\0008\0009";
+
+#if HAVE_STRING_PROFILING > 1
+# define MEMO_INITIALIZER_TAIL , 0, 0
+#else
+# define MEMO_INITIALIZER_TAIL
+#endif
+
+const String::rep_t String::null_string_rep = {
+ &null_data, 0, 0
+};
+const String::rep_t String::oom_string_rep = {
+ &oom_data, 0, 0
+};
+
+#if HAVE_STRING_PROFILING
+uint64_t String::live_memo_count;
+uint64_t String::memo_sizes[55];
+uint64_t String::live_memo_sizes[55];
+uint64_t String::live_memo_bytes[55];
+# if HAVE_STRING_PROFILING > 1
+String::memo_t *String::live_memos[55];
+# endif
+#endif
+
+/** @cond never */
+String::memo_t *
+String::create_memo(char *space, int dirty, int capacity)
+{
+ assert(capacity > 0 && capacity >= dirty);
+ memo_t *memo;
+ if (space)
+ memo = reinterpret_cast<memo_t *>(space);
+ else
+ memo = reinterpret_cast<memo_t *>(new char[MEMO_SPACE + capacity]);
+ if (memo) {
+ memo->capacity = capacity;
+ memo->dirty = dirty;
+ memo->refcount = (space ? 0 : 1);
+#if HAVE_STRING_PROFILING
+ int bucket = profile_memo_size_bucket(dirty, capacity);
+ ++memo_sizes[bucket];
+ ++live_memo_sizes[bucket];
+ live_memo_bytes[bucket] += capacity;
+ ++live_memo_count;
+# if HAVE_STRING_PROFILING > 1
+ memo->pprev = &live_memos[bucket];
+ if ((memo->next = *memo->pprev))
+ memo->next->pprev = &memo->next;
+ *memo->pprev = memo;
+# endif
+#endif
+ }
+ return memo;
+}
+
+void
+String::delete_memo(memo_t *memo)
+{
+ assert(memo->capacity > 0);
+ assert(memo->capacity >= memo->dirty);
+#if HAVE_STRING_PROFILING
+ int bucket = profile_memo_size_bucket(memo->dirty, memo->capacity);
+ --live_memo_sizes[bucket];
+ live_memo_bytes[bucket] -= memo->capacity;
+ --live_memo_count;
+# if HAVE_STRING_PROFILING > 1
+ if ((*memo->pprev = memo->next))
+ memo->next->pprev = memo->pprev;
+# endif
+#endif
+ delete[] reinterpret_cast<char *>(memo);
+}
+
+
+#if HAVE_STRING_PROFILING
+void
+String::one_profile_report(StringAccum &sa, int i, int examples)
+{
+ if (i <= 16)
+ sa << "memo_dirty_" << i;
+ else if (i < 25) {
+ uint32_t s = (i - 17) * 2 + 17;
+ sa << "memo_cap_" << s << '_' << (s + 1);
+ } else if (i < 29) {
+ uint32_t s = (i - 25) * 8 + 33;
+ sa << "memo_cap_" << s << '_' << (s + 7);
+ } else {
+ uint32_t s1 = (1U << (i - 23)) + 1;
+ uint32_t s2 = (s1 - 1) << 1;
+ sa << "memo_cap_" << s1 << '_' << s2;
+ }
+ sa << '\t' << live_memo_sizes[i] << '\t' << memo_sizes[i] << '\t' << live_memo_bytes[i] << '\n';
+ if (examples) {
+# if HAVE_STRING_PROFILING > 1
+ for (memo_t *m = live_memos[i]; m; m = m->next) {
+ sa << " [" << m->dirty << "] ";
+ uint32_t dirty = m->dirty;
+ if (dirty > 0 && m->real_data[dirty - 1] == '\0')
+ --dirty;
+ sa.append(m->real_data, dirty > 128 ? 128 : dirty);
+ sa << '\n';
+ }
+# endif
+ }
+}
+
+void
+String::profile_report(StringAccum &sa, int examples)
+{
+ uint64_t all_live_sizes = 0, all_sizes = 0, all_live_bytes = 0;
+ for (int i = 0; i < 55; ++i) {
+ if (memo_sizes[i])
+ one_profile_report(sa, i, examples);
+ all_live_sizes += live_memo_sizes[i];
+ all_sizes += memo_sizes[i];
+ all_live_bytes += live_memo_bytes[i];
+ }
+ sa << "memo_total\t" << all_live_sizes << '\t' << all_sizes << '\t' << all_live_bytes << '\n';
+}
+#endif
+
+/** @endcond never */
+
+
+/** @brief Construct a base-10 string representation of @a x. */
+String::String(int x)
+{
+ if (x >= 0 && x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%d", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(unsigned x)
+{
+ if (x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%u", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(long x)
+{
+ if (x >= 0 && x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%ld", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(unsigned long x)
+{
+ if (x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%lu", x);
+ assign(buf, -1, false);
+ }
+}
+
+String::String(double x)
+{
+ char buf[128];
+ int len = sprintf(buf, "%.12g", x);
+ assign(buf, len, false);
+}
+
+String
+String::make_claim(char *str, int len, int capacity)
+{
+ assert(str && len > 0 && capacity >= len);
+ memo_t *new_memo = create_memo(str - MEMO_SPACE, len, capacity);
+ return String(str, len, new_memo);
+}
+
+String
+String::make_stable(const char *s, int len)
+{
+ if (len < 0)
+ len = (s ? strlen(s) : 0);
+ return String(s, len, 0);
+}
+
+String
+String::make_fill(int c, int len)
+{
+ String s;
+ s.append_fill(c, len);
+ return s;
+}
+
+void
+String::assign_out_of_memory()
+{
+ if (_r.memo)
+ deref();
+ _r.memo = 0;
+ _r.data = &oom_data;
+ _r.length = 0;
+}
+
+void
+String::assign(const char *s, int len, bool need_deref)
+{
+ if (!s) {
+ assert(len <= 0);
+ len = 0;
+ } else if (len < 0)
+ len = strlen(s);
+
+ // need to start with dereference
+ if (need_deref) {
+ if (unlikely(_r.memo
+ && s >= _r.memo->real_data
+ && s + len <= _r.memo->real_data + _r.memo->capacity)) {
+ // Be careful about "String s = ...; s = s.c_str();"
+ _r.data = s;
+ _r.length = len;
+ return;
+ } else
+ deref();
+ }
+
+ if (len == 0) {
+ _r.memo = 0;
+ _r.data = (s == &oom_data ? s : &null_data);
+
+ } else {
+ // Make the memo a multiple of 16 characters and bigger than 'len'.
+ int memo_capacity = (len + 15 + MEMO_SPACE) & ~15;
+ _r.memo = create_memo(0, len, memo_capacity - MEMO_SPACE);
+ if (!_r.memo) {
+ assign_out_of_memory();
+ return;
+ }
+ memcpy(_r.memo->real_data, s, len);
+ _r.data = _r.memo->real_data;
+ }
+
+ _r.length = len;
+}
+
+/** @brief Append @a len unknown characters to this string.
+ * @return Modifiable pointer to the appended characters.
+ *
+ * The caller may safely modify the returned memory. Null is returned if
+ * the string becomes out-of-memory. */
+char *
+String::append_uninitialized(int len)
+{
+ // Appending anything to "out of memory" leaves it as "out of memory"
+ if (unlikely(len <= 0) || out_of_memory())
+ return 0;
+
+ // If we can, append into unused space. First, we check that there's
+ // enough unused space for 'len' characters to fit; then, we check
+ // that the unused space immediately follows the data in '*this'.
+ uint32_t dirty;
+ if (_r.memo
+ && ((dirty = _r.memo->dirty), _r.memo->capacity > dirty + len)) {
+ char *real_dirty = _r.memo->real_data + dirty;
+ if (real_dirty == _r.data + _r.length) {
+ _r.memo->dirty = dirty + len;
+ _r.length += len;
+ assert(_r.memo->dirty < _r.memo->capacity);
+#if HAVE_STRING_PROFILING
+ profile_update_memo_dirty(_r.memo, dirty, dirty + len, _r.memo->capacity);
+#endif
+ return real_dirty;
+ }
+ }
+
+ // Now we have to make new space. Make sure the memo is a multiple of 16
+ // bytes and that it is at least 16. But for large strings, allocate a
+ // power of 2, since power-of-2 sizes minimize waste in frequently-used
+ // allocators, like Linux kmalloc.
+ int want_memo_len = _r.length + len + MEMO_SPACE;
+ int memo_capacity;
+ if (want_memo_len <= 1024)
+ memo_capacity = (want_memo_len + 15) & ~15;
+ else
+ for (memo_capacity = 2048; memo_capacity < want_memo_len; )
+ memo_capacity *= 2;
+
+ memo_t *new_memo = create_memo(0, _r.length + len, memo_capacity - MEMO_SPACE);
+ if (!new_memo) {
+ assign_out_of_memory();
+ return 0;
+ }
+
+ char *new_data = new_memo->real_data;
+ memcpy(new_data, _r.data, _r.length);
+
+ deref();
+ _r.data = new_data;
+ new_data += _r.length; // now new_data points to the garbage
+ _r.length += len;
+ _r.memo = new_memo;
+ return new_data;
+}
+
+void
+String::append(const char *s, int len, memo_t *memo)
+{
+ if (!s) {
+ assert(len <= 0);
+ len = 0;
+ } else if (len < 0)
+ len = strlen(s);
+
+ if (s == &oom_data)
+ // Appending "out of memory" to a regular string makes it "out of
+ // memory"
+ assign_out_of_memory();
+ else if (len == 0)
+ /* do nothing */;
+ else if (_r.length == 0 && memo && !out_of_memory()) {
+ deref();
+ assign_memo(s, len, memo);
+ } else if (likely(!(_r.memo
+ && s >= _r.memo->real_data
+ && s + len <= _r.memo->real_data + _r.memo->capacity))) {
+ if (char *space = append_uninitialized(len))
+ memcpy(space, s, len);
+ } else {
+ String preserve_s(*this);
+ if (char *space = append_uninitialized(len))
+ memcpy(space, s, len);
+ }
+}
+
+/** @brief Append @a len copies of character @a c to this string. */
+void
+String::append_fill(int c, int len)
+{
+ assert(len >= 0);
+ if (char *space = append_uninitialized(len))
+ memset(space, c, len);
+}
+
+/** @brief Ensure the string's data is unshared and return a mutable
+ pointer to it. */
+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 (_r.memo && _r.memo->refcount == 1)
+ return const_cast<char *>(_r.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(!_r.memo || _r.memo->refcount > 1);
+ // But in multithreaded situations we must hold a local copy of memo!
+ String do_not_delete_underlying_memo(*this);
+ deref();
+ assign(_r.data, _r.length, false);
+ return const_cast<char *>(_r.data);
+}
+
+char *
+String::mutable_c_str()
+{
+ (void) mutable_data();
+ (void) c_str();
+ return const_cast<char *>(_r.data);
+}
+
+/** @brief Return a substring of this string, consisting of the @a len
+ characters starting at index @a pos.
+ @param pos substring's first position relative to the string
+ @param len length of substring
+
+ If @a pos is negative, starts that far from the end of the string. If @a
+ len is negative, leaves that many characters off the end of the string.
+ If @a pos and @a len specify a substring that is partly outside the
+ string, only the part within the string is returned. If the substring is
+ beyond either end of the string, returns an empty string (but this
+ should be considered a programming error; a future version may generate
+ a warning for this case).
+
+ @note String::substring() is intended to behave like Perl's substr(). */
+String
+String::substring(int pos, int len) const
+{
+ if (pos < 0)
+ pos += _r.length;
+
+ int pos2;
+ if (len < 0)
+ pos2 = _r.length + len;
+ else if (pos >= 0 && len >= _r.length) // avoid integer overflow
+ pos2 = _r.length;
+ else
+ pos2 = pos + len;
+
+ if (pos < 0)
+ pos = 0;
+ if (pos2 > _r.length)
+ pos2 = _r.length;
+
+ if (pos >= pos2)
+ return String();
+ else
+ return String(_r.data + pos, pos2 - pos, _r.memo);
+}
+
+int
+String::find_left(char c, int start) const
+{
+ if (start < 0)
+ start = 0;
+ for (int i = start; i < _r.length; i++)
+ if (_r.data[i] == c)
+ return i;
+ return -1;
+}
+
+int
+String::find_left(const String &str, int start) const
+{
+ if (start < 0)
+ start = 0;
+ int max_pos = length() - str.length();
+ for (int i = start; i <= max_pos; ++i)
+ if (memcmp(_r.data + i, str.data(), str.length()) == 0)
+ return i;
+ return -1;
+}
+
+int
+String::find_right(char c, int start) const
+{
+ if (start >= _r.length)
+ start = _r.length - 1;
+ for (int i = start; i >= 0; i--)
+ if (_r.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((unsigned char) x[pos]);
+ return new_s;
+}
+
+/** @brief Return a lowercased version of this string.
+
+ Translates the ASCII characters 'A' through 'Z' into their lowercase
+ equivalents. */
+String
+String::lower() const
+{
+ // avoid copies
+ if (!out_of_memory())
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] >= 'A' && _r.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((unsigned char) x[pos]);
+ return new_s;
+}
+
+/** @brief Return an uppercased version of this string.
+
+ Translates the ASCII characters 'a' through 'z' into their uppercase
+ equivalents. */
+String
+String::upper() const
+{
+ // avoid copies
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] >= 'a' && _r.data[i] <= 'z')
+ return hard_upper(*this, i);
+ return *this;
+}
+
+static String
+hard_printable(const String &s, int pos, int type)
+{
+ 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 && type != 1)
+ sa << '^' << (unsigned char)(x[pos] + 64);
+ else if (char *buf = sa.extend(4, 1))
+ sprintf(buf, "\\%03o", x[pos]);
+ }
+ return sa.take_string();
+}
+
+/** @brief Return a "printable" version of this string.
+ @param type quoting type
+
+ The default quoting type (0) translates control characters 0-31 into
+ "control" sequences, such as "^@" for the null character, and characters
+ 127-255 into octal escape sequences, such as "\377" for 255. Quoting
+ type 1 translates all characters outside of 32-126 into octal escape
+ sequences. */
+String
+String::printable(int type) const
+{
+ // avoid copies
+ if (!out_of_memory())
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] < 32 || _r.data[i] > 126)
+ return hard_printable(*this, i, type);
+ return *this;
+}
+
+hashcode_t
+String::hashcode(const char *begin, const char *end)
+{
+ if (end <= begin)
+ return 0;
+
+ uint32_t hash = end - begin;
+ int rem = hash & 3;
+ end -= rem;
+ uint32_t last16;
+
+#if !HAVE_INDIFFERENT_ALIGNMENT
+ if (!(reinterpret_cast<uintptr_t>(begin) & 1)) {
+#endif
+#define get16(p) (*reinterpret_cast<const uint16_t *>((p)))
+ for (; begin != end; begin += 4) {
+ hash += get16(begin);
+ uint32_t tmp = (get16(begin + 2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ hash += hash >> 11;
+ }
+ if (rem >= 2) {
+ last16 = get16(begin);
+ goto rem2;
+ }
+#undef get16
+#if !HAVE_INDIFFERENT_ALIGNMENT
+ } else {
+# if WORDS_BIGENDIAN
+# define get16(p) (((unsigned char) (p)[0] << 8) + (unsigned char) (p)[1])
+# elif WORDS_LITTLEENDIAN
+# define get16(p) ((unsigned char) (p)[0] + ((unsigned char) (p)[1] << 8))
+# else
+# error "unknown byte order"
+# endif
+ // should be exactly the same as the code above
+ for (; begin != end; begin += 4) {
+ hash += get16(begin);
+ uint32_t tmp = (get16(begin + 2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ hash += hash >> 11;
+ }
+ if (rem >= 2) {
+ last16 = get16(begin);
+ goto rem2;
+ }
+# undef get16
+ }
+#endif
+
+ /* Handle end cases */
+ if (0) { // weird organization avoids uninitialized
+ rem2: // variable warnings
+ if (rem == 3) {
+ hash += last16;
+ hash ^= hash << 16;
+ hash ^= ((unsigned char) begin[2]) << 18;
+ hash += hash >> 11;
+ } else {
+ hash += last16;
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ }
+ } else if (rem == 1) {
+ hash += (unsigned char) *begin;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+}
+
+#if 0
+// 11.Apr.2008 -- This old hash function was swapped out in favor of
+// SuperFastHash, above.
+hashcode_t
+String::hashcode() const
+{
+ int l = length();
+ const char *d = data();
+ if (!l)
+ return 0;
+ else if (l == 1)
+ return d[0] | (d[0] << 8);
+ else if (l < 4)
+ return d[0] + (d[1] << 3) + (l << 12);
+ else
+ return d[0] + (d[1] << 8) + (d[2] << 16) + (d[3] << 24)
+ + (l << 12) + (d[l-1] << 10);
+}
+#endif
+
+bool
+String::equals(const char *s, int len) const
+{
+ // It'd be nice to make "out-of-memory" strings compare unequal to
+ // anything, even themselves, 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 (_r.length != len)
+ return false;
+ else if (_r.data == s)
+ return true;
+ else if (len == 0)
+ return (s != &oom_data && _r.data != &oom_data);
+ else
+ return memcmp(_r.data, s, len) == 0;
+}
+
+bool
+String::starts_with(const char *s, int len) const
+{
+ // See note on equals() re: "out-of-memory" strings.
+ if (len < 0)
+ len = strlen(s);
+ if (_r.length < len)
+ return false;
+ else if (_r.data == s)
+ return true;
+ else if (len == 0)
+ return (s != &oom_data && _r.data != &oom_data);
+ else
+ return memcmp(_r.data, s, len) == 0;
+}
+
+int
+String::compare(const char *s, int len) const
+{
+ if (len < 0)
+ len = strlen(s);
+ if (_r.data == s)
+ return _r.length - len;
+ else if (_r.data == &oom_data)
+ return 1;
+ else if (s == &oom_data)
+ return -1;
+ else if (_r.length == len)
+ return memcmp(_r.data, s, len);
+ else if (_r.length < len) {
+ int v = memcmp(_r.data, s, _r.length);
+ return (v ? v : -1);
+ } else {
+ int v = memcmp(_r.data, s, len);
+ return (v ? v : 1);
+ }
+}
+
+void
+String::align(int n)
+{
+ int offset = reinterpret_cast<uintptr_t>(_r.data) % n;
+ if (offset) {
+ String s;
+ s.append_uninitialized(_r.length + n + 1);
+ offset = reinterpret_cast<uintptr_t>(s._r.data) % n;
+ memcpy((char *)s._r.data + n - offset, _r.data, _r.length);
+ s._r.data += n - offset;
+ s._r.length = _r.length;
+ *this = s;
+ }
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/strtonum.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/strtonum.c
new file mode 100644
index 00000000000..36898c5a7ad
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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>
+#if HAVE_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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/transform.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/transform.cc
new file mode 100644
index 00000000000..5eb0ff58728
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/transform.cc
@@ -0,0 +1,167 @@
+// -*- related-file-name: "../include/lcdf/transform.hh" -*-
+
+/* transform.{cc,hh} -- planar affine transformations
+ *
+ * Copyright (c) 2000-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/vectorv.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/vectorv.cc
new file mode 100644
index 00000000000..f5f12b52c90
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/liblcdf/vectorv.cc
@@ -0,0 +1,110 @@
+/*
+ * vectorv.cc -- template specialization for Vector<void*>
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2006 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/texk/lcdf-typetools/lcdf-typetools-2.98/m4/lcdf-typetools.m4 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/m4/lcdf-typetools.m4
new file mode 100644
index 00000000000..7aaff4c33af
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/m4/lcdf-typetools.m4
@@ -0,0 +1,15 @@
+## Define configure options for lcdf-typetools. Extracted from configure.ac
+## for ease of building TeX Live.
+m4_define_default([kpse_indent_26], [26])[]dnl
+m4_define([kpse_lcdf_typetools_progs], [cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42])[]dnl
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [AC_ARG_ENABLE(Kpse_Prog,
+ AS_HELP_STRING([--disable-]Kpse_Prog,
+ [do not build the ]Kpse_Prog[ program],
+ kpse_indent_26))])
+m4_define([kpse_otftotfm_auto_opts], [cfftot1 t1dotlessj ttftotype42 updmap])[]dnl
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AC_ARG_ENABLE(Kpse_Opt,
+ AS_HELP_STRING([--disable-auto-]Kpse_Opt,
+ [disable running ]Kpse_Opt[ from otftotfm],
+ kpse_indent_26))])
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.am
new file mode 100644
index 00000000000..6438927eb5f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmafm.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.in
new file mode 100644
index 00000000000..484a5a081c3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/Makefile.in
@@ -0,0 +1,695 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = mmafm$(EXEEXT)
+subdir = lcdf-typetools-2.98/mmafm
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_mmafm_OBJECTS = main.$(OBJEXT)
+mmafm_OBJECTS = $(am_mmafm_OBJECTS)
+mmafm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(mmafm_SOURCES)
+DIST_SOURCES = $(mmafm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = mmafm.1
+mmafm_SOURCES = main.cc
+mmafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmafm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/mmafm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+mmafm$(EXEEXT): $(mmafm_OBJECTS) $(mmafm_DEPENDENCIES) $(EXTRA_mmafm_DEPENDENCIES)
+ @rm -f mmafm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/main.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/main.cc
new file mode 100644
index 00000000000..99e320f94bd
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/main.cc
@@ -0,0 +1,434 @@
+/* main.cc -- driver for mmafm program
+ *
+ * Copyright (c) 1997-2012 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
+
+const Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ValDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ValDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ValDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ValDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ValDouble, 0 },
+ { "optical-size", 'O', OPSIZE_OPT, Clp_ValDouble, 0 },
+ { "style", 0, STYLE_OPT, Clp_ValDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ValDouble, 0 },
+ { "min-kern", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "minimum-kern", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "kern-precision", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ValInt, 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+static void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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->vstr, "-") == 0)
+ output_file = stdout;
+ else {
+ output_file = fopen(clp->vstr, "wb");
+ if (!output_file)
+ errh->fatal("%s: %s", clp->vstr, strerror(errno));
+ }
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("mmafm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2012 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->vstr, 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/mmafm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/mmafm.1
new file mode 100644
index 00000000000..d70a6b8743b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmafm/mmafm.1
@@ -0,0 +1,178 @@
+.\" -*-nroff-*-
+.ds V 2.98
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de Op
+.BR "\\$1" "\\$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, ekohler@gmail.com
+.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 for suggestions and patient
+debugging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.am
new file mode 100644
index 00000000000..527b7d14937
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmpfb.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.in
new file mode 100644
index 00000000000..c070413b61c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/Makefile.in
@@ -0,0 +1,721 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = mmpfb$(EXEEXT)
+subdir = lcdf-typetools-2.98/mmpfb
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+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
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(mmpfb_SOURCES)
+DIST_SOURCES = $(mmpfb_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmpfb.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/mmpfb/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+mmpfb$(EXEEXT): $(mmpfb_OBJECTS) $(mmpfb_DEPENDENCIES) $(EXTRA_mmpfb_DEPENDENCIES)
+ @rm -f mmpfb$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/main.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/main.cc
new file mode 100644
index 00000000000..1d685f18eff
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/main.cc
@@ -0,0 +1,463 @@
+/* main.cc -- driver for mmpfb program
+ *
+ * Copyright (c) 1997-2012 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
+
+const Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ValDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ValDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ValDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ValDouble, 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_ValDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ValUnsigned, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "style", 0, STYLE_OPT, Clp_ValDouble, 0 },
+ { "subrs", 0, SUBRS_OPT, Clp_ValInt, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ValDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ValDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ValDouble, 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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 = new SilentErrorHandler;
+ break;
+
+ case OUTPUT_OPT:
+ if (outfile) errh->fatal("output file already specified");
+ if (strcmp(clp->vstr, "-") == 0)
+ outfile = stdout;
+ else {
+ outfile = fopen(clp->vstr, "wb");
+ if (!outfile)
+ errh->fatal("%s: %s", clp->vstr, strerror(errno));
+ }
+ break;
+
+ case VERSION_OPT:
+ printf("mmpfb (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2012 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->vstr, 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/mmpfb.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/mmpfb.1
new file mode 100644
index 00000000000..e2f20aa9b7d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/mmpfb.1
@@ -0,0 +1,206 @@
+.\" -*-nroff-*-
+.ds V 2.98
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de Op
+.BR "\\$1" "\\$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, ekohler@gmail.com
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
+.PP
+Thanks to Melissa O'Neill for suggestions and patient
+debugging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.cc
new file mode 100644
index 00000000000..1325b44d3e6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.cc
@@ -0,0 +1,300 @@
+/* myfont.cc -- general multiple- to single-master conversion
+ *
+ * Copyright (c) 1997-2012 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/myfont.hh
new file mode 100644
index 00000000000..ffe35668f94
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.cc
new file mode 100644
index 00000000000..2c4b1bcb015
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.cc
@@ -0,0 +1,41 @@
+/* t1minimize.cc -- make minimal copy of a Type 1 font
+ *
+ * Copyright (c) 2003-2012 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;
+
+Type1Font *
+minimize(Type1Font *font)
+{
+ Vector<double> xuid_extension;
+ xuid_extension.push_back(0x000395C1);
+ Type1Font *output = Type1Font::skeleton_make_copy(font, font->font_name(), &xuid_extension);
+
+ // 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1minimize.hh
new file mode 100644
index 00000000000..a5c3ea04906
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.cc
new file mode 100644
index 00000000000..86382ca239b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.cc
@@ -0,0 +1,924 @@
+/* t1rewrit.cc -- routines for multiple- to single-master charstring conversion
+ *
+ * Copyright (c) 1997-2012 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 &, bool is_subr);
+
+ private:
+
+ Type1CharstringGen _gen;
+ Type1MMRemover *_remover;
+ bool _is_subr;
+
+};
+
+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 || _is_subr) && cmd != Cs::cReturn;
+
+ }
+}
+
+bool
+Type1BadCallRemover::run(Type1Charstring &cs, bool is_subr)
+{
+ _is_subr = is_subr;
+ _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(), false);
+ for (int subrno = 4; subrno < _nsubrs; subrno++)
+ if (Type1Charstring *cs = _font->subr(subrno))
+ bcr.run(*cs, true);
+
+ // 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/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/mmpfb/t1rewrit.hh
new file mode 100644
index 00000000000..eac9d75beeb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.am
new file mode 100644
index 00000000000..837eb83ef0f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otfinfo.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.in
new file mode 100644
index 00000000000..dc32f230065
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/Makefile.in
@@ -0,0 +1,697 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = otfinfo$(EXEEXT)
+subdir = lcdf-typetools-2.98/otfinfo
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_otfinfo_OBJECTS = otfinfo.$(OBJEXT)
+otfinfo_OBJECTS = $(am_otfinfo_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(otfinfo_SOURCES)
+DIST_SOURCES = $(otfinfo_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otfinfo.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/otfinfo/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+otfinfo$(EXEEXT): $(otfinfo_OBJECTS) $(otfinfo_DEPENDENCIES) $(EXTRA_otfinfo_DEPENDENCIES)
+ @rm -f otfinfo$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.1
new file mode 100644
index 00000000000..746e14dd8b5
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.1
@@ -0,0 +1,195 @@
+'\"t
+.ds V 2.98
+.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-sfzpvag\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 \-a ", " \-\-family
+Print each font's family name. For example:
+.nf
+ Minion Pro
+.fi
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-font\-version
+Print font version information, if available. For example:
+.nf
+ OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)
+.fi
+'
+.Sp
+.TP 5
+.BR \-i ", " \-\-info
+Print each font's name, version, designer, vendor, copyright, and license
+information. For example:
+.nf
+ Family: Minion Pro
+ Subfamily: Regular
+ Full name: Minion Pro
+ PostScript name: MinionPro-Regular
+ Version: OTF 1.011;PS 001.000;Core 1.0.27;makeotf.lib1.3.1
+ Unique ID: 1.011;ADBE;MinionPro-Regular
+ Designer: Robert Slimbach
+ Vendor URL: http://www.adobe.com/type/
+ Trademark: Minion is either a registered trademark or a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+ Copyright: \(co 2000 Adobe Systems Incorporated. All Rights Reserved. U.S. Patent Des. 337,604. Other patents pending.
+ License URL: http://www.adobe.com/type/legal.html
+.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.
+'
+.Sp
+.TP 5
+.BR \-t ", " \-\-tables
+Print the size and name of every OpenType table in the font. For example:
+.nf
+ 52 BASE
+ 87723 CFF
+ 4940 DSIG
+ 21366 GPOS
+ \&...
+.fi
+'
+.Sp
+.TP 5
+.BR \-T " \fItable\fR, " \-\-dump\-table= \fItable\fR
+Print the contents of the font's OpenType table \fItable\fR.
+'
+.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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.cc
new file mode 100644
index 00000000000..74d340c3d45
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otfinfo/otfinfo.cc
@@ -0,0 +1,636 @@
+/* otfinfo.cc -- driver for reporting information about OpenType fonts
+ *
+ * Copyright (c) 2003-2012 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/otfos2.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 QUERY_FVERSION_OPT 325
+#define TABLES_OPT 326
+#define QUERY_FAMILY_OPT 327
+#define INFO_OPT 328
+#define DUMP_TABLE_OPT 329
+
+const Clp_Option options[] = {
+
+ { "script", 0, SCRIPT_OPT, Clp_ValString, 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 },
+ { "family", 'a', QUERY_FAMILY_OPT, 0, 0 },
+ { "font-version", 'v', QUERY_FVERSION_OPT, 0, 0 },
+ { "info", 'i', INFO_OPT, 0, 0 },
+ { "glyphs", 'g', QUERY_GLYPHS_OPT, 0, 0 },
+ { "tables", 't', TABLES_OPT, 0, 0 },
+ { "dump-table", 'T', DUMP_TABLE_OPT, Clp_ValString, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+
+};
+
+
+static const char *program_name;
+
+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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Otfinfo%> reports information about an OpenType font to standard output.\n\
+Options specify what information to print.\n\
+\n\
+Usage: %s [-sfzpg | OPTIONS] [OTFFILES...]\n\n",
+ program_name);
+ uerrh.message("\
+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\
+ -a, --family Report font%,s family name.\n\
+ -v, --font-version Report font%,s version information.\n\
+ -i, --info Report font%,s names and designer/vendor info.\n\
+ -g, --glyphs Report font%,s glyph names.\n\
+ -t, --tables Report font%,s OpenType tables.\n\
+ -T, --dump-table NAME Output font%,s %<NAME%> table.\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 <ekohler@gmail.com>.\n");
+}
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning = false)
+{
+ FILE *f;
+ int f_errno = 0;
+ 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 {
+ f = fopen(filename.c_str(), "rb");
+ f_errno = errno;
+ }
+
+ String error_anno = (warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename);
+ if (!f) {
+ errh->xmessage(error_anno, strerror(f_errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage(error_anno, strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<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();
+
+ // old Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
+ 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.english_name(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_family_name(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String family_name = "no family name information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ family_name = name.english_name(OpenType::Name::N_FAMILY);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", family_name.c_str());
+}
+
+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.english_name(OpenType::Name::N_POSTSCRIPT);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", postscript_name.c_str());
+}
+
+static void
+do_query_font_version(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String version = "no version information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ version = name.english_name(OpenType::Name::N_VERSION);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", version.c_str());
+}
+
+static void
+do_info(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ StringAccum sa;
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok()) {
+ if (String s = name.english_name(OpenType::Name::N_FAMILY))
+ sa << "Family: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_SUBFAMILY))
+ sa << "Subfamily: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_FULLNAME))
+ sa << "Full name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_POSTSCRIPT))
+ sa << "PostScript name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_POSTSCRIPT_CID))
+ sa << "PostScript CID name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_PREF_FAMILY))
+ sa << "Preferred family: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_PREF_SUBFAMILY))
+ sa << "Preferred subfamily: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_MAC_COMPAT_FULLNAME))
+ sa << "Mac font menu name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_VERSION))
+ sa << "Version: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_UNIQUEID))
+ sa << "Unique ID: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESCRIPTION))
+ sa << "Description: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESIGNER))
+ sa << "Designer: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESIGNER_URL))
+ sa << "Designer URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_MANUFACTURER))
+ sa << "Manufacturer: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_VENDOR_URL))
+ sa << "Vendor URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_TRADEMARK))
+ sa << "Trademark: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_COPYRIGHT))
+ sa << "Copyright: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_LICENSE_URL))
+ sa << "License URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_LICENSE_DESCRIPTION))
+ sa << "License Description: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_SAMPLE_TEXT))
+ sa << "Sample text: " << s << "\n";
+ }
+ }
+
+ if (String os2_table = otf.table("OS/2")) {
+ OpenType::Os2 os2(os2_table, errh);
+ if (os2.ok()) {
+ if (String s = os2.vendor_id()) {
+ while (s.length() && (s.back() == ' ' || s.back() == 0))
+ s = s.substring(s.begin(), s.end() - 1);
+ if (s)
+ sa << "Vendor ID: " << s << "\n";
+ }
+ }
+ }
+
+ if (sa || errh->nerrors() == before_nerrors)
+ result_errh->message("%s", (sa ? sa.c_str() : "no information"));
+}
+
+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");
+ }
+}
+
+static void
+do_dump_table(const OpenType::Font &otf, OpenType::Tag tag, ErrorHandler *errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ if (otf.has_table(tag)) {
+ String s = otf.table(tag);
+ int written = fwrite(s.data(), 1, s.length(), stdout);
+ if (written != s.length())
+ errh->error("%s", strerror(errno));
+ } else
+ errh->message("no %<%s%> table", tag.text().c_str());
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ errh->message("corrupted tables");
+ }
+}
+
+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) + ": "));
+ Vector<const char *> input_files;
+ OpenType::Tag dump_table;
+ 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->vstr;
+ 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 QUERY_FAMILY_OPT:
+ case QUERY_FVERSION_OPT:
+ case TABLES_OPT:
+ case INFO_OPT:
+ if (query)
+ usage_error(errh, "supply exactly one query type option");
+ query = opt;
+ break;
+
+ case DUMP_TABLE_OPT:
+ if (query)
+ usage_error(errh, "supply exactly one query type option");
+ if (!(dump_table = OpenType::Tag(clp->vstr)))
+ usage_error(errh, "bad table name");
+ query = opt;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case VERSION_OPT:
+ printf("otfinfo (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2012 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->vstr);
+ 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 == QUERY_FAMILY_OPT)
+ do_query_family_name(otf, &cerrh, result_errh);
+ else if (query == QUERY_FVERSION_OPT)
+ do_query_font_version(otf, &cerrh, result_errh);
+ else if (query == TABLES_OPT)
+ do_tables(otf, &cerrh, result_errh);
+ else if (query == DUMP_TABLE_OPT)
+ do_dump_table(otf, dump_table, &cerrh);
+ else if (query == INFO_OPT)
+ do_info(otf, &cerrh, result_errh);
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.am
new file mode 100644
index 00000000000..d75c552f12e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.am
@@ -0,0 +1,34 @@
+## 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 \
+ 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
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otftotfm.1
+
+if have_kpathsea
+otftotfm_SOURCES += kpseinterface.c kpseinterface.h
+INCLUDES += $(KPATHSEA_INCLUDES)
+otftotfm_LDADD += $(KPATHSEA_LIBS)
+otftotfm_DEPENDENCIES += $(KPATHSEA_DEPEND)
+endif have_kpathsea
+
+## Rebuild libkpathsea in a TeX Live build
+@KPATHSEA_RULE@
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.in
new file mode 100644
index 00000000000..bf817b1a42d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/Makefile.in
@@ -0,0 +1,768 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = otftotfm$(EXEEXT)
+@have_kpathsea_TRUE@am__append_1 = kpseinterface.c kpseinterface.h
+@have_kpathsea_TRUE@am__append_2 = $(KPATHSEA_INCLUDES)
+@have_kpathsea_TRUE@am__append_3 = $(KPATHSEA_LIBS)
+@have_kpathsea_TRUE@am__append_4 = $(KPATHSEA_DEPEND)
+subdir = lcdf-typetools-2.98/otftotfm
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__otftotfm_SOURCES_DIST = automatic.cc automatic.hh dvipsencoding.cc \
+ dvipsencoding.hh glyphfilter.cc glyphfilter.hh metrics.cc \
+ metrics.hh otftotfm.cc otftotfm.hh secondary.cc secondary.hh \
+ uniprop.cc uniprop.hh util.cc util.hh kpseinterface.c \
+ kpseinterface.h
+@have_kpathsea_TRUE@am__objects_1 = kpseinterface.$(OBJEXT)
+am_otftotfm_OBJECTS = automatic.$(OBJEXT) dvipsencoding.$(OBJEXT) \
+ glyphfilter.$(OBJEXT) metrics.$(OBJEXT) otftotfm.$(OBJEXT) \
+ secondary.$(OBJEXT) uniprop.$(OBJEXT) util.$(OBJEXT) \
+ $(am__objects_1)
+otftotfm_OBJECTS = $(am_otftotfm_OBJECTS)
+am__DEPENDENCIES_1 =
+@have_kpathsea_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(otftotfm_SOURCES) $(EXTRA_otftotfm_SOURCES)
+DIST_SOURCES = $(am__otftotfm_SOURCES_DIST) $(EXTRA_otftotfm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = otftotfm.1
+otftotfm_SOURCES = automatic.cc automatic.hh dvipsencoding.cc \
+ dvipsencoding.hh glyphfilter.cc glyphfilter.hh metrics.cc \
+ metrics.hh otftotfm.cc otftotfm.hh secondary.cc secondary.hh \
+ uniprop.cc uniprop.hh util.cc util.hh $(am__append_1)
+EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
+otftotfm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a \
+ $(am__append_3)
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a \
+ $(am__append_4)
+INCLUDES = -I$(srcdir)/../include $(am__append_2)
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otftotfm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/otftotfm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+otftotfm$(EXEEXT): $(otftotfm_OBJECTS) $(otftotfm_DEPENDENCIES) $(EXTRA_otftotfm_DEPENDENCIES)
+ @rm -f otftotfm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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)/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@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+
+@KPATHSEA_RULE@
+
+# 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.cc
new file mode 100644
index 00000000000..aae70b16b58
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.cc
@@ -0,0 +1,820 @@
+/* automatic.{cc,hh} -- code for automatic mode and interfacing with kpathsea
+ *
+ * Copyright (c) 2003-2012 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>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <sys/types.h>
+#if HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#include <algorithm>
+
+#ifdef WIN32
+# define mkdir(dir, access) mkdir(dir)
+# define COPY_CMD "copy"
+# define CMD_SEP "&"
+#else
+# define COPY_CMD "cp"
+# define CMD_SEP ";"
+#endif
+
+/* kpathsea may already have defined this */
+#ifndef DEV_NULL
+# ifdef WIN32
+# define DEV_NULL "NUL"
+# else
+# define DEV_NULL "/dev/null"
+# endif
+#endif
+
+#if HAVE_AUTO_T1DOTLESSJ
+enum { T1DOTLESSJ_EXIT_J_NODOT = 2 };
+#endif
+
+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" },
+ { "TrueType", "TTFDESTDIR", "fonts/truetype/%" },
+ { "OpenType", "OPENTYPEDESTDIR", "fonts/opentype/%" },
+ { "Type 42", "T42DESTDIR", "fonts/type42/%" }
+};
+
+#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 *)
+{
+#if defined(W32TEX)
+// W32TeX does not have TEXMFVAR
+ char *p = kpsei_var_value("TEXMFVAR");
+ if (p == NULL) // W32TeX
+ look_for_writable_texdir("$TEXMFLOCAL", true);
+ else { // TeXLive
+ free (p);
+ look_for_writable_texdir("$TEXMFVAR", true);
+ }
+#else
+ look_for_writable_texdir("$TEXMFVAR", true);
+#endif
+ 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);
+
+#if 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);
+#if !HAVE_KPATHSEA
+ static int kpathsea_warning = 0;
+ if (++kpathsea_warning == 1)
+ errh->message("(This version of otftotfm lacks $TEXMF directory support.)");
+#endif
+ }
+ 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(), "ab")) {
+ 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) {
+#ifdef WIN32
+ mktexupd = "mktexupd";
+#else
+ mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
+#endif
+ 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)
+{
+ (void) otf_filename, (void) allow_generate, (void) 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 (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ 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)
+{
+ (void) otf_filename, (void) allow_generate, (void) 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)))) {
+ // ignore versions in the current directory
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ 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();
+}
+
+String
+installed_truetype(const String &ttf_filename, bool allow_generate, ErrorHandler *errh)
+{
+ String file = pathname_filename(ttf_filename);
+
+#if HAVE_KPATHSEA
+ if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh))) {
+ if (String path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TRUETYPE))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring TrueType file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+ }
+#endif
+
+ // perhaps generate type 42 in the future, for now just copy
+ if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh)) {
+ String installed_ttf_filename = odir[O_TRUETYPE] + "/" + file;
+ if (installed_ttf_filename.find_left('\'') >= 0 || installed_ttf_filename.find_left('\"') >= 0)
+ return String();
+
+ int retval;
+ if (!same_filename(ttf_filename, installed_ttf_filename)) {
+ String command = COPY_CMD " " + shell_quote(ttf_filename) + " " + shell_quote(installed_ttf_filename);
+ 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());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s already located in output directory", installed_ttf_filename.c_str());
+ retval = 0;
+ }
+
+ if (retval == 0) {
+ update_odir(O_TRUETYPE, installed_ttf_filename, errh);
+ return installed_ttf_filename;
+ }
+ }
+
+ return String();
+}
+
+String
+installed_type42(const String &ttf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ (void) allow_generate, (void) ttf_filename, (void) errh;
+
+ if (!ps_fontname)
+ return String();
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_TTFTOTYPE42
+ if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh))) {
+# endif
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".t42", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE42)))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 42 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 42 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+# if HAVE_AUTO_TTFTOTYPE42
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_TTFTOTYPE42
+ // if not found, and can generate on the fly, run ttftotype42
+ if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh)) {
+ String t42_filename = odir[O_TYPE42] + "/" + ps_fontname + ".t42";
+ if (t42_filename.find_left('\'') >= 0 || ttf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "ttftotype42 " + shell_quote(ttf_filename) + " " + shell_quote(t42_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_TYPE42, t42_filename, errh);
+ return t42_filename;
+ }
+ }
+#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->lerror(map_file, "%s", 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;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f))
+ return errh->error("%s: %s", map_file.c_str(), strerror(errno));
+ 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
+#if HAVE_FTRUNCATE
+ rewind(f);
+ if (ftruncate(fd, 0) < 0)
+#endif
+ {
+ fclose(f);
+ f = fopen(map_file.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+ // write data
+ ignore_result(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);
+#if defined(W32TEX)
+// jtex_filetype is defined only in W32TeX
+ char *p = kpsei_var_value("jtex_filetype");
+ if (p != NULL) { // W32TeX
+ free(p);
+ String command = "updmap --nomkmap --add " + shell_quote(filename) + CMD_SEP " updmap";
+ } else // TeXLive
+#endif
+ String command = "updmap --nomkmap --enable Map " + shell_quote(filename) + CMD_SEP " 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.hh
new file mode 100644
index 00000000000..4c973347715
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/automatic.hh
@@ -0,0 +1,25 @@
+#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,
+ O_TRUETYPE, O_OPENTYPE, O_TYPE42, 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 *);
+String installed_truetype(const String &ttf_filename, bool allow_generate, ErrorHandler *errh);
+String installed_type42(const String &ttf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh);
+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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.cc
new file mode 100644
index 00000000000..870c7d02885
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.cc
@@ -0,0 +1,979 @@
+/* dvipsencoding.{cc,hh} -- store a DVIPS encoding
+ *
+ * Copyright (c) 2003-2012 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 <lcdf/straccum.hh>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <algorithm>
+#include "util.hh"
+
+enum { GLYPHLIST_ALTERNATIVE = 0x40000000,
+ GLYPHLIST_USEMAP = GLYPHLIST_ALTERNATIVE,
+ U_EMPTYSLOT = 0xD801,
+ U_ALTSELECTOR = 0xD802 };
+static HashMap<String, uint32_t> glyphlist((uint32_t) -1);
+static Vector<uint32_t> glyphmap;
+static PermString::Initializer perm_initializer;
+PermString DvipsEncoding::dot_notdef(".notdef");
+
+#define NEXT_GLYPH_NAME(gn) ("/" + (gn))
+
+void
+DvipsEncoding::add_glyphlist(String text)
+{
+ const char *s = text.begin(), *end = text.end();
+ while (s != end) {
+ // move to first nonblank
+ while (s != end && isspace((unsigned char) *s))
+ ++s;
+ // ignore comments
+ if (s != end && *s == '#') {
+ skip_to_end_of_line:
+ while (s != end && *s != '\n' && *s != '\r')
+ ++s;
+ continue;
+ }
+ // parse glyph name
+ const char *name_start = s;
+ while (s != end && !isspace((unsigned char) *s) && *s != ';')
+ ++s;
+ if (s == name_start)
+ goto skip_to_end_of_line;
+ String glyph_name = text.substring(name_start, s).compact();
+ int map_pos = glyphmap.size();
+ // parse Unicodes
+ while (1) {
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || *s == '\n' || *s == '\r' || *s == '#'
+ || (map_pos == glyphmap.size() && *s != ';' && *s != ','))
+ break;
+ if (*s == ';' || *s == ',') {
+ ++s;
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || !isxdigit((unsigned char) *s))
+ goto skip_to_end_of_line;
+ if (map_pos != glyphmap.size())
+ glyphmap.push_back(GLYPHLIST_ALTERNATIVE);
+ }
+ uint32_t u = 0;
+ while (s != end && isxdigit((unsigned char) *s)) {
+ if (*s >= '0' && *s <= '9')
+ u = (u << 4) + *s - '0';
+ else if (*s >= 'A' && *s <= 'F')
+ u = (u << 4) + *s - 'A' + 10;
+ else
+ u = (u << 4) + *s - 'a' + 10;
+ ++s;
+ }
+ if (u == 0 || u > 0x10FFFF)
+ goto skip_to_end_of_line;
+ glyphmap.push_back(u);
+ if (s != end && !isspace((unsigned char) *s) && *s != ',' && *s != ';')
+ break;
+ }
+ // store result
+ if (map_pos == glyphmap.size() - 1) {
+ glyphlist.insert(glyph_name, glyphmap.back());
+ glyphmap.pop_back();
+ } else {
+ glyphlist.insert(glyph_name, map_pos | GLYPHLIST_USEMAP);
+ glyphmap.push_back(0);
+ }
+ goto skip_to_end_of_line;
+ }
+}
+
+static void
+unicode_add_suffix(Vector<uint32_t> &prefix,
+ int prefix_starting_from,
+ const Vector<uint32_t> &suffix)
+{
+ int prefix_size = prefix.size();
+ for (Vector<uint32_t>::const_iterator it = suffix.begin();
+ it != suffix.end() && *it != 0;
+ ++it)
+ if (*it == GLYPHLIST_ALTERNATIVE) {
+ prefix.push_back(*it);
+ for (int i = prefix_starting_from; i < prefix_size; ++i)
+ prefix.push_back(prefix[i]);
+ } else
+ prefix.push_back(*it);
+}
+
+bool
+DvipsEncoding::glyphname_unicode(String gn, Vector<uint32_t> &unis)
+{
+ int unis_first_size = unis.size();
+
+ // drop all characters to the right of the first dot
+ String::iterator dot = std::find(gn.begin(), gn.end(), '.');
+ if (dot > gn.begin() && dot < gn.end())
+ gn = gn.substring(gn.begin(), dot);
+
+ // map the first component, handle later components recursively
+ String::iterator underscore = std::find(gn.begin(), gn.end(), '_');
+ String component = gn.substring(gn.begin(), underscore);
+ int prefix_start = 0;
+ Vector<uint32_t> suffix;
+ if (String gn_suffix = gn.substring(underscore + 1, gn.end())) {
+ if (!glyphname_unicode(gn_suffix, suffix))
+ return false;
+ }
+
+ // check glyphlist
+ int value = glyphlist[component];
+ uint32_t uval;
+ if (value >= 0 && !(value & GLYPHLIST_USEMAP))
+ unis.push_back(value);
+ else if (value >= 0) {
+ for (int i = (value & ~GLYPHLIST_USEMAP);
+ glyphmap[i];
+ ++i)
+ if (glyphmap[i] == GLYPHLIST_ALTERNATIVE) {
+ unicode_add_suffix(unis, prefix_start, suffix);
+ unis.push_back(GLYPHLIST_ALTERNATIVE);
+ prefix_start = unis.size();
+ } else
+ unis.push_back(glyphmap[i]);
+ } else if (component.length() >= 7
+ && (component.length() % 4) == 3
+ && (memcmp(component.data(), "uni", 3) == 0
+ // 16.Aug.2008: Some texnansx.enc have incorrect "Uni"
+ // prefix, but we might as well understand it.
+ || memcmp(component.data(), "Uni", 3) == 0)) {
+ 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(unis_first_size);
+ return false;
+ }
+ } 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);
+ else
+ return false;
+
+ unicode_add_suffix(unis, prefix_start, suffix);
+ return true;
+}
+
+
+DvipsEncoding::DvipsEncoding()
+ : _boundary_char(-1), _altselector_char(-1), _unicoding_map(-1),
+ _warn_missing(false)
+{
+}
+
+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((unsigned char) 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((unsigned char) 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 bool
+retokenize_isword(char c)
+{
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9') || c == '.' || c == '_';
+}
+
+
+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 -EPARSE;
+}
+
+int
+DvipsEncoding::parse_position_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ if (v.size() != 4)
+ return -EPARSE;
+
+ int c = encoding_of(v[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 -EPARSE;
+ else if (v[0] == "||" || (av = encoding_of(v[0])) < 0)
+ return errh->warning("%<%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++) {
+ if (_unicoding.size() != original_size)
+ _unicoding.push_back(GLYPHLIST_ALTERNATIVE);
+ if (!glyphname_unicode(v[i], _unicoding)) {
+ errh->warning("can%,t map %<%s%> to Unicode", v[i].c_str());
+ if (i == v.size() - 1 && _unicoding.size() == original_size)
+ errh->warning("target %<%s%> will be deleted from encoding", v[0].c_str());
+ else if (_unicoding.size() != original_size)
+ _unicoding.pop_back();
+ }
+ }
+ }
+
+ _unicoding.push_back(0);
+ if (override > 0 || _unicoding_map[v[0]] < 0)
+ _unicoding_map.insert(v[0], original_size);
+ return 0;
+}
+
+const DvipsEncoding::WordType DvipsEncoding::word_types[] = {
+ { "LIGKERN", &DvipsEncoding::parse_ligkern_words },
+ { "POSITION", &DvipsEncoding::parse_position_words },
+ { "UNICODING", &DvipsEncoding::parse_unicoding_words }
+};
+
+void
+DvipsEncoding::parse_word_group(Vector<String> &words, int override, int wt, ErrorHandler *errh)
+{
+ if (words.size() > 0) {
+ int (DvipsEncoding::*method)(Vector<String> &, int, ErrorHandler *) = word_types[wt].parsefunc;
+ if ((this->*method)(words, override, errh) == -EPARSE) {
+ Vector<String> rewords;
+ for (String *sp = words.begin(); sp != words.end(); sp++) {
+ const char *s = sp->begin(), *ends = sp->end();
+ while (s != ends) {
+ const char *word = s;
+ if (*s == '{') {
+ for (s++; s != ends && *s != '}'; s++)
+ /* nada */;
+ if (s != ends)
+ s++;
+ } else {
+ bool x = retokenize_isword(*s);
+ for (s++; s != ends && x == retokenize_isword(*s); s++)
+ /* nada */;
+ }
+ rewords.push_back(sp->substring(word, s));
+ }
+ }
+ if ((this->*method)(rewords, override, errh) == -EPARSE)
+ errh->error("parse error in %s", word_types[wt].name);
+
+ }
+ words.clear();
+ }
+}
+
+int
+DvipsEncoding::parse_words(const String &s, int override, int wt, ErrorHandler *errh)
+{
+ Vector<String> words;
+ const char *data = s.data();
+ const char *end = s.end();
+ while (data < end) {
+ while (data < end && isspace((unsigned char) *data))
+ data++;
+ const char *first = data;
+ while (data < end && !isspace((unsigned char) *data) && *data != ';')
+ data++;
+ if (data == first) {
+ data++; // step past semicolon (or harmlessly past EOS)
+ parse_word_group(words, override, wt, errh);
+ } else
+ words.push_back(s.substring(first, data));
+ }
+ parse_word_group(words, override, wt, errh);
+ return 0;
+}
+
+String
+DvipsEncoding::landmark(int line) const
+{
+ StringAccum sa;
+ sa << _printable_filename << ':' << line;
+ return sa.take_string();
+}
+
+static String
+trim_space(const String &s, int pos)
+{
+ while (pos < s.length() && isspace((unsigned char) s[pos]))
+ pos++;
+ int epos = s.length();
+ for (int x = 0; x < 2; x++) {
+ while (epos > pos && isspace((unsigned char) s[epos - 1]))
+ epos--;
+ if (epos == pos || s[epos - 1] != ';')
+ break;
+ epos--;
+ }
+ return s.substring(pos, epos - pos);
+}
+
+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;
+ _printable_filename = printable_filename(filename);
+ _file_had_ligkern = false;
+ int pos = 0, line = 1;
+
+ // parse text
+ String token = tokenize(s, pos, line);
+ if (!token || token[0] != '/')
+ return errh->lerror(landmark(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(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((unsigned char) token[7])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(8), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "LIGKERNX", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 10
+ && memcmp(token.data(), "UNICODING", 9) == 0
+ && isspace((unsigned char) token[9])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(10), 1, WT_UNICODING, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "POSITION", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_POSITION, &lerrh);
+
+ } else if (token.length() >= 13
+ && memcmp(token.data(), "CODINGSCHEME", 12) == 0
+ && isspace((unsigned char) token[12])
+ && !ignore_other) {
+ _coding_scheme = trim_space(token, 13);
+ if (_coding_scheme.length() > 39)
+ lerrh.lwarning(landmark(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(line), "CODINGSCHEME cannot contain parentheses");
+ _coding_scheme = String();
+ }
+
+ } else if (token.length() >= 11
+ && memcmp(token.data(), "WARNMISSING", 11) == 0
+ && (token.length() == 11 || isspace((unsigned char) token[11]))
+ && !ignore_other) {
+ String value = trim_space(token, 11);
+ if (value == "1" || value == "yes" || value == "true" || !value)
+ _warn_missing = true;
+ else if (value == "0" || value == "no" || value == "false")
+ _warn_missing = false;
+ else
+ lerrh.lerror(landmark(line), "WARNMISSING command not understood");
+ }
+
+ return 0;
+}
+
+int
+DvipsEncoding::parse_ligkern(const String &ligkern_text, int override, ErrorHandler *errh)
+{
+ return parse_words(ligkern_text, override, WT_LIGKERN, errh);
+}
+
+int
+DvipsEncoding::parse_position(const String &position_text, int override, ErrorHandler *errh)
+{
+ return parse_words(position_text, override, WT_POSITION, errh);
+}
+
+int
+DvipsEncoding::parse_unicoding(const String &unicoding_text, int override, ErrorHandler *errh)
+{
+ return parse_words(unicoding_text, override, WT_UNICODING, errh);
+}
+
+void
+DvipsEncoding::bad_codepoint(int code, Metrics &metrics, HashMap<PermString, int> &unencoded)
+{
+ 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;
+ }
+
+ if (_warn_missing) {
+ Vector<uint32_t> garbage;
+ bool unicodes_explicit = x_unicodes(_e[code], garbage);
+ if (!unicodes_explicit || garbage.size() > 0) {
+ Vector<Setting> v;
+ v.push_back(Setting(Setting::RULE, 500, 500));
+ v.push_back(Setting(Setting::SPECIAL, String("Warning: missing glyph '") + _e[code] + "'"));
+ metrics.encode_virtual(code, _e[code], 0, v, true);
+ unencoded.insert(_e[code], 1);
+ }
+ }
+}
+
+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 {
+ glyphname_unicode(chname, unicodes);
+ return false;
+ }
+}
+
+
+void
+DvipsEncoding::make_metrics(Metrics &metrics, const FontInfo &finfo, Secondary *secondary, bool literal, ErrorHandler *errh)
+{
+ // first pass: without secondaries
+ for (int code = 0; code < _e.size(); code++) {
+ PermString chname = _e[code];
+
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find first single Unicode glyph supported by the font
+ Efont::OpenType::Glyph glyph = 0;
+ uint32_t glyph_uni = 0;
+ {
+ Vector<uint32_t> unicodes;
+ (void) x_unicodes(chname, unicodes);
+ Vector<uint32_t>::iterator u = unicodes.begin();
+ while (u != unicodes.end() && glyph <= 0) {
+ uint32_t this_uni = u[0];
+ ++u;
+ if (u != unicodes.end()) {
+ if (*u != GLYPHLIST_ALTERNATIVE)
+ break;
+ ++u;
+ }
+
+ glyph = map_uni(this_uni, *finfo.cmap, metrics);
+ if (glyph_uni == 0 || glyph > 0)
+ glyph_uni = this_uni;
+ }
+ }
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+#if 0
+ // 2.May.2008: ff, fi, fl, ffi, and ffl might map to f_f, f_i, f_l,
+ // f_f_i, and f_f_l
+ if (!named_glyph && chname.length() > 0 && chname.length() <= 3
+ && chname[0] == 'f') {
+ if (chname.equals("ff", 2))
+ named_glyph = finfo.glyphid("f_f");
+ else if (chname.equals("fi", 2))
+ named_glyph = finfo.glyphid("f_i");
+ else if (chname.equals("fl", 2))
+ named_glyph = finfo.glyphid("f_l");
+ else if (chname.equals("ffi", 2))
+ named_glyph = finfo.glyphid("f_f_i");
+ else if (chname.equals("ffl", 2))
+ named_glyph = finfo.glyphid("f_f_l");
+ }
+#endif
+ // 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];
+
+ // find all Unicodes
+ Vector<uint32_t> unicodes;
+ bool unicodes_explicit = x_unicodes(chname, unicodes);
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.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's explicit unicoding or no named_glyph.
+ if (unicodes_explicit || named_glyph <= 0)
+ for (uint32_t *u = unicodes.begin(); u != unicodes.end(); ) {
+ uint32_t *endu = u + 1;
+ while (endu != unicodes.end() && *endu != GLYPHLIST_ALTERNATIVE)
+ ++endu;
+ if (secondary->encode_uni(code, chname, u, endu, metrics, errh))
+ goto encoded;
+ u = (endu == unicodes.end() ? endu : endu + 1);
+ }
+
+ // 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]))) {
+ uint32_t uni = 0;
+ if (unicodes.size() == 1 || (unicodes.size() > 0 && unicodes[1] == GLYPHLIST_ALTERNATIVE))
+ uni = unicodes[0];
+ metrics.encode(code, uni, named_glyph);
+ }
+
+ encoded:
+ /* all set */;
+ }
+
+ // add altselector
+ if (_altselector_char >= 0 && _altselector_char < _e.size()) {
+ metrics.add_altselector_code(_altselector_char, 0);
+ if (metrics.glyph(_altselector_char) <= 0 && !literal)
+ (void) secondary->encode_uni(_altselector_char, "altselector", U_ALTSELECTOR, metrics, errh);
+ }
+
+ // final pass: complain
+ HashMap<PermString, int> unencoded_map;
+ for (int code = 0; code < _e.size(); code++)
+ if (_e[code] != dot_notdef && metrics.glyph(code) <= 0)
+ bad_codepoint(code, metrics, unencoded_map);
+ Vector<String> unencoded;
+ for (HashMap<PermString, int>::iterator it = unencoded_map.begin(); it; ++it)
+ unencoded.push_back(it.key());
+
+ if (unencoded.size() == 1) {
+ errh->warning("%<%s%> glyph not found in font", unencoded[0].c_str());
+ errh->message("(This glyph will appear as a blot and cause warnings if used.)");
+ } else if (unencoded.size() > 1) {
+ 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->warning("%d glyphs not found in font:", unencoded.size());
+ errh->message("%s\n(These glyphs will appear as blots and cause warnings if used.)", sa.c_str());
+ }
+
+ metrics.set_coding_scheme(_coding_scheme);
+}
+
+void
+DvipsEncoding::make_base_mappings(Vector<int> &mappings, const FontInfo &finfo)
+{
+ mappings.clear();
+ for (int code = 0; code < _e.size(); code++) {
+ PermString chname = _e[code];
+
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find named glyph
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+ if (named_glyph > 0) {
+ if (mappings.size() <= named_glyph)
+ mappings.resize(named_glyph + 1, -1);
+ mappings[named_glyph] = code;
+ }
+ }
+}
+
+
+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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.hh
new file mode 100644
index 00000000000..a80631c3038
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/dvipsencoding.hh
@@ -0,0 +1,128 @@
+#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 FontInfo;
+
+class DvipsEncoding { public:
+
+ DvipsEncoding();
+
+ static void add_glyphlist(String);
+
+ 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 set_warn_missing(bool wm) { _warn_missing = wm; }
+
+ void encode(int, PermString);
+ inline int encoding_of(PermString) const;
+ int encoding_of(PermString, bool encode);
+ inline bool encoded(int e) const;
+ inline PermString encoding(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 FontInfo &, Secondary *, bool literal, ErrorHandler *);
+ void make_base_mappings(Vector<int> &mappings, const FontInfo &);
+
+ 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<uint32_t> _unicoding;
+
+ mutable Vector<uint32_t> _unicodes;
+
+ String _name;
+ String _filename;
+ String _printable_filename;
+ String _coding_scheme;
+ String _initial_comment;
+ String _final_text;
+ bool _file_had_ligkern;
+ bool _warn_missing;
+
+ struct WordType {
+ const char *name;
+ int (DvipsEncoding::*parsefunc)(Vector<String>&, int, ErrorHandler*);
+ };
+ static const WordType word_types[];
+ enum { WT_LIGKERN = 0, WT_POSITION, WT_UNICODING };
+
+ void add_ligkern(const Ligature &, int override);
+ enum { EPARSE = 90000 };
+ 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 *);
+ void parse_word_group(Vector<String> &, int override, int wt, ErrorHandler *);
+ int parse_words(const String &, int override, int wt, ErrorHandler *);
+ void bad_codepoint(int, Metrics &, HashMap<PermString, int> &bad_unicodes);
+ bool x_unicodes(PermString chname, Vector<uint32_t> &unicodes) const;
+ String landmark(int line) const;
+
+ static PermString dot_notdef;
+
+ static bool glyphname_unicode(String, Vector<uint32_t> &);
+
+ 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 PermString
+DvipsEncoding::encoding(int e) const
+{
+ if (encoded(e))
+ return _e[e];
+ else
+ return PermString();
+}
+
+inline int
+DvipsEncoding::encoding_of(PermString what) const
+{
+ return const_cast<DvipsEncoding *>(this)->encoding_of(what, false);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.cc
new file mode 100644
index 00000000000..a4120660bfc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.cc
@@ -0,0 +1,236 @@
+/* glyphfilter.{cc,hh} -- define subsets of characters
+ *
+ * Copyright (c) 2004-2012 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((unsigned char) *begin))
+ begin++;
+ if (begin >= end)
+ errh->error("missing pattern");
+
+ while (begin < end) {
+ const char* word = begin;
+ while (word < end && !isspace((unsigned char) *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, 2, 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, (begin[0] == 'U' ? 1 : 0), p.u.unirange.high))
+ /* do nothing */;
+ else
+ goto name_pattern; // assume it's a name
+ p.data = D_UNIRANGE;
+ _patterns.push_back(p);
+ goto next_clause;
+ }
+ }
+
+ // otherwise must be name pattern
+ 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((unsigned char) *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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/glyphfilter.hh
new file mode 100644
index 00000000000..753e5714d5c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.c
new file mode 100644
index 00000000000..e42b81fa24a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.c
@@ -0,0 +1,231 @@
+/* kpseinterface.{c,h} -- interface with the kpathsea library
+ *
+ * Copyright (c) 2003-2012 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.
+ */
+
+/* The W32TEX version does not link to Kpathsea, but uses the DLL
+ * built by MSVC.
+ */
+
+#if !defined(W32TEX)
+#include <kpathsea/config.h>
+#endif
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef W32TEX
+#define ENV_SEP ';'
+#include <windows.h>
+extern HINSTANCE Hinstance;
+#else
+#include <kpathsea/progname.h>
+#include <kpathsea/expand.h>
+#include <kpathsea/c-pathch.h>
+#include <kpathsea/tex-file.h>
+#endif
+#include "kpseinterface.h"
+
+int kpsei_env_sep_char = ENV_SEP;
+
+#ifdef W32TEX
+typedef enum
+{
+ kpse_gf_format,
+ kpse_pk_format,
+ kpse_any_glyph_format, /* ``any'' meaning gf or pk */
+ kpse_tfm_format,
+ kpse_afm_format,
+ kpse_base_format,
+ kpse_bib_format,
+ kpse_bst_format,
+ kpse_cnf_format,
+ kpse_db_format,
+ kpse_fmt_format,
+ kpse_fontmap_format,
+ kpse_mem_format,
+ kpse_mf_format,
+ kpse_mfpool_format,
+ kpse_mft_format,
+ kpse_mp_format,
+ kpse_mppool_format,
+ kpse_mpsupport_format,
+ kpse_ocp_format,
+ kpse_ofm_format,
+ kpse_opl_format,
+ kpse_otp_format,
+ kpse_ovf_format,
+ kpse_ovp_format,
+ kpse_pict_format,
+ kpse_tex_format,
+ kpse_texdoc_format,
+ kpse_texpool_format,
+ kpse_texsource_format,
+ kpse_tex_ps_header_format,
+ kpse_troff_font_format,
+ kpse_type1_format,
+ kpse_vf_format,
+ kpse_dvips_config_format,
+ kpse_ist_format,
+ kpse_truetype_format,
+ kpse_type42_format,
+ kpse_web2c_format,
+ kpse_program_text_format,
+ kpse_program_binary_format,
+ kpse_miscfonts_format,
+ kpse_web_format,
+ kpse_cweb_format,
+ kpse_enc_format,
+ kpse_cmap_format,
+ kpse_sfd_format,
+ kpse_opentype_format,
+ kpse_pdftex_config_format,
+ kpse_lig_format,
+ kpse_texmfscripts_format,
+ kpse_lua_format,
+ kpse_fea_format,
+ kpse_cid_format,
+ kpse_mlbib_format,
+ kpse_mlbst_format,
+ kpse_clua_format,
+ kpse_ris_format,
+ kpse_bltxml_format,
+ kpse_last_format /* one past last index */
+} kpse_file_format_type;
+#endif
+
+void
+kpsei_init(const char* argv0, const char* progname)
+{
+#ifdef W32TEX
+ PROC pkpse_set_program_name;
+ pkpse_set_program_name = GetProcAddress(Hinstance, "kpse_set_program_name");
+ if(!pkpse_set_program_name) {
+ fprintf(stderr, "Failed to find Kpathsea function.\n");
+ return;
+ }
+ (void)pkpse_set_program_name(argv0, progname);
+#else
+ kpse_set_program_name(argv0, progname);
+#endif
+#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)
+{
+#ifdef W32TEX
+ PROC pkpse_path_expand;
+ pkpse_path_expand = GetProcAddress(Hinstance, "kpse_path_expand");
+ if(!pkpse_path_expand) {
+ fprintf(stderr, "Failed to find Kpathsea function.\n");
+ return 0;
+ }
+ return (char *)pkpse_path_expand(path);
+#else
+ return kpse_path_expand(path);
+#endif
+}
+
+#ifdef W32TEX
+#define kpse_find_file (char *)pkpse_find_file
+#endif
+
+char*
+kpsei_find_file(const char* name, int format)
+{
+ char *result;
+#ifdef W32TEX
+ PROC pkpse_find_file;
+ pkpse_find_file = GetProcAddress(Hinstance, "kpse_find_file");
+ if(!pkpse_find_file) {
+ fprintf(stderr, "Failed to find Kpathsea function.\n");
+ return 0;
+ }
+#endif
+ switch (format) {
+ case KPSEI_FMT_WEB2C:
+ return kpse_find_file(name, kpse_web2c_format, true);
+ case KPSEI_FMT_ENCODING:
+#if HAVE_DECL_KPSE_ENC_FORMAT
+ if ((result = kpse_find_file(name, kpse_enc_format, true)))
+ return result;
+#endif
+ 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_TYPE42:
+ return kpse_find_file(name, kpse_type42_format, false);
+ case KPSEI_FMT_TRUETYPE:
+ return kpse_find_file(name, kpse_truetype_format, false);
+#if HAVE_DECL_KPSE_OPENTYPE_FORMAT
+ case KPSEI_FMT_OPENTYPE:
+ return kpse_find_file(name, kpse_opentype_format, false);
+#endif
+ case KPSEI_FMT_OTHER_TEXT:
+ return kpse_find_file(name, kpse_program_text_format, true);
+ case KPSEI_FMT_MAP:
+ return kpse_find_file(name, kpse_fontmap_format, true);
+ default:
+ return 0;
+ }
+}
+
+void
+kpsei_set_debug_flags(unsigned flags)
+{
+#ifdef W32TEX
+ unsigned int *pkpathsea_debug;
+ pkpathsea_debug = (unsigned int *)GetProcAddress(Hinstance, "kpathsea_debug");
+ if(!pkpathsea_debug) {
+ fprintf(stderr, "Failed to find Kpathsea variable.\n");
+ return;
+ }
+ *pkpathsea_debug = flags;
+#else
+ kpathsea_debug = flags;
+#endif
+}
+
+#ifdef W32TEX
+int
+kpsei_getlongpath(char *buff, char *input, int len)
+{
+ PROC pkpse_getlongpath;
+ pkpse_getlongpath = GetProcAddress(Hinstance, "getlongpath");
+ if(!pkpse_getlongpath) {
+ fprintf(stderr, "Failed to find Kpathsea function.\n");
+ return 0;
+ }
+ return (int)pkpse_getlongpath(buff, input, len);
+}
+
+char *
+kpsei_var_value(const char *var)
+{
+ PROC pkpse_var_value;
+ pkpse_var_value = GetProcAddress(Hinstance, "kpse_var_value");
+ if(!pkpse_var_value) {
+ fprintf(stderr, "Failed to find Kpathsea function.\n");
+ return NULL;
+ }
+ return (char *)pkpse_var_value(var);
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.h
new file mode 100644
index 00000000000..c822a24fa1e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/kpseinterface.h
@@ -0,0 +1,26 @@
+#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, KPSEI_FMT_MAP, KPSEI_FMT_TRUETYPE,
+ KPSEI_FMT_OPENTYPE, KPSEI_FMT_TYPE42 };
+char* kpsei_find_file(const char* name, int format);
+void kpsei_set_debug_flags(unsigned flags);
+
+#ifdef W32TEX
+int kpsei_getlongpath(char *buff, char *input, int len);
+char *kpsei_var_value(const char *var);
+#define true 1
+#define false 0
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.cc
new file mode 100644
index 00000000000..b4427f3f6fa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.cc
@@ -0,0 +1,1550 @@
+/* metrics.{cc,hh} -- an encoding during and after OpenType features
+ *
+ * Copyright (c) 2003-2012 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(const Efont::CharstringProgram *font, int nglyphs)
+ : _boundary_glyph(nglyphs), _emptyslot_glyph(nglyphs + 1),
+ _design_units(1000), _units_per_em(font->units_per_em()),
+ _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(const 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, Code after) const
+{
+ if (g < 0)
+ return -1;
+ int answer = -1, n = 0;
+ for (int i = _encoding.size() - 1; i >= after; i--)
+ if (_encoding[i].glyph == g)
+ answer = i, n++;
+ if (n < 2 && after == 0) {
+ 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, 0);
+ 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, bool base_char)
+{
+ assert(code >= 0 && v.size() > 0);
+ if (code >= _encoding.size())
+ _encoding.resize(code + 1, Char());
+ _encoding[code].unicode = uni;
+ _encoding[code].glyph = VIRTUAL_GLYPH;
+ if (base_char)
+ _encoding[code].flags |= Char::BASE_REP;
+ 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::apply_base_encoding(const String &font_name, const DvipsEncoding &dvipsenc, const Vector<int> &mapping)
+{
+ int font_number = -1;
+ for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
+ if (c->glyph > 0 && !c->virtual_char && c->glyph < mapping.size()
+ && mapping[c->glyph] >= 0) {
+ if (font_number < 0)
+ font_number = add_mapped_font(mapped_font(0), font_name);
+ VirtualChar *vc = c->virtual_char = new VirtualChar;
+ vc->name = dvipsenc.encoding(mapping[c->glyph]);
+ vc->setting.push_back(Setting(Setting::FONT, font_number));
+ vc->setting.push_back(Setting(Setting::SHOW, mapping[c->glyph], c->glyph));
+ c->glyph = VIRTUAL_GLYPH;
+ c->base_code = -1;
+ c->flags = (c->flags & ~Char::BASE_LIVE) | Char::BASE_REP;
+ }
+}
+
+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));
+}
+
+bool
+Metrics::base_glyphs(Vector<Glyph> &v, int size) const
+{
+ bool any = false;
+ v.assign(_encoding.size(), 0);
+ for (const Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->base_code >= 0 && ch->base_code < size) {
+ v[ch->base_code] = ch->glyph;
+ any = true;
+ }
+ return any;
+}
+
+
+/*****************************************************************************/
+/* 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 */
+
+class Metrics::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;
+};
+
+Metrics::ChangedContext::ChangedContext(int ncodes)
+ : _v(ncodes, 0), _initial_ncodes(ncodes), _all_sentinel(((ncodes - 1) >> 5) + 1, 0xFFFFFFFFU)
+{
+}
+
+Metrics::ChangedContext::~ChangedContext()
+{
+ for (Vector<uint32_t> **v = _v.begin(); v != _v.end(); v++)
+ if (*v != &_all_sentinel)
+ delete *v;
+}
+
+inline void
+Metrics::ChangedContext::ensure_all(Code c) const
+{
+ if (c >= 0 && (c >> 5) >= _all_sentinel.size())
+ _all_sentinel.resize((c >> 5) + 1, 0xFFFFFFFFU);
+}
+
+inline bool
+Metrics::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
+Metrics::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
+Metrics::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
+Metrics::ChangedContext::virgin(Code c) const
+{
+ return (c >= 0 && (c >= _v.size() || _v[c] == 0));
+}
+
+void
+Metrics::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
+Metrics::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_single(Code cin, const Substitution *s, int lookup,
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ // check if encoded
+ if (!ctx.allowed(cin, false))
+ /* not encoded before this substitution began, or completely changed;
+ ingore */
+ return;
+
+ // check if substitution of this code allowed
+ if (!glyph_filter.allow_substitution(s->in_glyph(), glyph_names, unicode(cin)))
+ return;
+
+ // 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
+ return;
+
+ // 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;
+ } 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);
+ }
+ }
+
+ // no more substitutions for cin
+ ctx.disallow(cin);
+}
+
+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);
+}
+
+void
+Metrics::apply_simple_context_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup, ChangedContext &ctx)
+{
+ int nleft = s->left_nglyphs(), nin = s->in_nglyphs();
+ assert(codes.size() >= 2);
+
+ // check if context allows substitutions
+ for (const Code *inp = codes.begin(); inp < codes.end(); ++inp)
+ if (!ctx.allowed(*inp, inp - codes.begin() < nleft))
+ return;
+
+ // check if any part of the combination has already changed
+ int ncheck = nleft + (nin > 2 ? 2 : nin);
+ if (ncheck == codes.size())
+ --ncheck;
+ for (const Code *inp = codes.begin(); inp < codes.begin() + ncheck; ++inp)
+ if (!ctx.pair_allowed(inp[0], inp[1]))
+ return;
+
+ // mark this combination as changed if appropriate
+ if (codes.size() == 2 && nin == 1)
+ ctx.disallow_pair(codes[0], codes[1]);
+
+ // actually apply ligature
+ apply_ligature(codes, s, lookup);
+}
+
+bool
+Metrics::next_encoding(Vector<Code> &codes, const Vector<Glyph> &glyphs) const
+{
+ if (!codes.size()) {
+ codes.assign(glyphs.size(), 0);
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], 0)) < 0)
+ return false;
+ return true;
+ } else {
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], codes[i] + 1)) >= 0)
+ return true;
+ else
+ codes[i] = encoding(glyphs[i], 0);
+ return false;
+ }
+}
+
+int
+Metrics::apply(const Vector<Substitution>& sv, bool allow_single, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ // keep track of what substitutions we have performed
+ ChangedContext ctx(_encoding.size());
+
+ // 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();
+ bool is_apply_single = is_single && allow_single;
+ bool is_apply_simple_context_ligature = !is_single && !s->is_multiple() && s->is_simple_context();
+
+ if (is_apply_single || is_apply_simple_context_ligature) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_apply_single)
+ apply_single(codes[0], s, lookup, ctx, glyph_filter, glyph_names);
+ else
+ apply_simple_context_ligature(codes, s, lookup, ctx);
+ }
+ } else
+ failures++;
+ }
+
+ return sv.size() - failures;
+}
+
+void
+Metrics::apply_alternates_single(Code cin, const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ Code last = cin;
+ uint32_t u = unicode(cin);
+ for (int i = 0; i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, u)) {
+ 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(cin, as->in2, out);
+ }
+}
+
+void
+Metrics::apply_alternates_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ // check whether the output character is allowed
+ if (!glyph_filter.allow_alternate(s->out_glyph(), glyph_names, 0))
+ return;
+
+ // find alternate selector and apply ligature if appropriate
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ Vector<Code> lig(codes);
+ lig.insert(lig.begin() + 1, as->in2);
+ apply_ligature(lig, s, lookup);
+ }
+}
+
+void
+Metrics::apply_alternates(const Vector<Substitution>& sv, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
+ bool is_single = s->is_single() || s->is_alternate();
+ if (is_single || s->is_ligature()) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_single)
+ apply_alternates_single(codes[0], s, lookup, glyph_filter, glyph_names);
+ else
+ apply_alternates_ligature(codes, s, lookup, glyph_filter, glyph_names);
+ }
+ }
+ }
+}
+
+
+/*****************************************************************************/
+/* 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);
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ // loop over substitutions
+ int success = 0;
+ for (const Positioning *p = pv.begin(); p != pv.end(); p++) {
+ bool is_single = p->is_single();
+ if (is_single || p->is_pairkern()) {
+ p->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); )
+ if (is_single) {
+ if (!assign_bitvec(single_changed, codes[0], _encoding.size())) {
+ _encoding[codes[0]].pdx += p->left().pdx;
+ _encoding[codes[0]].pdy += p->left().pdy;
+ _encoding[codes[0]].adx += p->left().adx;
+ }
+ } else {
+ if (!assign_bitvec(pair_changed[codes[0]], codes[1], _encoding.size()))
+ add_kern(codes[0], codes[1], 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;
+
+ // make sure we have ligatures
+ Vector<Ligature3> my_ligs;
+ if (!all_ligs) {
+ all_ligatures(my_ligs);
+ all_ligs = &my_ligs;
+ }
+
+ /* 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].base_code >= 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;
+ // 21.Feb.2007: Character isn't live any more.
+ ch->flags &= ~(Char::BASE_LIVE | Char::LIVE);
+ }
+
+ /* Maybe we don't need to do anything else. */
+ if (_encoding.size() <= size) {
+ _encoding.resize(size, Char());
+ return;
+ }
+
+ /* Need liveness markings. */
+ if (!_liveness_marked)
+ mark_liveness(size);
+
+ /* 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 {
+ CONVENTIONAL_F_LIGATURE_SCORE = 1,
+ CONVENTIONAL_F_F_LIGATURE_SCORE = 2,
+ BASIC_LATIN_LOWER_SCORE = 3,
+ BASIC_LATIN_UPPER_SCORE = 4,
+ BASIC_LATIN_OTHER_SCORE = 5,
+ LATIN1_SUPPLEMENT_SCORE = 6,
+ LOW_16_SCORE = 7,
+ OTHER_SCORE = 8,
+ NOCHAR_SCORE = 100000,
+ CONTEXT_PENALTY = 4
+};
+
+static int
+unicode_score(uint32_t u)
+{
+ if (u == 0)
+ return NOCHAR_SCORE;
+ else if (u >= 'a' && u <= 'z')
+ return BASIC_LATIN_LOWER_SCORE;
+ else if (u >= 'A' && u <= 'Z')
+ return BASIC_LATIN_UPPER_SCORE;
+ else if (u < 0x0080)
+ return BASIC_LATIN_OTHER_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]) {
+ /* 2.May.2008: Prefer conventional f-ligatures. */
+ if (score == 2 * BASIC_LATIN_LOWER_SCORE
+ && _encoding[l->in1].unicode == 'f'
+ && (_encoding[l->in2].unicode == 'f'
+ || _encoding[l->in2].unicode == 'i'
+ || _encoding[l->in2].unicode == 'l'))
+ score = CONVENTIONAL_F_LIGATURE_SCORE;
+ else if (score == CONVENTIONAL_F_LIGATURE_SCORE + BASIC_LATIN_LOWER_SCORE) {
+ if (scores[l->in1] == CONVENTIONAL_F_LIGATURE_SCORE
+ && (_encoding[l->in2].unicode == 'i'
+ || _encoding[l->in2].unicode == 'l'))
+ score = CONVENTIONAL_F_F_LIGATURE_SCORE;
+ else
+ score = 3 * BASIC_LATIN_LOWER_SCORE;
+ }
+ scores[l->out] = score;
+ }
+ }
+
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ /* Make sure that if this virtual 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, assign codes to the unencoded characters. */
+ int nunencoded = 0;
+
+ 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 dest = -1;
+ for (Code *h = empty_codes.begin(); h < empty_codes.end() && dest < 0; h++) {
+ int haves = (_encoding[*h].base_code < 0 ? 1 : 0)
+ + (!_encoding[*h].visible() ? 2 : 0);
+ if ((needs & haves) == needs)
+ dest = *h;
+ }
+
+ if (dest >= 0) {
+ if (needs & 2) {
+ assert(!_encoding[dest].visible());
+ _encoding[dest].swap(_encoding[slot->old_code]);
+ slot->new_code = dest;
+ } else {
+ _encoding[slot->old_code].base_code = dest;
+ slot->new_code = slot->old_code;
+ }
+ if (needs & 1) {
+ assert(_encoding[dest].base_code < 0 || _encoding[dest].base_code == slot->old_code);
+ _encoding[dest].base_code = slot->old_code;
+ }
+ } 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 these have been left out:\n%s.\n\
+To select specific glyphs, add them to the input encoding.)", 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)
+{
+ Vector<Code> reencoding;
+ for (Code c = 0; c < size && c < _encoding.size(); c++) {
+ Char &ch = _encoding[c];
+ if (ch.base_code >= 0 && ch.base_code != c) {
+ if (!reencoding.size())
+ for (Code cc = 0; cc < _encoding.size(); cc++)
+ reencoding.push_back(cc);
+ reencoding[ch.base_code] = c;
+ reencoding[c] = ch.base_code;
+ _encoding[c].swap(_encoding[ch.base_code]);
+ }
+ if (ch.virtual_char) // remove it
+ ch.clear();
+ }
+ if (reencoding.size()) {
+ 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->glyph /* actually encoded */
+ && (ch->pdx || ch->pdy || ch->adx || ch->virtual_char))
+ return true;
+ return false;
+}
+
+bool
+Metrics::need_base()
+{
+ if (!_liveness_marked)
+ mark_liveness(_encoding.size());
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if ((ch->flags & Char::BASE_LIVE) && ch->glyph != _boundary_glyph)
+ return true;
+ return false;
+}
+
+bool
+Metrics::setting(Code code, Vector<Setting> &v, SettingMode sm) const
+{
+ extern int letterspace;
+
+ 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;
+
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+
+ 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:
+ case Setting::SPECIAL:
+ 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:
+ case Setting::KERNX:
+ if (sm & SET_INTERMEDIATE)
+ v.push_back(*s);
+ else if (font_number == 0 && s > vc->setting.begin()
+ && s + 1 < vc->setting.end()
+ && s[-1].op == Setting::SHOW
+ && s[1].op == Setting::SHOW) {
+ int k = kern(s[-1].x, s[1].x);
+ if (s->op == Setting::KERNX)
+ k -= letterspace;
+ if (k)
+ v.push_back(Setting(Setting::MOVE, k, 0));
+ }
+ break;
+ }
+
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ 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 Char *ch) const
+{
+ Code c;
+ if (ch >= _encoding.begin() && ch < _encoding.end())
+ c = ch - _encoding.begin();
+ else
+ c = -1;
+ 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*");
+ int curfont = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::FONT:
+ fprintf(stderr, " {F%d}", s->x);
+ curfont = s->x;
+ break;
+ case Setting::SHOW:
+ fprintf(stderr, " %d", s->x);
+ if (curfont == 0)
+ fprintf(stderr, "/%s", 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;
+ case Setting::SPECIAL:
+ fprintf(stderr, " S{%s}", s->s.c_str());
+ 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
+}
+
+void
+Metrics::unparse() const
+{
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if (ch->glyph)
+ unparse(ch);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.hh
new file mode 100644
index 00000000000..b032e6b348f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/metrics.hh
@@ -0,0 +1,297 @@
+#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, KERNX, MOVE, RULE, PUSH, POP,
+ SPECIAL, DEAD };
+ int op;
+ int x;
+ int y;
+ String s;
+ Setting(int op_in, int x_in = 0, int y_in = 0)
+ : op(op_in), x(x_in), y(y_in) { }
+ Setting(int op_in, const String &s_in) : op(op_in), s(s_in) { }
+ bool valid_op() const { return op >= FONT && op <= SPECIAL; }
+};
+
+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(const 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; }
+ int units_per_em() const { return _units_per_em; }
+ void set_design_units(int du) { _design_units = du; }
+
+ int n_mapped_fonts() const { return _mapped_fonts.size();}
+ const 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(const 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 code) const;
+ inline uint32_t unicode(Code code) const;
+ inline Code encoding(Glyph g, Code after) const;
+ Code unicode_encoding(uint32_t uni) const;
+ Code force_encoding(Glyph g, int lookup_source = -1);
+ void encode(Code code, uint32_t uni, Glyph g);
+ void encode_virtual(Code, PermString, uint32_t uni, const Vector<Setting> &, bool base_char);
+
+ void add_altselector_code(Code, int altselector_type);
+ bool altselectors() const { return _altselectors.size() > 0; }
+
+ inline bool was_base_glyph(Code) const;
+ inline Code base_code(Code) const;
+ inline Glyph base_glyph(Code) const;
+ bool base_glyphs(Vector<Glyph> &, int size) 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 apply_base_encoding(const String &font_name, const DvipsEncoding &, const Vector<int> &mapping);
+
+ void cut_encoding(int size);
+ void shrink_encoding(int size, const DvipsEncoding &, ErrorHandler *);
+ void make_base(int size);
+
+ bool need_virtual(int size) const;
+ bool need_base();
+ 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, BASE_REP = 32 };
+ 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; }
+ inline bool base_glyph() const;
+ 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;
+ int _units_per_em;
+
+ bool _liveness_marked : 1;
+
+ Vector<const 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, Code) const;
+ bool next_encoding(Vector<Code> &codes, const Vector<Glyph> &glyphs) 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> * = 0);
+ void reencode(const Vector<Code> &);
+
+ class ChangedContext;
+ void apply_ligature(const Vector<Code> &, const Substitution *, int lookup);
+ void apply_single(Code cin, const Substitution *s, int lookup,
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+ void apply_simple_context_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup, ChangedContext &ctx);
+ void apply_alternates_single(Code cin, const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+ void apply_alternates_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+
+ void unparse(const Char *) const;
+
+};
+
+
+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, Code after) const
+{
+ Code c;
+ if (g >= 0 && g < _emap.size() && (c = _emap.at_u(g)) >= -1)
+ return c < 0 || c >= after ? c : -1;
+ else
+ return hard_encoding(g, after);
+}
+
+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();
+}
+
+inline bool
+Metrics::Char::base_glyph() const
+{
+ return glyph == VIRTUAL_GLYPH ? flags & BASE_REP : glyph != 0;
+}
+
+inline bool
+Metrics::was_base_glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].base_glyph();
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.1
new file mode 100644
index 00000000000..96e9ac64383
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.1
@@ -0,0 +1,1654 @@
+'\"t
+.ds V 2.98
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.de Bp
+.IP \(bu 3n
+..
+.TH OTFTOTFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+otftotfm \- create TeX font metrics from OpenType fonts
+.SH SYNOPSIS
+.B otftotfm
+\%[\fB\-a\fR]
+\%[\fBoptions\fR]
+\%\fIfontfile\fR [\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" or ".ttf" 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
+works on both PostScript-flavored and TrueType-flavored OpenType fonts,
+although TrueType-flavor support will only work easily with pdftex.
+.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 \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".
+'
+.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 .
+On newer TeXLive installations, you may need to set the TEXMFVAR environment
+variable.)
+You can then run "\fBotftotfm\fR
+.B \-a
+.IR fontfile
+.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/
+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. 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
+.B Otftotfm
+also installs a font file suitable for printing. PostScript-flavored
+OpenType fonts are translated to Type 1 format and installed as PFB fonts.
+TrueType-flavored fonts are normally installed as is, since pdftex and
+pdflatex can read TrueType directly; but if you provide the
+.B \-\-type42
+option,
+.B otftotfm
+will translate TrueType fonts to Type 42 format, which dvips understands.
+.B Otftotfm
+does not overwrite existing font files.
+.PP
+The installation paths are as follows, where \fIPSname\fR is the font's
+PostScript name.
+.TS
+l l l .
+PFB TEXMF/fonts/type1/\fIvendor\fR/\fItypeface\fR/ \fIPSname\fR.pfb
+TrueType TEXMF/fonts/truetype/\fIvendor\fR/\fItypeface\fR/ \fIfontfile\fR
+Type 42 TEXMF/fonts/type42/\fIvendor\fR/\fItypeface\fR/ \fIPSname\fR.t42
+.TE
+.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 T1DESTDIR \-\-type1\-directory
+TrueType TRUETYPEDESTDIR \-\-truetype\-directory
+Type 42 T42DESTDIR \-\-type42\-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 has reasonable accent support and is a good choice
+for many OpenType fonts. LY1 corresponds to the "texnansx.enc" encoding
+file, so we will supply
+.B otftotfm
+with the "\fB\-e\fR texnansx" option.
+.RS
+.LP
+Expert note: Strictly speaking, LY1 corresponds to the "texnansi.enc"
+encoding file. Since the "texnansx.enc" version omits duplicate
+characters, it has more room for font-specific glyphs and is generally a
+better choice; but if you plan to type characters like "ae" directly into
+your editor, rather than using TeX commands like \eae, you should use
+"texnansi.enc".
+.RE
+.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 GLYPH 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.
+'
+.Sp
+.TP 5
+.BI \-\-fixed\-width
+Set the font to fixed-width (its space character will have no stretch or
+shrink). Normally you won't need this option; the font will tell
+.B otftotfm
+whether it is fixed width. The opposite of
+.B \-\-fixed\-width
+is
+.BR \-\-proportional\-width .
+'
+.Sp
+.TP 5
+.BI \-\-italic\-angle= angle
+Set the output font's default italic angle to
+.IR angle ,
+a number of degrees. This value is used by TeX to position
+accents. Normally you won't need this option; the font will tell
+.B otftotfm
+its italic angle.
+.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 \-\-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. Alternate selectors let TeX authors explicitly choose
+between versions of a character. For instance, the
+\&'\-\-altselector\-char="*"' option turns the "*" character into a special
+switch that cycles between alternates. For instance, the TeX input "A"
+would produce the normal version of the "A" Unicode character, "A*" would
+produce the first alternate, "A**" would produce the second alternate, and
+so forth. Furthermore, "s*t" will activate any discretionary "s_t"
+ligature in the font.
+.Sp
+The
+.B \-\-altselector\-char
+mechanism uses the features specified by
+.BR \-\-altselector\-feature
+options.
+.Sp
+The alternate-selector character may also be specified in the encoding; see
+ENCODINGS, below. 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 GLYPH 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
+\&'\-\-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
+'
+.Sp
+.TP 5
+.BI \-\-ligkern= command
+Add a LIGKERN
+.IR command
+to 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
+Add a POSITION
+.IR command
+to 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
+Add a UNICODING
+.IR command
+to 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
+Add a CODINGSCHEME to the encoding. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-warn\-missing
+Warn about encoded characters not supported by the font. See the
+WARNMISSING command in ENCODINGS, below.
+'
+.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 \-\-base\-encodings= file
+.B Experts only.
+Allow the output font to refer to existing "base" fonts. This can greatly
+reduce the number of base fonts generated by
+.BR otftotfm ". "
+Each line in the
+.I file
+argument contains a TeX font name (as for
+.BR \-\-name )
+and a corresponding literal encoding file (as for
+.BR \-\-literal\-encoding );
+for example:
+.nf
+ WarnoProReg\-\-eka eka
+ WarnoProReg\-\-exp1 exp1
+.fi
+The named fonts must have been created by prior runs of
+.B otftotfm
+on the same input OpenType font, with the same
+.BR \-\-extend
+and
+.BR \-\-slant
+options as the current run. The current output font will refer to glyphs
+from the named base fonts when possible. If the base fonts cover all
+glyphs required by the output font,
+.B otftotfm
+won't generate any new base fonts at all. The
+.I file
+can also refer to dotless-J fonts using the following syntax:
+.nf
+ WarnoProReg\-\-lcdfj \- dotlessj
+.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\-truetype
+Do not install TrueType-flavored fonts.
+'
+.Sp
+.TP 5
+.BI \-\-type42
+Install TrueType-flavored fonts in translated Type 42 format.
+'
+.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.
+'
+.\" .Sp
+.\" .TP 5
+.\" .BI \-\-base\-name name
+.\" Experts only: Set the TeX name of the "base" output font. When
+.\" .B otftotfm
+.\" needs to make a virtual font (because of font features and/or
+.\" letterspacing), it must generate at least two TFM metrics files, one for
+.\" the base font and one for the virtual font. In some cases, multiple
+.\" virtual fonts can share the same base metrics, reducing the number of
+.\" installed metrics files. This option lets you explicitly set the name of
+.\" the base output font independently from the main output font, and thus
+.\" force fonts to share base metrics. The default base name is derived from
+.\" the TeX name, with "\f(CW\-\-base\fR" appended.
+.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
+.TP 5
+.BI \-\-truetype\-directory= dir
+.TP 5
+.BI \-\-type42\-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 a Adobe glyph list, which helps translate glyph names to Unicode code
+points. Give multiple options to include multiple files.
+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, say an input encoding
+has "/dotlessi" at position 10.
+.B Otftotfm
+detects that position 10 should contain Unicode character U+0131 LATIN
+SMALL LETTER DOTLESS I, and uses the font's glyph for that character
+(possibly modified by any active features). The selected glyph might not
+be named "dotlessi"; only the Unicode value matters.
+.PP
+.B Otftotfm
+assigns Unicode values to glyph names using a table published by Adobe (SEE
+ALSO has a reference), with extensions for TeX. For more fine-grained
+control, add UNICODING commands to the input encoding file. These commands
+have the following format:
+.nf
+ % UNICODING \fIglyph\fR =: \fIchoice1\fR [\fIchoice2\fR ...] ;
+.fi
+This 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. \fIGlyph\fR and the
+.IR choice s
+are PostScript glyph names; the initial "%" sign is required; and each
+UNICODING line can contain multiple commands, separated by spaced
+semicolons. For example,
+.nf
+ % UNICODING pi1 =: uni03D6 ;
+.fi
+encodes the character "/pi1" as U+03D6 GREEK PI SYMBOL,
+and
+.nf
+ % UNICODING Delta =: uni0394 uni2206 ;
+.fi
+makes U+0394 GREEK CAPITAL LETTER DELTA preferred to
+U+2206 INCREMENT as an encoding for "/Delta". You can also supply
+glyph names:
+.nf
+ % UNICODING Delta =: Deltagreek Delta ;
+.fi
+A mapping with no Unicode values removes that glyph from the input
+encoding. For instance, this erases any f-ligature characters from the
+encoding:
+.nf
+ % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
+.fi
+The slots are available for
+.BR otftfm 's
+own use, for example for other characters required by the font. (If the
+f-ligatures themselves are required by the font, for instance by a \&'liga'
+feature, then they will be stored into their old slots when possible.) Map
+a glyph to \&'emptyslot' if you don't want
+.B otftotfm
+to use the slot. For example, this will leave the \&'ff' slot unused if
+the font has no \&'ff' glyph:
+.nf
+ % UNICODING ff =: ff emptyslot ;
+.fi
+(Note that most OpenType fonts provide a visible representation for unused
+encoding slots, namely a box with an X inside.)
+.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
+.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
+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
+The CODINGSCHEME command specifies the coding scheme for fonts using this
+encoding. This is a string, less than 40 characters long and containing no
+parentheses, that classifies the encoding for TeX's purposes. Sample
+coding schemes include "TEX TEXT", "TEX MATH ITALIC", and "EXTENDED TEX
+FONT ENCODING - LATIN". For example:
+.nf
+ % CODINGSCHEME EXTENDED TEX FONT ENCODING - LATIN
+.fi
+Most tools ignore the coding scheme; fontinst is an exception.
+.B Otftotfm
+uses the encoding's PostScript name for the default coding scheme.
+.PP
+Finally, the WARNMISSING command makes any glyphs not supported by the
+input font appear as black boxes. The
+.M dvips 1
+processor will also print a warning when encountering these glyphs. For
+example:
+.nf
+ % WARNMISSING yes
+.fi
+.PP
+The
+.BR \-\-unicoding ,
+.BR \-\-ligkern ,
+.BR \-\-position ,
+.BR \-\-coding\-scheme ,
+and
+.B \-\-warn\-missing
+options add UNICODING, LIGKERN/LIGKERNX, POSITION, CODINGSCHEME, and
+WARNMISSING commands to an encoding, and can override commands in the
+encoding itself. 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. Commands from
+options like
+.B \-\-ligkern
+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
+ringfitted
+Ring accent centered on the width of "A"
+.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
+FFLsmall
+Small-capital version of "FFL"
+.PD
+'
+'
+.SH "GLYPH PATTERNS"
+.LP
+The
+.BR \-\-include\-subs
+and
+.BR \-\-include\-alternates
+options, and their
+.B \-\-exclude
+and
+.B \-\-*\-filter
+variants, accept the following types of pattern.
+.Bp
+Glyph names. Example: "Aacute". For PostScript-flavored fonts, 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.
+.Bp
+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".
+.Bp
+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.
+.Bp
+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.
+.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 " and " swsh .
+.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. As a special case, "\fB\-f\fRkern" can
+also read kerning information from the "kern" table in conventional
+TrueType fonts.
+.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. Compare
+.IR subs .
+.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 subs ", Subscript"
+Replaces characters with smaller, lowered forms intended for subscripts.
+Supported. Compare
+.IR sinf ;
+some fonts support
+.I sinf
+but not
+.IR subs .
+.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. Note that some fonts with swash
+variants support the
+.I cswh
+feature exclusively.
+.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 .
+'
+.TP 5
+The \&'\fB\-a\fR' option did not install my font correctly.
+'
+Try again with the \&'\fB\-\-verbose\fR' option, which causes
+.BR otftotfm
+to explain its behavior. Note that by default,
+.BR otftotfm
+will not re-install files already present in your system's TeX search paths
+(in the current directory, for instance). Use \&'\fB\-\-force\fR' to
+override this behavior.
+'
+.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.
+'
+.TP 5
+How can I refer to the different forms of phi?
+'
+\fBOtftotfm\fR follows TeX practice and widely-distributed TeX encoding
+vectors, so "/phi" in an input encoding vector should map to a "straight"
+phi and "/phi1" should map to a "loopy" phi. Note that TeX practice
+differs from the PostScript standard naming conventions, in which "/phi" is
+"loopy" and "/phi1" is "straight"; this means that \fBotftotfm\fR may map
+"/phi" in an input encoding vector to a font's "/phi1" glyph, and vice
+versa. Perhaps most unambiguously, you can use "/uni03D5" for the
+"straight" form and "/uni03C6" for the "loopy" form.
+'
+.TP 5
+How can I get lining figures (that is, normal line-height digits) with small caps ('\fB\-f\fRsmcp')?
+'
+Many fonts use old-style figures by default with small caps. Since the
+default is not specified, it's wise to explicitly supply \&'\fB\-f\fRlnum' or
+\&'\fB-f\fRonum'.
+'
+.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 ttftotype42 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)
+.LP
+Adobe Systems, "Unicode and Glyph Names". Refers to the glyphlist.txt file
+used to translate glyph names to Unicode code points.
+http://partners.adobe.com/public/developer/opentype/index_glyph.html
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
+.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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.cc
new file mode 100644
index 00000000000..e36e1c63edf
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.cc
@@ -0,0 +1,2307 @@
+/* otftotfm.cc -- driver for translating OpenType fonts to TeX metrics
+ *
+ * Copyright (c) 2003-2012 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/otfname.hh>
+#include <efont/otfgsub.hh>
+#include <efont/ttfkern.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 <lcdf/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>
+/* M_PI isn't defined in C99 */
+#ifndef M_PI
+# define M_PI 3.14159265358979323846264338327
+#endif
+#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 WARN_MISSING_OPT 340
+#define BASE_ENCODINGS_OPT 341
+#define FIXED_PITCH_OPT 342
+#define ITALIC_ANGLE_OPT 343
+#define PROPORTIONAL_WIDTH_OPT 344
+
+#define AUTOMATIC_OPT 350
+#define FONT_NAME_OPT 351
+#define QUIET_OPT 352
+#define GLYPHLIST_OPT 353
+#define VENDOR_OPT 354
+#define TYPEFACE_OPT 355
+#define NOCREATE_OPT 356
+#define VERBOSE_OPT 357
+#define FORCE_OPT 358
+
+#define VIRTUAL_OPT 360
+#define PL_OPT 361
+#define TFM_OPT 362
+#define MAP_FILE_OPT 363
+#define OUTPUT_ENCODING_OPT 364
+
+#define DIR_OPTS 380
+#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 TYPE42_DIR_OPT (DIR_OPTS + O_TYPE42)
+#define TRUETYPE_DIR_OPT (DIR_OPTS + O_TRUETYPE)
+
+#define NO_OUTPUT_OPTS 400
+#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 YES_OUTPUT_OPTS 2000
+#define TRUETYPE_OPT (YES_OUTPUT_OPTS + G_TRUETYPE)
+#define TYPE42_OPT (YES_OUTPUT_OPTS + G_TYPE42)
+
+#define CHAR_OPTTYPE (Clp_ValFirstUser)
+
+static Clp_Option options[] = {
+
+ { "script", 's', SCRIPT_OPT, Clp_ValString, 0 },
+ { "feature", 'f', FEATURE_OPT, Clp_ValString, 0 },
+ { "letter-feature", 0, LETTER_FEATURE_OPT, Clp_ValString, 0 },
+ { "lf", 0, LETTER_FEATURE_OPT, Clp_ValString, 0 },
+ { "include-substitutions", 0, INCLUDE_SUBS_OPT, Clp_ValString, 0 },
+ { "exclude-substitutions", 0, EXCLUDE_SUBS_OPT, Clp_ValString, 0 },
+ { "clear-substitutions", 0, CLEAR_SUBS_OPT, 0, 0 },
+ { "substitution-filter", 0, SUBS_FILTER_OPT, Clp_ValString, 0 },
+ { "subs-filter", 0, SUBS_FILTER_OPT, Clp_ValString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ValString, 0 },
+ { "literal-encoding", 0, LITERAL_ENCODING_OPT, Clp_ValString, 0 },
+ { "base-encodings", 0, BASE_ENCODINGS_OPT, Clp_ValString, 0 },
+ { "extend", 'E', EXTEND_OPT, Clp_ValDouble, 0 },
+ { "slant", 'S', SLANT_OPT, Clp_ValDouble, 0 },
+ { "letterspacing", 'L', LETTERSPACE_OPT, Clp_ValInt, 0 },
+ { "letterspace", 'L', LETTERSPACE_OPT, Clp_ValInt, 0 },
+ { "min-kern", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "minimum-kern", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "kern-precision", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "ligkern", 0, LIGKERN_OPT, Clp_ValString, 0 },
+ { "position", 0, POSITION_OPT, Clp_ValString, 0 },
+ { "warn-missing", 0, WARN_MISSING_OPT, 0, Clp_Negate },
+ { "no-encoding-commands", 0, NO_ECOMMAND_OPT, 0, 0 },
+ { "default-ligkern", 0, DEFAULT_LIGKERN_OPT, 0, Clp_Negate },
+ { "unicoding", 0, UNICODING_OPT, Clp_ValString, 0 },
+ { "coding-scheme", 0, CODINGSCHEME_OPT, Clp_ValString, 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_ValString, 0 },
+ { "design-size", 0, DESIGN_SIZE_OPT, Clp_ValDouble, 0 },
+ { "include-alternates", 0, INCLUDE_ALTERNATES_OPT, Clp_ValString, 0 },
+ { "exclude-alternates", 0, EXCLUDE_ALTERNATES_OPT, Clp_ValString, 0 },
+ { "clear-alternates", 0, CLEAR_ALTERNATES_OPT, 0, 0 },
+ { "alternates-filter", 0, ALTERNATES_FILTER_OPT, Clp_ValString, 0 },
+ { "space-factor", 0, SPACE_FACTOR_OPT, Clp_ValDouble, 0 },
+ { "math-spacing", 0, MATH_SPACING_OPT, CHAR_OPTTYPE, Clp_Negate | Clp_Optional },
+ { "fixed-pitch", 0, FIXED_PITCH_OPT, 0, Clp_Negate },
+ { "fixed-width", 0, FIXED_PITCH_OPT, 0, Clp_Negate },
+ { "proportional-width", 0, PROPORTIONAL_WIDTH_OPT, 0, Clp_Negate },
+ { "italic-angle", 0, ITALIC_ANGLE_OPT, Clp_ValDouble, 0 },
+
+ { "pl", 'p', PL_OPT, 0, 0 },
+ { "virtual", 0, VIRTUAL_OPT, 0, Clp_Negate },
+ { "no-encoding", 0, NO_ENCODING_OPT, 0, 0 },
+ { "no-type1", 0, NO_TYPE1_OPT, 0, 0 },
+ { "no-dotlessj", 0, NO_DOTLESSJ_OPT, 0, 0 },
+ { "no-updmap", 0, NO_UPDMAP_OPT, 0, 0 },
+ { "truetype", 0, TRUETYPE_OPT, 0, Clp_Negate },
+ { "type42", 0, TYPE42_OPT, 0, Clp_Negate },
+ { "map-file", 0, MAP_FILE_OPT, Clp_ValString, Clp_Negate },
+ { "output-encoding", 0, OUTPUT_ENCODING_OPT, Clp_ValString, Clp_Optional },
+
+ { "automatic", 'a', AUTOMATIC_OPT, 0, Clp_Negate },
+ { "name", 'n', FONT_NAME_OPT, Clp_ValString, 0 },
+ { "vendor", 'v', VENDOR_OPT, Clp_ValString, 0 },
+ { "typeface", 0, TYPEFACE_OPT, Clp_ValString, 0 },
+
+ { "encoding-directory", 0, ENCODING_DIR_OPT, Clp_ValString, 0 },
+ { "pl-directory", 0, PL_DIR_OPT, Clp_ValString, 0 },
+ { "tfm-directory", 0, TFM_DIR_OPT, Clp_ValString, 0 },
+ { "vpl-directory", 0, VPL_DIR_OPT, Clp_ValString, 0 },
+ { "vf-directory", 0, VF_DIR_OPT, Clp_ValString, 0 },
+ { "type1-directory", 0, TYPE1_DIR_OPT, Clp_ValString, 0 },
+ { "type42-directory", 0, TYPE42_DIR_OPT, Clp_ValString, 0 },
+ { "truetype-directory", 0, TRUETYPE_DIR_OPT, Clp_ValString, 0 },
+
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "glyphlist", 0, GLYPHLIST_OPT, Clp_ValString, 0 },
+ { "no-create", 0, NOCREATE_OPT, 0, 0 },
+ { "force", 0, FORCE_OPT, 0, Clp_Negate },
+ { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },
+ { "kpathsea-debug", 0, KPATHSEA_DEBUG_OPT, Clp_ValInt, 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 ;";
+
+struct BaseEncoding {
+ String font_name;
+ String secondary;
+ DvipsEncoding encoding;
+};
+
+static const char *program_name;
+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 Vector<BaseEncoding *> base_encodings;
+static double extend;
+static double slant;
+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 bool override_is_fixed_pitch = false;
+static bool is_fixed_pitch;
+static bool override_italic_angle = false;
+static double italic_angle;
+
+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 | G_TRUETYPE;
+
+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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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);
+ uerrh.message("\
+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\
+ --fixed-width Set fixed width (no space stretch).\n\
+ --italic-angle=ANGLE Set font italic angle (for positioning accents).\n\
+\n");
+ uerrh.message("\
+Encoding options:\n\
+ -e, --encoding=FILE Use DVIPS encoding FILE as a base encoding.\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 as --alternates-filter, but cumulative.\n\
+ --exclude-alternates=PAT Ignore alternate characters matching PAT.\n\
+ --clear-alternates Clear included/excluded alternates.\n\
+ --ligkern=COMMAND Add a ligature or kern.\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\
+ --no-default-ligkern Don%,t include default LIGKERNs.\n\
+ --coding-scheme=SCHEME Set the output coding scheme to SCHEME.\n\
+ --warn-missing Warn about characters not supported by font.\n\
+ --literal-encoding=FILE Use DVIPS encoding FILE verbatim.\n\
+ --base-encodings=FILE Output can refer to base fonts named in FILE.\n\
+\n");
+ uerrh.message("\
+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\
+ --no-truetype Do not install TrueType-flavored input fonts.\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");
+ uerrh.message("\
+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\
+ --truetype-directory=DIR Put TrueType 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 <ekohler@gmail.com>.\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)
+{
+ const char *begin = font_name.begin(), *end = font_name.end();
+ while (end > begin && isdigit((unsigned char) end[-1]))
+ --end;
+ if (end < font_name.end() && end > begin && end[-1] != '-' && end[-1] != '+')
+ end = font_name.end();
+ else
+ while (end > begin && (end[-1] == '-' || end[-1] == '+'))
+ --end;
+ if (end == begin)
+ end = font_name.end();
+ return font_name.substring(begin, end) + suffix + font_name.substring(end, font_name.end());
+}
+
+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();
+
+ // old Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Name name(finfo.otf->table("name"), errh);
+ OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
+ 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 double max_printed_real;
+
+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);
+ max_printed_real = std::max(max_printed_real, fabs(value));
+ } else {
+ fprintf(f, "%s R %.4f%s", prefix, value * du, suffix);
+ max_printed_real = std::max(max_printed_real, fabs(value * du));
+ }
+}
+
+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 = finfo.italic_angle();
+ return -tan(val * M_PI / 180.0) + slant;
+}
+
+static void
+output_pl(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, bool vpl,
+ const String &filename, ErrorHandler *errh)
+{
+ // create file
+ if (no_create) {
+ errh->message("would create %s", filename.c_str());
+ return;
+ }
+
+ if (verbose)
+ errh->message("creating %s", filename.c_str());
+ FILE *f = fopen(filename.c_str(), "wb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return;
+ }
+
+ // 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);
+ max_printed_real = 0;
+
+ 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 == metrics.units_per_em() ? 1. : design_units / (double) metrics.units_per_em());
+
+ double actual_slant = font_slant(finfo);
+ if (actual_slant)
+ fprintf(f, " (SLANT R %g)\n", actual_slant);
+
+ if (char_bounds(bounds, width, finfo, font_xform, ' ')) {
+ // advance space width by letterspacing, scale by space_factor
+ double space_width = (width + (vpl ? letterspace : 0)) * space_factor;
+ fprint_real(f, " (SPACE", space_width, du);
+ if (finfo.is_fixed_pitch()) {
+ // 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 * du < 1000)
+ fprint_real(f, " (XHEIGHT", xheight, du);
+
+ fprint_real(f, " (QUAD", finfo.units_per_em(), du);
+ fprintf(f, " )\n");
+
+ if (boundary_char >= 0)
+ fprintf(f, "(BOUNDARYCHAR D %d)\n", boundary_char);
+
+ // figure out font mapping
+ int mapped_font0 = 0;
+ Vector<int> font_mapping;
+ if (vpl) {
+ int vpl_first_font = (metrics.need_base() ? 0 : 1);
+ font_mapping.assign(metrics.n_mapped_fonts(), 0);
+ if (vpl_first_font == 1 && font_mapping.size() == 1)
+ font_mapping.push_back(0);
+ // how many times is each font used?
+ Vector<Setting> settings;
+ for (int i = 0; i < 256; i++)
+ if (metrics.setting(i, settings)) {
+ int font_number = 0;
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ if (s->op == Setting::SHOW)
+ font_mapping[font_number]++;
+ else if (s->op == Setting::FONT)
+ font_number = (int) s->x;
+ }
+ // make sure the most-used font is number 0
+ mapped_font0 = std::max_element(font_mapping.begin(), font_mapping.end()) - font_mapping.begin();
+ // prepare the mapping
+ for (int i = vpl_first_font; i < font_mapping.size(); i++)
+ font_mapping[i] = i - vpl_first_font;
+ font_mapping[mapped_font0] = 0;
+ font_mapping[vpl_first_font] = mapped_font0 - vpl_first_font;
+ if (vpl_first_font != 0)
+ font_mapping[0] = font_mapping.size() - 1;
+ // write MAPFONT
+ for (int i = 0; i < metrics.n_mapped_fonts() - vpl_first_font; i++) {
+ int j = std::find(font_mapping.begin(), font_mapping.end(), i) - font_mapping.begin();
+ String name = metrics.mapped_font_name(j);
+ 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);
+ }
+ } else
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++)
+ font_mapping.push_back(i);
+
+ // 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];
+ bool any_ligs = false;
+ 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) {
+ if (any_ligs)
+ fprintf(f, "\n");
+ fprintf(f, " (LABEL %s)%s\n%s (STOP)\n", glyph_ids[i].c_str(), glyph_comments[i].c_str(), kern_sa.c_str());
+ any_ligs = true;
+ }
+ }
+ }
+ 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);
+ int program_number = mapped_font0;
+ const CharstringProgram *program = finfo.program();
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ switch (s->op) {
+
+ case Setting::SHOW:
+ if (vpl || program == finfo.program())
+ 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_number == 0)
+ sa << " (SETCHAR " << glyph_ids[s->x] << ')' << glyph_base_comments[s->x] << "\n";
+ else
+ sa << " (SETCHAR D " << s->x << ")\n";
+ break;
+
+ case Setting::MOVE: {
+ int x = 0, y = 0;
+ while (s+1 < settings.end() && s[1].op == Setting::MOVE)
+ x += s->x, y += s->y, s++;
+ if (vpl)
+ boundser.translate(s->x + x, s->y + y);
+ if (s->x + x)
+ sa << " (MOVERIGHT R " << real_string(s->x + x, du) << ")\n";
+ if (s->y + y)
+ sa << " (MOVEUP R " << real_string(s->y + y, du) << ")\n";
+ break;
+ }
+
+ case Setting::RULE:
+ if (vpl) {
+ 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:
+ if ((int) s->x != program_number) {
+ program = metrics.mapped_font((int) s->x);
+ program_number = (int) s->x;
+ sa << " (SELECTFONT D " << font_mapping[program_number] << ")\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));
+ if (vpl)
+ boundser.translate(p.x, p.y);
+ push_stack.pop_back();
+ sa << " (POP)\n";
+ break;
+ }
+
+ case Setting::SPECIAL: {
+ bool needhex = false;
+ for (const char *str = s->s.begin(); str < s->s.end() && !needhex; str++)
+ if (*str < ' ' || *str > '~' || *str == '(' || *str == ')')
+ needhex = true;
+ if (needhex) {
+ sa << " (SPECIALHEX ";
+ for (const char *str = s->s.begin(); str < s->s.end(); str++) {
+ static const char hexdig[] = "0123456789ABCDEF";
+ int val = (unsigned char) *str;
+ sa << hexdig[val >> 4] << hexdig[val & 0xF];
+ }
+ sa << ")\n";
+ } else
+ sa << " (SPECIAL " << s->s << ")\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");
+ }
+
+ // at last, close the file
+ fclose(f);
+
+ // Did we print a number too big for TeX to handle? If so, try again.
+ if (max_printed_real >= 2047) {
+ if (metrics.design_units() <= 1)
+ errh->fatal("This font appears to be broken. It has characters so big that the PL format\ncannot represent them.");
+ metrics.set_design_units(metrics.design_units() > 200 ? metrics.design_units() - 250 : 1);
+ if (verbose)
+ errh->message("the font%,s metrics overflow the limits of PL files\n(reducing DESIGNUNITS to %d and trying again)", metrics.design_units());
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, filename, errh);
+ }
+}
+
+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;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ 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);
+ if (ftruncate(fd, 0) < 0)
+#endif
+ {
+ fclose(f);
+ f = fopen(filename.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+ ignore_result(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 bool
+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;
+ if (!metrics.base_glyphs(glyphs, 256))
+ return false;
+
+ 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 true;
+
+ // 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 == "-")
+ ignore_result(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);
+ return true;
+}
+
+static void
+output_tfm(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, String tfm_filename, String vf_filename,
+ ErrorHandler *errh)
+{
+ String pl_filename;
+ bool vpl = vf_filename;
+
+ if (no_create) {
+ errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));
+ pl_filename = "<temporary>";
+ } else {
+ int pl_fd = temporary_file(pl_filename, errh);
+ if (pl_fd < 0)
+ return;
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, pl_filename, errh);
+ close(pl_fd);
+ }
+
+ 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,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, 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);
+ }
+ }
+
+ // quit if no base needed
+ metrics.make_base(257);
+ if (!metrics.need_base())
+ return;
+
+ // 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, finfo, errh) << '\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 = errh->format("%<%s%>", f.text().c_str());
+ 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 String
+main_dvips_map(const String &ps_name, const FontInfo &finfo, ErrorHandler *errh)
+{
+ if (String fn = installed_type1(otf_filename, ps_name, (output_flags & G_TYPE1) != 0, errh))
+ return "<" + pathname_filename(fn);
+ if (!finfo.cff) {
+ String ttf_fn, t42_fn;
+ ttf_fn = installed_truetype(otf_filename, (output_flags & G_TRUETYPE) != 0, errh);
+ t42_fn = installed_type42(otf_filename, ps_name, (output_flags & G_TYPE42) != 0, errh);
+ if (t42_fn && (!ttf_fn || (output_flags & G_TYPE42) != 0))
+ return "<" + pathname_filename(t42_fn);
+ else if (ttf_fn)
+ return "<" + pathname_filename(ttf_fn);
+ }
+ return "<" + 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)
+{
+ // find 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);
+
+ // find all characters that might result
+ Vector<bool> used(glyph_names.size(), false);
+ for (Metrics::Code c = 0; c < metrics.encoding_size(); ++c) {
+ Metrics::Glyph g = metrics.glyph(c);
+ if (g >= 0 && g < used.size())
+ used[g] = true;
+ }
+ for (int i = 0; i < lookups.size(); ++i)
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ l.mark_out_glyphs(gsub, used);
+ }
+ OpenType::Coverage used_coverage(used);
+
+ // apply activated GSUB features
+ 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, used_coverage);
+
+ // 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) {
+ // 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, used_coverage);
+ metrics.apply_alternates(alt_subs, i, *alt_lookups[i].filter, glyph_names);
+ }
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ }
+}
+
+static bool
+kern_feature_requested()
+{
+ return std::find(interesting_features.begin(), interesting_features.end(),
+ OpenType::Tag("kern")) != interesting_features.end();
+}
+
+static void
+do_try_ttf_kern(Metrics& metrics, const OpenType::Font& otf, HashMap<uint32_t, int>& feature_usage, ErrorHandler* errh)
+{
+ // if no GPOS "kern" lookups and "kern" requested, try "kern" table
+ if (!kern_feature_requested())
+ return;
+ try {
+ OpenType::KernTable kern(otf.table("kern"), errh);
+ Vector<OpenType::Positioning> poss;
+ bool understood = kern.unparse_automatics(poss, errh);
+ 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;
+ feature_usage.find_force(OpenType::Tag("kern").value()) |= d;
+ } catch (OpenType::BlankTable) {
+ // nada
+ } catch (OpenType::Error e) {
+ errh->warning("kern %<%s%> error, continuing", e.description.c_str());
+ }
+}
+
+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);
+
+ // OpenType recommends that if GPOS exists, but the "kern" feature loads
+ // no lookups, we use the TrueType "kern" table, if any.
+ if (kern_feature_requested()) {
+ OpenType::Tag kern_tag("kern");
+ for (Lookup *l = lookups.begin(); l != lookups.end(); ++l)
+ if (std::find(l->features.begin(), l->features.end(), kern_tag) != l->features.end())
+ goto skip_ttf_kern;
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ skip_ttf_kern: ;
+ }
+
+ 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, errh);
+ 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 < metrics.encoding_size(); code++)
+ if (metrics.was_base_glyph(code) && code != boundary_char
+ && 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 && code < 256) {
+ 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)
+{
+ FontInfo finfo(&otf, errh);
+ if (!finfo.ok())
+ return;
+ if (!finfo.cff)
+ errh->warning("TrueType-flavored font support is experimental");
+ if (override_is_fixed_pitch)
+ finfo.set_is_fixed_pitch(is_fixed_pitch);
+ if (override_italic_angle)
+ finfo.set_italic_angle(italic_angle);
+
+ // save glyph names
+ Vector<PermString> glyph_names;
+ finfo.glyph_names(glyph_names);
+ OpenType::debug_glyph_names = glyph_names;
+
+ // set typeface name from font family name
+ {
+ String typeface = finfo.family_name();
+
+ // make it reasonable for the shell
+ StringAccum sa;
+ for (int i = 0; i < typeface.length(); i++)
+ if (isalnum((unsigned char) 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(finfo.program(), finfo.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, finfo, 0, true, errh);
+ else {
+ T1Secondary secondary(finfo, font_name, otf_filename);
+ dvipsenc.make_metrics(metrics, finfo, &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) {
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ } 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);
+
+ // use prespecified raw fonts
+ for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
+ if (!(*be)->secondary) {
+ Vector<int> mapp;
+ (*be)->encoding.make_base_mappings(mapp, finfo);
+ metrics.apply_base_encoding((*be)->font_name, (*be)->encoding, mapp);
+ }
+
+ // 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 < metrics.encoding_size(); code++)
+ if (metrics.was_base_glyph(code) && code != boundary_char) {
+ metrics.add_single_positioning(code, letterspace / 2, 0, letterspace);
+ if (code < 256) {
+ 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 = finfo.postscript_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);
+
+ // force no type 1
+ if (!finfo.cff && (output_flags & G_TYPE1)) {
+ errh->warning("assuming --no-type1 since this font is TrueType-flavored");
+ output_flags &= ~G_TYPE1;
+ }
+
+ // output
+ ::otf_filename = otf_filename;
+ output_metrics(metrics, finfo.postscript_name(), dvipsenc.boundary_char(),
+ finfo,
+ out_encoding_name, out_encoding_file,
+ font_name, main_dvips_map, errh);
+}
+
+
+String
+installed_metrics_font_name(const String &base_font_name, const String &secondary)
+{
+ for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
+ if ((*be)->secondary == secondary && ::font_name == base_font_name)
+ return (*be)->font_name;
+ return String();
+}
+
+
+extern "C" {
+static int
+clp_parse_char(Clp_Parser *clp, const char *arg, int complain, void *)
+{
+ if (arg[0] && !arg[1] && !isdigit((unsigned char) arg[0])) {
+ clp->val.i = (unsigned char)arg[0];
+ return 1;
+ } else if (arg[0] == '-' || isdigit((unsigned char) 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;
+}
+}
+
+static void
+parse_base_encodings(const String &filename, ErrorHandler *errh)
+{
+ String str = read_file(filename, errh, true);
+ String print_filename = (filename == "-" ? "<stdin>" : filename) + ":";
+ int lineno = 1;
+ str.c_str();
+ const char *s_end = str.end();
+ for (const char *s = str.begin(); s != s_end; ) {
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ // skip comments and blank lines
+ if (s != s_end && *s != '%' && *s != '#' && *s != '\n' && *s != '\r') {
+ const char *w1 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ BaseEncoding *be = new BaseEncoding;
+ be->font_name = str.substring(w1, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ const char *w2 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ String efile = str.substring(w2, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && !isspace((unsigned char) *s) && *s != '%' && *s != '#') {
+ const char *w3 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ be->secondary = str.substring(w3, s);
+ }
+ LandmarkErrorHandler lerrh(errh, print_filename + String(lineno));
+ int before = lerrh.nerrors();
+ if (be->secondary)
+ /* encoding ignored */;
+ else if (!efile)
+ lerrh.error("missing encoding name");
+ else if (String path = locate_encoding(efile, errh))
+ be->encoding.parse(path, true, true, &lerrh);
+ else
+ lerrh.error("encoding %<%s%> not found", efile.c_str());
+ if (lerrh.nerrors() == before)
+ base_encodings.push_back(be);
+ else
+ delete be;
+ }
+ while (s != s_end && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && *s == '\r')
+ s++;
+ if (s != s_end && *s == '\n')
+ s++;
+ lineno++;
+ }
+}
+
+#ifdef W32TEX
+#include <windows.h>
+HINSTANCE Hinstance;
+#endif
+
+int
+main(int argc, char *argv[])
+{
+#ifndef WIN32
+ handle_sigchld();
+#endif
+ 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
+#ifdef W32TEX
+ Hinstance = LoadLibrary(KPSEDLLNAME);
+ if(Hinstance == NULL)
+ Hinstance = LoadLibrary(KPSEOLDDLLNAME);
+ if(Hinstance == NULL) {
+ fprintf(stderr, "I cannot load Kpathsea dynamic library.\n");
+ return 100;
+ }
+#endif
+ 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;
+ Vector<String> glyphlist_files;
+ bool literal_encoding = false;
+ Vector<String> ligkern;
+ Vector<String> pos;
+ Vector<String> unicoding;
+ Vector<String> base_encoding_files;
+ bool no_ecommand = false, default_ligkern = true;
+ int warn_missing = -1;
+ 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->vstr;
+ 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->vstr);
+ 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->vstr);
+ 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->vstr, 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->vstr;
+ break;
+
+ case LITERAL_ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->vstr;
+ literal_encoding = true;
+ break;
+
+ case BASE_ENCODINGS_OPT:
+ base_encoding_files.push_back(clp->vstr);
+ 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_val) {
+ 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->vstr);
+ break;
+
+ case POSITION_OPT:
+ pos.push_back(clp->vstr);
+ break;
+
+ case WARN_MISSING_OPT:
+ warn_missing = !clp->negated;
+ 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->vstr);
+ 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->vstr, 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->vstr);
+ break;
+
+ case CODINGSCHEME_OPT:
+ if (codingscheme)
+ usage_error(errh, "coding scheme specified twice");
+ codingscheme = clp->vstr;
+ 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->vstr))
+ usage_error(errh, "vendor name specified twice");
+ break;
+
+ case TYPEFACE_OPT:
+ if (!set_typeface(clp->vstr, 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 TRUETYPE_OPT:
+ case TYPE42_OPT:
+ if (!clp->negated)
+ output_flags |= (opt - YES_OUTPUT_OPTS);
+ else
+ output_flags &= ~(opt - YES_OUTPUT_OPTS);
+ break;
+
+ case OUTPUT_ENCODING_OPT:
+ if (out_encoding_file)
+ usage_error(errh, "encoding output file specified twice");
+ out_encoding_file = (clp->have_val ? clp->vstr : "-");
+ 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->vstr))
+ 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:
+ case TRUETYPE_DIR_OPT:
+ case TYPE42_DIR_OPT:
+ if (!setodir(opt - DIR_OPTS, clp->vstr))
+ 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->vstr;
+ break;
+
+ case FIXED_PITCH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !clp->negated;
+ break;
+
+ case PROPORTIONAL_WIDTH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !!clp->negated;
+ break;
+
+ case ITALIC_ANGLE_OPT:
+ override_italic_angle = true;
+ italic_angle = clp->val.d;
+ break;
+
+ case GLYPHLIST_OPT:
+ glyphlist_files.push_back(clp->vstr);
+ 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
+ // 9.Nov.05 -- need a new SilentErrorHandler, because we use
+ // the base SilentErrorHandler elsewhere to ignore errors
+ errh = new SilentErrorHandler;
+ 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-2012 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");
+#ifdef W32TEX
+ if(Hinstance != NULL)
+ FreeLibrary(Hinstance);
+#endif
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+#ifdef W32TEX
+ if(Hinstance != NULL)
+ FreeLibrary(Hinstance);
+#endif
+ 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->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ // check for odd option combinations
+ if (warn_missing > 0 && !(output_flags & G_VMETRICS))
+ errh->warning("%<--warn-missing%> has no effect with %<--no-virtual%>");
+
+ // set up file names
+ 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 = "";
+
+ // set up feature filters
+ if (!altselector_features.size()) {
+ if (!current_filter_ptr)
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ altselector_features.push_back(OpenType::Tag("dlig"));
+ altselector_feature_filters.insert(OpenType::Tag("dlig"), current_filter_ptr);
+ altselector_features.push_back(OpenType::Tag("salt"));
+ altselector_feature_filters.insert(OpenType::Tag("salt"), current_filter_ptr);
+ } else if (!current_filter_ptr) {
+ errh->warning("some filtering options ignored");
+ errh->message("(--include-*, --exclude-*, and --*-filter options must occur\nbefore the feature options to which they should apply.)");
+ }
+
+ try {
+ // read font
+ otf_data = read_file(input_file, errh);
+ if (errh->nerrors()) {
+#ifdef W32TEX
+ if(Hinstance != NULL)
+ FreeLibrary(Hinstance);
+#endif
+ 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 (!glyphlist_files.size()) {
+#if HAVE_KPATHSEA
+ if (String g = kpsei_find_file("glyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("glyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
+#endif
+ glyphlist_files.push_back(GLYPHLISTDIR "/glyphlist.txt");
+#if HAVE_KPATHSEA
+ if (String g = kpsei_find_file("texglyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("texglyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
+#endif
+ glyphlist_files.push_back(GLYPHLISTDIR "/texglyphlist.txt");
+ }
+
+ // read glyphlist
+ for (String *g = glyphlist_files.begin(); g < glyphlist_files.end(); g++)
+ if (String s = read_file(*g, errh, true))
+ DvipsEncoding::add_glyphlist(s);
+
+ // read base encodings
+ for (String *s = base_encoding_files.begin(); s < base_encoding_files.end(); s++)
+ parse_base_encodings(*s, errh);
+
+ // 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);
+ if (warn_missing >= 0)
+ dvipsenc.set_warn_missing(warn_missing);
+
+ do_file(input_file, otf, dvipsenc, literal_encoding, errh);
+
+ } catch (OpenType::Error e) {
+ errh->error("unhandled exception %<%s%>", e.description.c_str());
+ }
+#ifdef W32TEX
+ if(Hinstance != NULL)
+ FreeLibrary(Hinstance);
+#endif
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.hh
new file mode 100644
index 00000000000..67c0e0b32ab
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/otftotfm.hh
@@ -0,0 +1,25 @@
+#ifndef OTFTOTFM_OTFTOTFM_HH
+#define OTFTOTFM_OTFTOTFM_HH
+#include <lcdf/string.hh>
+class Metrics;
+class FontInfo;
+class StringAccum;
+class ErrorHandler;
+
+String suffix_font_name(const String &font_name, const String &suffix);
+
+String installed_metrics_font_name(const String &font_name, const String &secondary);
+
+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,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.cc
new file mode 100644
index 00000000000..a951bc7d304
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.cc
@@ -0,0 +1,742 @@
+/* secondary.{cc,hh} -- code for generating fake glyphs
+ *
+ * Copyright (c) 2003-2012 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/otfname.hh>
+#include <efont/otfos2.hh>
+#include <efont/otfpost.hh>
+#include <efont/t1csgen.hh>
+#include <efont/t1unparser.hh>
+#include <efont/ttfcs.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_RINGABOVE = 0x02DA, // U+02DA RING ABOVE
+ U_COMBININGRINGABOVE = 0x030A, // U+030A COMBINING RING ABOVE
+ 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+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ U_DBLBRACKETRIGHT = 0x27E7, // U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ U_INTERROBANGDOWN = 0x2E18, // U+2E18 INVERTED INTERROBANG
+ U_EMPTYSLOT = 0xD801, // invalid Unicode (not handled by Secondary)
+ U_ALTSELECTOR = 0xD802, // invalid Unicode
+ U_CAPITALCWM = 0xD809, // invalid Unicode
+ U_ASCENDERCWM = 0xD80A, // invalid Unicode
+ U_TWELVEUDASH = 0xD80C, // invalid Unicode
+ U_RINGFITTED = 0xD80D, // invalid Unicode
+
+ // BEGIN BACKWARDS COMPATIBILITY -- newer texglyphlist.txt does not include
+ // these code points
+ U_SS = 0xD800, // 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
+ // END BACKWARDS COMPATIBILITY
+
+ U_USE_KERNX = 0xD80E, // invalid Unicode, not in maps
+ 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,
+ U_MATHDOTLESSJ = 0x1D6A5 // U+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
+};
+
+
+FontInfo::FontInfo(const Efont::OpenType::Font *otf_, ErrorHandler *errh)
+ : otf(otf_), cmap(0), cff_file(0), cff(0), post(0), name(0), _nglyphs(-1),
+ _got_glyph_names(false), _ttb_program(0), _override_is_fixed_pitch(false),
+ _override_italic_angle(false)
+{
+ cmap = new Efont::OpenType::Cmap(otf->table("cmap"), errh);
+ assert(cmap->ok());
+
+ if (String cff_string = otf->table("CFF")) {
+ cff_file = new Efont::Cff(cff_string, errh);
+ if (!cff_file->ok())
+ return;
+ Efont::Cff::FontParent *fp = cff_file->font(PermString(), errh);
+ if (!fp || !fp->ok())
+ return;
+ if (!(cff = dynamic_cast<Efont::Cff::Font *>(fp))) {
+ errh->error("CID-keyed fonts not supported");
+ return;
+ }
+ _nglyphs = cff->nglyphs();
+ }
+
+ if (!cff) {
+ post = new Efont::OpenType::Post(otf->table("post"), errh);
+ // read number of glyphs from 'maxp' -- should probably be elsewhere
+ if (Efont::OpenType::Data maxp = otf->table("maxp"))
+ if (maxp.length() >= 6)
+ _nglyphs = maxp.u16(4);
+ if (_nglyphs < 0 && post->ok())
+ _nglyphs = post->nglyphs();
+ }
+
+ name = new Efont::OpenType::Name(otf->table("name"), errh);
+}
+
+FontInfo::~FontInfo()
+{
+ delete cmap;
+ delete cff_file;
+ delete cff;
+ delete post;
+ delete name;
+ delete _ttb_program;
+}
+
+bool
+FontInfo::ok() const
+{
+ if (cff)
+ return cmap->ok() && cff->ok();
+ else
+ return post && post->ok() && name && name->ok();
+}
+
+bool
+FontInfo::glyph_names(Vector<PermString> &glyph_names) const
+{
+ program()->glyph_names(glyph_names);
+ return true;
+}
+
+int
+FontInfo::glyphid(PermString name) const
+{
+ if (cff)
+ return cff->glyphid(name);
+ else {
+ if (!_got_glyph_names) {
+ glyph_names(_glyph_names);
+ _got_glyph_names = true;
+ }
+ PermString *found = std::find(_glyph_names.begin(), _glyph_names.end(), name);
+ if (found == _glyph_names.end())
+ return 0;
+ return found - _glyph_names.begin();
+ }
+}
+
+String
+FontInfo::family_name() const
+{
+ if (cff)
+ return cff->dict_string(Efont::Cff::oFamilyName);
+ else
+ return name->english_name(Efont::OpenType::Name::N_FAMILY);
+}
+
+String
+FontInfo::postscript_name() const
+{
+ if (cff)
+ return cff->font_name();
+ else
+ return name->english_name(Efont::OpenType::Name::N_POSTSCRIPT);
+}
+
+const Efont::CharstringProgram *
+FontInfo::program() const
+{
+ if (cff)
+ return cff;
+ else {
+ if (!_ttb_program)
+ _ttb_program = new Efont::TrueTypeBoundsCharstringProgram(otf);
+ return _ttb_program;
+ }
+}
+
+bool
+FontInfo::is_fixed_pitch() const
+{
+ if (_override_is_fixed_pitch)
+ return _is_fixed_pitch;
+ else if (cff) {
+ double d;
+ return (cff->dict_value(Efont::Cff::oIsFixedPitch, &d) && d);
+ } else
+ return post->is_fixed_pitch();
+}
+
+double
+FontInfo::italic_angle() const
+{
+ if (_override_italic_angle)
+ return _italic_angle;
+ else if (cff) {
+ double d;
+ (void) cff->dict_value(Efont::Cff::oItalicAngle, &d);
+ return d;
+ } else
+ return post->italic_angle();
+}
+
+
+/* */
+
+Secondary::~Secondary()
+{
+}
+
+bool
+Secondary::encode_uni(int code, PermString name,
+ const uint32_t *uni_begin, const uint32_t *uni_end,
+ Metrics &metrics, ErrorHandler *errh)
+{
+ if (uni_begin + 1 == uni_end)
+ return encode_uni(code, name, *uni_begin, metrics, errh);
+ else {
+ Vector<Setting> v;
+ int max_s = 0;
+ while (uni_begin != uni_end) {
+ Vector<Setting> subv;
+ int s = setting(*uni_begin, subv, metrics, errh);
+ if (s == 0)
+ return false;
+ if (subv.size() && v.size())
+ v.push_back(Setting(Setting::KERN));
+ for (Vector<Setting>::const_iterator it = subv.begin();
+ it != subv.end(); ++it)
+ v.push_back(*it);
+ max_s = (max_s > s ? max_s : s);
+ ++uni_begin;
+ }
+ metrics.encode_virtual(code, name, 0, v, max_s > 1);
+ return true;
+ }
+}
+
+bool
+Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics &metrics, ErrorHandler *errh)
+{
+ Vector<Setting> v;
+ if (int s = setting(uni, v, metrics, errh)) {
+ metrics.encode_virtual(code, name, uni, v, s > 1);
+ 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),
+ _units_per_em(finfo.units_per_em()),
+ _xheight(font_x_height(finfo, Transform())),
+ _spacewidth(_units_per_em)
+{
+ int bounds[4], width;
+ if (char_bounds(bounds, width, finfo, Transform(), ' '))
+ _spacewidth = width;
+}
+
+int
+Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+{
+ if (_next)
+ return _next->setting(uni, v, metrics, errh);
+ else
+ return 0;
+}
+
+bool
+T1Secondary::char_setting(Vector<Setting> &v, Metrics &metrics, int uni, ...)
+{
+ Vector<int> codes;
+
+ // collect codes
+ va_list val;
+ va_start(val, uni);
+
+ int kerntype = Setting::KERN;
+ if (uni == U_USE_KERNX) {
+ kerntype = Setting::KERNX;
+ uni = va_arg(val, int);
+ }
+
+ 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(kerntype));
+ 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, false);
+ metrics.add_altselector_code(code, which);
+ return true;
+ } else
+ return Secondary::encode_uni(code, name, uni, metrics, errh);
+}
+
+
+static String dotlessj_file_name;
+
+static String
+dotlessj_dvips_include(const String &, const FontInfo &, ErrorHandler *)
+{
+ return "<" + pathname_filename(dotlessj_file_name);
+}
+
+int
+T1Secondary::dotlessj_font(Metrics &metrics, ErrorHandler *errh, Glyph &dj_glyph)
+{
+ if (!_font_name || !_finfo.otf || !_finfo.cff)
+ return -1;
+
+ String dj_name;
+ bool install_metrics;
+ // XXX make sure dotlessj is for the main font?
+ if ((dj_name = installed_metrics_font_name(_font_name, "dotlessj")))
+ install_metrics = false;
+ else {
+ dj_name = suffix_font_name(_font_name, "--lcdfj");
+ install_metrics = true;
+ }
+
+ // is dotlessj already mapped?
+ 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), 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;
+ }
+
+ // find dotless-J character
+ 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()) {
+ errh->error("%s: dotless-J font has no %<uni0237%> glyph", filename.c_str());
+ delete font;
+ return -1;
+ }
+ dj_glyph = g - glyph_names.begin();
+
+ // create metrics for dotless-J
+ if (install_metrics) {
+ Metrics dj_metrics(font, 256);
+ dj_metrics.encode('j', U_DOTLESSJ, dj_glyph);
+ ::dotlessj_file_name = filename;
+ output_metrics(dj_metrics, font->font_name(), -1, _finfo, String(), String(), dj_name, dotlessj_dvips_include, errh);
+ } else if (verbose)
+ errh->message("using %<%s%> for dotless-J font metrics", dj_name.c_str());
+
+ // add font to metrics
+ return metrics.add_mapped_font(font, dj_name);
+
+ } else
+ return -1;
+}
+
+int
+T1Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+{
+ Transform xform;
+ int vsize = v.size();
+ extern int letterspace;
+
+ if (char_setting(v, metrics, uni, 0))
+ return 1;
+
+ switch (uni) {
+
+ case U_CWM:
+ case U_ALTSELECTOR:
+ v.push_back(Setting(Setting::RULE, 0, _xheight));
+ return 1;
+
+ case U_CAPITALCWM:
+ v.push_back(Setting(Setting::RULE, 0, font_cap_height(_finfo, xform)));
+ return 1;
+
+ case U_ASCENDERCWM:
+ v.push_back(Setting(Setting::RULE, 0, font_ascender(_finfo, xform)));
+ return 1;
+
+ 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 2;
+
+ case U_SS:
+ if (char_setting(v, metrics, 'S', 'S', 0))
+ return 1;
+ break;
+
+ case U_SSSMALL:
+ if (char_setting(v, metrics, U_SSMALL, U_SSMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 's', 's', 0))
+ return 1;
+ break;
+
+ case U_FFSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 'f', 'f', 0))
+ return 1;
+ break;
+
+ case U_FISMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_ISMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 'f', 'i', 0))
+ return 1;
+ break;
+
+ case U_FLSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_LSMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 'f', 'l', 0))
+ return 1;
+ break;
+
+ case U_FFISMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_ISMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 'f', 'f', 'i', 0))
+ return 1;
+ break;
+
+ case U_FFLSMALL:
+ if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_LSMALL, 0))
+ return 1;
+ else if (char_setting(v, metrics, 'f', 'f', 'l', 0))
+ return 1;
+ break;
+
+ case U_IJ:
+ if (char_setting(v, metrics, 'I', 'J', 0))
+ return 1;
+ break;
+
+ case U_ij:
+ if (char_setting(v, metrics, 'i', 'j', 0))
+ return 1;
+ break;
+
+ case U_DOTLESSJ:
+ case U_DOTLESSJ_2:
+ case U_MATHDOTLESSJ: {
+ 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 2;
+ } else if (which == J_NODOT && char_setting(v, metrics, 'j', 0))
+ return 1;
+ break;
+ }
+
+ case U_DBLBRACKETLEFT:
+ if (char_setting(v, metrics, '[', 0)) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, '[', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d - letterspace), 0));
+ }
+ char_setting(v, metrics, '[', 0);
+ return 1;
+ }
+ break;
+
+ case U_DBLBRACKETRIGHT:
+ if (char_setting(v, metrics, ']', 0)) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, ']', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d - letterspace), 0));
+ }
+ char_setting(v, metrics, ']', 0);
+ return 1;
+ }
+ break;
+
+ case U_BARDBL:
+ if (char_setting(v, metrics, '|', 0)) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, Transform(), 4, true, 0, '|', 0);
+ v.push_back(Setting(Setting::MOVE, (int) (-0.333 * d - letterspace), 0));
+ }
+ char_setting(v, metrics, '|', 0);
+ return 1;
+ }
+ 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)) {
+ v.push_back(Setting(Setting::MOVE, 0, -(int) (-dropdown / 2)));
+ return 1;
+ }
+ break;
+ }
+
+ case U_TWELVEUDASH:
+ if (char_setting(v, metrics, U_ENDASH, 0)) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ v.push_back(Setting(Setting::MOVE, (int) (667 - 2 * d - letterspace), 0));
+ }
+ char_setting(v, metrics, U_ENDASH, 0);
+ return 1;
+ }
+ break;
+
+ case U_THREEQUARTERSEMDASH:
+ if (char_setting(v, metrics, U_ENDASH, 0)) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ v.push_back(Setting(Setting::MOVE, (int) (750 - 2 * d - letterspace), 0));
+ }
+ char_setting(v, metrics, U_ENDASH, 0);
+ return 1;
+ }
+ break;
+
+ case U_CENTIGRADE:
+ // TODO: set italic correction to that of a 'C'
+ if (char_setting(v, metrics, U_USE_KERNX, U_DEGREE, 'C', 0))
+ return 1;
+ 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 1;
+ }
+ 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 1;
+ }
+ break;
+ }
+
+ case U_PERTENTHOUSAND:
+ if (char_setting(v, metrics, U_USE_KERNX, 0xF661, U_FRACTION, 0xF655, 0xF655, 0xF655, 0))
+ return 1;
+ break;
+
+ case U_RINGFITTED: {
+ int A_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, 'A', 0);
+ uint32_t ring_char = U_RINGABOVE;
+ int ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ if (ring_width <= -_units_per_em) {
+ ring_char = U_COMBININGRINGABOVE;
+ ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ }
+ if (A_width > -_units_per_em && ring_width > -_units_per_em) {
+ int offset = (A_width - ring_width) / 2;
+ v.push_back(Setting(Setting::MOVE, offset, 0));
+ if (char_setting(v, metrics, ring_char, 0)) {
+ v.push_back(Setting(Setting::MOVE, A_width - ring_width - offset, 0));
+ return 1;
+ }
+ }
+ 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.program()->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, finfo.units_per_em(),
+ '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 'H', 'O', 'B' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, false, finfo.units_per_em(),
+ '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 'd', 'l' 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.hh
new file mode 100644
index 00000000000..c349a48dcf6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/secondary.hh
@@ -0,0 +1,97 @@
+#ifndef OTFTOTFM_SECONDARY_HH
+#define OTFTOTFM_SECONDARY_HH
+#include <efont/otfcmap.hh>
+#include <efont/cff.hh>
+class Metrics;
+class Transform;
+struct Setting;
+namespace Efont { class TrueTypeBoundsCharstringProgram; }
+
+struct FontInfo {
+
+ const Efont::OpenType::Font *otf;
+ const Efont::OpenType::Cmap *cmap;
+
+ Efont::Cff *cff_file;
+ const Efont::Cff::Font *cff;
+
+ const Efont::OpenType::Post *post;
+ const Efont::OpenType::Name *name;
+
+ FontInfo(const Efont::OpenType::Font *otf, ErrorHandler *);
+ ~FontInfo();
+
+ bool ok() const;
+
+ int nglyphs() const { return _nglyphs; }
+ bool glyph_names(Vector<PermString> &) const;
+ int glyphid(PermString) const;
+ const Efont::CharstringProgram *program() const;
+ int units_per_em() const {
+ return program()->units_per_em();
+ }
+
+ bool is_fixed_pitch() const;
+ double italic_angle() const;
+
+ void set_is_fixed_pitch(bool is_fixed_pitch) {
+ _override_is_fixed_pitch = true;
+ _is_fixed_pitch = is_fixed_pitch;
+ }
+ void set_italic_angle(double italic_angle) {
+ _override_italic_angle = true;
+ _italic_angle = italic_angle;
+ }
+
+ String family_name() const;
+ String postscript_name() const;
+
+ private:
+
+ int _nglyphs;
+ mutable Vector<PermString> _glyph_names;
+ mutable bool _got_glyph_names;
+ mutable Vector<uint32_t> _unicodes;
+ mutable Efont::TrueTypeBoundsCharstringProgram *_ttb_program;
+ bool _override_is_fixed_pitch;
+ bool _override_italic_angle;
+ bool _is_fixed_pitch;
+ double _italic_angle;
+
+};
+
+class Secondary { public:
+ Secondary() : _next(0) { }
+ virtual ~Secondary();
+ void set_next(Secondary *s) { _next = s; }
+ typedef Efont::OpenType::Glyph Glyph;
+ bool encode_uni(int code, PermString name, const uint32_t *uni_begin, const uint32_t *uni_end, Metrics &metrics, ErrorHandler *errh);
+ virtual bool encode_uni(int code, PermString name, uint32_t uni, Metrics &, ErrorHandler *);
+ virtual int 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 *);
+ int setting(uint32_t uni, Vector<Setting> &, Metrics &, ErrorHandler *);
+ private:
+ const FontInfo &_finfo;
+ String _font_name;
+ String _otf_file_name;
+ int _units_per_em;
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.cc
new file mode 100644
index 00000000000..228661394a9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.cc
@@ -0,0 +1,365 @@
+/* uniprop.{cc,hh} -- code for Unicode character properties
+ *
+ * Copyright (c) 2004-2012 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, 58, P_Lu, 60, P_Ll, 61, P_Lu, 63, P_Ll, 65, P_Lul, 67, P_Lu, 71, P_Ll, 72, P_Lul, 80, P_Ll, 148, P_Lo, 149, 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, 112, P_Cn, 116, P_Sk, 118, P_Cn, 122, P_Lm, 123, P_Ll, 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, 253, P_Lu,
+ 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_Ll, 208, P_Lul,
+ 0, P_Lul, 20, 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, 190, P_Po, 191, P_Mn, 192, P_Po, 193, P_Mn, 195, P_Po, 196, P_Mn, 198, P_Po, 199, P_Mn, 200, P_Cn, 208, P_Lo, 235, P_Cn, 240, P_Lo, 243, P_Po, 245, P_Cn,
+ 0, P_Cf, 4, P_Cn, 11, P_Sc, 12, P_Po, 14, P_So, 16, P_Mn, 22, P_Cn, 27, P_Po, 28, P_Cn, 30, P_Po, 32, P_Cn, 33, P_Lo, 59, P_Cn, 64, P_Lm, 65, P_Lo, 75, P_Mn, 95, 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, 110, P_Cn, 128, P_Lo, 166, P_Mn, 177, P_Lo, 178, P_Cn, 192, P_Nd, 202, P_Lo, 235, P_Mn, 244, P_Lm, 246, P_So, 247, P_Po, 250, P_Lm, 251, 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, 123, P_Lo, 128, 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_Lo, 207, 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, 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, 230, 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_Mn, 228, P_Cn, 230, P_Nd, 240, P_Cn, 241, P_So, 243, 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_Po, 210, 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, 251, P_Po, 252, P_Lm, 253, P_Cn,
+ 0, P_Lo, 90, P_Cn, 95, P_Lo, 163, P_Cn, 168, P_Lo, 250, P_Cn,
+ 0, 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, 137, P_Cn, 138, P_Lo, 142, P_Cn, 144, 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, 215, P_Cn, 216, P_Lo,
+ 0, P_Lo, 17, P_Cn, 18, P_Lo, 22, P_Cn, 24, P_Lo, 91, P_Cn, 95, P_Mn, 96, P_So, 97, P_Po, 105, P_No, 125, P_Cn, 128, P_Lo, 144, P_So, 154, 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, 128, P_Lo, 170, P_Cn, 176, P_Mc, 193, P_Lo, 200, P_Mc, 202, P_Cn, 208, P_Nd, 218, P_Cn, 222, P_Po, 224, P_So,
+ 0, P_Lo, 23, P_Mn, 25, P_Mc, 28, P_Cn, 30, P_Po, 32, P_Cn,
+ 0, P_Mn, 4, P_Mc, 5, P_Lo, 52, P_Mn, 53, P_Mc, 54, P_Mn, 59, P_Mc, 60, P_Mn, 61, P_Mc, 66, P_Mn, 67, P_Mc, 69, P_Lo, 76, P_Cn, 80, P_Nd, 90, P_Po, 97, P_So, 107, P_Mn, 116, P_So, 125, P_Cn,
+ 0, P_Ll, 44, P_Lm, 98, P_Ll, 120, P_Lm, 121, P_Ll, 155, P_Lm, 192, P_Mn, 203, P_Cn, 254, P_Mn,
+ 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, 11, 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_Po, 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, 144, P_Lm, 149, P_Cn, 160, P_Sc, 182, P_Cn, 208, P_Mn, 221, P_Me, 225, P_Mn, 226, P_Me, 229, P_Mn, 240, 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, 52, P_Ll, 53, P_Lo, 57, P_Ll, 58, P_So, 60, P_Ll, 62, P_Lu, 64, P_Sm, 69, P_Lul, 71, P_Ll, 74, P_So, 75, P_Sm, 76, P_So, 78, P_Ll, 79, P_Cn, 83, P_No, 96, P_Nl, 131, P_Lul, 133, 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_So, 220, P_Sm, 226, P_So, 232, 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, 111, P_Sm, 112, P_So, 157, P_Cn, 160, P_So, 179, 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, 192, P_Sm, 197, P_Ps, 198, P_Pe, 199, P_Sm, 203, 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, 27, P_Cn, 32, P_So, 36, P_Cn,
+ 0, P_Lu, 47, P_Cn, 48, P_Ll, 95, P_Cn, 96, P_Lul, 98, P_Lu, 101, P_Ll, 103, P_Lul, 109, P_Cn, 116, P_Ll, 117, P_Lul, 119, P_Ll, 120, P_Cn, 128, P_Lul, 228, P_Ll, 229, P_So, 235, P_Cn, 249, P_Po, 253, P_No, 254, P_Po,
+ 0, P_Ll, 38, P_Cn, 48, P_Lo, 102, P_Cn, 111, P_Lm, 112, P_Cn, 128, P_Lo, 151, P_Cn, 160, P_Lo, 167, P_Cn, 168, P_Lo, 175, P_Cn, 176, P_Lo, 183, P_Cn, 184, P_Lo, 191, P_Cn, 192, P_Lo, 199, P_Cn, 200, P_Lo, 207, P_Cn, 208, P_Lo, 215, P_Cn, 216, P_Lo, 223, P_Cn,
+ 0, P_Po, 2, P_Pi, 3, P_Pf, 4, P_Pi, 5, P_Pf, 6, P_Po, 9, P_Pi, 10, P_Pf, 11, P_Po, 12, P_Pi, 13, P_Pf, 14, P_Po, 23, P_Pd, 24, P_Cn, 28, P_Pi, 29, P_Pf, 30, 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_Po, 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, 192, P_So, 208, 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, 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, 187, P_Lo, 188, P_Cn,
+ 0, P_Lo, 21, P_Lm, 22, P_Lo,
+ 0, P_Lo, 141, P_Cn, 144, P_So, 199, P_Cn,
+ 0, P_Sk, 23, P_Lm, 27, P_Cn, 32, P_Sk, 34, P_Cn,
+ 0, P_Lo, 2, P_Mc, 3, P_Lo, 6, P_Mn, 7, P_Lo, 11, P_Mn, 12, P_Lo, 35, P_Mc, 37, P_Mn, 39, P_Mc, 40, P_So, 44, P_Cn, 64, P_Lo, 116, P_Po, 120, 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, 112, P_Lo, 218, 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_Po, 23, P_Ps, 24, P_Pe, 25, P_Po, 26, 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, 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_Nl, 117, P_No, 121, P_So, 138, P_No, 139, P_Cn,
+ 0, P_Lo, 31, P_Cn, 32, P_No, 36, P_Cn, 48, P_Lo, 65, P_Nl, 66, P_Lo, 74, P_Nl, 75, P_Cn, 128, P_Lo, 158, P_Cn, 159, P_Po, 160, P_Lo, 196, P_Cn, 200, P_Lo, 208, P_Po, 209, P_Nl, 214, 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_Lo, 22, P_No, 26, P_Cn, 31, P_Po, 32, P_Cn,
+ 0, P_Lo, 1, P_Mn, 4, P_Cn, 5, P_Mn, 7, P_Cn, 12, P_Mn, 16, P_Lo, 20, P_Cn, 21, P_Lo, 24, P_Cn, 25, P_Lo, 52, P_Cn, 56, P_Mn, 59, P_Cn, 63, P_Mn, 64, P_No, 72, P_Cn, 80, P_Po, 89, P_Cn,
+ 0, P_Lo, 111, P_Cn,
+ 0, P_Nl, 99, P_Cn, 112, P_Po, 116, 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, 66, P_Mn, 69, P_So, 70, P_Cn,
+ 0, P_So, 87, P_Cn, 96, P_No, 114, 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, 166, 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_Lul, 204, 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, 290,
+ 0x300, 290, 356,
+ 0x400, 356, 382,
+ 0x500, 382, 436,
+ 0x600, 436, 510,
+ 0x700, 510, 554,
+ 0x800, 0, 2,
+ 0x900, 554, 678,
+ 0xA00, 678, 818,
+ 0xB00, 818, 972,
+ 0xC00, 972, 1094,
+ 0xD00, 1094, 1192,
+ 0xE00, 1192, 1300,
+ 0xF00, 1300, 1382,
+ 0x1000, 1382, 1436,
+ 0x1100, 1436, 1448,
+ 0x1200, 1448, 1502,
+ 0x1300, 1502, 1534,
+ 0x1400, 1534, 1538,
+ 0x1500, 1538, 1540,
+ 0x1600, 1540, 1566,
+ 0x1700, 1566, 1640,
+ 0x1800, 1640, 1670,
+ 0x1900, 1670, 1730,
+ 0x1A00, 1730, 1742,
+ 0x1B00, 1742, 1780,
+ 0x1C00, 0, 2,
+ 0x1D00, 1780, 1798,
+ 0x1E00, 1798, 1808,
+ 0x1F00, 1808, 1936,
+ 0x2000, 1936, 2050,
+ 0x2100, 2050, 2174,
+ 0x2200, 2174, 2176,
+ 0x2300, 2176, 2206,
+ 0x2400, 2206, 2220,
+ 0x2500, 2220, 2232,
+ 0x2600, 2232, 2244,
+ 0x2700, 2244, 2350,
+ 0x2800, 2350, 2352,
+ 0x2900, 2352, 2416,
+ 0x2A00, 2174, 2176,
+ 0x2B00, 2416, 2424,
+ 0x2C00, 2424, 2464,
+ 0x2D00, 2464, 2512,
+ 0x2E00, 2512, 2554,
+ 0x2F00, 2554, 2562,
+ 0x3000, 2562, 2664,
+ 0x3100, 2664, 2690,
+ 0x3200, 2690, 2716,
+ 0x3300, 2350, 2352,
+ 0x3400, 2716, 2720,
+ 0x3500, 0, 2,
+ 0x4D00, 2720, 2728,
+ 0x4E00, 2716, 2720,
+ 0x4F00, 0, 2,
+ 0x9F00, 2728, 2734,
+ 0xA000, 2734, 2740,
+ 0xA100, 1538, 1540,
+ 0xA400, 2740, 2748,
+ 0xA500, 0, 2,
+ 0xA700, 2748, 2758,
+ 0xA800, 2758, 2788,
+ 0xA900, 0, 2,
+ 0xAC00, 2716, 2720,
+ 0xAD00, 0, 2,
+ 0xD700, 2788, 2794,
+ 0xD800, 2794, 2798,
+ 0xD900, 0, 2,
+ 0xDB00, 2798, 2806,
+ 0xDC00, 2794, 2798,
+ 0xDD00, 0, 2,
+ 0xDF00, 2806, 2810,
+ 0xE000, 2810, 2814,
+ 0xE100, 0, 2,
+ 0xF800, 2814, 2818,
+ 0xF900, 1538, 1540,
+ 0xFA00, 2818, 2830,
+ 0xFB00, 2830, 2872,
+ 0xFC00, 1538, 1540,
+ 0xFD00, 2872, 2896,
+ 0xFE00, 2896, 3008,
+ 0xFF00, 3008, 3128,
+ 0x10000, 3128, 3156,
+ 0x10100, 3156, 3178,
+ 0x10200, 0, 2,
+ 0x10300, 3178, 3214,
+ 0x10400, 3214, 3226,
+ 0x10500, 0, 2,
+ 0x10800, 3226, 3250,
+ 0x10900, 3250, 3260,
+ 0x10A00, 3260, 3298,
+ 0x10B00, 0, 2,
+ 0x12000, 1538, 1540,
+ 0x12300, 3298, 3302,
+ 0x12400, 3302, 3310,
+ 0x12500, 0, 2,
+ 0x1D000, 3310, 3314,
+ 0x1D100, 3314, 3344,
+ 0x1D200, 3344, 3352,
+ 0x1D300, 3352, 3360,
+ 0x1D400, 3360, 3416,
+ 0x1D500, 3416, 3470,
+ 0x1D600, 3470, 3502,
+ 0x1D700, 3502, 3544,
+ 0x1D800, 0, 2,
+ 0x20000, 2716, 2720,
+ 0x20100, 0, 2,
+ 0x2A600, 3544, 3550,
+ 0x2A700, 0, 2,
+ 0x2F800, 1538, 1540,
+ 0x2FA00, 3550, 3554,
+ 0x2FB00, 0, 2,
+ 0xE0000, 3554, 3564,
+ 0xE0100, 3564, 3568,
+ 0xE0200, 0, 2,
+ 0xF0000, 2810, 2814,
+ 0xF0100, 0, 2,
+ 0xFFF00, 3568, 3574,
+ 0x100000, 2810, 2814,
+ 0x100100, 0, 2,
+ 0x10FF00, 3568, 3574,
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/uniprop.hh
new file mode 100644
index 00000000000..4dd6b135eb7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.cc
new file mode 100644
index 00000000000..b50ff9566d3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.cc
@@ -0,0 +1,286 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2012 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->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<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;
+}
+
+static String
+simplify_filename(String x)
+{
+ while (x.substring(0, 2) == "./")
+ x = x.substring(2);
+ int pos;
+ while ((pos = x.find_left("/./")) >= 0)
+ x = x.substring(0, pos) + x.substring(pos + 2);
+ return x;
+}
+
+bool
+same_filename(const String &a, const String &b)
+{
+ return simplify_filename(a) == simplify_filename(b);
+}
+
+String
+shell_quote(const String &str)
+{
+ if (!str)
+ return String::make_stable("\"\"");
+
+ const char *begin = str.begin();
+ const char *end = str.end();
+ StringAccum sa;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ sa.append('\"');
+
+ for (const char *s = begin; s < end; ++s)
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '\\' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else if (*s == '\"') {
+ sa.append(begin, s);
+ sa.append("\"\"\"", 3);
+ begin = s + 1;
+ } else {
+ sa.append(begin, s + 1);
+ begin = s + 1;
+ }
+
+ if (sa.length() > 1) {
+ sa.append(begin, end);
+ sa.append('\"');
+ return sa.take_string();
+ }
+#else
+ 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.length()) {
+ sa.append(begin, end);
+ return sa.take_string();
+ }
+#endif
+
+ return str;
+}
+
+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);
+ }
+}
+
+#if !HAVE_MKSTEMP
+static const char *
+my_tmpnam()
+{
+# ifndef WIN32
+ return tmpnam(0);
+# else
+ const char *dir = getenv("TEMP");
+ return _tempnam(dir ? dir : ".", "otftmp.");
+# endif
+}
+#endif
+
+int
+temporary_file(String &filename, ErrorHandler *errh)
+{
+ if (no_create)
+ return 0; // random number suffices
+
+#if 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 = my_tmpnam()))
+ 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 = (require_prefix == 1);
+ 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 + 3 <= end && begin + 8 >= end && begin[0] == 'U' && begin[1] == '+')
+ begin += 2, allow_lower = true;
+ else if (require_prefix > 1)
+ /* 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 > 0
+ && (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));
+ ignore_result(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;
+ int amt;
+ do {
+ if (char *x = sa.reserve(2048)) {
+ amt = fread(x, 1, 2048, p);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0 && sa.length() < 200000);
+ if (amt != 0)
+ errh->warning("%<%s%> output too long, truncated", cmdline.c_str());
+ else if (!feof(p) || ferror(p))
+ errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.hh
new file mode 100644
index 00000000000..a3e42b63d9f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/otftotfm/util.hh
@@ -0,0 +1,35 @@
+#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, G_TRUETYPE = 512, G_TYPE42 = 1024 };
+
+extern int output_flags;
+
+String read_file(String filename, ErrorHandler *, bool warn = false);
+String printable_filename(const String &);
+String pathname_filename(const String &);
+bool same_filename(const String &a, const String &b);
+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
+
+template <typename T>
+void ignore_result(T result) {
+ (void) result;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.am
new file mode 100644
index 00000000000..9b9b16ca77b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1dotlessj.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.in
new file mode 100644
index 00000000000..4c20b65f152
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/Makefile.in
@@ -0,0 +1,695 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = t1dotlessj$(EXEEXT)
+subdir = lcdf-typetools-2.98/t1dotlessj
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1dotlessj_OBJECTS = t1dotlessj.$(OBJEXT)
+t1dotlessj_OBJECTS = $(am_t1dotlessj_OBJECTS)
+t1dotlessj_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1dotlessj_SOURCES)
+DIST_SOURCES = $(t1dotlessj_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1dotlessj.1
+t1dotlessj_SOURCES = t1dotlessj.cc
+t1dotlessj_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1dotlessj.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1dotlessj/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+t1dotlessj$(EXEEXT): $(t1dotlessj_OBJECTS) $(t1dotlessj_DEPENDENCIES) $(EXTRA_t1dotlessj_DEPENDENCIES)
+ @rm -f t1dotlessj$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.1
new file mode 100644
index 00000000000..b51f210dcb2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.1
@@ -0,0 +1,96 @@
+.ds V 2.98
+.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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.cc
new file mode 100644
index 00000000000..aa1bae00aee
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1dotlessj/t1dotlessj.cc
@@ -0,0 +1,418 @@
+/* t1dotlessj.cc -- driver for creating dotlessj characters from Type 1 fonts
+ *
+ * Copyright (c) 2003-2012 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
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "name", 'n', NAME_OPT, Clp_ValString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(EXIT_ERROR);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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("<%d>%s: %<j%> is already dotless", -EXIT_J_NODOT, 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("<%d>%s: %<j%> is already dotless", -EXIT_J_NODOT, 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("<%d>%s: %s", -EXIT_ERROR, filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("<%d>%s: empty file", -EXIT_ERROR, filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal("<%d>%s: no glyphs in font", -EXIT_ERROR, 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 = new SilentErrorHandler;
+ break;
+
+ case NAME_OPT:
+ font_name = clp->vstr;
+ 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->vstr, "-") == 0)
+ outputf = stdout;
+ else if (!(outputf = fopen(clp->vstr, "wb")))
+ errh->fatal("<%d>%s: %s", -EXIT_ERROR, clp->vstr, strerror(errno));
+ break;
+
+ case VERSION_OPT:
+ printf("t1dotlessj (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2012 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->vstr;
+ 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("<%d>%s: already has a %<dotlessj%> glyph", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (font->glyph("uni0237"))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<uni0237%>", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (font->glyph("u0237"))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<u0237%>", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (private_use_dotlessj && font->glyph(private_use_dotlessj))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<%s%>", -EXIT_DOTLESSJ_EXISTS, 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)
+ j_cs = font->glyph("u006A");
+ if (!j_cs)
+ errh->fatal("<%d>%s: has no %<j%> glyph to make dotless", -EXIT_NO_J, 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.)");
+ }
+
+ Vector<double> xuid_extension;
+ xuid_extension.push_back(0x00237237);
+ Type1Font *dotless_font = Type1Font::skeleton_make_copy(font, actual_font_name, &xuid_extension);
+ 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 defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outputf), _O_BINARY);
+#endif
+ if (binary) {
+ 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.am
new file mode 100644
index 00000000000..42cd92087d4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1lint.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.in
new file mode 100644
index 00000000000..6aa7bd5c7aa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/Makefile.in
@@ -0,0 +1,716 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = t1lint$(EXEEXT)
+subdir = lcdf-typetools-2.98/t1lint
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1lint_OBJECTS = cscheck.$(OBJEXT) t1lint.$(OBJEXT)
+t1lint_OBJECTS = $(am_t1lint_OBJECTS)
+t1lint_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(t1lint_SOURCES)
+DIST_SOURCES = $(t1lint_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1lint.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1lint/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+t1lint$(EXEEXT): $(t1lint_OBJECTS) $(t1lint_DEPENDENCIES) $(EXTRA_t1lint_DEPENDENCIES)
+ @rm -f t1lint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.cc
new file mode 100644
index 00000000000..f39a040a014
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.cc
@@ -0,0 +1,528 @@
+/* cscheck.{cc,hh} -- checking Type 1 charstrings for validity
+ *
+ * Copyright (c) 1999-2012 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_GE(numargs) do { if (size() < numargs) return error(errUnderflow, cmd); } while (0)
+#define CHECK_STACK_EQ(numargs) do { CHECK_STACK_GE(numargs); if (size() > numargs) _errh->warning("too many arguments to %<%s%> (have %d, expected %d)", Charstring::command_name(cmd).c_str(), size(), numargs); } while (0)
+#define CHECK_STACK_CPEQ(numargs) do { CHECK_STACK_EQ(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 stemw0 = hints[i0+1] - hints[i0];
+ double stemw2 = hints[i2+1] - hints[i2];
+ if ((int)(1024*(stemw0 - stemw2) + .5) != 0)
+ _errh->error("bad %<%s%>: extreme stem widths unequal (%g, %g)", cmd_name, stemw0, 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;
+ _just_flexed = false;
+}
+
+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) {
+ _errh->error("no Flex in progress");
+ pop(3);
+ return false;
+ } else if (ps_size() != 16) {
+ _errh->error("Flex needs 16 arguments, have %d", ps_size());
+ pop(3);
+ 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;
+ _just_flexed = 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);
+ if (_just_flexed)
+ _errh->error("Flex control points must be separated by a moveto");
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _just_flexed = true;
+ 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 (_subrno < 0)
+ ++_ncommand;
+ if (cmd == Cs::cCallsubr) {
+ int old_subrno = _subrno;
+ _subrno = (size() > 1 ? (int) top(0) : -300);
+ bool result = callsubr_command();
+ _subrno = old_subrno;
+ return result;
+ } else if (cmd == Cs::cCallothersubr) {
+ CHECK_STACK_GE(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_EQ(2);
+ moveto(at(0), 0, false);
+ clear();
+ break;
+
+ case Cs::cSbw:
+ CHECK_STACK_EQ(4);
+ moveto(at(0), at(1), false);
+ clear();
+ break;
+
+ case Cs::cClosepath:
+ _cp_exists = false;
+ clear();
+ break;
+
+ case Cs::cHlineto:
+ CHECK_STACK_CPEQ(1);
+ rlineto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK_EQ(1);
+ rmoveto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK_CPEQ(4);
+ rrcurveto(at(0), 0, at(1), at(2), 0, at(3));
+ clear();
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK_CPEQ(2);
+ rlineto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK_EQ(2);
+ rmoveto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK_CPEQ(6);
+ rrcurveto(at(0), at(1), at(2), at(3), at(4), at(5));
+ clear();
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK_CPEQ(4);
+ rrcurveto(0, at(0), at(1), at(2), at(3), 0);
+ clear();
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK_CPEQ(1);
+ rlineto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK_EQ(1);
+ rmoveto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cHstem:
+ CHECK_STACK_EQ(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_EQ(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_EQ(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_EQ(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_EQ(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_EQ(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)
+{
+ CharstringCheckerErrorHandler<CharstringChecker> merrh(errh, this);
+ _errh = &merrh;
+ int old_errors = errh->nerrors();
+
+ _started = false;
+ _flex = false;
+ _hstem = _hstem3 = _vstem = _vstem3 = _just_flexed = false;
+ _h_hstem.clear();
+ _h_vstem.clear();
+ _h_hstem3.clear();
+ _h_vstem3.clear();
+ _ncommand = 0;
+ _subrno = -1;
+
+ CharstringInterp::interpret(g);
+
+ return errh->nerrors() == old_errors;
+}
+
+
+
+CharstringSubrChecker::CharstringSubrChecker()
+ : CharstringInterp(), _errh(0)
+{
+ set_careful(true);
+}
+
+CharstringSubrChecker::CharstringSubrChecker(const Vector<double> &weight)
+ : CharstringInterp(weight), _errh(0)
+{
+ set_careful(true);
+}
+
+bool
+CharstringSubrChecker::error(int error, int data)
+{
+ CharstringInterp::error(error, data);
+ _errh->error("%s", error_string().c_str());
+ return false;
+}
+
+bool
+CharstringSubrChecker::type1_command(int cmd)
+{
+ switch (cmd) {
+ case Cs::cReturn:
+ _returned = true;
+ return false;
+ default:
+ clear();
+ return true;
+ }
+}
+
+bool
+CharstringSubrChecker::check(const CharstringContext &g, ErrorHandler *errh)
+{
+ CharstringCheckerErrorHandler<CharstringSubrChecker> merrh(errh, this);
+ _errh = &merrh;
+ int old_errors = errh->nerrors();
+
+ _returned = false;
+
+ CharstringInterp::interpret(g);
+
+ if (!_returned)
+ _errh->error("subroutine does not return");
+ return errh->nerrors() == old_errors;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.hh
new file mode 100644
index 00000000000..9ba167b1588
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/cscheck.hh
@@ -0,0 +1,134 @@
+#ifndef CSCHECK_HH
+#define CSCHECK_HH
+#include <efont/t1interp.hh>
+#include <lcdf/point.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <ctype.h>
+
+template <typename T>
+class CharstringCheckerErrorHandler : public ErrorVeneer { public:
+
+ CharstringCheckerErrorHandler(ErrorHandler *errh, T *checker)
+ : ErrorVeneer(errh), _checker(checker) {
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ T *_checker;
+
+};
+
+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 *);
+
+ int ncommand() const {
+ return _ncommand;
+ }
+ int subrno() const {
+ return _subrno;
+ }
+
+ private:
+
+ ErrorHandler *_errh;
+ int _ncommand;
+ int _subrno;
+
+ Point _cp;
+
+ bool _started;
+ bool _flex;
+ bool _cp_exists;
+
+ bool _hstem;
+ bool _hstem3;
+ bool _vstem;
+ bool _vstem3;
+
+ bool _just_flexed;
+
+ 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);
+
+};
+
+class CharstringSubrChecker : public Efont::CharstringInterp { public:
+
+ CharstringSubrChecker();
+ CharstringSubrChecker(const Vector<double> &weight_vec);
+
+ bool error(int, int);
+ bool type1_command(int);
+
+ bool check(const Efont::CharstringContext &, ErrorHandler *);
+
+ int ncommand() const {
+ return -1;
+ }
+ int subrno() const {
+ return -1;
+ }
+
+ private:
+
+ ErrorHandler *_errh;
+
+ bool _returned;
+
+};
+
+
+template <typename T> String
+CharstringCheckerErrorHandler<T>::decorate(const String &str)
+{
+ StringAccum sa;
+ const char *s = skip_anno(str.begin(), str.end());
+ while (s < str.end() && isspace((unsigned char) *s))
+ ++s;
+ sa.append(str.begin(), s);
+ if (_checker->subrno() >= 0)
+ sa << "called from ";
+ if (_checker->ncommand() >= 0)
+ sa << "command " << (_checker->ncommand() - 1) << ':';
+ if (sa)
+ sa << ' ';
+ if (s + 11 < str.end() && memcmp(s, "charstring ", 11) == 0) {
+ bool quote_parity = 0;
+ const char *last = s + 11;
+ for (const char *x = last; x != str.end(); ++x)
+ if (*x == '\'') {
+ sa.append(last, x);
+ sa << format(quote_parity ? "%>" : "%<");
+ quote_parity = !quote_parity;
+ last = x + 1;
+ }
+ sa.append(last, str.end());
+ } else
+ sa.append(s, str.end());
+ return ErrorVeneer::decorate(sa.take_string());
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.1
new file mode 100644
index 00000000000..b29c432a507
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.1
@@ -0,0 +1,48 @@
+.ds V 2.98
+.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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.cc
new file mode 100644
index 00000000000..e2ac1012382
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1lint/t1lint.cc
@@ -0,0 +1,450 @@
+/* t1lint.cc -- driver for checking Type 1 fonts for validity
+ *
+ * Copyright (c) 1999-2012 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
+
+const 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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 (size %g, max %g [%g])", name, i/2, blues[i+1] - blues[i], max_diff, BlueScale);
+ }
+}
+
+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,
+ ErrorHandler *err_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)
+ err_errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ err_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))
+ cerrh.error("UniqueID not in the range 0-16777215");
+ if (get_integer(font, Type1Font::dP, "UniqueID", UniqueID2, errh)
+ && (UniqueID2 < 0 || UniqueID2 > 0xFFFFFF))
+ cerrh.error("Private UniqueID not in the range 0-16777215");
+ if (UniqueID >= 0 && UniqueID2 >= 0 && UniqueID != UniqueID2)
+ cerrh.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)
+ cerrh.error("empty XUID");
+ for (int i = 0; i < XUID.size(); i++) {
+ if (floor(XUID[i]) != XUID[i] || XUID[i] < 0 || XUID[i] > 0xFFFFFF) {
+ cerrh.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, "While interpreting %<%s%>:", font->glyph_name(i).c_str());
+ cc.check(font->glyph_context(i), &derrh);
+ }
+
+ int ns = font->nsubrs();
+ CharstringSubrChecker csc(weight_vector);
+ for (int i = 0; i < ns; ++i)
+ if (Type1Charstring *cs = font->subr(i)) {
+ ContextErrorHandler derrh(&cerrh, "While interpreting subr %d:", i);
+ CharstringContext cctx(font, cs);
+ csc.check(cctx, &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 *err_errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ ErrorHandler *out_errh = new FileErrorHandler(stdout);
+ ErrorHandler *errh = out_errh;
+ int nfiles = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = out_errh;
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("t1lint (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2012 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->vstr, psres, errh, err_errh);
+ nfiles++;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(err_errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (nfiles == 0)
+ do_file("-", psres, errh, err_errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.am
new file mode 100644
index 00000000000..815d0efad89
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1rawafm
+man_MANS = t1rawafm.1
+
+t1rawafm_SOURCES = t1rawafm.cc
+
+t1rawafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1rawafm.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.in
new file mode 100644
index 00000000000..64710129b27
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/Makefile.in
@@ -0,0 +1,695 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = t1rawafm$(EXEEXT)
+subdir = lcdf-typetools-2.98/t1rawafm
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1rawafm_OBJECTS = t1rawafm.$(OBJEXT)
+t1rawafm_OBJECTS = $(am_t1rawafm_OBJECTS)
+t1rawafm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1rawafm_SOURCES)
+DIST_SOURCES = $(t1rawafm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1rawafm.1
+t1rawafm_SOURCES = t1rawafm.cc
+t1rawafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1rawafm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1rawafm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1rawafm/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+t1rawafm$(EXEEXT): $(t1rawafm_OBJECTS) $(t1rawafm_DEPENDENCIES) $(EXTRA_t1rawafm_DEPENDENCIES)
+ @rm -f t1rawafm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1rawafm_OBJECTS) $(t1rawafm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rawafm.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.1
new file mode 100644
index 00000000000..9227baa5955
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.1
@@ -0,0 +1,55 @@
+.ds V 2.98
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1RAWAFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1rawafm \- produce raw AFM metrics from a PostScript Type 1 font
+.SH SYNOPSIS
+\fBt1rawafm\fR \%[OPTIONS...] [\fIfont\fR [\fIoutputfile\fR]]
+.SH DESCRIPTION
+.BR T1rawafm
+generates an AFM file with the information available in a PostScript
+Type\~1 font. The AFM file will lack kerns, ligature information, and
+composite characters, but is otherwise usable. The AFM file is written to
+the standard output (but see the
+.B \-\-output
+option). If no input font file is supplied,
+.B t1rawafm
+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 \-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 T1rawafm
+exits with value 0 if an AFM metrics file was successfully generated, and 1
+otherwise.
+'
+.SH "SEE ALSO"
+.LP
+.IR "Adobe Type 1 Font Format" ,
+.IR "Adobe Font Metrics File Format Specification v4.1"
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.cc
new file mode 100644
index 00000000000..8ba7c7531fb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1rawafm/t1rawafm.cc
@@ -0,0 +1,362 @@
+/* t1rawafm.cc -- driver for generating a raw AFM file from a font
+ *
+ * Copyright (c) 2008-2012 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
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define SMOKE_OPT 305
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+
+
+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 [OUTPUT]]", program_name);
+ else
+ errh->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1rawafm%> generates a raw (kernless and ligatureless) AFM file corresponding\n\
+to the specified Type 1 font file and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTION]... [FONT [OUTPUT]]\n\
+\n\
+FONT is the name of a PFA or PFB font file. If omitted, t1rawafm will read a\n\
+font file from the standard input.\n\
+\n\
+Options:\n\
+ -o, --output=FILE Write output to FILE instead of standard output.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\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;
+}
+
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+struct fontinfo_t {
+ const char *afm_name;
+ int dict;
+ const char *dict_name;
+ bool as_string;
+};
+
+static const fontinfo_t fontinfo_strings[] = {
+ { "Version", Type1Font::dFI, "version", true },
+ { "Notice", Type1Font::dFI, "Notice", true },
+ { "FullName", Type1Font::dFI, "FullName", true },
+ { "FamilyName", Type1Font::dFI, "FamilyName", true },
+ { "Weight", Type1Font::dFI, "Weight", true },
+ { "ItalicAngle", Type1Font::dFI, "ItalicAngle", false },
+ { "IsFixedPitch", Type1Font::dFI, "isFixedPitch", false },
+ { "UnderlinePosition", Type1Font::dFI, "UnderlinePosition", false },
+ { "UnderlineThickness", Type1Font::dFI, "UnderlineThickness", false }
+};
+
+static String
+strip_newlines(const String &str)
+{
+ StringAccum sa;
+ const char *end = str.end(), *last = str.begin();
+ for (const char *s = str.begin(); s != end; ++s)
+ if (*s == '\n' || *s == '\r' || *s == '\f' || *s == '\v') {
+ sa.append(last, s);
+ last = s + 1;
+ }
+ if (last == str.begin())
+ return str;
+ else {
+ sa.append(last, end);
+ return sa.take_string();
+ }
+}
+
+static void
+write_char(FILE *outf, int c, PermString n, Type1Charstring *g, const Transform &font_transform, Type1Font *font)
+{
+ int bb[4], wx;
+ CharstringBounds::bounds(font_transform, CharstringContext(font, g), bb, wx);
+ fprintf(outf, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n",
+ c, wx, n.c_str(), bb[0], bb[1], bb[2], bb[3]);
+}
+
+static void
+write_afm(FILE *outf, Type1Font *font)
+{
+ fprintf(outf, "StartFontMetrics 2.0\n\
+Comment Generated by t1rawafm\n");
+
+ for (size_t i = 0; i < sizeof(fontinfo_strings) / sizeof(fontinfo_t); ++i)
+ if (Type1Definition *t1d = font->dict(fontinfo_strings[i].dict,
+ fontinfo_strings[i].dict_name)) {
+ if (!fontinfo_strings[i].as_string)
+ fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, t1d->value().c_str());
+ else {
+ String s;
+ if (t1d->value_string(s))
+ fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, strip_newlines(s).c_str());
+ }
+ }
+
+ Transform font_transform;
+ {
+ double font_matrix[6];
+ font->font_matrix(font_matrix);
+ font_transform = Transform(font_matrix);
+ font_transform.scale(1000);
+ }
+
+ int bb[4], wx;
+ if (Type1Charstring *t1cs = font->glyph("H")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "Ascender %d\n", bb[3]);
+ }
+ if (Type1Charstring *t1cs = font->glyph("x")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "XHeight %d\n", bb[3]);
+ }
+ if (Type1Charstring *t1cs = font->glyph("d")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "Ascender %d\n", bb[3]);
+ }
+ if (Type1Charstring *t1cs = font->glyph("p")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "Descender %d\n", bb[1]);
+ }
+
+ Vector<double> vd;
+ if (Type1Definition *t1d = font->p_dict("StdHW"))
+ if (t1d->value_numvec(vd) && vd.size() > 0)
+ fprintf(outf, "StdHW %d\n", (int) ceil(vd[0]));
+ if (Type1Definition *t1d = font->p_dict("StdVW"))
+ if (t1d->value_numvec(vd) && vd.size() > 0)
+ fprintf(outf, "StdVW %d\n", (int) ceil(vd[0]));
+
+ int fontbb[4] = { 1000000, 1000000, -1000000, -1000000 };
+ for (int i = 0; i < font->nglyphs(); ++i) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, font->glyph(i)), bb, wx);
+ fontbb[0] = std::min(fontbb[0], bb[0]);
+ fontbb[1] = std::min(fontbb[1], bb[1]);
+ fontbb[2] = std::max(fontbb[2], bb[2]);
+ fontbb[3] = std::max(fontbb[3], bb[3]);
+ }
+ fprintf(outf, "FontBBox %d %d %d %d\n", fontbb[0], fontbb[1], fontbb[2], fontbb[3]);
+
+ fprintf(outf, "FontName %s\n", font->font_name().c_str());
+
+ int nglyphs = font->nglyphs();
+ PermString dot_notdef(".notdef");
+ if (font->glyph(dot_notdef))
+ --nglyphs;
+ fprintf(outf, "Characters %d\n", nglyphs);
+
+ fprintf(outf, "StartCharMetrics %d\n", nglyphs);
+ Type1Encoding *enc = font->type1_encoding();
+ HashMap<PermString, int> done_yet(0);
+ done_yet.insert(dot_notdef, 1);
+ for (int i = 0; i < 256; ++i) {
+ PermString n = enc->elt(i);
+ if (!done_yet[n])
+ if (Type1Charstring *g = font->glyph(n)) {
+ write_char(outf, i, n, g, font_transform, font);
+ done_yet.insert(n, true);
+ }
+ }
+ for (int i = 0; i < font->nglyphs(); ++i) {
+ PermString n = font->glyph_name(i);
+ if (!done_yet[n])
+ write_char(outf, -1, n, font->glyph(i), font_transform, font);
+ }
+ fprintf(outf, "EndCharMetrics\n");
+
+ fprintf(outf, "EndFontMetrics\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);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *output_file = 0;
+ Vector<String> glyph_patterns;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case OUTPUT_OPT:
+ output_file:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->vstr;
+ break;
+
+ case VERSION_OPT:
+ printf("t1rawafm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2008-2012 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)
+ goto output_file;
+ else
+ do_file(clp->vstr, 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));
+ }
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+
+ write_afm(outf, font);
+
+ exit(0);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.am
new file mode 100644
index 00000000000..1cb4c402f15
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1reencode
+man_MANS = t1reencode.1
+
+t1reencode_SOURCES = t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1reencode.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.in
new file mode 100644
index 00000000000..b1e643f3c65
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/Makefile.in
@@ -0,0 +1,716 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = t1reencode$(EXEEXT)
+subdir = lcdf-typetools-2.98/t1reencode
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1reencode_OBJECTS = t1reencode.$(OBJEXT) util.$(OBJEXT)
+t1reencode_OBJECTS = $(am_t1reencode_OBJECTS)
+t1reencode_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(t1reencode_SOURCES)
+DIST_SOURCES = $(t1reencode_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1reencode.1
+t1reencode_SOURCES = t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1reencode.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1reencode/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+t1reencode$(EXEEXT): $(t1reencode_OBJECTS) $(t1reencode_DEPENDENCIES) $(EXTRA_t1reencode_DEPENDENCIES)
+ @rm -f t1reencode$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1reencode_OBJECTS) $(t1reencode_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1reencode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.1
new file mode 100644
index 00000000000..1dbf7b0ffc4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.1
@@ -0,0 +1,205 @@
+.ds V 2.98
+.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 the following special names, in which case the corresponding
+standard encoding is used.
+.Sp
+.RS
+.TP 23
+.B Name
+.B Source
+.TP
+StandardEncoding
+Adobe
+.TP
+ISOLatin1Encoding
+Adobe/ISO (synonym: ISO_8859_1_Encoding)
+.TP
+ExpertEncoding
+Adobe
+.TP
+ExpertSubsetEncoding
+Adobe
+.TP
+SymbolEncoding
+Adobe
+.TP
+ISOLatin2Encoding
+ISO (synonym: ISO_8859_2_Encoding)
+.TP
+ISOLatin3Encoding
+ISO (synonym: ISO_8859_3_Encoding)
+.TP
+ISOLatin4Encoding
+ISO (synonym: ISO_8859_4_Encoding)
+.TP
+ISOCyrillicEncoding
+ISO (synonym: ISO_8859_5_Encoding)
+.TP
+ISOGreekEncoding
+ISO (synonym: ISO_8859_7_Encoding)
+.TP
+ISOLatin5Encoding
+ISO (synonym: ISO_8859_9_Encoding)
+.TP
+ISOLatin6Encoding
+ISO (synonym: ISO_8859_10_Encoding)
+.TP
+ISOThaiEncoding
+ISO (synonym: ISO_8859_11_Encoding)
+.TP
+ISOLatin7Encoding
+ISO (synonym: ISO_8859_13_Encoding)
+.TP
+ISOLatin8Encoding
+ISO (synonym: ISO_8859_14_Encoding)
+.TP
+ISOLatin9Encoding
+ISO (synonym: ISO_8859_15_Encoding)
+.TP
+KOI8REncoding
+-
+.RE
+'
+.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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.cc
new file mode 100644
index 00000000000..952d3f87bdc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/t1reencode.cc
@@ -0,0 +1,1109 @@
+/* t1reencode.cc -- driver for reencoding Type 1 fonts
+ *
+ * Copyright (c) 2005-2012 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 <lcdf/md5.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 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
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "name", 'n', FONTNAME_OPT, Clp_ValString, 0 },
+ { "fullname", 'N', FULLNAME_OPT, Clp_ValString, 0 },
+ { "full-name", 'N', FULLNAME_OPT, Clp_ValString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ValString, 0 },
+ { "encoding-text", 'E', ENCODING_TEXT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+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 ISOLatin2Encoding[] = "/ISOLatin2Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section\n\
+ /dieresis /Scaron /Scedilla /Tcaron /Zacute /uni00AD /Zcaron /Zdotaccent\n\
+ /degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron\n\
+ /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent\n\
+ /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron\n\
+ /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply\n\
+ /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /uni0162 /germandbls\n\
+ /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla\n\
+ /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron\n\
+ /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide\n\
+ /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /uni0163 /dotaccent\n\
+] def\n";
+
+static const char ISOLatin3Encoding[] = "/ISOLatin3Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Hbar /breve /sterling /currency /yen /Hcircumflex /section\n\
+ /dieresis /Idotaccent /Scedilla /Gbreve /Jcircumflex /uni00AD /registered /Zdotaccent\n\
+ /degree /hbar /twosuperior /threesuperior /acute /mu /hcircumflex /periodcentered\n\
+ /cedilla /dotlessi /scedilla /gbreve /jcircumflex /onehalf /threequarters /zdotaccent\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Cdotaccent /Ccircumflex /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Gdotaccent /Odieresis /multiply\n\
+ /Gcircumflex /Ugrave /Uacute /Ucircumflex /Udieresis /Ubreve /Scircumflex /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /cdotaccent /ccircumflex /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /ograve /oacute /ocircumflex /gdotaccent /odieresis /divide\n\
+ /gcircumflex /ugrave /uacute /ucircumflex /udieresis /ubreve /scircumflex /dotaccent\n\
+] def\n";
+
+static const char ISOLatin4Encoding[] = "/ISOLatin4Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /kgreenlandic /Rcommaaccent /currency /Itilde /Lcommaaccent /section\n\
+ /dieresis /Scaron /Emacron /Gcommaaccent /Tbar /uni00AD /Zcaron /macron\n\
+ /degree /aogonek /ogonek /rcommaaccent /acute /itilde /lcommaaccent /caron\n\
+ /cedilla /scaron /emacron /gcommaaccent /tbar /Eng /zcaron /eng\n\
+ /Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Edotaccent /Iacute /Icircumflex /Imacron\n\
+ /Dcroat /Ncommaaccent /Omacron /Kcommaaccent /Ocircumflex /Otilde /Odieresis /multiply\n\
+ /Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Utilde /Umacron /germandbls\n\
+ /amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek\n\
+ /ccaron /eacute /eogonek /edieresis /edotaccent /iacute /icircumflex /imacron\n\
+ /dcroat /ncommaaccent /omacron /kcommaaccent /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /uogonek /uacute /ucircumflex /udieresis /utilde /umacron /dotaccent\n\
+] def\n";
+
+static const char ISOCyrillicEncoding[] = "/ISOCyrillicEncoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /afii10023 /afii10051 /afii10052 /afii10053 /afii10054 /afii10055 /afii10056\n\
+ /afii10057 /afii10058 /afii10059 /afii10060 /afii10061 /uni00AD /afii10062 /afii10145\n\
+ /afii10017 /afii10018 /afii10019 /afii10020 /afii10021 /afii10022 /afii10024 /afii10025\n\
+ /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032 /afii10033\n\
+ /afii10034 /afii10035 /afii10036 /afii10037 /afii10038 /afii10039 /afii10040 /afii10041\n\
+ /afii10042 /afii10043 /afii10044 /afii10045 /afii10046 /afii10047 /afii10048 /afii10049\n\
+ /afii10065 /afii10066 /afii10067 /afii10068 /afii10069 /afii10070 /afii10072 /afii10073\n\
+ /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080 /afii10081\n\
+ /afii10082 /afii10083 /afii10084 /afii10085 /afii10086 /afii10087 /afii10088 /afii10089\n\
+ /afii10090 /afii10091 /afii10092 /afii10093 /afii10094 /afii10095 /afii10096 /afii10097\n\
+ /afii61352 /afii10071 /afii10099 /afii10100 /afii10101 /afii10102 /afii10103 /afii10104\n\
+ /afii10105 /afii10106 /afii10107 /afii10108 /afii10109 /section /afii10110 /afii10193\n\
+] def\n";
+
+static const char ISOGreekEncoding[] = "/ISOGreekEncoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /afii64937 /afii57929 /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /afii00208\n\
+ /degree /plusminus /twosuperior /threesuperior /tonos /dieresistonos /Alphatonos /periodcentered\n\
+ /Epsilontonos /Etatonos /Iotatonos /guillemotright /Omicrontonos /onehalf /Upsilontonos /Omegatonos\n\
+ /iotadieresistonos /Alpha /Beta /Gamma /uni0394 /Epsilon /Zeta /Eta\n\
+ /Theta /Iota /Kappa /Lambda /Mu /Nu /Xi /Omicron\n\
+ /Pi /Rho /Ograve /Sigma /Tau /Upsilon /Phi /Chi\n\
+ /Psi /uni03A9 /Iotadieresis /Upsilondieresis /alphatonos /epsilontonos /etatonos /iotatonos\n\
+ /upsilondieresistonos /alpha /beta /gamma /delta /epsilon /zeta /eta\n\
+ /theta /iota /kappa /lambda /uni03BC /nu /xi /omicron\n\
+ /pi /rho /sigma1 /sigma /tau /upsilon /phi /chi\n\
+ /psi /omega /iotadieresis /upsilondieresis /omicrontonos /upsilontonos /omegatonos /ydieresis\n\
+] def\n";
+
+static const char ISOLatin5Encoding[] = "/ISOLatin5Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /exclamdown /cent /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /acute /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\
+ /Gbreve /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Idotaccent /Scedilla /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /gbreve /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /dotlessi /scedilla /ydieresis\n\
+] def\n";
+
+static const char ISOLatin6Encoding[] = "/ISOLatin6Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /Emacron /Gcommaaccent /Imacron /Itilde /Kcommaaccent /section\n\
+ /Lcommaaccent /Dcroat /Scaron /Tbar /Zcaron /uni00AD /Umacron /Eng\n\
+ /degree /aogonek /emacron /gcommaaccent /imacron /itilde /kcommaaccent /periodcentered\n\
+ /lcommaaccent /dcroat /scaron /tbar /zcaron /macron /umacron /eng\n\
+ /Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Emacron /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ncommaaccent /Omacron /Oacute /Ocircumflex /Otilde /Odieresis /Utilde\n\
+ /Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls\n\
+ /amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek\n\
+ /ccaron /eacute /eogonek /edieresis /emacron /iacute /icircumflex /idieresis\n\
+ /eth /ncommaaccent /omacron /oacute /ocircumflex /otilde /odieresis /utilde\n\
+ /oslash /uogonek /uacute /ucircumflex /udieresis /yacute /thorn /kgreenlandic\n\
+] def\n";
+
+static const char ISOThaiEncoding[] = "/ISOThaiEncoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /uni0E01 /uni0E02 /uni0E03 /uni0E04 /uni0E05 /uni0E06 /uni0E07\n\
+ /uni0E08 /uni0E09 /uni0E0A /uni0E0B /uni0E0C /uni0E0D /uni0E0E /uni0E0F\n\
+ /uni0E10 /uni0E11 /uni0E12 /uni0E13 /uni0E14 /uni0E15 /uni0E16 /uni0E17\n\
+ /uni0E18 /uni0E19 /uni0E1A /uni0E1B /uni0E1C /uni0E1D /uni0E1E /uni0E1F\n\
+ /uni0E20 /uni0E21 /uni0E22 /uni0E23 /uni0E24 /uni0E25 /uni0E26 /uni0E27\n\
+ /uni0E28 /uni0E29 /uni0E2A /uni0E2B /uni0E2C /uni0E2D /uni0E2E /uni0E2F\n\
+ /uni0E30 /uni0E31 /uni0E32 /uni0E33 /uni0E34 /uni0E35 /uni0E36 /uni0E37\n\
+ /uni0E38 /uni0E39 /uni0E3A /.notdef /space /.notdef /.notdef /uni0E3F\n\
+ /uni0E40 /uni0E41 /uni0E42 /uni0E43 /uni0E44 /uni0E45 /uni0E46 /uni0E47\n\
+ /uni0E48 /uni0E49 /uni0E4A /uni0E4B /uni0E4C /uni0E4D /uni0E4E /uni0E4F\n\
+ /uni0E50 /uni0E51 /uni0E52 /uni0E53 /uni0E54 /uni0E55 /uni0E56 /uni0E57\n\
+ /uni0E58 /uni0E59 /uni0E5A /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+] def\n";
+
+static const char ISOLatin7Encoding[] = "/ISOLatin7Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /quotedblright /cent /sterling /currency /quotedblbase /brokenbar /section\n\
+ /Oslash /copyright /rcommaaccent /guillemotleft /logicalnot /uni00AD /registered /AE\n\
+ /degree /plusminus /twosuperior /threesuperior /quotedblleft /mu /paragraph /periodcentered\n\
+ /oslash /onesuperior /.notdef /guillemotright /onequarter /onehalf /threequarters /ae\n\
+ /Aogonek /Iogonek /Amacron /Cacute /Adieresis /Aring /Eogonek /Emacron\n\
+ /Ccaron /Eacute /Zacute /Edotaccent /Gcommaaccent /Kcommaaccent /Imacron /Lcommaaccent\n\
+ /Scaron /Nacute /Ncommaaccent /Oacute /Omacron /Otilde /Odieresis /multiply\n\
+ /Uogonek /Lslash /Uacute /Ucircumflex /Udieresis /Zdotaccent /Zcaron /germandbls\n\
+ /aogonek /Iogonek /amacron /cacute /adieresis /aring /eogonek /emacron\n\
+ /ccaron /eacute /zacute /edotaccent /gcommaaccent /kcommaaccent /imacron /lcommaaccent\n\
+ /scaron /nacute /ncommaaccent /oacute /omacron /otilde /odieresis /divide\n\
+ /uogonek /lslash /uacute /ucircumflex /udieresis /zdotaccent /zcaron /quoteright\n\
+] def\n";
+
+static const char ISOLatin8Encoding[] = "/ISOLatin8Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /uni1E02 /uni1E03 /sterling /Cdotaccent /cdotaccent /uni1E0A /section\n\
+ /Wgrave /copyright /Wacute /uni1E0B /Ygrave /uni00AD /registered /Ydieresis\n\
+ /uni1E1E /uni1E1F /Gdotaccent /gdotaccent /uni1E40 /uni1E41 /paragraph /uni1E56\n\
+ /wgrave /uni1E57 /wacute /uni1E60 /ygrave /Wdieresis /wdieresis /uni1E61\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Wcircumflex /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /uni1E6A\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Ycircumflex /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /wcircumflex /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /uni1E6B\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /ycircumflex /ydieresis\n\
+] def\n";
+
+static const char ISOLatin9Encoding[] = "/ISOLatin9Encoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /exclamdown /cent /sterling /Euro /yen /Scaron /section\n\
+ /scaron /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /Zcaron /mu /paragraph /periodcentered\n\
+ /zcaron /onesuperior /ordmasculine /guillemotright /OE /oe /Ydieresis /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 /Otilde /Odieresis /multiply\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis\n\
+] def\n";
+
+static const char KOI8REncoding[] = "/KOI8REncoding [\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 /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /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\
+ /grave /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\
+ /SF100000 /SF110000 /SF010000 /SF030000 /SF020000 /SF040000 /SF080000 /SF090000\n\
+ /SF060000 /SF070000 /SF050000 /upblock /dnblock /block /lfblock /rtblock\n\
+ /ltshade /shade /dkshade /integraltp /filledbox /uni2219 /radical /approxequal\n\
+ /lessequal /greaterequal /uni00A0 /integralbt /degree /twosuperior /periodcentered /divide\n\
+ /SF430000 /SF240000 /SF510000 /afii10071 /SF520000 /SF390000 /SF220000 /SF210000\n\
+ /SF250000 /SF500000 /SF490000 /SF380000 /SF280000 /SF270000 /SF260000 /SF360000\n\
+ /SF370000 /SF420000 /SF190000 /afii10023 /SF200000 /SF230000 /SF470000 /SF480000\n\
+ /SF410000 /SF450000 /SF460000 /SF400000 /SF540000 /SF530000 /SF440000 /copyright\n\
+ /afii10096 /afii10065 /afii10066 /afii10088 /afii10069 /afii10070 /afii10086 /afii10068\n\
+ /afii10087 /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080\n\
+ /afii10081 /afii10097 /afii10082 /afii10083 /afii10084 /afii10085 /afii10072 /afii10067\n\
+ /afii10094 /afii10093 /afii10073 /afii10090 /afii10095 /afii10091 /afii10089 /afii10092\n\
+ /afii10048 /afii10017 /afii10018 /afii10040 /afii10021 /afii10022 /afii10038 /afii10020\n\
+ /afii10039 /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032\n\
+ /afii10033 /afii10049 /afii10034 /afii10035 /afii10036 /afii10037 /afii10024 /afii10019\n\
+ /afii10046 /afii10045 /afii10025 /afii10042 /afii10047 /afii10043 /afii10041 /afii10044\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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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 <ekohler@gmail.com>.\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((unsigned char) 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((unsigned char) 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::make_stable(":", 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->vstr;
+ break;
+
+ case ENCODING_TEXT_OPT:
+ if (encoding_file || encoding_text)
+ errh->fatal("encoding already specified");
+ encoding_text = clp->vstr;
+ break;
+
+ case FONTNAME_OPT:
+ if (new_font_name)
+ errh->fatal("font name already specified");
+ new_font_name = clp->vstr;
+ break;
+
+ case FULLNAME_OPT:
+ if (new_full_name)
+ errh->fatal("full name already specified");
+ new_full_name = clp->vstr;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->vstr;
+ 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-2012 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->vstr;
+ else
+ input_file = clp->vstr;
+ 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 (strcmp(encoding_file, "StandardEncoding") == 0) {
+ t1e = Type1Encoding::standard_encoding();
+ encoding_name = encoding_file;
+ } else {
+ String text;
+ if (strcmp(encoding_file, "ISOLatin1Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_1_Encoding") == 0)
+ text = String::make_stable(ISOLatin1Encoding);
+ else if (strcmp(encoding_file, "ISOLatin2Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_2_Encoding") == 0)
+ text = String::make_stable(ISOLatin2Encoding);
+ else if (strcmp(encoding_file, "ISOLatin3Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_3_Encoding") == 0)
+ text = String::make_stable(ISOLatin3Encoding);
+ else if (strcmp(encoding_file, "ISOLatin4Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_4_Encoding") == 0)
+ text = String::make_stable(ISOLatin4Encoding);
+ else if (strcmp(encoding_file, "ISOCyrillicEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_5_Encoding") == 0)
+ text = String::make_stable(ISOCyrillicEncoding);
+ else if (strcmp(encoding_file, "ISOGreekEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_7_Encoding") == 0)
+ text = String::make_stable(ISOGreekEncoding);
+ else if (strcmp(encoding_file, "ISO_8859_9_Encoding") == 0
+ || strcmp(encoding_file, "ISOLatin5Encoding") == 0)
+ text = String::make_stable(ISOLatin5Encoding);
+ else if (strcmp(encoding_file, "ISOLatin6Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_10_Encoding") == 0)
+ text = String::make_stable(ISOLatin6Encoding);
+ else if (strcmp(encoding_file, "ISOThaiEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_11_Encoding") == 0)
+ text = String::make_stable(ISOThaiEncoding);
+ else if (strcmp(encoding_file, "ISOLatin7Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_13_Encoding") == 0)
+ text = String::make_stable(ISOLatin7Encoding);
+ else if (strcmp(encoding_file, "ISOLatin8Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_14_Encoding") == 0)
+ text = String::make_stable(ISOLatin8Encoding);
+ else if (strcmp(encoding_file, "ISOLatin9Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_15_Encoding") == 0)
+ text = String::make_stable(ISOLatin9Encoding);
+ else if (strcmp(encoding_file, "KOI8REncoding") == 0)
+ text = String::make_stable(KOI8REncoding);
+ else if (strcmp(encoding_file, "ExpertEncoding") == 0)
+ text = String::make_stable(ExpertEncoding);
+ else if (strcmp(encoding_file, "ExpertSubsetEncoding") == 0)
+ text = String::make_stable(ExpertSubsetEncoding);
+ else if (strcmp(encoding_file, "SymbolEncoding") == 0)
+ text = String::make_stable(SymbolEncoding);
+ else if (encoding_text)
+ text = String::make_stable(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 defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+ if (binary) {
+ Type1PFBWriter w(outf);
+ font->write(w);
+ } else {
+ Type1PFAWriter w(outf);
+ font->write(w);
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.cc
new file mode 100644
index 00000000000..89f43391152
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.cc
@@ -0,0 +1,78 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2010 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->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<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/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1reencode/util.hh
new file mode 100644
index 00000000000..34b9c9c5a22
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.am
new file mode 100644
index 00000000000..eac56ee9066
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/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$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1testpage.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.in
new file mode 100644
index 00000000000..33a74f93ede
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/Makefile.in
@@ -0,0 +1,695 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = t1testpage$(EXEEXT)
+subdir = lcdf-typetools-2.98/t1testpage
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1testpage_OBJECTS = t1testpage.$(OBJEXT)
+t1testpage_OBJECTS = $(am_t1testpage_OBJECTS)
+t1testpage_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1testpage_SOURCES)
+DIST_SOURCES = $(t1testpage_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1testpage.1
+t1testpage_SOURCES = t1testpage.cc
+t1testpage_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1testpage.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/t1testpage/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+t1testpage$(EXEEXT): $(t1testpage_OBJECTS) $(t1testpage_DEPENDENCIES) $(EXTRA_t1testpage_DEPENDENCIES)
+ @rm -f t1testpage$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(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@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.1
new file mode 100644
index 00000000000..201b9632e46
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.1
@@ -0,0 +1,66 @@
+.ds V 2.98
+.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 more than one
+.I font
+is given, the output proof contains all the fonts in order. If
+.I font
+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 (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.cc
new file mode 100644
index 00000000000..ed3d7330a13
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/t1testpage/t1testpage.cc
@@ -0,0 +1,748 @@
+/* t1testpage.cc -- driver for generating Type 1 fonts' test pages
+ *
+ * Copyright (c) 1999-2012 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
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define GLYPH_OPT 304
+#define SMOKE_OPT 305
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+ { "glyph", 'g', GLYPH_OPT, Clp_ValString, 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<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\
+Each FONT is the name of a PFA or PFB font file. If omitted, t1testpage will\n\
+read 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 <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// OUTPUTTER
+
+namespace {
+
+class Testpager { public:
+ Testpager(FILE *f)
+ : _f(f), _pageno(1) {
+ }
+ virtual ~Testpager() {
+ fclose(_f);
+ }
+ virtual void prolog(const Vector<Type1Font *> &fonts) = 0;
+ void newpage() {
+ fprintf(_f, "%%%%Page: %d %d\n", _pageno, _pageno);
+ ++_pageno;
+ }
+ virtual void font(Type1Font *font, const Vector<PermString>& glyph_names) = 0;
+ virtual void epilog() {
+ fprintf(_f, "%%%%EOF\n");
+ }
+ protected:
+ FILE *_f;
+ int _pageno;
+};
+
+class GridTestpager : public Testpager { public:
+ GridTestpager(FILE *f)
+ : Testpager(f) {
+ }
+ void prolog(const Vector<Type1Font *> &fonts);
+ void font(Type1Font *font, const Vector<PermString>& glyph_names);
+};
+
+class SmokeTestpager : public Testpager { public:
+ SmokeTestpager(FILE *f)
+ : Testpager(f) {
+ }
+ void prolog(const Vector<Type1Font *> &fonts);
+ void font(Type1Font *font, const Vector<PermString>& glyph_names);
+};
+
+}
+
+
+// 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("%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);
+
+ delete reader;
+ return font;
+}
+
+void
+GridTestpager::prolog(const Vector<Type1Font *> &fonts)
+{
+ fprintf(_f, "%%!PS-Adobe-3.0\n\
+%%%%LanguageLevel: 2\n\
+%%%%DocumentMedia: Plain 612 792 white ( )\n\
+%%%%BeginProlog\n");
+ fprintf(_f, "/magicstr 1 string def\n\
+/magicbox { %% row col char name encoding magicbox -\n\
+ 5 3 roll 54 mul 36 add exch 54 mul neg 682 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(_f);
+ for (Vector<Type1Font *>::const_iterator it = fonts.begin();
+ it != fonts.end(); ++it)
+ (*it)->write(w);
+ fprintf(_f, "%%%%EndProlog\n");
+}
+
+void
+GridTestpager::font(Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ HashMap<PermString, int> encodings(-1);
+ if (Type1Encoding *encoding = font->type1_encoding())
+ for (int i = 255; i >= 0; i--)
+ if (encoding->elt(i))
+ encodings.insert(encoding->elt(i), i);
+
+ int per_row = 10;
+ int nrows = 13;
+ int per_page = nrows * per_row;
+
+ int page = 0, gi = -1;
+ for (Vector<PermString>::const_iterator it = glyph_names.begin();
+ it != glyph_names.end(); ++it) {
+ // allow font that doesn't have all glyphs
+ if (!font->glyph(*it))
+ continue;
+
+ ++gi;
+ if (gi % per_page == 0) {
+ if (page)
+ fprintf(_f, "showpage restore\n");
+ ++page;
+ newpage();
+ fprintf(_f, "save\n");
+ // make new font
+ fprintf(_f, "/%s findfont dup length dict begin\n\
+ { 1 index /FID ne {def} {pop pop} ifelse } forall\n /Encoding [",
+ font->font_name().c_str());
+ int gx = 0;
+ for (Vector<PermString>::const_iterator xit = it;
+ xit != glyph_names.end() && gx < per_page; ++xit)
+ if (font->glyph(*xit)) {
+ ++gx;
+ fprintf(_f, " /%s", xit->c_str());
+ if (gx % 10 == 9)
+ fprintf(_f, "\n");
+ }
+ fprintf(_f, " ] def\n currentdict end /X exch definefont pop\n\
+/Helvetica-Bold 16 selectfont 36 742 moveto (%s) show\n\
+/X 24 selectfont\n", font->font_name().c_str());
+ }
+
+ int row = (gi % per_page) / per_row;
+ int col = gi % per_row;
+
+ fprintf(_f, "%d %d %d (%s)", row, col, gi % per_page, it->c_str());
+ if (encodings[*it] >= 0) {
+ int e = encodings[*it];
+ if (e == '\\')
+ fprintf(_f, " ('\\\\\\\\')");
+ else if (e == '\'')
+ fprintf(_f, " ('\\\\'')");
+ else if (e == '(' || e == ')')
+ fprintf(_f, " ('\\%c')", e);
+ else if (e >= 32 && e < 127)
+ fprintf(_f, " ('%c')", e);
+ else
+ fprintf(_f, " ('\\\\%03o')", e);
+ } else
+ fprintf(_f, " ()");
+ fprintf(_f, " magicbox\n");
+ }
+
+ if (page)
+ fprintf(_f, "showpage restore\n");
+}
+
+
+
+/*****
+ * 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
+};
+
+void
+SmokeTestpager::prolog(const Vector<Type1Font *> &)
+{
+ fprintf(_f, "%%!PS-Adobe-3.0\n%%%%LanguageLevel: 2\n%%%%BeginProlog\n");
+ fprintf(_f, "/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\
+");
+ fprintf(_f, "%%%%EndProlog\n");
+}
+
+void
+SmokeTestpager::font(Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ 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++) {
+ // allow font that doesn't have all glyphs
+ if (!font->glyph(glyph_names[gi]))
+ continue;
+
+ newpage();
+ fprintf(_f, "save\n");
+
+ 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(_f, "%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(_f, "%s\n0.5 setgray fill\n\n1 setlinewidth\n%s\nshowpage\nrestore\n", smoker.char_postscript().c_str(), smoker.points_postscript().c_str());
+ }
+}
+
+
+/*****
+ * 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((unsigned char) *ad) && isdigit((unsigned char) *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((unsigned char) *ad))
+ ad++;
+ while (bd < be && isdigit((unsigned char) *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((unsigned char) *ad))
+ return (isalpha((unsigned char) *bd) ? -1 : 1);
+ else if (isdigit((unsigned char) *bd))
+ return (isalpha((unsigned char) *ad) ? 1 : -1);
+ else {
+ int d = tolower((unsigned char) *ad) - tolower((unsigned char) *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;
+ Vector<Type1Font *> fonts;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case GLYPH_OPT: {
+ const char* s = clp->vstr, *end = s + strlen(s);
+ while (s < end) {
+ while (s < end && isspace((unsigned char) *s))
+ s++;
+ const char* word = s;
+ while (s < end && !isspace((unsigned char) *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->vstr;
+ break;
+
+ case VERSION_OPT:
+ printf("t1testpage (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2012 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:
+ fonts.push_back(do_file(clp->vstr, psres, errh));
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!fonts.size())
+ fonts.push_back(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));
+ }
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+
+ //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.
+ HashMap<PermString, int> glyph_hash(0);
+ for (Vector<Type1Font *>::iterator it = fonts.begin(); it != fonts.end();
+ ++it)
+ for (int i = 0; i < (*it)->nglyphs(); i++) {
+ if (glyph_matches((*it)->glyph_name(i),
+ glyph_patterns.begin(), glyph_patterns.end()))
+ glyph_hash.insert((*it)->glyph_name(i), 1);
+ }
+
+ Vector<PermString> glyph_names;
+ for (HashMap<PermString, int>::iterator it = glyph_hash.begin();
+ it != glyph_hash.end(); ++it)
+ glyph_names.push_back(it.key());
+ if (glyph_names.size() == 0)
+ errh->fatal("no glyphs to print");
+ qsort(glyph_names.begin(), glyph_names.size(), sizeof(PermString), glyphcompare);
+
+ // outputs
+ Testpager *tp;
+ if (smoke)
+ tp = new SmokeTestpager(outf);
+ else
+ tp = new GridTestpager(outf);
+
+ tp->prolog(fonts);
+ for (Vector<Type1Font *>::iterator it = fonts.begin(); it != fonts.end();
+ ++it)
+ tp->font(*it, glyph_names);
+ tp->epilog();
+
+ delete tp;
+ exit(0);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist-g2u.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist-g2u.txt
new file mode 100644
index 00000000000..2340809a4de
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist-g2u.txt
@@ -0,0 +1,1188 @@
+# lcdf-typetools texglyphlist-g2u.txt, Version 2.95
+# Contents: Overrides to glyphlist.txt and texglyphlist.txt used to
+# generate glyphtounicode.tex, which maps glyphs to searchable Unicode
+# code points.
+# --
+# -- Map common ligatures to their components.
+# --
+ff;0066 0066
+ffi;0066 0066 0069
+ffl;0066 0066 006C
+fi;0066 0069
+fl;0066 006C
+longst;017F 0074
+st;0073 0074
+# --
+# -- texglyphlist.txt overrides /heart, /diamond, /phi, and /phi1 to their
+# -- more typical meanings in encoding files meant for TeX: /heart and
+# -- /diamond are outline, not solid; /phi is straight; /phi1 is loopy. These
+# -- overrides are not appropriate for glyphtounicode.tex, which can apply to
+# -- any font. Newer fonts apply the AGL glyph shapes to these names. But we
+# -- can provide font-specific overrides for fonts commonly used with TeX.
+# --
+diamond;2666
+heart;2665
+phi;03C6
+phi1;03D5
+tfm:lmmi5/phi;03D5
+tfm:lmmi5/phi1;03C6
+tfm:lmmi6/phi;03D5
+tfm:lmmi6/phi1;03C6
+tfm:lmmi7/phi;03D5
+tfm:lmmi7/phi1;03C6
+tfm:lmmi8/phi;03D5
+tfm:lmmi8/phi1;03C6
+tfm:lmmi9/phi;03D5
+tfm:lmmi9/phi1;03C6
+tfm:lmmi10/phi;03D5
+tfm:lmmi10/phi1;03C6
+tfm:lmmi12/phi;03D5
+tfm:lmmi12/phi1;03C6
+tfm:lmmib5/phi;03D5
+tfm:lmmib5/phi1;03C6
+tfm:lmmib7/phi;03D5
+tfm:lmmib7/phi1;03C6
+tfm:lmmib10/phi;03D5
+tfm:lmmib10/phi1;03C6
+tfm:lmbsy5/diamond;2662
+tfm:lmbsy5/heart;2661
+tfm:lmbsy7/diamond;2662
+tfm:lmbsy7/heart;2661
+tfm:lmbsy10/diamond;2662
+tfm:lmbsy10/heart;2661
+tfm:lmsy5/diamond;2662
+tfm:lmsy5/heart;2661
+tfm:lmsy6/diamond;2662
+tfm:lmsy6/heart;2661
+tfm:lmsy7/diamond;2662
+tfm:lmsy7/heart;2661
+tfm:lmsy8/diamond;2662
+tfm:lmsy8/heart;2661
+tfm:lmsy9/diamond;2662
+tfm:lmsy9/heart;2661
+tfm:lmsy10/diamond;2662
+tfm:lmsy10/heart;2661
+tfm:cmbsy10/diamond;2662
+tfm:cmbsy10/heart;2661
+tfm:cmbsy5/diamond;2662
+tfm:cmbsy5/heart;2661
+tfm:cmbsy6/diamond;2662
+tfm:cmbsy6/heart;2661
+tfm:cmbsy7/diamond;2662
+tfm:cmbsy7/heart;2661
+tfm:cmbsy8/diamond;2662
+tfm:cmbsy8/heart;2661
+tfm:cmbsy9/diamond;2662
+tfm:cmbsy9/heart;2661
+tfm:cmmi10/phi1;03C6
+tfm:cmmi10/phi;03D5
+tfm:cmmi12/phi1;03C6
+tfm:cmmi12/phi;03D5
+tfm:cmmi5/phi1;03C6
+tfm:cmmi5/phi;03D5
+tfm:cmmi6/phi1;03C6
+tfm:cmmi6/phi;03D5
+tfm:cmmi7/phi1;03C6
+tfm:cmmi7/phi;03D5
+tfm:cmmi8/phi1;03C6
+tfm:cmmi8/phi;03D5
+tfm:cmmi9/phi1;03C6
+tfm:cmmi9/phi;03D5
+tfm:cmmib10/phi1;03C6
+tfm:cmmib10/phi;03D5
+tfm:cmmib5/phi1;03C6
+tfm:cmmib5/phi;03D5
+tfm:cmmib6/phi1;03C6
+tfm:cmmib6/phi;03D5
+tfm:cmmib7/phi1;03C6
+tfm:cmmib7/phi;03D5
+tfm:cmmib8/phi1;03C6
+tfm:cmmib8/phi;03D5
+tfm:cmmib9/phi1;03C6
+tfm:cmmib9/phi;03D5
+tfm:cmsy10/diamond;2662
+tfm:cmsy10/heart;2661
+tfm:cmsy10/heart;2661
+tfm:cmsy5/heart;2661
+tfm:cmsy6/diamond;2662
+tfm:cmsy6/heart;2661
+tfm:cmsy7/diamond;2662
+tfm:cmsy7/heart;2661
+tfm:cmsy8/diamond;2662
+tfm:cmsy8/heart;2661
+tfm:cmsy9/diamond;2662
+tfm:cmsy9/heart;2661
+tfm:eurb10/phi1;03C6
+tfm:eurb10/phi;03D5
+tfm:eurb5/phi1;03C6
+tfm:eurb5/phi;03D5
+tfm:eurb6/phi1;03C6
+tfm:eurb6/phi;03D5
+tfm:eurb7/phi1;03C6
+tfm:eurb7/phi;03D5
+tfm:eurb8/phi1;03C6
+tfm:eurb8/phi;03D5
+tfm:eurb9/phi1;03C6
+tfm:eurb9/phi;03D5
+tfm:eurm10/phi1;03C6
+tfm:eurm10/phi;03D5
+tfm:eurm5/phi1;03C6
+tfm:eurm5/phi;03D5
+tfm:eurm6/phi1;03C6
+tfm:eurm6/phi;03D5
+tfm:eurm7/phi1;03C6
+tfm:eurm7/phi;03D5
+tfm:eurm8/phi1;03C6
+tfm:eurm8/phi;03D5
+tfm:eurm9/phi1;03C6
+tfm:eurm9/phi;03D5
+tfm:msam10/diamond;2662
+tfm:msam5/diamond;2662
+tfm:msam6/diamond;2662
+tfm:msam7/diamond;2662
+tfm:msam8/diamond;2662
+tfm:msam9/diamond;2662
+tfm:fplmbi/phi1;03C6
+tfm:fplmbi/phi;03D5
+tfm:fplmri/phi1;03C6
+tfm:fplmri/phi;03D5
+tfm:pxbmia/phi1;03C6
+tfm:pxbmia/phi;03D5
+tfm:pxbsy/diamond;2662
+tfm:pxbsy/heart;2661
+tfm:pxbsya/diamond;2662
+tfm:pxmia/phi1;03C6
+tfm:pxmia/phi;03D5
+tfm:pxsy/diamond;2662
+tfm:pxsy/heart;2661
+tfm:pxsya/diamond;2662
+tfm:rpxbmi/phi1;03C6
+tfm:rpxbmi/phi;03D5
+tfm:rpxmi/phi1;03C6
+tfm:rpxmi/phi;03D5
+tfm:rtxbmi/phi1;03C6
+tfm:rtxbmi/phi;03D5
+tfm:rtxmi/phi1;03C6
+tfm:rtxmi/phi;03D5
+tfm:txbmia/phi1;03C6
+tfm:txbmia/phi;03D5
+tfm:txbsy/diamond;2662
+tfm:txbsy/heart;2661
+tfm:txbsya/diamond;2662
+tfm:txmia/phi1;03C6
+tfm:txmia/phi;03D5
+tfm:txsy/diamond;2662
+tfm:txsy/heart;2661
+tfm:txsya/diamond;2662
+# --
+# -- PDF searching works best if we map small capitals to lower case, not
+# -- private use code points as in glyphlist.txt.
+# --
+AEsmall;00E6
+Aacutesmall;00E1
+Acircumflexsmall;00E2
+Acute;00B4
+Acutesmall;00B4
+Adieresissmall;00E4
+Agravesmall;00E0
+Aringsmall;00E5
+Asmall;0061
+Atildesmall;00E3
+Brevesmall;02D8
+Bsmall;0062
+Caron;02C7
+Caronsmall;02C7
+Ccedillasmall;00E7
+Cedillasmall;00B8
+Circumflexsmall;02C6
+Csmall;0063
+Dieresis;00A8
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;00A8
+Dotaccentsmall;02D9
+Dsmall;0064
+Eacutesmall;00E9
+Ecircumflexsmall;00EA
+Edieresissmall;00EB
+Egravesmall;00E8
+Esmall;0065
+Ethsmall;00F0
+Fsmall;0066
+Grave;0060
+Gravesmall;0060
+Gsmall;0067
+Hsmall;0068
+Hungarumlaut;02DD
+Hungarumlautsmall;02DD
+Iacutesmall;00ED
+Icircumflexsmall;00EE
+Idieresissmall;00EF
+Igravesmall;00EC
+Ismall;0069
+Jsmall;006A
+Ksmall;006B
+LL;004C 004C
+Lslashsmall;0142
+Lsmall;006C
+Macron;00AF
+Macronsmall;00AF
+Msmall;006D
+Nsmall;006E
+Ntildesmall;00F1
+OEsmall;0153
+Oacutesmall;00F3
+Ocircumflexsmall;00F4
+Odieresissmall;00F6
+Ogoneksmall;02DB
+Ogravesmall;00F2
+Oslashsmall;00F8
+Osmall;006F
+Otildesmall;00F5
+Psmall;0070
+Qsmall;0071
+Ringsmall;02DA
+Rsmall;0072
+Scaronsmall;0161
+Ssmall;0073
+Thornsmall;00FE
+Tildesmall;02DC
+Tsmall;0074
+Uacutesmall;00FA
+Ucircumflexsmall;00FB
+Udieresissmall;00FC
+Ugravesmall;00F9
+Usmall;0075
+Vsmall;0076
+Wsmall;0077
+Xsmall;0078
+Yacutesmall;00FD
+Ydieresissmall;00FF
+Ysmall;0079
+Zcaronsmall;017E
+Zsmall;007A
+# afii10063;F6C4
+# afii10064;F6C5
+# afii10192;F6C6
+# afii10831;F6C7
+# afii10832;F6C8
+ampersandsmall;0026
+# apple;F8FF
+# arrowhorizex;F8E7
+# arrowvertex;F8E6
+asuperior;0061
+# braceex;F8F4
+# braceleftbt;F8F3
+# braceleftmid;F8F2
+# bracelefttp;F8F1
+# bracerightbt;F8FE
+# bracerightmid;F8FD
+# bracerighttp;F8FC
+# bracketleftbt;F8F0
+# bracketleftex;F8EF
+# bracketlefttp;F8EE
+# bracketrightbt;F8FB
+# bracketrightex;F8FA
+# bracketrighttp;F8F9
+bsuperior;0062
+centinferior;00A2
+centoldstyle;00A2
+centsuperior;00A2
+# commaaccent;F6C3
+commainferior;002C
+commasuperior;002C
+copyrightsans;00A9
+copyrightserif;00A9
+cyrBreve;02D8
+cyrFlex;00A0 0311
+cyrbreve;02D8
+cyrflex;00A0 0311
+dblGrave;00A0 030F
+dblgrave;00A0 030F
+dieresisacute;00A0 0308 0301
+dieresisgrave;00A0 0308 0300
+dollarinferior;0024
+dollaroldstyle;0024
+dollarsuperior;0024
+dotlessj;0237
+dsuperior;0064
+eightoldstyle;0038
+esuperior;0065
+exclamdownsmall;00A1
+exclamsmall;0021
+fiveoldstyle;0035
+fouroldstyle;0034
+hypheninferior;002D
+hyphensuperior;002D
+# integralex;F8F5
+isuperior;0069
+ll;006C 006C
+lsuperior;006C
+# maichattawalowleftthai;F895
+# maichattawalowrightthai;F894
+# maichattawaupperleftthai;F893
+# maieklowleftthai;F88C
+# maieklowrightthai;F88B
+# maiekupperleftthai;F88A
+# maihanakatleftthai;F884
+# maitaikhuleftthai;F889
+# maitholowleftthai;F88F
+# maitholowrightthai;F88E
+# maithoupperleftthai;F88D
+# maitrilowleftthai;F892
+# maitrilowrightthai;F891
+# maitriupperleftthai;F890
+msuperior;006D
+# nikhahitleftthai;F899
+nineoldstyle;0039
+onefitted;0031
+oneoldstyle;0031
+osuperior;006F
+# parenleftbt;F8ED
+# parenleftex;F8EC
+# parenlefttp;F8EB
+# parenrightbt;F8F8
+# parenrightex;F8F7
+# parenrighttp;F8F6
+periodinferior;002E
+periodsuperior;002E
+questiondownsmall;00BF
+questionsmall;003F
+# radicalex;F8E5
+registersans;00AE
+registerserif;00AE
+rsuperior;0072
+rupiah;20A8
+# saraiileftthai;F886
+# saraileftthai;F885
+# saraueeleftthai;F888
+# saraueleftthai;F887
+sevenoldstyle;0037
+sixoldstyle;0036
+ssuperior;0073
+# thanthakhatlowleftthai;F898
+# thanthakhatlowrightthai;F897
+# thanthakhatupperleftthai;F896
+threeoldstyle;0033
+# threequartersemdash;F6DE
+trademarksans;2122
+trademarkserif;2122
+tsuperior;0074
+twooldstyle;0032
+zerooldstyle;0030
+FFsmall;0066 0066
+FFIsmall;0066 0066 0069
+FFLsmall;0066 0066 006C
+FIsmall;0066 0069
+FLsmall;0066 006C
+Germandblssmall;0073 0073
+SSsmall;0073 0073
+# --
+# -- These character names are used in Zapf-Dingbats.
+# -- The encodings differ from Adobe's zdingbat.txt table version 0.2,
+# -- updated 30 March 1999, in that it does not use private use code points.
+# --
+tfm:pzdr/a1;2701
+tfm:pzdr/a2;2702
+tfm:pzdr/a3;2704
+tfm:pzdr/a4;260E
+tfm:pzdr/a5;2706
+tfm:pzdr/a6;271D
+tfm:pzdr/a7;271E
+tfm:pzdr/a8;271F
+tfm:pzdr/a9;2720
+tfm:pzdr/a10;2721
+tfm:pzdr/a11;261B
+tfm:pzdr/a12;261E
+tfm:pzdr/a13;270C
+tfm:pzdr/a14;270D
+tfm:pzdr/a15;270E
+tfm:pzdr/a16;270F
+tfm:pzdr/a17;2711
+tfm:pzdr/a18;2712
+tfm:pzdr/a19;2713
+tfm:pzdr/a20;2714
+tfm:pzdr/a21;2715
+tfm:pzdr/a22;2716
+tfm:pzdr/a23;2717
+tfm:pzdr/a24;2718
+tfm:pzdr/a25;2719
+tfm:pzdr/a26;271A
+tfm:pzdr/a27;271B
+tfm:pzdr/a28;271C
+tfm:pzdr/a29;2722
+tfm:pzdr/a30;2723
+tfm:pzdr/a31;2724
+tfm:pzdr/a32;2725
+tfm:pzdr/a33;2726
+tfm:pzdr/a34;2727
+tfm:pzdr/a35;2605
+tfm:pzdr/a36;2729
+tfm:pzdr/a37;272A
+tfm:pzdr/a38;272B
+tfm:pzdr/a39;272C
+tfm:pzdr/a40;272D
+tfm:pzdr/a41;272E
+tfm:pzdr/a42;272F
+tfm:pzdr/a43;2730
+tfm:pzdr/a44;2731
+tfm:pzdr/a45;2732
+tfm:pzdr/a46;2733
+tfm:pzdr/a47;2734
+tfm:pzdr/a48;2735
+tfm:pzdr/a49;2736
+tfm:pzdr/a50;2737
+tfm:pzdr/a51;2738
+tfm:pzdr/a52;2739
+tfm:pzdr/a53;273A
+tfm:pzdr/a54;273B
+tfm:pzdr/a55;273C
+tfm:pzdr/a56;273D
+tfm:pzdr/a57;273E
+tfm:pzdr/a58;273F
+tfm:pzdr/a59;2740
+tfm:pzdr/a60;2741
+tfm:pzdr/a61;2742
+tfm:pzdr/a62;2743
+tfm:pzdr/a63;2744
+tfm:pzdr/a64;2745
+tfm:pzdr/a65;2746
+tfm:pzdr/a66;2747
+tfm:pzdr/a67;2748
+tfm:pzdr/a68;2749
+tfm:pzdr/a69;274A
+tfm:pzdr/a70;274B
+tfm:pzdr/a71;25CF
+tfm:pzdr/a72;274D
+tfm:pzdr/a73;25A0
+tfm:pzdr/a74;274F
+tfm:pzdr/a75;2751
+tfm:pzdr/a76;25B2
+tfm:pzdr/a77;25BC
+tfm:pzdr/a78;25C6
+tfm:pzdr/a79;2756
+tfm:pzdr/a81;25D7
+tfm:pzdr/a82;2758
+tfm:pzdr/a83;2759
+tfm:pzdr/a84;275A
+tfm:pzdr/a85;276F
+tfm:pzdr/a86;2771
+tfm:pzdr/a87;2772
+tfm:pzdr/a88;2773
+tfm:pzdr/a89;2768
+tfm:pzdr/a90;2769
+tfm:pzdr/a91;276C
+tfm:pzdr/a92;276D
+tfm:pzdr/a93;276A
+tfm:pzdr/a94;276B
+tfm:pzdr/a95;2774
+tfm:pzdr/a96;2775
+tfm:pzdr/a97;275B
+tfm:pzdr/a98;275C
+tfm:pzdr/a99;275D
+tfm:pzdr/a100;275E
+tfm:pzdr/a101;2761
+tfm:pzdr/a102;2762
+tfm:pzdr/a103;2763
+tfm:pzdr/a104;2764
+tfm:pzdr/a105;2710
+tfm:pzdr/a106;2765
+tfm:pzdr/a107;2766
+tfm:pzdr/a108;2767
+tfm:pzdr/a109;2660
+tfm:pzdr/a110;2665
+tfm:pzdr/a111;2666
+tfm:pzdr/a112;2663
+tfm:pzdr/a117;2709
+tfm:pzdr/a118;2708
+tfm:pzdr/a119;2707
+tfm:pzdr/a120;2460
+tfm:pzdr/a121;2461
+tfm:pzdr/a122;2462
+tfm:pzdr/a123;2463
+tfm:pzdr/a124;2464
+tfm:pzdr/a125;2465
+tfm:pzdr/a126;2466
+tfm:pzdr/a127;2467
+tfm:pzdr/a128;2468
+tfm:pzdr/a129;2469
+tfm:pzdr/a130;2776
+tfm:pzdr/a131;2777
+tfm:pzdr/a132;2778
+tfm:pzdr/a133;2779
+tfm:pzdr/a134;277A
+tfm:pzdr/a135;277B
+tfm:pzdr/a136;277C
+tfm:pzdr/a137;277D
+tfm:pzdr/a138;277E
+tfm:pzdr/a139;277F
+tfm:pzdr/a140;2780
+tfm:pzdr/a141;2781
+tfm:pzdr/a142;2782
+tfm:pzdr/a143;2783
+tfm:pzdr/a144;2784
+tfm:pzdr/a145;2785
+tfm:pzdr/a146;2786
+tfm:pzdr/a147;2787
+tfm:pzdr/a148;2788
+tfm:pzdr/a149;2789
+tfm:pzdr/a150;278A
+tfm:pzdr/a151;278B
+tfm:pzdr/a152;278C
+tfm:pzdr/a153;278D
+tfm:pzdr/a154;278E
+tfm:pzdr/a155;278F
+tfm:pzdr/a156;2790
+tfm:pzdr/a157;2791
+tfm:pzdr/a158;2792
+tfm:pzdr/a159;2793
+tfm:pzdr/a160;2794
+tfm:pzdr/a161;2192
+tfm:pzdr/a162;27A3
+tfm:pzdr/a163;2194
+tfm:pzdr/a164;2195
+tfm:pzdr/a165;2799
+tfm:pzdr/a166;279B
+tfm:pzdr/a167;279C
+tfm:pzdr/a168;279D
+tfm:pzdr/a169;279E
+tfm:pzdr/a170;279F
+tfm:pzdr/a171;27A0
+tfm:pzdr/a172;27A1
+tfm:pzdr/a173;27A2
+tfm:pzdr/a174;27A4
+tfm:pzdr/a175;27A5
+tfm:pzdr/a176;27A6
+tfm:pzdr/a177;27A7
+tfm:pzdr/a178;27A8
+tfm:pzdr/a179;27A9
+tfm:pzdr/a180;27AB
+tfm:pzdr/a181;27AD
+tfm:pzdr/a182;27AF
+tfm:pzdr/a183;27B2
+tfm:pzdr/a184;27B3
+tfm:pzdr/a185;27B5
+tfm:pzdr/a186;27B8
+tfm:pzdr/a187;27BA
+tfm:pzdr/a188;27BB
+tfm:pzdr/a189;27BC
+tfm:pzdr/a190;27BD
+tfm:pzdr/a191;27BE
+tfm:pzdr/a192;279A
+tfm:pzdr/a193;27AA
+tfm:pzdr/a194;27B6
+tfm:pzdr/a195;27B9
+tfm:pzdr/a196;2798
+tfm:pzdr/a197;27B4
+tfm:pzdr/a198;27B7
+tfm:pzdr/a199;27AC
+tfm:pzdr/a200;27AE
+tfm:pzdr/a201;27B1
+tfm:pzdr/a202;2703
+tfm:pzdr/a203;2750
+tfm:pzdr/a204;2752
+tfm:pzdr/a205;276E
+tfm:pzdr/a206;2770
+tfm:rpzdr/a1;2701
+tfm:rpzdr/a2;2702
+tfm:rpzdr/a3;2704
+tfm:rpzdr/a4;260E
+tfm:rpzdr/a5;2706
+tfm:rpzdr/a6;271D
+tfm:rpzdr/a7;271E
+tfm:rpzdr/a8;271F
+tfm:rpzdr/a9;2720
+tfm:rpzdr/a10;2721
+tfm:rpzdr/a11;261B
+tfm:rpzdr/a12;261E
+tfm:rpzdr/a13;270C
+tfm:rpzdr/a14;270D
+tfm:rpzdr/a15;270E
+tfm:rpzdr/a16;270F
+tfm:rpzdr/a17;2711
+tfm:rpzdr/a18;2712
+tfm:rpzdr/a19;2713
+tfm:rpzdr/a20;2714
+tfm:rpzdr/a21;2715
+tfm:rpzdr/a22;2716
+tfm:rpzdr/a23;2717
+tfm:rpzdr/a24;2718
+tfm:rpzdr/a25;2719
+tfm:rpzdr/a26;271A
+tfm:rpzdr/a27;271B
+tfm:rpzdr/a28;271C
+tfm:rpzdr/a29;2722
+tfm:rpzdr/a30;2723
+tfm:rpzdr/a31;2724
+tfm:rpzdr/a32;2725
+tfm:rpzdr/a33;2726
+tfm:rpzdr/a34;2727
+tfm:rpzdr/a35;2605
+tfm:rpzdr/a36;2729
+tfm:rpzdr/a37;272A
+tfm:rpzdr/a38;272B
+tfm:rpzdr/a39;272C
+tfm:rpzdr/a40;272D
+tfm:rpzdr/a41;272E
+tfm:rpzdr/a42;272F
+tfm:rpzdr/a43;2730
+tfm:rpzdr/a44;2731
+tfm:rpzdr/a45;2732
+tfm:rpzdr/a46;2733
+tfm:rpzdr/a47;2734
+tfm:rpzdr/a48;2735
+tfm:rpzdr/a49;2736
+tfm:rpzdr/a50;2737
+tfm:rpzdr/a51;2738
+tfm:rpzdr/a52;2739
+tfm:rpzdr/a53;273A
+tfm:rpzdr/a54;273B
+tfm:rpzdr/a55;273C
+tfm:rpzdr/a56;273D
+tfm:rpzdr/a57;273E
+tfm:rpzdr/a58;273F
+tfm:rpzdr/a59;2740
+tfm:rpzdr/a60;2741
+tfm:rpzdr/a61;2742
+tfm:rpzdr/a62;2743
+tfm:rpzdr/a63;2744
+tfm:rpzdr/a64;2745
+tfm:rpzdr/a65;2746
+tfm:rpzdr/a66;2747
+tfm:rpzdr/a67;2748
+tfm:rpzdr/a68;2749
+tfm:rpzdr/a69;274A
+tfm:rpzdr/a70;274B
+tfm:rpzdr/a71;25CF
+tfm:rpzdr/a72;274D
+tfm:rpzdr/a73;25A0
+tfm:rpzdr/a74;274F
+tfm:rpzdr/a75;2751
+tfm:rpzdr/a76;25B2
+tfm:rpzdr/a77;25BC
+tfm:rpzdr/a78;25C6
+tfm:rpzdr/a79;2756
+tfm:rpzdr/a81;25D7
+tfm:rpzdr/a82;2758
+tfm:rpzdr/a83;2759
+tfm:rpzdr/a84;275A
+tfm:rpzdr/a85;276F
+tfm:rpzdr/a86;2771
+tfm:rpzdr/a87;2772
+tfm:rpzdr/a88;2773
+tfm:rpzdr/a89;2768
+tfm:rpzdr/a90;2769
+tfm:rpzdr/a91;276C
+tfm:rpzdr/a92;276D
+tfm:rpzdr/a93;276A
+tfm:rpzdr/a94;276B
+tfm:rpzdr/a95;2774
+tfm:rpzdr/a96;2775
+tfm:rpzdr/a97;275B
+tfm:rpzdr/a98;275C
+tfm:rpzdr/a99;275D
+tfm:rpzdr/a100;275E
+tfm:rpzdr/a101;2761
+tfm:rpzdr/a102;2762
+tfm:rpzdr/a103;2763
+tfm:rpzdr/a104;2764
+tfm:rpzdr/a105;2710
+tfm:rpzdr/a106;2765
+tfm:rpzdr/a107;2766
+tfm:rpzdr/a108;2767
+tfm:rpzdr/a109;2660
+tfm:rpzdr/a110;2665
+tfm:rpzdr/a111;2666
+tfm:rpzdr/a112;2663
+tfm:rpzdr/a117;2709
+tfm:rpzdr/a118;2708
+tfm:rpzdr/a119;2707
+tfm:rpzdr/a120;2460
+tfm:rpzdr/a121;2461
+tfm:rpzdr/a122;2462
+tfm:rpzdr/a123;2463
+tfm:rpzdr/a124;2464
+tfm:rpzdr/a125;2465
+tfm:rpzdr/a126;2466
+tfm:rpzdr/a127;2467
+tfm:rpzdr/a128;2468
+tfm:rpzdr/a129;2469
+tfm:rpzdr/a130;2776
+tfm:rpzdr/a131;2777
+tfm:rpzdr/a132;2778
+tfm:rpzdr/a133;2779
+tfm:rpzdr/a134;277A
+tfm:rpzdr/a135;277B
+tfm:rpzdr/a136;277C
+tfm:rpzdr/a137;277D
+tfm:rpzdr/a138;277E
+tfm:rpzdr/a139;277F
+tfm:rpzdr/a140;2780
+tfm:rpzdr/a141;2781
+tfm:rpzdr/a142;2782
+tfm:rpzdr/a143;2783
+tfm:rpzdr/a144;2784
+tfm:rpzdr/a145;2785
+tfm:rpzdr/a146;2786
+tfm:rpzdr/a147;2787
+tfm:rpzdr/a148;2788
+tfm:rpzdr/a149;2789
+tfm:rpzdr/a150;278A
+tfm:rpzdr/a151;278B
+tfm:rpzdr/a152;278C
+tfm:rpzdr/a153;278D
+tfm:rpzdr/a154;278E
+tfm:rpzdr/a155;278F
+tfm:rpzdr/a156;2790
+tfm:rpzdr/a157;2791
+tfm:rpzdr/a158;2792
+tfm:rpzdr/a159;2793
+tfm:rpzdr/a160;2794
+tfm:rpzdr/a161;2192
+tfm:rpzdr/a162;27A3
+tfm:rpzdr/a163;2194
+tfm:rpzdr/a164;2195
+tfm:rpzdr/a165;2799
+tfm:rpzdr/a166;279B
+tfm:rpzdr/a167;279C
+tfm:rpzdr/a168;279D
+tfm:rpzdr/a169;279E
+tfm:rpzdr/a170;279F
+tfm:rpzdr/a171;27A0
+tfm:rpzdr/a172;27A1
+tfm:rpzdr/a173;27A2
+tfm:rpzdr/a174;27A4
+tfm:rpzdr/a175;27A5
+tfm:rpzdr/a176;27A6
+tfm:rpzdr/a177;27A7
+tfm:rpzdr/a178;27A8
+tfm:rpzdr/a179;27A9
+tfm:rpzdr/a180;27AB
+tfm:rpzdr/a181;27AD
+tfm:rpzdr/a182;27AF
+tfm:rpzdr/a183;27B2
+tfm:rpzdr/a184;27B3
+tfm:rpzdr/a185;27B5
+tfm:rpzdr/a186;27B8
+tfm:rpzdr/a187;27BA
+tfm:rpzdr/a188;27BB
+tfm:rpzdr/a189;27BC
+tfm:rpzdr/a190;27BD
+tfm:rpzdr/a191;27BE
+tfm:rpzdr/a192;279A
+tfm:rpzdr/a193;27AA
+tfm:rpzdr/a194;27B6
+tfm:rpzdr/a195;27B9
+tfm:rpzdr/a196;2798
+tfm:rpzdr/a197;27B4
+tfm:rpzdr/a198;27B7
+tfm:rpzdr/a199;27AC
+tfm:rpzdr/a200;27AE
+tfm:rpzdr/a201;27B1
+tfm:rpzdr/a202;2703
+tfm:rpzdr/a203;2750
+tfm:rpzdr/a204;2752
+tfm:rpzdr/a205;276E
+tfm:rpzdr/a206;2770
+tfm:zd/a1;2701
+tfm:zd/a2;2702
+tfm:zd/a3;2704
+tfm:zd/a4;260E
+tfm:zd/a5;2706
+tfm:zd/a6;271D
+tfm:zd/a7;271E
+tfm:zd/a8;271F
+tfm:zd/a9;2720
+tfm:zd/a10;2721
+tfm:zd/a11;261B
+tfm:zd/a12;261E
+tfm:zd/a13;270C
+tfm:zd/a14;270D
+tfm:zd/a15;270E
+tfm:zd/a16;270F
+tfm:zd/a17;2711
+tfm:zd/a18;2712
+tfm:zd/a19;2713
+tfm:zd/a20;2714
+tfm:zd/a21;2715
+tfm:zd/a22;2716
+tfm:zd/a23;2717
+tfm:zd/a24;2718
+tfm:zd/a25;2719
+tfm:zd/a26;271A
+tfm:zd/a27;271B
+tfm:zd/a28;271C
+tfm:zd/a29;2722
+tfm:zd/a30;2723
+tfm:zd/a31;2724
+tfm:zd/a32;2725
+tfm:zd/a33;2726
+tfm:zd/a34;2727
+tfm:zd/a35;2605
+tfm:zd/a36;2729
+tfm:zd/a37;272A
+tfm:zd/a38;272B
+tfm:zd/a39;272C
+tfm:zd/a40;272D
+tfm:zd/a41;272E
+tfm:zd/a42;272F
+tfm:zd/a43;2730
+tfm:zd/a44;2731
+tfm:zd/a45;2732
+tfm:zd/a46;2733
+tfm:zd/a47;2734
+tfm:zd/a48;2735
+tfm:zd/a49;2736
+tfm:zd/a50;2737
+tfm:zd/a51;2738
+tfm:zd/a52;2739
+tfm:zd/a53;273A
+tfm:zd/a54;273B
+tfm:zd/a55;273C
+tfm:zd/a56;273D
+tfm:zd/a57;273E
+tfm:zd/a58;273F
+tfm:zd/a59;2740
+tfm:zd/a60;2741
+tfm:zd/a61;2742
+tfm:zd/a62;2743
+tfm:zd/a63;2744
+tfm:zd/a64;2745
+tfm:zd/a65;2746
+tfm:zd/a66;2747
+tfm:zd/a67;2748
+tfm:zd/a68;2749
+tfm:zd/a69;274A
+tfm:zd/a70;274B
+tfm:zd/a71;25CF
+tfm:zd/a72;274D
+tfm:zd/a73;25A0
+tfm:zd/a74;274F
+tfm:zd/a75;2751
+tfm:zd/a76;25B2
+tfm:zd/a77;25BC
+tfm:zd/a78;25C6
+tfm:zd/a79;2756
+tfm:zd/a81;25D7
+tfm:zd/a82;2758
+tfm:zd/a83;2759
+tfm:zd/a84;275A
+tfm:zd/a85;276F
+tfm:zd/a86;2771
+tfm:zd/a87;2772
+tfm:zd/a88;2773
+tfm:zd/a89;2768
+tfm:zd/a90;2769
+tfm:zd/a91;276C
+tfm:zd/a92;276D
+tfm:zd/a93;276A
+tfm:zd/a94;276B
+tfm:zd/a95;2774
+tfm:zd/a96;2775
+tfm:zd/a97;275B
+tfm:zd/a98;275C
+tfm:zd/a99;275D
+tfm:zd/a100;275E
+tfm:zd/a101;2761
+tfm:zd/a102;2762
+tfm:zd/a103;2763
+tfm:zd/a104;2764
+tfm:zd/a105;2710
+tfm:zd/a106;2765
+tfm:zd/a107;2766
+tfm:zd/a108;2767
+tfm:zd/a109;2660
+tfm:zd/a110;2665
+tfm:zd/a111;2666
+tfm:zd/a112;2663
+tfm:zd/a117;2709
+tfm:zd/a118;2708
+tfm:zd/a119;2707
+tfm:zd/a120;2460
+tfm:zd/a121;2461
+tfm:zd/a122;2462
+tfm:zd/a123;2463
+tfm:zd/a124;2464
+tfm:zd/a125;2465
+tfm:zd/a126;2466
+tfm:zd/a127;2467
+tfm:zd/a128;2468
+tfm:zd/a129;2469
+tfm:zd/a130;2776
+tfm:zd/a131;2777
+tfm:zd/a132;2778
+tfm:zd/a133;2779
+tfm:zd/a134;277A
+tfm:zd/a135;277B
+tfm:zd/a136;277C
+tfm:zd/a137;277D
+tfm:zd/a138;277E
+tfm:zd/a139;277F
+tfm:zd/a140;2780
+tfm:zd/a141;2781
+tfm:zd/a142;2782
+tfm:zd/a143;2783
+tfm:zd/a144;2784
+tfm:zd/a145;2785
+tfm:zd/a146;2786
+tfm:zd/a147;2787
+tfm:zd/a148;2788
+tfm:zd/a149;2789
+tfm:zd/a150;278A
+tfm:zd/a151;278B
+tfm:zd/a152;278C
+tfm:zd/a153;278D
+tfm:zd/a154;278E
+tfm:zd/a155;278F
+tfm:zd/a156;2790
+tfm:zd/a157;2791
+tfm:zd/a158;2792
+tfm:zd/a159;2793
+tfm:zd/a160;2794
+tfm:zd/a161;2192
+tfm:zd/a162;27A3
+tfm:zd/a163;2194
+tfm:zd/a164;2195
+tfm:zd/a165;2799
+tfm:zd/a166;279B
+tfm:zd/a167;279C
+tfm:zd/a168;279D
+tfm:zd/a169;279E
+tfm:zd/a170;279F
+tfm:zd/a171;27A0
+tfm:zd/a172;27A1
+tfm:zd/a173;27A2
+tfm:zd/a174;27A4
+tfm:zd/a175;27A5
+tfm:zd/a176;27A6
+tfm:zd/a177;27A7
+tfm:zd/a178;27A8
+tfm:zd/a179;27A9
+tfm:zd/a180;27AB
+tfm:zd/a181;27AD
+tfm:zd/a182;27AF
+tfm:zd/a183;27B2
+tfm:zd/a184;27B3
+tfm:zd/a185;27B5
+tfm:zd/a186;27B8
+tfm:zd/a187;27BA
+tfm:zd/a188;27BB
+tfm:zd/a189;27BC
+tfm:zd/a190;27BD
+tfm:zd/a191;27BE
+tfm:zd/a192;279A
+tfm:zd/a193;27AA
+tfm:zd/a194;27B6
+tfm:zd/a195;27B9
+tfm:zd/a196;2798
+tfm:zd/a197;27B4
+tfm:zd/a198;27B7
+tfm:zd/a199;27AC
+tfm:zd/a200;27AE
+tfm:zd/a201;27B1
+tfm:zd/a202;2703
+tfm:zd/a203;2750
+tfm:zd/a204;2752
+tfm:zd/a205;276E
+tfm:zd/a206;2770
+tfm:zpzdr-reversed/a1;2701
+tfm:zpzdr-reversed/a2;2702
+tfm:zpzdr-reversed/a3;2704
+tfm:zpzdr-reversed/a4;260E
+tfm:zpzdr-reversed/a5;2706
+tfm:zpzdr-reversed/a6;271D
+tfm:zpzdr-reversed/a7;271E
+tfm:zpzdr-reversed/a8;271F
+tfm:zpzdr-reversed/a9;2720
+tfm:zpzdr-reversed/a10;2721
+tfm:zpzdr-reversed/a11;261B
+tfm:zpzdr-reversed/a12;261E
+tfm:zpzdr-reversed/a13;270C
+tfm:zpzdr-reversed/a14;270D
+tfm:zpzdr-reversed/a15;270E
+tfm:zpzdr-reversed/a16;270F
+tfm:zpzdr-reversed/a17;2711
+tfm:zpzdr-reversed/a18;2712
+tfm:zpzdr-reversed/a19;2713
+tfm:zpzdr-reversed/a20;2714
+tfm:zpzdr-reversed/a21;2715
+tfm:zpzdr-reversed/a22;2716
+tfm:zpzdr-reversed/a23;2717
+tfm:zpzdr-reversed/a24;2718
+tfm:zpzdr-reversed/a25;2719
+tfm:zpzdr-reversed/a26;271A
+tfm:zpzdr-reversed/a27;271B
+tfm:zpzdr-reversed/a28;271C
+tfm:zpzdr-reversed/a29;2722
+tfm:zpzdr-reversed/a30;2723
+tfm:zpzdr-reversed/a31;2724
+tfm:zpzdr-reversed/a32;2725
+tfm:zpzdr-reversed/a33;2726
+tfm:zpzdr-reversed/a34;2727
+tfm:zpzdr-reversed/a35;2605
+tfm:zpzdr-reversed/a36;2729
+tfm:zpzdr-reversed/a37;272A
+tfm:zpzdr-reversed/a38;272B
+tfm:zpzdr-reversed/a39;272C
+tfm:zpzdr-reversed/a40;272D
+tfm:zpzdr-reversed/a41;272E
+tfm:zpzdr-reversed/a42;272F
+tfm:zpzdr-reversed/a43;2730
+tfm:zpzdr-reversed/a44;2731
+tfm:zpzdr-reversed/a45;2732
+tfm:zpzdr-reversed/a46;2733
+tfm:zpzdr-reversed/a47;2734
+tfm:zpzdr-reversed/a48;2735
+tfm:zpzdr-reversed/a49;2736
+tfm:zpzdr-reversed/a50;2737
+tfm:zpzdr-reversed/a51;2738
+tfm:zpzdr-reversed/a52;2739
+tfm:zpzdr-reversed/a53;273A
+tfm:zpzdr-reversed/a54;273B
+tfm:zpzdr-reversed/a55;273C
+tfm:zpzdr-reversed/a56;273D
+tfm:zpzdr-reversed/a57;273E
+tfm:zpzdr-reversed/a58;273F
+tfm:zpzdr-reversed/a59;2740
+tfm:zpzdr-reversed/a60;2741
+tfm:zpzdr-reversed/a61;2742
+tfm:zpzdr-reversed/a62;2743
+tfm:zpzdr-reversed/a63;2744
+tfm:zpzdr-reversed/a64;2745
+tfm:zpzdr-reversed/a65;2746
+tfm:zpzdr-reversed/a66;2747
+tfm:zpzdr-reversed/a67;2748
+tfm:zpzdr-reversed/a68;2749
+tfm:zpzdr-reversed/a69;274A
+tfm:zpzdr-reversed/a70;274B
+tfm:zpzdr-reversed/a71;25CF
+tfm:zpzdr-reversed/a72;274D
+tfm:zpzdr-reversed/a73;25A0
+tfm:zpzdr-reversed/a74;274F
+tfm:zpzdr-reversed/a75;2751
+tfm:zpzdr-reversed/a76;25B2
+tfm:zpzdr-reversed/a77;25BC
+tfm:zpzdr-reversed/a78;25C6
+tfm:zpzdr-reversed/a79;2756
+tfm:zpzdr-reversed/a81;25D7
+tfm:zpzdr-reversed/a82;2758
+tfm:zpzdr-reversed/a83;2759
+tfm:zpzdr-reversed/a84;275A
+tfm:zpzdr-reversed/a85;276F
+tfm:zpzdr-reversed/a86;2771
+tfm:zpzdr-reversed/a87;2772
+tfm:zpzdr-reversed/a88;2773
+tfm:zpzdr-reversed/a89;2768
+tfm:zpzdr-reversed/a90;2769
+tfm:zpzdr-reversed/a91;276C
+tfm:zpzdr-reversed/a92;276D
+tfm:zpzdr-reversed/a93;276A
+tfm:zpzdr-reversed/a94;276B
+tfm:zpzdr-reversed/a95;2774
+tfm:zpzdr-reversed/a96;2775
+tfm:zpzdr-reversed/a97;275B
+tfm:zpzdr-reversed/a98;275C
+tfm:zpzdr-reversed/a99;275D
+tfm:zpzdr-reversed/a100;275E
+tfm:zpzdr-reversed/a101;2761
+tfm:zpzdr-reversed/a102;2762
+tfm:zpzdr-reversed/a103;2763
+tfm:zpzdr-reversed/a104;2764
+tfm:zpzdr-reversed/a105;2710
+tfm:zpzdr-reversed/a106;2765
+tfm:zpzdr-reversed/a107;2766
+tfm:zpzdr-reversed/a108;2767
+tfm:zpzdr-reversed/a109;2660
+tfm:zpzdr-reversed/a110;2665
+tfm:zpzdr-reversed/a111;2666
+tfm:zpzdr-reversed/a112;2663
+tfm:zpzdr-reversed/a117;2709
+tfm:zpzdr-reversed/a118;2708
+tfm:zpzdr-reversed/a119;2707
+tfm:zpzdr-reversed/a120;2460
+tfm:zpzdr-reversed/a121;2461
+tfm:zpzdr-reversed/a122;2462
+tfm:zpzdr-reversed/a123;2463
+tfm:zpzdr-reversed/a124;2464
+tfm:zpzdr-reversed/a125;2465
+tfm:zpzdr-reversed/a126;2466
+tfm:zpzdr-reversed/a127;2467
+tfm:zpzdr-reversed/a128;2468
+tfm:zpzdr-reversed/a129;2469
+tfm:zpzdr-reversed/a130;2776
+tfm:zpzdr-reversed/a131;2777
+tfm:zpzdr-reversed/a132;2778
+tfm:zpzdr-reversed/a133;2779
+tfm:zpzdr-reversed/a134;277A
+tfm:zpzdr-reversed/a135;277B
+tfm:zpzdr-reversed/a136;277C
+tfm:zpzdr-reversed/a137;277D
+tfm:zpzdr-reversed/a138;277E
+tfm:zpzdr-reversed/a139;277F
+tfm:zpzdr-reversed/a140;2780
+tfm:zpzdr-reversed/a141;2781
+tfm:zpzdr-reversed/a142;2782
+tfm:zpzdr-reversed/a143;2783
+tfm:zpzdr-reversed/a144;2784
+tfm:zpzdr-reversed/a145;2785
+tfm:zpzdr-reversed/a146;2786
+tfm:zpzdr-reversed/a147;2787
+tfm:zpzdr-reversed/a148;2788
+tfm:zpzdr-reversed/a149;2789
+tfm:zpzdr-reversed/a150;278A
+tfm:zpzdr-reversed/a151;278B
+tfm:zpzdr-reversed/a152;278C
+tfm:zpzdr-reversed/a153;278D
+tfm:zpzdr-reversed/a154;278E
+tfm:zpzdr-reversed/a155;278F
+tfm:zpzdr-reversed/a156;2790
+tfm:zpzdr-reversed/a157;2791
+tfm:zpzdr-reversed/a158;2792
+tfm:zpzdr-reversed/a159;2793
+tfm:zpzdr-reversed/a160;2794
+tfm:zpzdr-reversed/a161;2192
+tfm:zpzdr-reversed/a162;27A3
+tfm:zpzdr-reversed/a163;2194
+tfm:zpzdr-reversed/a164;2195
+tfm:zpzdr-reversed/a165;2799
+tfm:zpzdr-reversed/a166;279B
+tfm:zpzdr-reversed/a167;279C
+tfm:zpzdr-reversed/a168;279D
+tfm:zpzdr-reversed/a169;279E
+tfm:zpzdr-reversed/a170;279F
+tfm:zpzdr-reversed/a171;27A0
+tfm:zpzdr-reversed/a172;27A1
+tfm:zpzdr-reversed/a173;27A2
+tfm:zpzdr-reversed/a174;27A4
+tfm:zpzdr-reversed/a175;27A5
+tfm:zpzdr-reversed/a176;27A6
+tfm:zpzdr-reversed/a177;27A7
+tfm:zpzdr-reversed/a178;27A8
+tfm:zpzdr-reversed/a179;27A9
+tfm:zpzdr-reversed/a180;27AB
+tfm:zpzdr-reversed/a181;27AD
+tfm:zpzdr-reversed/a182;27AF
+tfm:zpzdr-reversed/a183;27B2
+tfm:zpzdr-reversed/a184;27B3
+tfm:zpzdr-reversed/a185;27B5
+tfm:zpzdr-reversed/a186;27B8
+tfm:zpzdr-reversed/a187;27BA
+tfm:zpzdr-reversed/a188;27BB
+tfm:zpzdr-reversed/a189;27BC
+tfm:zpzdr-reversed/a190;27BD
+tfm:zpzdr-reversed/a191;27BE
+tfm:zpzdr-reversed/a192;279A
+tfm:zpzdr-reversed/a193;27AA
+tfm:zpzdr-reversed/a194;27B6
+tfm:zpzdr-reversed/a195;27B9
+tfm:zpzdr-reversed/a196;2798
+tfm:zpzdr-reversed/a197;27B4
+tfm:zpzdr-reversed/a198;27B7
+tfm:zpzdr-reversed/a199;27AC
+tfm:zpzdr-reversed/a200;27AE
+tfm:zpzdr-reversed/a201;27B1
+tfm:zpzdr-reversed/a202;2703
+tfm:zpzdr-reversed/a203;2750
+tfm:zpzdr-reversed/a204;2752
+tfm:zpzdr-reversed/a205;276E
+tfm:zpzdr-reversed/a206;2770
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist.txt
new file mode 100644
index 00000000000..b9c5fa9af0f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/texglyphlist.txt
@@ -0,0 +1,386 @@
+# lcdf-typetools texglyphlist.txt, Version 2.95
+# Contents: Extensions to the Adobe Glyph List for TeX fonts and
+# encodings. We also extend the second field so that it can contain
+# multiple Unicode scalar values, separated by commas, analogous to
+# otftotfm's "% UNICODING" comments.
+###############################################################################
+Delta;2206,0394
+Ifractur;2111
+FFsmall;F766 F766,0066 0066
+FFIsmall;F766 F766 F769,0066 0066 0069
+FFLsmall;F766 F766 F76C,0066 0066 006C
+FIsmall;F766 F769,0066 0069
+FLsmall;F766 F76C,0066 006C
+Germandbls;0053 0053
+Germandblssmall;F773 F773,0073 0073
+Ng;014A
+Omega;2126,03A9
+Rfractur;211C
+SS;0053 0053
+SSsmall;F773 F773,0073 0073
+# 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
+ct;0063 0074
+# cwm: Unicode for ZWNJ, used for secondary replacement from EC.enc
+cwm;200C
+dblbracketleft;27E6
+dblbracketright;27E7
+# U+2662 is WHITE DIAMOND SUIT
+# U+25CA is LOZENGE
+# U+2666 is BLACK DIAMOND SUIT
+diamond;2662,25CA,2666
+diamondmath;22C4
+# U+0237 is the proposed allocation for dotless j as of Unicode 4.0
+# U+1D6A5 is the mathematical italic version approved in Unicode 5.0
+dotlessj;0237,F6BE,1D6A5
+emptyset;2205,F638
+# emptyslot: invalid Unicode; the user explicitly wants this slot empty
+emptyslot;D801
+epsilon1;03F5
+epsiloninv;03F6
+equivasymptotic;224D
+flat;266D
+floorleft;230A
+floorright;230B
+follows;227B
+followsequal;2AB0
+followsorcurly;227D
+greatermuch;226B
+heart;2661,2665
+interrobang;203D
+interrobangdown;2E18
+intersectionsq;2293
+latticetop;22A4
+lessmuch;226A
+longdbls;017F 017F
+longsh;017F 0068
+longsi;017F 0069
+longsl;017F 006C
+longst;FB05,017F 0074
+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;2AAF
+precedesorcurly;227C
+prime;2032,02B9
+rho1;03F1
+# ringfitted: a ring character centered on the x-width of A, invalid Unicode
+ringfitted;D80D
+sharp;266F
+similarequal;2243
+slurabove;2322
+slurbelow;2323
+st;FB06,0073 0074
+star;22C6
+subsetsqequal;2291
+supersetsqequal;2292
+triangle;25B3
+triangleinv;25BD
+triangleleft;25C1
+triangleright;25B7
+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
+# --
+# -- These character names are used in the MSAM fonts
+# --
+Yen;00A5
+# the MSAM10 glyph is more closed than U+21BA
+# the MSAM10 glyph's gap is at the top, while U+27F2 is on the left
+anticlockwise;27F2,21BA
+# XXX arrowaxisleft
+# XXX arrowaxisright
+arrowparrleftright;21C6
+arrowparrrightleft;21C4
+arrowtailleft;21A2
+arrowtailright;21A3
+arrowtripleleft;21DA
+arrowtripleright;21DB
+# XXX axisshort
+between;226C
+# U+2713 is a Zapf dingbat
+check;2713
+circleR;00AE
+# the MSAM10 glyph may be smaller than U+24C8
+circleS;24C8
+circleasterisk;229B
+circleequal;229C
+circlering;229A
+# the MSAM10 glyph is more closed than U+21BB
+# the MSAM10 glyph's gap is at the top, while U+27F3 is on the left
+clockwise;27F3,21BB
+complement;2201
+curlyleft;21AB
+curlyright;21AC
+dblarrowdwn;21CA
+dblarrowheadleft;219E
+dblarrowheadright;21A0
+dblarrowup;21C8
+defines;225C
+# U+2666 is BLACK DIAMOND SUIT
+# U+29EB is BLACK LOZENGE
+diamondsolid;2666,29EB
+difference;224F
+dotplus;2214
+downfall;22CE
+equaldotleftright;2252
+equaldotrightleft;2253
+equalorfollows;22DF
+equalorgreater;2A96
+equalorless;2A95
+equalorprecedes;22DE
+equalsdots;2251
+followsorequal;227F
+forces;22A9
+forcesbar;22AA
+fork;22D4
+frown;2322
+geomequivalent;224E
+greaterdbleqlless;2A8C
+greaterdblequal;2267
+greaterlessequal;22DB
+greaterorapproxeql;2A86
+greaterorequalslant;2A7E
+greaterorsimilar;2273
+harpoondownleft;21C3
+harpoondownright;21C2
+# MSAM probably misnamed this glyph; the right pointing harpoon is above
+# U+21CC has the right pointing harpoon above, like MSAM
+harpoonleftright;21CC
+# MSAM probably misnamed this glyph; the left pointing harpoon is above
+# U+21CB has the left pointing harpoon above, like MSAM
+harpoonrightleft;21CB
+harpoonupleft;21BF
+harpoonupright;21BE
+# U+22BA may be larger than MSAM intercal
+intercal;22BA
+intersectiondbl;22D2
+lessdbleqlgreater;2A8B
+lessdblequal;2266
+lessequalgreater;22DA
+lessorapproxeql;2A85
+lessorequalslant;2A7D
+lessorsimilar;2272
+maltesecross;2720
+measuredangle;2221
+multimap;22B8
+multiopenleft;22CB
+multiopenright;22CC
+nand;22BC
+orunderscore;22BB
+# U+2306 PERSPECTIVE is larger than the MSAM glyph
+perpcorrespond;2A5E,2306
+precedesorequal;227E
+primereverse;2035
+revasymptequal;22CD
+revsimilar;223D
+# U+231D TOP RIGHT CORNER is a quine corner,
+# U+2E23 TOP RIGHT HALF BRACKET is a half bracket.
+# MSAM rightanglene matches the shape of U+231C but the spacing of U+2E23.
+# Similar for other rightangle characters.
+rightanglene;231D,2E23
+rightanglenw;231C,2E22
+rightanglese;231F,2E25
+rightanglesw;231E,2E24
+ringinequal;2256
+# U+22A7 MODELS is shorter than U+22A8 TRUE = satisfies.
+# MSAM satisfies is in between.
+satisfies;22A8
+shiftleft;21B0
+shiftright;21B1
+smile;2323
+sphericalangle;2222
+# U+25A1 WHITE SQUARE
+square;25A1
+squaredot;22A1
+squareimage;228F
+squareminus;229F
+squaremultiply;22A0
+squareoriginal;2290
+squareplus;229E
+# XXX U+25AA BLACK SMALL SQUARE doesn't sit on the baseline
+# XXX squaresmallsolid
+squaresolid;25A0
+# U+21AD LEFT RIGHT WAVE ARROW is not actually a squiggle arrow
+squiggleleftright;21AD
+squiggleright;21DD
+subsetdbl;22D0
+subsetdblequal;2AC5
+supersetdbl;22D1
+supersetdblequal;2AC6
+triangledownsld;25BC
+# U+22B4 NORMAL SUBGROUP OF OR EQUAL TO is sharper than MSAM
+triangleleftequal;22B4,25C1 0332
+triangleleftsld;25C0
+# U+22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO is sharper than MSAM
+trianglerightequal;22B5,25B7 0332
+trianglerightsld;25B6
+trianglesolid;25B2
+uniondbl;22D3
+uprise;22CF
+# --
+# -- These character names are used in the MSBM fonts
+# --
+# U+1D7CB MATHEMATICAL BOLD SMALL DIGAMMA is the closest match to MSBM,
+# although MSBM Digamma's spelling indicates that a capital was intended
+# U+03DD GREEK SMALL LETTER DIGAMMA for fallback
+Digamma;1D7CB,03DD
+# U+2132 TURNED CAPITAL F is shown as seriffed, MSBM Finv is sans
+Finv;2132
+# U+2141 TURNED SANS-SERIF CAPITAL G is turned, MSBM Gmir is only reversed
+Gmir;2141
+Omegainv;2127
+approxorequal;224A
+archleftdown;21B6
+archrightdown;21B7
+# XXX barshort
+beth;2136
+daleth;2138
+dividemultiply;22C7
+# U+29F9 BIG REVERSE SOLIDUS seems the right size
+downslope;29F9
+equalorsimilar;2242
+follownotdbleqv;2ABA
+follownotslnteql;2AB6
+followornoteqvlnt;22E9
+greaterdot;22D7
+# MSBM misnamed this glyph; should be greaternotdbleqv
+greaternotdblequal;2A8A
+greaternotequal;2A88
+greaterornotdbleql;2269
+# XXX MSBM greaterornotequal has a vertical negation slash, not U+2269 diagonal
+greaterornotequal;2269
+# XXX greaterornotsimilar
+# XXX hatwide
+# XXX hatwider
+integerdivide;2216
+lessdot;22D6
+# MSBM misnamed this glyph; should be lessnotdbleqv
+lessnotdblequal;2A89
+lessnotequal;2A87
+lessornotdbleql;2268
+# XXX MSBM lessornotequal has a vertical negation slash, not U+2268 diagonal
+lessornotequal;2268
+# XXX lessornotsimilar
+multicloseleft;22C9
+multicloseright;22CA
+notapproxequal;2247
+notarrowboth;21AE
+notarrowleft;219A
+notarrowright;219B
+notbar;2224
+notdblarrowboth;21CE
+notdblarrowleft;21CD
+notdblarrowright;21CF
+notexistential;2204
+notfollows;2281
+# U+22E1 DOES NOT SUCCEED OR EQUAL has a curved equal sign, unlike MSBM
+notfollowsoreql;2AB0 0338,22E1
+notforces;22AE
+notforcesextra;22AF
+# Unicode has no precomposed negation of U+2267 GREATER THAN OVER EQUAL TO
+notgreaterdblequal;2267 0338
+notgreaterequal;2271
+notgreaterorslnteql;2A7E 0338
+notlessdblequal;2266 0338
+notlessequal;2270
+notlessorslnteql;2A7D 0338
+# U+22E0 DOES NOT PRECEDE OR EQUAL has a curved equal sign, unlike MSBM
+notprecedesoreql;2AAF 0338,22E0
+notsatisfies;22AD
+# XXX notshortbar
+# XXX notshortparallel
+notsimilar;2241
+notsubseteql;2288
+notsubsetordbleql;2AC5 0338
+# U+228A SUBSET OF WITH NOT EQUAL TO negation slash only touches bar below;
+# MSBM negation slash touches bar and lower part of subset
+notsubsetoreql;228A
+notsuperseteql;2289
+notsupersetordbleql;2AC6 0338
+# U+228A SUPERSET OF WITH NOT EQUAL TO negation slash only touches bar below;
+# MSBM negation slash touches bar and lower part of superset
+notsupersetoreql;228B
+# U+22EC NOT NORMAL SUBGROUP OF OR EQUAL TO is sharper than MSBM
+nottriangeqlleft;22EC,25C1 0332 0338
+# U+22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL is sharper than MSBM
+nottriangeqlright;22ED,25B7 0332 0338
+# U+22EA NOT NORMAL SUBGROUP OF is sharper than MSBM
+nottriangleleft;22EA,25C1 0338
+# U+22EB DOES NOT CONTAIN AS NORMAL SUBGROUP is sharper than MSBM
+nottriangleright;22EB,25B7 0338
+notturnstile;22AC
+# XXX parallelshort
+planckover2pi;210F
+# U+210F PLANCK CONSTANT OVER TWO PI is shown with diagonal slash, which
+# corresponds to MSBM planckover2pi, but this is a font variant
+planckover2pi1;210F
+precedenotdbleqv;2AB9
+precedenotslnteql;2AB5
+precedeornoteqvlnt;22E8
+subsetnoteql;228A
+subsetornotdbleql;2ACB
+# XXX subsetornoteql
+supersetnoteql;228B
+supersetornotdbleql;2ACC
+# XXX supersetornoteql
+# XXX tildewide
+# XXX tildewider
+# U+29F8 BIG SOLIDUS seems the right size
+upslope;29F8
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.am
new file mode 100644
index 00000000000..a55d65d82c4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = ttftotype42
+man_MANS = ttftotype42.1
+
+ttftotype42_SOURCES = ttftotype42.cc
+
+ttftotype42_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = ttftotype42.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.in
new file mode 100644
index 00000000000..1b3036b9747
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/Makefile.in
@@ -0,0 +1,695 @@
+# Makefile.in generated by automake 1.13.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2012 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@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = ttftotype42$(EXEEXT)
+subdir = lcdf-typetools-2.98/ttftotype42
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/../../build-aux/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ttftotype42_OBJECTS = ttftotype42.$(OBJEXT)
+ttftotype42_OBJECTS = $(am_ttftotype42_OBJECTS)
+ttftotype42_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ttftotype42_SOURCES)
+DIST_SOURCES = $(ttftotype42_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+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 = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+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@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+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@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = ttftotype42.1
+ttftotype42_SOURCES = ttftotype42.cc
+ttftotype42_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+INCLUDES = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = ttftotype42.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .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 ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-2.98/ttftotype42/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-2.98/ttftotype42/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
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+ttftotype42$(EXEEXT): $(ttftotype42_OBJECTS) $(ttftotype42_DEPENDENCIES) $(EXTRA_ttftotype42_DEPENDENCIES)
+ @rm -f ttftotype42$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ttftotype42_OBJECTS) $(ttftotype42_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttftotype42.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+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)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$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:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool 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
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS 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/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.1
new file mode 100644
index 00000000000..0dcab2a2053
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.1
@@ -0,0 +1,78 @@
+.ds V 2.98
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH TTFTOTYPE42 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+ttftotype42 \- create PostScript Type 42 wrapper of TrueType font
+.SH SYNOPSIS
+.B ttftotype42
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.BR Ttftotype42
+converts TrueType or TrueType-flavored OpenType font programs into
+PostScript Type 42 format, which is a wrapper for the TrueType outlines.
+This conversion preserves all outlines and hint information from the
+original TrueType font. The Type 42 wrapper uses glyph names identical to
+those expected by
+.M pdflatex 1
+or
+.M otftotfm 1 ,
+so encoding files suitable for TrueType fonts and
+.B pdflatex
+will also work for the Type 42 fonts and
+.M dvips 1 .
+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 \-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 cfftot1 1 ,
+.M otftotfm 1 ,
+.M pdftex 1 ,
+.M dvips 1
+.LP
+Adobe Technical Note #5012,
+.IR "The Type 42 Font Format Specification"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.cc
new file mode 100644
index 00000000000..0c3567e874c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.98/ttftotype42/ttftotype42.cc
@@ -0,0 +1,403 @@
+/* ttftotype42.cc -- driver for translating TrueType fonts to Type 42 fonts
+ *
+ * Copyright (c) 2006-2012 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 <efont/cff.hh>
+#include <efont/otf.hh>
+#include <efont/otfname.hh>
+#include <efont/otfpost.hh>
+#include <efont/otfcmap.hh>
+#include <efont/ttfcs.hh>
+#include <lcdf/md5.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <math.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 OUTPUT_OPT 306
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 'v', 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->vxmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Ttftotype42%> translates a TrueType or TrueType-flavored OpenType font into\n\
+PostScript Type 42 format, which is suitable for inclusion in PostScript\n\
+files. The result is usually written to the standard output.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\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 <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// MAIN
+
+// This is the list of tables Adobe recommends be included from the source TTF,
+// plus the 'cmap' table, which helps to make PDF results searchable.
+static const char * const t42_tables[] = {
+ "cmap", "cvt ", "fpgm", "glyf", "head", "hhea", "hmtx",
+ "loca", "maxp", "prep", "vhea", "vmtx", 0
+};
+
+struct NameId {
+ const char *name;
+ int nameid;
+};
+
+static const NameId fontinfo_names[] = {
+ { "version", OpenType::Name::N_VERSION },
+ { "Notice", OpenType::Name::N_TRADEMARK },
+ { "Copyright", OpenType::Name::N_COPYRIGHT },
+ { "FullName", OpenType::Name::N_FULLNAME },
+ { "FamilyName", OpenType::Name::N_FAMILY },
+ { "Weight", OpenType::Name::N_SUBFAMILY },
+ { 0, 0 }
+};
+
+static void
+fprint_sfnts(FILE *f, const String &data, bool glyf, const OpenType::Font &font)
+{
+ if (glyf && data.length() >= 65535) {
+ OpenType::Data head = font.table("head");
+ OpenType::Data loca = font.table("loca");
+ bool loca_long = (head.length() >= 52 && head.u16(50) != 0);
+ int loca_size = (loca_long ? 4 : 2);
+ uint32_t first_offset = 0;
+ for (int i = 1; i * loca_size < loca.length(); i++) {
+ uint32_t next_offset = (loca_long ? loca.u32(4*i) : loca.u16(2*i) * 2);
+ if (next_offset - first_offset >= 65535) {
+ uint32_t prev_offset = (loca_long ? loca.u32(4*i - 4) : loca.u16(2*i - 2) * 2);
+ fprint_sfnts(f, data.substring(first_offset, prev_offset - first_offset), false, font);
+ first_offset = prev_offset;
+ }
+ }
+ fprint_sfnts(f, data.substring(first_offset), false, font);
+ return;
+ } else if (data.length() >= 65535) {
+ for (int offset = 0; offset < data.length(); ) {
+ int next_offset = offset + 65534;
+ if (next_offset > data.length())
+ next_offset = data.length();
+ fprint_sfnts(f, data.substring(offset, next_offset - offset), false, font);
+ offset = next_offset;
+ }
+ return;
+ }
+
+ fputc('<', f);
+ const uint8_t *s = data.udata();
+ for (int i = 0; i < data.length(); i++) {
+ if (i && (i % 38) == 0)
+ fputc('\n', f);
+ fputc("0123456789ABCDEF"[(s[i] >> 4) & 0xF], f);
+ fputc("0123456789ABCDEF"[s[i] & 0xF], f);
+ }
+ if ((data.length() % 38) == 0)
+ fputc('\n', f);
+ fputs("00>\n", f);
+}
+
+static void
+do_file(const char *infn, const char *outfn, 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);
+
+ if (c == EOF)
+ errh->fatal("%s: empty file", infn);
+
+ StringAccum sa(150000);
+ int amt;
+ do {
+ if (char *x = sa.reserve(32768)) {
+ amt = fread(x, 1, 32768, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->error("%s: %s", infn, strerror(errno));
+ if (f != stdin)
+ fclose(f);
+
+ LandmarkErrorHandler cerrh(errh, infn);
+ OpenType::Font otf(sa.take_string(), &cerrh);
+ if (!otf.ok() || !otf.check_checksums(&cerrh))
+ return;
+ if (otf.table("CFF"))
+ cerrh.fatal("CFF-flavored OpenType font not suitable for Type 42");
+
+ OpenType::Name name(otf.table("name"), &cerrh);
+ OpenType::Data head_data = otf.table("head");
+ if (!otf.table("glyf") || head_data.length() <= 52 || !name.ok())
+ cerrh.fatal("font appears to lack required tables");
+
+ // create reduced font
+ Vector<OpenType::Tag> tags;
+ Vector<String> tables;
+ for (const char * const *table = t42_tables; *table; table++)
+ if (String s = otf.table(*table)) {
+ tags.push_back(*table);
+ tables.push_back(s);
+ }
+ OpenType::Font reduced_font = OpenType::Font::make(true, tags, tables);
+
+ // output file
+ if (!outfn || strcmp(outfn, "-") == 0) {
+ f = stdout;
+ outfn = "<stdout>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(outfn, "wb")))
+ errh->fatal("%s: %s", outfn, strerror(errno));
+
+ // fprintf(f, "%%!\n");
+
+ // get glyph names
+ TrueTypeBoundsCharstringProgram ttbprog(&otf);
+ Vector<PermString> gn;
+ ttbprog.glyph_names(gn);
+ OpenType::Post post(otf.table("post"));
+ OpenType::Cmap cmap(otf.table("cmap"));
+ double emunits = head_data.u16(18);
+
+ // font opener
+ fprintf(f, "%%!PS-TrueTypeFont-65536-%u-1\n", head_data.u32(4));
+ if (post.ok())
+ fprintf(f, "%%%%VMusage: %u %u\n", post.mem_type42(false), post.mem_type42(true));
+ fprintf(f, "11 dict begin\n");
+ fprintf(f, "/FontName /%s def\n", name.english_name(OpenType::Name::N_POSTSCRIPT).c_str());
+ fprintf(f, "/FontType 42 def\n");
+ fprintf(f, "/FontMatrix [1 0 0 1 0 0] def\n");
+ fprintf(f, "/FontBBox [%g %g %g %g] readonly def\n",
+ /* head_data.s16(36), head_data.s16(38),
+ head_data.s16(40), head_data.s16(42)); */
+ head_data.s16(36) / emunits, head_data.s16(38) / emunits,
+ head_data.s16(40) / emunits, head_data.s16(42) / emunits);
+ fprintf(f, "/PaintType 0 def\n");
+
+ // XUID (MD5 sum of font data)
+ {
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *) reduced_font.data(), reduced_font.length());
+ unsigned char result[MD5_DIGEST_SIZE + 3];
+ memset(result, 0, sizeof(result));
+ md5_final(result, &md5);
+ fprintf(f, "/XUID [42");
+ for (int i = 0; i < MD5_DIGEST_SIZE; i += 3)
+ fprintf(f, " 16#%X", result[i] + result[i+1]*256 + result[i+2]*256*256);
+ fprintf(f, "] def\n");
+ }
+
+ // FontInfo dictionary
+ fprintf(f, "/FontInfo 10 dict dup begin\n");
+ for (const NameId *n = fontinfo_names; n->name; n++)
+ if (String s = name.english_name(n->nameid)) {
+ fprintf(f, "/%s (", n->name);
+ for (const char *x = s.begin(); x < s.end(); x++)
+ if (*x == '(' || *x == '\\' || *x == ')')
+ fprintf(f, "\\%c", *x);
+ else if (*x == '\n' || (*x >= ' ' && *x <= '~'))
+ fputc(*x, f);
+ else
+ fprintf(f, "\\%03o", (unsigned char) *x);
+ fprintf(f, ") readonly def\n");
+ }
+ if (post.ok()) {
+ fprintf(f, "/isFixedPitch %s def\n", (post.is_fixed_pitch() ? "true" : "false"));
+ fprintf(f, "/ItalicAngle %g def\n", post.italic_angle());
+ fprintf(f, "/UnderlinePosition %g def\n", (post.underline_position() - (post.underline_thickness() / 2)) / emunits);
+ fprintf(f, "/UnderlineThickness %g def\n", post.underline_thickness() / emunits);
+ }
+ fprintf(f, "end readonly def\n");
+
+ // encoding
+ fprintf(f, "/Encoding 256 array\n0 1 255{1 index exch/.notdef put}for\n");
+ for (int i = 0; i < 256; i++)
+ if (OpenType::Glyph g = cmap.map_uni(i))
+ fprintf(f, "dup %d /%s put\n", i, gn[g].c_str());
+ fprintf(f, "readonly def\n");
+
+ // print 'sfnts' array
+ OpenType::Data sfnts = reduced_font.data_string();
+ fprintf(f, "/sfnts[\n");
+ fprint_sfnts(f, sfnts.substring(0, OpenType::Font::HEADER_SIZE + OpenType::Font::TABLE_DIR_ENTRY_SIZE * reduced_font.ntables()), false, reduced_font);
+ for (int i = 0; i < reduced_font.ntables(); i++) {
+ int off = OpenType::Font::HEADER_SIZE + OpenType::Font::TABLE_DIR_ENTRY_SIZE * i;
+ uint32_t offset = sfnts.u32(off + 8);
+ uint32_t length = (sfnts.u32(off + 12) + 3) & ~3;
+ fprint_sfnts(f, sfnts.substring(offset, length), sfnts.u32(off) == 0x676C7966 /*glyf*/, reduced_font);
+ }
+ fprintf(f, "] def\n");
+
+ // print CharStrings data
+ fprintf(f, "/CharStrings %d dict dup begin\n", ttbprog.nglyphs());
+ for (int i = 0; i < gn.size(); i++)
+ fprintf(f, "/%s %d def\n", gn[i].c_str(), i);
+ fprintf(f, "end readonly def\n");
+
+ // complete font
+ fprintf(f, "FontName currentdict end definefont pop\n");
+
+ // fprintf(f, "/%s 100 selectfont 30 30 moveto (Hello! 9) show showpage\n", name.english_name(OpenType::Name::N_POSTSCRIPT).c_str());
+
+ if (f != stdout)
+ fclose(f);
+}
+
+#if 0
+static void check_md5sum() {
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *) "message digest", 14);
+ unsigned char result[MD5_DIGEST_SIZE];
+ md5_final(result, &md5);
+ assert(memcmp(result, "\xF9\x6B\x69\x7D\x7C\xB7\x93\x8D\x52\x5A\x2F\x31\xAA\xF1\x61\xD0", MD5_DIGEST_SIZE) == 0);
+}
+#endif
+
+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;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("ttftotype42 (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2006-2012 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->vstr;
+ 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->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ do_file(input_file, output_file, errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}