summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/xdvik
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/xdvik')
-rw-r--r--Build/source/texk/xdvik/BUGS62
-rw-r--r--Build/source/texk/xdvik/CHANGES1050
-rw-r--r--Build/source/texk/xdvik/ChangeLog393
-rw-r--r--Build/source/texk/xdvik/FAQ248
-rw-r--r--Build/source/texk/xdvik/LESSTIF-BUGS37
-rw-r--r--Build/source/texk/xdvik/Makefile.am267
-rw-r--r--Build/source/texk/xdvik/Makefile.in1683
-rw-r--r--Build/source/texk/xdvik/README.t1fonts186
-rw-r--r--Build/source/texk/xdvik/README.t1mapper187
-rw-r--r--Build/source/texk/xdvik/ac/withenable.ac10
-rw-r--r--Build/source/texk/xdvik/ac/xdvik.ac11
-rw-r--r--Build/source/texk/xdvik/aclocal.m41194
-rw-r--r--Build/source/texk/xdvik/alloc-debug.h33
-rw-r--r--Build/source/texk/xdvik/browser.c279
-rw-r--r--Build/source/texk/xdvik/browser.h29
-rw-r--r--Build/source/texk/xdvik/c-auto.in457
-rw-r--r--Build/source/texk/xdvik/c-openmx.h37
-rw-r--r--Build/source/texk/xdvik/common.am34
-rwxr-xr-xBuild/source/texk/xdvik/configure21663
-rw-r--r--Build/source/texk/xdvik/configure.ac305
-rw-r--r--Build/source/texk/xdvik/dl_list.c165
-rw-r--r--Build/source/texk/xdvik/dl_list.h27
-rw-r--r--Build/source/texk/xdvik/dvi-draw.c5326
-rw-r--r--Build/source/texk/xdvik/dvi-draw.h154
-rw-r--r--Build/source/texk/xdvik/dvi-init.c1892
-rw-r--r--Build/source/texk/xdvik/dvi-init.h235
-rw-r--r--Build/source/texk/xdvik/dvi.h64
-rw-r--r--Build/source/texk/xdvik/dvisel.c762
-rw-r--r--Build/source/texk/xdvik/dvisel.h42
-rw-r--r--Build/source/texk/xdvik/encodings.c4153
-rw-r--r--Build/source/texk/xdvik/encodings.h56
-rw-r--r--Build/source/texk/xdvik/events.c6596
-rw-r--r--Build/source/texk/xdvik/events.h253
-rw-r--r--Build/source/texk/xdvik/exit-handlers.c86
-rw-r--r--Build/source/texk/xdvik/exit-handlers.h33
-rw-r--r--Build/source/texk/xdvik/filehist.c403
-rw-r--r--Build/source/texk/xdvik/filehist.h40
-rw-r--r--Build/source/texk/xdvik/font-open.c1899
-rw-r--r--Build/source/texk/xdvik/font-open.h95
-rw-r--r--Build/source/texk/xdvik/ft.c484
-rw-r--r--Build/source/texk/xdvik/gf.c326
-rw-r--r--Build/source/texk/xdvik/gui/Panner.c1238
-rw-r--r--Build/source/texk/xdvik/gui/Panner.h108
-rw-r--r--Build/source/texk/xdvik/gui/PannerP.h104
-rw-r--r--Build/source/texk/xdvik/gui/Tip.c607
-rw-r--r--Build/source/texk/xdvik/gui/Tip.h62
-rw-r--r--Build/source/texk/xdvik/gui/TipP.h95
-rw-r--r--Build/source/texk/xdvik/gui/help-window.c1110
-rw-r--r--Build/source/texk/xdvik/gui/help-window.h29
-rw-r--r--Build/source/texk/xdvik/gui/mag.c772
-rw-r--r--Build/source/texk/xdvik/gui/mag.h53
-rw-r--r--Build/source/texk/xdvik/gui/menu.c380
-rw-r--r--Build/source/texk/xdvik/gui/menu.h72
-rw-r--r--Build/source/texk/xdvik/gui/message-window.c1203
-rw-r--r--Build/source/texk/xdvik/gui/message-window.h116
-rw-r--r--Build/source/texk/xdvik/gui/pagesel.c1520
-rw-r--r--Build/source/texk/xdvik/gui/pagesel.h71
-rw-r--r--Build/source/texk/xdvik/gui/print-dialog.c2444
-rw-r--r--Build/source/texk/xdvik/gui/print-dialog.h32
-rw-r--r--Build/source/texk/xdvik/gui/print-log.c733
-rw-r--r--Build/source/texk/xdvik/gui/print-log.h41
-rw-r--r--Build/source/texk/xdvik/gui/search-dialog.c1399
-rw-r--r--Build/source/texk/xdvik/gui/search-dialog.h70
-rw-r--r--Build/source/texk/xdvik/gui/selection.c244
-rw-r--r--Build/source/texk/xdvik/gui/selection.h31
-rw-r--r--Build/source/texk/xdvik/gui/sfDir.c165
-rw-r--r--Build/source/texk/xdvik/gui/sfDir.h61
-rw-r--r--Build/source/texk/xdvik/gui/sfDraw.c820
-rw-r--r--Build/source/texk/xdvik/gui/sfDraw.h97
-rw-r--r--Build/source/texk/xdvik/gui/sfPath.c911
-rw-r--r--Build/source/texk/xdvik/gui/sfPath.h43
-rw-r--r--Build/source/texk/xdvik/gui/sfSelFile.c1042
-rw-r--r--Build/source/texk/xdvik/gui/sfSelFile.h51
-rw-r--r--Build/source/texk/xdvik/gui/sfinternal.h70
-rw-r--r--Build/source/texk/xdvik/gui/statusline.c580
-rw-r--r--Build/source/texk/xdvik/gui/statusline.h56
-rw-r--r--Build/source/texk/xdvik/gui/topic-window.c650
-rw-r--r--Build/source/texk/xdvik/gui/topic-window.h79
-rw-r--r--Build/source/texk/xdvik/gui/xaw_bitmaps.c82
-rw-r--r--Build/source/texk/xdvik/gui/xaw_bitmaps.h21
-rw-r--r--Build/source/texk/xdvik/gui/xaw_menu.c823
-rw-r--r--Build/source/texk/xdvik/gui/xaw_menu.h52
-rw-r--r--Build/source/texk/xdvik/gui/xicon.c166
-rw-r--r--Build/source/texk/xdvik/gui/xicon.h29
-rw-r--r--Build/source/texk/xdvik/gui/xlwradio.c677
-rw-r--r--Build/source/texk/xdvik/gui/xlwradio.h117
-rw-r--r--Build/source/texk/xdvik/gui/xlwradioP.h139
-rw-r--r--Build/source/texk/xdvik/gui/xm_colorsel.c638
-rw-r--r--Build/source/texk/xdvik/gui/xm_colorsel.h43
-rw-r--r--Build/source/texk/xdvik/gui/xm_filesel.c243
-rw-r--r--Build/source/texk/xdvik/gui/xm_menu.c364
-rw-r--r--Build/source/texk/xdvik/gui/xm_menu.h45
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs.c590
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs.h39
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefsP.h129
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_appearance.c540
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_appearance.h37
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_fonts.c692
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_fonts.h37
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_helpers.c898
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_helpers.h35
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_page.c691
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_page.h38
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_scroll.c470
-rw-r--r--Build/source/texk/xdvik/gui/xm_prefs_scroll.h34
-rw-r--r--Build/source/texk/xdvik/gui/xm_toolbar.c863
-rw-r--r--Build/source/texk/xdvik/gui/xm_toolbar.h50
-rw-r--r--Build/source/texk/xdvik/hypertex.c2257
-rw-r--r--Build/source/texk/xdvik/hypertex.h71
-rw-r--r--Build/source/texk/xdvik/image-magick.c1443
-rw-r--r--Build/source/texk/xdvik/image-magick.h33
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-c-bitmap-type.m434
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-check-iconv.m4116
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-check-langinfo.m427
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-check-xaw.m480
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-find-motif.m4288
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-find-xpm.m4214
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-func-memicmp.m421
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-func-poll.m423
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-func-setsid-in-fork.m458
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-func-working-vsnprintf.m432
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-func-xkbbell.m429
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-gs-lib-path.m439
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-linker-multiple-defns.m470
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-sys-old-linux.m422
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-sys-streams.m425
-rw-r--r--Build/source/texk/xdvik/m4/xdvi-xinput-2-1.m451
-rw-r--r--Build/source/texk/xdvik/main.c1321
-rw-r--r--Build/source/texk/xdvik/mime.c661
-rw-r--r--Build/source/texk/xdvik/mime.h29
-rwxr-xr-xBuild/source/texk/xdvik/mksedscript119
-rw-r--r--Build/source/texk/xdvik/my-snprintf.c60
-rw-r--r--Build/source/texk/xdvik/my-snprintf.h36
-rw-r--r--Build/source/texk/xdvik/my-vsnprintf.c102
-rw-r--r--Build/source/texk/xdvik/my-vsnprintf.h44
-rw-r--r--Build/source/texk/xdvik/pagehist.c563
-rw-r--r--Build/source/texk/xdvik/pagehist.h34
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_horiz.xbm8
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_horiz_mask.xbm8
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_omni.xbm10
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_omni_mask.xbm10
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_vert.xbm7
-rw-r--r--Build/source/texk/xdvik/pixmaps/drag_vert_mask.xbm7
-rw-r--r--Build/source/texk/xdvik/pixmaps/fist.xbm6
-rw-r--r--Build/source/texk/xdvik/pixmaps/fist_mask.xbm6
-rw-r--r--Build/source/texk/xdvik/pixmaps/hand.xbm6
-rw-r--r--Build/source/texk/xdvik/pixmaps/hand_mask.xbm6
-rw-r--r--Build/source/texk/xdvik/pixmaps/magglass.xbm10
-rw-r--r--Build/source/texk/xdvik/pixmaps/magglass_mask.xbm10
-rw-r--r--Build/source/texk/xdvik/pixmaps/time16.xbm8
-rw-r--r--Build/source/texk/xdvik/pixmaps/time16_mask.xbm6
-rw-r--r--Build/source/texk/xdvik/pixmaps/toolbar.xpm41
-rw-r--r--Build/source/texk/xdvik/pixmaps/toolbar2.xpm40
-rw-r--r--Build/source/texk/xdvik/pixmaps/xdvi16x16.xpm100
-rw-r--r--Build/source/texk/xdvik/pixmaps/xdvi32x32.xpm55
-rw-r--r--Build/source/texk/xdvik/pixmaps/xdvi48x48.xpm86
-rw-r--r--Build/source/texk/xdvik/pk.c387
-rw-r--r--Build/source/texk/xdvik/print-internal.c872
-rw-r--r--Build/source/texk/xdvik/print-internal.h111
-rw-r--r--Build/source/texk/xdvik/psdps.c869
-rw-r--r--Build/source/texk/xdvik/psdps.h28
-rw-r--r--Build/source/texk/xdvik/psgs.c1085
-rw-r--r--Build/source/texk/xdvik/psgs.h31
-rw-r--r--Build/source/texk/xdvik/psheader.txt248
-rw-r--r--Build/source/texk/xdvik/psnews.c951
-rw-r--r--Build/source/texk/xdvik/psnews.h28
-rw-r--r--Build/source/texk/xdvik/search-internal.c2076
-rw-r--r--Build/source/texk/xdvik/search-internal.h93
-rw-r--r--Build/source/texk/xdvik/special.c2892
-rw-r--r--Build/source/texk/xdvik/special.h78
-rw-r--r--Build/source/texk/xdvik/squeeze/Makefile.am16
-rw-r--r--Build/source/texk/xdvik/squeeze/Makefile.in724
-rw-r--r--Build/source/texk/xdvik/squeeze/aclocal.m41170
-rwxr-xr-xBuild/source/texk/xdvik/squeeze/configure5660
-rw-r--r--Build/source/texk/xdvik/squeeze/configure.ac21
-rw-r--r--Build/source/texk/xdvik/squeeze/squeeze.c195
-rw-r--r--Build/source/texk/xdvik/string-utils.c774
-rw-r--r--Build/source/texk/xdvik/string-utils.h81
-rw-r--r--Build/source/texk/xdvik/string_list.c166
-rw-r--r--Build/source/texk/xdvik/string_list.h8
-rwxr-xr-xBuild/source/texk/xdvik/t1mapper433
-rw-r--r--Build/source/texk/xdvik/t1mapper.1146
-rw-r--r--Build/source/texk/xdvik/tests/Makefile.am33
-rw-r--r--Build/source/texk/xdvik/tests/Makefile.in1079
-rw-r--r--Build/source/texk/xdvik/tests/README29
-rw-r--r--Build/source/texk/xdvik/tests/run_tests.c127
-rw-r--r--Build/source/texk/xdvik/tests/run_tests.h34
-rw-r--r--Build/source/texk/xdvik/tests/test1.c14
-rw-r--r--Build/source/texk/xdvik/tests/test_dl_list.c96
-rw-r--r--Build/source/texk/xdvik/tests/test_string_list.c75
-rw-r--r--Build/source/texk/xdvik/tests/test_string_utils.c443
-rw-r--r--Build/source/texk/xdvik/tests/test_util.c45
-rw-r--r--Build/source/texk/xdvik/texmf-alt/README31
-rw-r--r--Build/source/texk/xdvik/texmf-alt/charter2.map5
-rw-r--r--Build/source/texk/xdvik/texmf-alt/lucida.map110
-rw-r--r--Build/source/texk/xdvik/texmf-alt/marvosym.map2
-rw-r--r--Build/source/texk/xdvik/texmf-alt/xdvifont.map56
-rw-r--r--Build/source/texk/xdvik/texmf-alt/xypic.map18
-rw-r--r--Build/source/texk/xdvik/texmf/XDvi370
-rw-r--r--Build/source/texk/xdvik/texmf/config.xdvi40
-rw-r--r--Build/source/texk/xdvik/translations.h360
-rw-r--r--Build/source/texk/xdvik/util.c2006
-rw-r--r--Build/source/texk/xdvik/util.h254
-rw-r--r--Build/source/texk/xdvik/version.h19
-rw-r--r--Build/source/texk/xdvik/vf.c187
-rw-r--r--Build/source/texk/xdvik/x_util.c1231
-rw-r--r--Build/source/texk/xdvik/x_util.h143
-rw-r--r--Build/source/texk/xdvik/xdvi-config.h37
-rw-r--r--Build/source/texk/xdvik/xdvi-debug.h217
-rw-r--r--Build/source/texk/xdvik/xdvi-search.el397
-rw-r--r--Build/source/texk/xdvik/xdvi-sh.in53
-rw-r--r--Build/source/texk/xdvik/xdvi.1.in4370
-rw-r--r--Build/source/texk/xdvik/xdvi.c3623
-rw-r--r--Build/source/texk/xdvik/xdvi.desktop8
-rw-r--r--Build/source/texk/xdvik/xdvi.h1203
-rw-r--r--Build/source/texk/xdvik/xdvi.icon27
-rwxr-xr-xBuild/source/texk/xdvik/xdvizilla175
-rw-r--r--Build/source/texk/xdvik/xdvizilla.1115
-rw-r--r--Build/source/texk/xdvik/xserver-info.c280
-rw-r--r--Build/source/texk/xdvik/xserver-info.h10
220 files changed, 121794 insertions, 0 deletions
diff --git a/Build/source/texk/xdvik/BUGS b/Build/source/texk/xdvik/BUGS
new file mode 100644
index 00000000000..01ff6f628da
--- /dev/null
+++ b/Build/source/texk/xdvik/BUGS
@@ -0,0 +1,62 @@
+
+For an up-to-date list of bugs, please visit:
+
+http://sourceforge.net/tracker/?group_id=23164&atid=377580
+
+This file records only bugs that have been tagged as `Wont fix' or
+`Later', i.e. bugs that couldn't be resolved so far.
+
+Please report new bugs to the above SourceForge URL, including as much
+information as possible (whatever may be relevant: platform, compiler,
+X version, output of xdpyinfo, sample .dvi file to reproduce the
+problem; see also: http://xdvi.sourceforge.net/#bugs).
+
+
+(A) X interface bugs:
+
+(A1) The current code to toggle to/from fullscreen mode via Ctrl-l, and to
+ remove the Xaw scrollbars for expert mode is an atrocious hack that won't
+ work with many window managers (see e.g. #814327). These should be fixed by
+ someone who knows X better than I do.
+
+(A2) The correct handling of XtAppAddTimeOut() and friends, used e.g. internally
+ by many Motif widgets, depends on xdvi redefining the XtAppAddTimeOut() and
+ related functions to use its own non-standard event handling routines.
+
+ If this is not possible (e.g. because your linker doesn't allow multiple
+ definitions - check for the corresponding warnings by ./configure),
+ some of the widgets (e.g. the print log window, tooltips, statusline
+ messages, hyperlink location markers) will not appear correctly or will
+ only be updated when the mouse is moved.
+
+(A3) Motif: Toggle buttons in print dialog (page range) may fail under
+ certain circumstances when button has been changed via marking pages.
+ (For details, see comment in gui/print-dialog.c, notify_dialog()).
+
+(A4) Motif 1.2: After opening a document at page 1 and changing to page
+ 2, an partial area of the highlighting of page 1 is not erased (#997080).
+
+(A5) Ctrl-l and the `fullscreen' option are hacks that may interact badly
+ with certain window managers (e.g. KDE; see #815020). In such cases it's
+ better to use the window manager's functions to enable fullscreen mode.
+
+(A6) Xaw: The page list scroll area (viewport) is not resized when switching to
+ a file with longer page numbers (e.g. from 2-digit ones to 5-digit ones).
+
+
+(B) Known features:
+
+(B1) Controll of font/file generation by X-resource and commandline is overridden
+ by controll by environment variable/texmf.cnf setting. This is a design
+ decision in kpathsea; if you want it to be resource/commandline controlled,
+ make sure there is no setting in the environment or texmf.cnf.
+
+(B2) Some of the optional compilation stuff (e.g. display postscript) hasn't been
+ tested for quite some time and may be broken.
+
+
+(C) Autoconfigure issues:
+
+(C1) GS_PATH cannot be set except by CFLAGS=-DGS_PATH=... Paul has a macro for
+ this. Must be compatible with kpathsea, but I haven't checked this yet.
+
diff --git a/Build/source/texk/xdvik/CHANGES b/Build/source/texk/xdvik/CHANGES
new file mode 100644
index 00000000000..bd35043f486
--- /dev/null
+++ b/Build/source/texk/xdvik/CHANGES
@@ -0,0 +1,1050 @@
+The xdvik development team tries to keep step with the changes in
+Paul Vojta's xdvi, but since we might not always manage to update
+xdvik in time, there may be `leaps' in the version numbers.
+Sometimes there are also intermediate or `patchlevel' releases of
+xdvik between two releases of xdvi; these are tagged with additional
+digits (e.g. `22.74.1'; up to 22.40, letters were used instead).
+
+Versions containing major changes are marked as `beta'; these
+may contain undetected bugs. Such versions shouldn't be used
+by distributors.
+
+ * 22.87.04 (2020-02-29):
+ + Added xdvi.desktop and a mechanism to install it (TeX Live r46347)
+ + Some changes in the man page (TeX Live r46371 and r50583)
+ + Adjust psgs.c to make it work with Ghostscript 9.27
+ + Fixed bug #400 (eps picture overlays) and removed
+ GS_PIXMAP_CLEARING_HACK
+ + Updated support libraries from texlive 2020 (r53905)
+
+ * 22.87.03 (2016-04-02):
+ + incorporated changes in xdvik itself from the TeX Live version:
+ m4/xdvi-check-iconv.m4: Somewhat improved logic.
+ many places: avoided compiler warnings and cleaned up including of
+ header files.
+ + events.c: Fixed bug #391 (compilation with xaw3d).
+ + m4/xdvi-xinput-2-1.m4: Added check for -lXi (in addition to headers)
+ + events.h, main.c, dvi-init.c, special.c, xdvi.c: Fixed bug in which
+ papersize specials were ignored if the numbers in them had too many
+ digits. Also fixed rounding of negative numbers.
+ + psgs.c: Fixed bug #395 (strings.h --> string.h in psgs.c)
+ + texmf/XDvi: Fixed bug #397 (error message "Cannot convert string ...
+ to type FontStruct")
+ + events.c, events.h, util.c, util.h, and elsewhere: Fixed killing of
+ subprocesses in fork_process().
+ + exit-handlers.c: Ignore duplicate requests (such as
+ remove_tmp_dvi_file).
+ + events.c, xdvi.1.in: Added (unbound) user-exec() action.
+ + dvi-draw.c: Fixed bug #398 (crashed with message "currinf.set_char_p
+ is not a registered routine!" during scanning (string searches
+ or source specials))
+ + many places: Update from TeX Live, as of 2016-03-18:
+ Disable smooth scrolling by default for native TeX Live builds
+ Change handling of subdirectory squeeze (when cross compiling)
+ Avoid undefined behaviour when char is signed
+ Use link instead of compile check for XInput 2.1
+ Do not include c-auto.h from headers
+ Minor changes to avoid some compiler warnings
+ psheader.txt: Remove psfig macros due to copyright issues
+ Pulled in updated libraries, etc.
+ Removed outdated copies of the freetype2 library
+ + Internal changes in handling of PostScript file inclusion
+
+ * 22.87 (2014-04-12):
+ + ft.c: Avoid a compiler warning.
+ + font-open.c: Add support for .runlibfileifexists in gs Fontmap file;
+ tweak some messages.
+ + dvi-draw.c: Fixed bug #388 ("currinf.set_char_p is not a registered
+ routine!")
+ + gui/message-window.c, gui/message-window.h, hypertex.c: Avoid compiler
+ warnings.
+ + configure.ac, events.c, main.c, xdvi.c, xdvi.h, mksedscript,
+ xdvi.1.in, m4/xdvi-xinput-2-1.m4: Add support for high-resolution
+ scrolling via XInput 2.1 (touchpads only).
+ + gui/pagesel.c, events.c, events.h, xdvi.c: Fix wheel-mouse scrolling
+ in the page selector widget when using the Motif toolkit.
+ + gui/print-dialog.c, gui/xm_prefs_helpers.c: Eliminate compiler
+ warnings.
+ + xdvi.1.in: Fix the alphabetization of the options listing.
+ + pulled in libraries from TeX Live repository and ran reautoconf
+
+ * 22.86 (2013-04-04):
+ + xdvi.h, xdvi.c, x_util.h, x_util.c, dvi-init.c: Fixed bugs in
+ property handling on 64-bit systems (related to source specials).
+ + m4/xdvi-check-iconv.m4, m4/xdvi-check-langinfo.m4,
+ m4/xdvi-func-working-vsnprintf.m4: fixed copyright notices;
+ configure.ac: removed some obsolete lines.
+ + Added support for XkbBell, to make the console bell work again.
+ + Fixed #3514485 (mksedscript improperly handles macro values in
+ c-auto.in that contain spaces) (fix from TeX Live).
+ + Makefile.am and Makefile.in: Removed invalid utf-8 character \0x80.
+ + dvi-draw.c: Fixed #3578773 (type1 -> pk fallback bug if >1 size used)
+ + dvi-draw.c: Fixed #3607324 (misspelling)
+ + events.c: Fixed a bug involving a segfault when switching to a dvi
+ file whose name does not end in .dvi
+ + main.c: Added copyright message
+ + Many places: Switched from using the t1lib library to FreeType2
+
+ * 22.85 (2012-04-01):
+ + configure.ac: check for ulltostr is no longer used
+ + hypertex.c, gui/xm_toolbar.c: avoid compiler warnings about mixed
+ declarations and code
+ + Added support for horizontal scrolling
+ + Some cleanups in xdvi-1.in and dvi-init.h
+ + xdvi-1.in: visitedLinkColor should not be conditional on #ifcolor
+
+ * 22.84.17 (2012-03-30):
+ + Imported kpathsea, t1lib, and build system from TeX Live
+ + Imported changes from TeX Live svn versions 13213-25663:
+ * font-open.[ch] (font_open), dvi-init.c (load font): add const
+ * read-mapfile.c (read_map_file): Allow find_suffix() to return
+ a const string.
+ * tests/run_tests.c, test_dl_list.c: Cast size_t to long for printing
+ to avoid warnings on 64-bit systems.
+ * tests/test_string_utils.c (test_expand_filename):
+ Do not prepend cwd to absolute filenames;
+ (test_my_stristr): Make test result independent of compiler
+ optimizations (constant folding).
+ * [numerous files]: avoid some compiler warnings
+ * dvi-draw.c, string-utils.h, xdvi.h, gui/message-window.c,
+ gui/statusline.c, tests/test_string_utils.c:
+ omit #include "kpathsea/c-vararg.h", in favor of <stdarg.h>
+ (when not redundant)
+ * xdvi.h: remove NeedFunctionPrototypes, et al.
+ + Imported changes from TeX Live svn version 13213
+ + Corrected /usr/local/etc/mimetypes to /usr/local/etc/mime.types
+ + Fixed glitches in xdvi.1.in
+ + Fixed #2933610 (build error with parallel make)
+ + Fixed #2868509 (Bus error on NetBSD/sparc64)
+ + Fixed #2931447 (missing whitespace after viewer command in mailcap file)
+ + Fixed #2914532 (font dimensions computed incorrectly (musixtex))
+ + Fixed #2849449 (wrong open() parameters for O_CREAT)
+ + Fixed #2841005 (bounding boxes not shown for forward search)
+
+ * 22.84.16 (2009-05-18):
+ + Fixed a problem with the distribution (texmf.cnf file wasn't
+ included).
+
+ * 22.84.15 (2009-03-02):
+ + Fixed #2067614: Re-introduced default binding for key 0
+ which had been lost in previous changes
+ + Fixed #1502137 (compiler warnings on 64bit systems)
+ + Fixed some typos in the man page (ubuntu ticket #202435, see
+ https://bugs.launchpad.net/ubuntu/+source/texlive-bin/+bug/202435)
+
+ * 22.84.14:
+ + Added action "mouse-modes()" to allow customization of
+ mode specific mouse bindings.
+ + Fixed #1953028 (typo in events.c that broke fullscreen mode)
+ + Fixed #1953023 (unsigned char vs. signed char problem in
+ window ID computation that broke -unique and -sourceposition
+ on 64bit systems)
+ + Fixed #1953026 (security issue with temp file naming in xdvizilla)
+ + Don't distribute xdvizilla as binary since it's no longer needed
+ for current browsers (see discussion here:
+ http://www.tug.org/pipermail/tex-live/2008-April/015697.html)
+ The source is kept for compatibility.
+ + Updated to kpathsea version 3.4.5 (same as in texlive 2007)
+ + Fixed #1875314 (--with-system-t1lib still used headers from
+ distribution's t1lib subdir)
+ + Fixed #1888187 (Typo in help window)
+ + Fixed #1875311 (Space and backspace now keep horizontal position
+ when -keep is specified)
+ + Fixed #1875321 (Numlock key is not properly handled by translations)
+ + Fixed #1875309: Added xdg-open to browser commands
+ + Improved fix for #1819017
+ + Implemented feature request #1577926 (make mouse pointer invisible
+ in magnifier window)
+ + Merged STABLE with main branch by #ifdef'ing experimental
+ DELAYED_MKTEXPK code
+
+ * 22.84.13:
+ + Fixed #1819017 (uint32_t conflicts with XeTeX configure)
+ + Fixed #1044891 (xdvi -unique didn't insert page into page history)
+ + Fixed #1586240 (memory corruption with full TMPDIR)
+ + Fixed #1143508/#1283438 (wrong window sizes at startup)
+ + Fixed margin flags (didn't work for the first page of a document)
+ + Fixed #1553432 (failed assertion with hyperref and html:<font> specials)
+ + Fixed #1796818 (don't use 'empty' argument for %c when no column number
+ info is available)
+ + Fixed 1815476 (use = instead of == in shell wrapper)
+
+
+ * 22.84.12:
+ + Fixed a segfault bug if the default replacement font (cmr10)
+ had fewer characters than the font being replaced.
+ + Fixed a segfault with strcmp() when the statusline was disabled.
+
+ * 22.84.11:
+ + IMPORTANT: The binary is now called xdvi-<toolkit> instead of
+ xdvi-<toolkit>.bin, e.g. 'xdvi-motif' instead of 'xdvi-motif.bin'.
+ For more information on the reasons for this change, please see:
+ http://sourceforge.net/tracker/index.php?func=detail&aid=1222202&group_id=23164&atid=377580
+ + Implemented a search term history for the search window.
+ + Install signal handler for SIGUSR1 early (#1094615).
+ + Fixed a crash in htex_prescan_carry_over() (#1344956, #1188866).
+ + Fixed a crash when printing a DVI file that was read from a FIFO, as
+ was the case with Debian's xdvi.pl wrapper script (#1466262).
+ + Added more font encodings (missing encodings reported by several people).
+ + Fixed issue with translations not being installed on main window on Motif
+ (problem reported by Joost Kremers to xdvi-core).
+ + Fix for bug 1611508 (segfault with -nogrey/grey).
+ + Fix for bug 1526447 (searching for EPS files in included subdirectories).
+ + Fix for bug 1376354 (make -hush also trigger -hushstdout, add -hushbell).
+ + Fix bug with whitespace chars in Chinese fonts reported as .notdef
+ (see http://tug.org/mail-archives/tex-k/2006-October/001608.html).
+ + Fix for #1572806 (xdvi-search.el: cd into directory of .tex file
+ before invoking xdvi).
+ + Bugfix for #1530667 (hyperlinks containing parentheses don't work
+ correctly with 'hdvips' driver) contributed by Matthias Habl.
+ + Fixed xdvizilla bug #1508963 (Solaris "file" utility doesn't
+ recognize DVI files).
+ + Fixed bug #1499566 (force focus for text input field in search
+ dialog for Xaw).
+ + Fixed bugs #1475921 and #1484561 (type errors and a case of
+ uninitialized memory); thanks to Nobuyuki Tsuchimura for
+ reporting them and providing a patch.
+ + Fix for bug #1454648: restore old behaviour of '-s 0' option
+ which was accidentally lost in rev. 1.249.2.80
+ + Resurrected 'grid mode' which had been removed in 22.73-beta1
+ (toggled via 'D'; feature request #1375576)
+ + Fixed bug #1428583 (problems with GS_DPS, reported by Ben Stern)
+ + Fixed bug #1428482 (problem with building on sparcv9, also found
+ by Ben Stern)
+ + Added Ctrl/Shift bindings to the mouse wheel for zooming and
+ scrolling horizontally
+ + Fixed a bug with PK fonts not being used after loading a Type1
+ font had failed, reported by Ralf Stubner (#1363644)
+ + Fixed a crash on Solaris 10 (SPARC and AMD64) with WORD64/LONG64
+ reported by Peter Bray.
+ + Fixed a bug with reencoding reported by Staszek Wawrykiewicz
+ (#1295829): If plr10 is missing from ps2pk.map, xdvik will use
+ plr10.pfb without reencoding it instead of calling mktexpk for
+ plr10.mf which would yield the correct encoding.
+ + Replaced a failed assertion with a warning when a graphics file
+ included by a PS special isn't readable by user.
+ + Fix for library inclusion order problem contributed by K. Berry
+ (see http://tug.org/mailman/htdig/tex-live/2005-August/008609.html)
+
+ * 22.84.10 (2005/04/28):
+ + Fixed zero termination bug in t1lib version number check (t1lib.ac).
+ + Render an empty character instead of terminating with failed assertion
+ if T1lib doesn't return a usable glyph (e.g. at very small
+ \magnification factors; #1184087).
+ + Made gs_timeout in psgs.c a resource instead of #define it.
+ + Make file opening work with file descriptors too, as used in
+ Debian's Perl wrapper for xdvi (#1165497).
+
+ * 22.84.9 (teTeX-3.0):
+ + Applied Patch by Nobuyuki Tsuchimura (#1116871) to remove
+ code duplication in encodings.c.
+ + Changed --with-x-toolkit configure option to --with-xdvi-x-toolkit
+ for better interoperability with Metafont.
+ + Added a missing #if HAVE_X11_XMU_XMU_H in gui/selection.c.
+
+ * 22.84.8 (2004/12/02):
+ + Made text selection mode and ruler mode work correctly with
+ LessTif and Motif 1.2.4 (bugfix for #997073). Special thanks
+ to Svend Tollak Munkejord for helping me debugging this and
+ several of the other issues listed here.
+ + Fixed an `unaligned access' warning on 64-bit architectures
+ (OSF1/5.1), and some compiler warnings on Solaris/Ultrix/Tru64.
+ Many thanks to Bernhard Simon for extensive testing on Ultrix,
+ AIX and Tru64.
+ + Fixed a problem with non-default installation paths for libXpm,
+ with a lot of help from Sven de Vries.
+ + Fixed a formatting problem in the man page that showed up with
+ groff-1.17.2.
+ + Fixed a problem with window geometry when `-geometry' argument
+ specifies only x/y-offset, reported by Karl Berry here:
+ http://tug.org/mail-archives/tex-k/2004-November/001128.html
+ + Disabled virtual memory reallocation in T1lib (t1load.c,
+ ANSI_REALLOC_VM) that caused a segfault on OSF1/V5.1 alpha.
+ + Always install a custom X error handler which will print
+ warning messages instead of terminating the application.
+ + Create ~/.xdvirc with permissions 0600 instead of default ones.
+
+ * 22.84.6 (2004/11/08):
+ + Fixed a few compilation problems with HAVE_REGEX_H, strdup() vs.
+ xstrdup() and linkers not allowing multiple definitions (ULTRIX).
+
+ * 22.84.5 (2004/10/28):
+ + Fixed bug #968127 (recursive call to file loading code due to
+ read_events() in load_font(), which was supposed to update the
+ `loading file, may take a while' popup when fonts are created;
+ currently, this popup won't appear at all).
+
+ * 22.84.4 (2004/09/27):
+ + Fixed bug #1002688 (race condition when toggling expert mode
+ and marking pages).
+ + Fix bug #992179 (failed assertion when DVI had been removed),
+ reported again by Ulrich Scholz.
+ + Implemented feature request #995114 (prefix argument for Ctrl-o
+ opens recent files in history).
+ + Fixed bug #1029127 (map file parser didn't understand `<[' encoding
+ file syntax)
+ + Fixed a crasher bug on PowerPC related to multiple invocations of
+ v*printf() without matching va_start()/va_end() calls, reported to
+ the tex-live mailing list by Siep Kroonenberg
+ (http://tug.org/mailman/private/tex-live/2004-September/006780.html).
+
+ * 22.84.3 (2004/07/15):
+ + Printing to PS or PDF didn't really use the fallback temporary file
+ when current file was corrupted (#986009; thanks to Ulrich Scholz
+ for reporting this one).
+ + Fixed href length computation error when a href started with whitespace
+ (#988934, again reported by Ulrich Scholz).
+ + Removed t1x11.o from libs/t1lib/Makefile.in as in tetex 2.96.5.20040711
+ since it broke compilation with --with-x=no
+
+ * 22.84.1 (2004/06/26):
+ + Fixed a segfault if setlocale() call returns NULL for certain
+ locale/X library combinations (reported by Reiner Steib).
+ + Read the toolbar pixmap from build-in default (toolbar.xpm) if
+ no file is found in the search locations.
+ + Fixed a problem with the toolbar causing BadMatch errors with visuals
+ where the xdvi window has a different depth from the root window,
+ reported by Olaf Weber on tex-live
+ (http://tug.org/mailman/private/tex-live/2004-June/006112.html).
+ + Fixed a problem with incompatible vsnprintf() implementations that
+ don't return the length of the string actually needed, also reported
+ by Olaf Weber.
+ + Added a warning if configure detects LessTif because of the bugs
+ with LessTif.
+
+ * 22.84 (2004/06/01):
+ + Added a `Open Recent' entry to the files menu (file history is saved
+ to ~/.xdvirc). When xdvi is started without filename argument, the
+ most recent file from the history will be used (set the X resource
+ `noFileArgUseHistory' to false to get back the previous behaviour
+ of opening the file selector in that situation).
+ + Also enable the ruler lines when xdvi is started in ruler mode
+ (bug reported by Zhang Lin-Bo).
+ + Added `dvips options' field also to saving dialog (feature request
+ #942853, reported by Ulrich Scholz).
+ + Protect against integer overflow in prefix arguments (patch suggested
+ by Matt Swift in debian bug report #247848)
+ + Imported changes from non-k xdvi 22.83/22.84.
+ + Fixed another wrong string (printing vs. saving) for #939262
+ + Fixed a bug with UTF-8 conversion in text copy&paste.
+ + Fixed #940056 (Xaw version crashed when toggling expert mode and
+ at same time quickly changing pages)
+ + Added Ctrl-Home/End to forced Motif bindings for the drawing area.
+
+ * 22.82 (2004/04/21):
+ + Implemented a text selection mode, similar to xpdf: Use Mouse-1
+ to mark a rectangular region of text in a DVI file which is put
+ into the X selection.
+ + Added a Preferences dialog for the Motif version.
+ + Use $HOME/.xdvirc to save user customization from menus, dialogs
+ and Motif preferences; new `-q' option/`noUserFile' X resource
+ inhibits reading this file.
+ + Changed semantics of `browser' command-line option/`wwwBrowser'
+ X resource: Make it override the $BROWSER or the (obsolete)
+ $WWWBROWSER environment variable; use Netscape by default if no
+ browser is specified.
+ + Fixed #939262 (Bugs when saving/printing: Title of log window was
+ `Printing' also when saving, and outfile names weren't updated
+ correctly after loading a new file).
+ + Force vertical scrollbar for Motif Printing/Saving log window.
+ + Bugfixes for a potential crash if shrink factor is changed on a page
+ with color specials, as in non-k xdvi-22.82.
+ + Fixed a bug with the ESC key to close popup windows in Motif that
+ could cause crashes when opening new popups, and implemented ESC
+ to close Xaw popup windows (feature request #919501).
+ + Updates for kpathsea/withenable.ac by Olaf Weber.
+ + Made Ctrl-+ and Alt-Ctrl-+ case insensitive (suggested by Harald
+ Koenig).
+ + Fixed Motif 1.2 compile (XmEACH_SIDE), and added/fixed configure
+ checks for -lXmu, -lXp and -lXpm linker options.
+ + Removed Xaw file selector auto raising since it could send the
+ X server into a busy loop when the file selector was over a window
+ that should always stay on top.
+ + Removed t1mapper man page install (script wasn't installed either).
+ + Fixed #926055:
+ - Default printing target not set correctly when printing window
+ was initialized.
+ - `-t' paper options were just appended instead of replacing the
+ existing ones.
+ - Current directory of dvips was that of xdvi invocation instead
+ of DVI file path, causing e.g. problems with included EPS files.
+
+ * 22.81.1 (2004/03/17):
+ + Upgrade to kpathsea 3.5.2, and use lookup in new locations
+ kpse_enc_format and kpse_type1_format for .enc files and .pfa/.pfb
+ files, respectivly. (Lookup in old locations is preserved for
+ backwards compatibility).
+ + Upgrade to t1lib version 5.0.2, and and additional off-by-one bugfix
+ for MAXPATHLEN.
+ + Added support for libtool, as in teTeX-beta, and resync'ed with
+ the teTeX sources (many thanks to Thomas Esser for helping with
+ this!)
+ + Fixed a failed assertion when pressing `Shift-r' (reload) after
+ a DVI file had been deleted (also reported by Thomas Esser), and
+ a problem with the `-unique' option not always reloading the file
+ as it should (idem).
+ + Added <ESC> key bindings to close some dialogs (suggested by Bernhard
+ Walle in #912671).
+ + Close dependent windows when parent is closed (e.g. warning popups
+ for the save dialog).
+ + Made the `editor' X resource deal correctly with quoted arguments
+ (for arguments containing spaces; see #907714).
+ + Additinally support the paper formats `letter', `ledger' and `tabloid'
+ for better dvips compatibility, suggested by Dragan Milicic.
+
+ * 22.81 (2004/02/24):
+ + If no --with-toolkit option was given, check if Motif is available,
+ and use it if it is; else, use Xaw. (Use --with-toolkit=xaw to override
+ this default).
+ + Problem with flashing redraw of highlighted region when partially
+ obscured by another window reported and fixed by Zhang Lin-bo.
+ + Fixed #870323 (an error in the online help).
+ + Fixed #880550 (documented Ctrl-s; add default _pp suffix
+ to filenames only when saving partial files).
+ + Added an option '-findstring' for string search from the command
+ line, similar to inverse search.
+ + Improved character name detection in string search by using
+ T1lib function T1_GetCharName().
+ + Fixed #883708 (oversplitting of forward search markers).
+ + Fixed #876815 (closing search window failed under certain conditions).
+ + Fixed a race condition with hyperlinks and browser startup that might
+ lead to `unknown op-code' crashes, reported again by Zhang Lin-Bo.
+ + Workaround for #884290 (drag&drop in file selector freezes xdvi/X)
+ by disabling drag&drop. Thanks to Bernhard Walle for reporting the bug
+ and suggesting the workaround.
+ + Fixed #885464 (wrong parent window in message popups) by passing in parent
+ widget.
+ + Upgraded to t1lib version 5.0.1.
+ + Implemented a simple page history (feature request #884674).
+ + Implemented hyperref specials inserted by \usepackage[dvips]{hyperref}
+ (feature request #662096).
+ + Fixed wrong page number initialization when going back a hyperlink
+ to a different file (#902073).
+
+ * 22.78 (2003/12/12):
+ + Improved test for iconv lib to make it work on Mac OS X
+ (reported by Artemio Gonzalez Lopez,
+ http://sourceforge.net/mailarchive/forum.php?thread_id=3535253&forum_id=2244).
+ + Added more encodings for string extraction/search, reported
+ by Ulrich Scholz (#850787).
+ + Fixed a bug with redrawing the page after file had been reloaded
+ by `-watchfile', and a crash when using find while file was
+ reloaded (#850795), again reported by Ulrich Scholz (many thanks!)
+ + Force C locale when converting X resources to numbers, so that
+ `.' is used as decimal point (#855950 - many thanks to Martin Vaeth
+ for finding this bug).
+ + Fixed a bug when loading first file via the file selector,
+ reported by Dragan Milicic.
+ + Fixed a bug with inverted highlighting not working on Solaris,
+ again reported by Ulrich Scholz (#850788)
+ + Don't close file selector if opening the new DVI file failed
+ (feature request #851545, again by Ulrich Scholz).
+ + Implemented a0/a0r and other missing DIN A/B/C formats (feature
+ request #852431).
+ + Fixed wrong binding for XmDIALOG_OK_BUTTON instead of XmDIALOG_CANCEL_BUTTON
+ in create_dialogs().
+ + Fixed a bug with hyperlinks that wrapped across several lines
+ and pointed to another page: these were highlighted as visited
+ only when region was exposed the second time.
+ + Fixed a compatibility problem with fork/vfork on Mac OS X, as in
+ xdvi-22.78.
+ + Added a `creating fonts' info window before main window is mapped
+ (just a preliminary hack, no replacement for truly asynchronous
+ font creation, since that window also feezes during font creation;
+ see also feature request #614708).
+ + Fixed a bug with width computation of initial window with
+ `-expertmode 0'
+ + Workaround by Zhang Lin-Bo for bug #856547 (presumably a
+ race condition with GS_PIXMAP_CLEARING_HACK and scanned_page_*
+ global variables).
+
+ * 22.77.3 (2003/11/25):
+ + Fixed a few compilation problems on Solaris (#827454, and
+ headers in print-internal.c).
+ + Added an option `ignore hyphenation/linebreaks' for string search.
+ + Use inverse highlighting instead of drawing bounding box,
+ as in Acroread/xpdf, implemented by Zhang Lin-Bo.
+ + Make the pagelist use physical pages by default, unless
+ `UseTeXPages' option is used.
+ + Made search settings honour the X resources for setting
+ checkboxes (suggested by Reiner Steib).
+ + Made the `Home' and `End' buttons go to the top and bottom
+ of the page, and Ctrl-Home and Ctrl-End to the first and last
+ page of a document, respectively.
+ + Added the forgotten directory texk/xdvik/texmf-alt for
+ non-current-teTeX systems.
+ + Fixed an X error with toggling fullscreen mode when
+ -fullscreen option had been used (thanks to Zhang Lin-Bo
+ for reporting it).
+ + Fixed an off-by-one error in string backwards search that
+ had made it skip every second match for matches of length 1.
+ + Removed the -DOmega define and made Omega a runtime option that
+ is enable by default and can be disabled via the -noomega
+ command-line option or the `Omega' X resource.
+ + Removed the --disable-htex compilation option.
+ + Added support for CJK fonts when saving a file as UTF-8,
+ and when searching in a file with such fonts (many thanks
+ to Zhang Lin-Bo for providing the patches).
+ + Made toolbar.xpm obey the current window background colors.
+ + Fixed a crash when saving a DVI file with empty pages
+ in text format (again reported and fixed by Zhang Lin-Bo).
+ + Fixed a crash when opening nonexisting files via the file
+ selector in Motif (again reported by Zhang Lin-Bo).
+ + Fixed a crash with GS_PIXMAP_CLEARING_HACK when toggling
+ gs_alpha on a page with PS graphics (again reported by
+ Zhang Lin-Bo).
+ + Fixed broken `Print to file' option, and wrong page numbers
+ passed to dvips when `P' has been used to assign a different
+ page number to the current page
+ + Added string `physical pages' to print popup (#841434)
+
+
+ * 22.77.2 (2003/10/18):
+ + Implemented support for additional file formats in save dialog:
+ PS, PDF, DVI, and plain text (in ISO-8859-1 and UTF-8).
+ + Implemented string search in DVI files (feature request
+ #470389).
+ + Fixed an incompatibility with X11R5 (#803642; thanks to
+ Ulrich Scholz for his help with debugging this).
+ + Fixed a problem with the cursor masks on some X displays
+ (#804294, again reported and debugged by Ulrich Scholz).
+ + Fixed a problem with the initial tooltip window having
+ the wrong (too large) size on some systems (#802806; thanks
+ to Kostas Oikonomou for help with debugging this).
+ + Also dump PS header files (e.g. psfrag.pro) to partially saved
+ or printed files.
+ + Fixed a security problem (tmp race) with xdvizilla (#812600;
+ thanks very much to Thomas Esser for help with fixing this).
+ + Used another workaround for the Ghostscript `alpha' driver
+ problem with not erasing previous images: Call `erasepage'
+ explicitly for pages with PS graphics (#633420; many thanks
+ to John Bowman for providing a patch).
+ + Fixed a bug with --datadir or --prefix being overwritten by
+ default TEXMFMAIN if they didn't contain a valid texmf tree
+ (#814004; thanks to Han-Wen Nienhuys for reporting this).
+ + Fixed a typo in the Motif menu accelerator for set-gs-alpha()
+ (`V', not `0v', also reported by Han-Wen Nienhuys).
+ + Fixed bug #814328 (prevent Ctrl-l from changing position
+ when switching back from fullscreen mode).
+ + Fixed bug #810501 (`keep position' value was lost when resizing
+ to fullscreen had removed the scrollbars). Thanks again to
+ Ulrich Scholz for reporting these bugs.
+ + Fixed a typo in the manpage, and broken redrawing of page
+ (again reported by Ulrich Scholz, #819937).
+ + Also resolve symbolic links in the main DVI name; this should
+ improve the behaviour with inverse search, cf. #768817,
+ and the search for e.g. embedded graphics or hyperlinks.
+ + Use ',' as separator for command-line debugging options
+ instead of `|'.
+ + Fixed a linker problem with multiple definitions on Cygwin.
+
+
+ * 22.77.1 (2003/09/06):
+ + Fixed the support for the window manager `delete' protocol
+ for Xaw.
+ + Fixed bug #797171 (BadValue X error when toggling expert
+ mode on Solaris; thanks to Erik Frisk for helping me with
+ debugging this).
+ + Fixed a bug introduced in 22.76 with wrong argument to
+ kpse_set_program_name(), which results in kpathsearch
+ not finding font files etc. properly if SELFAUTODIR is used.
+ Reported by Erik Frisk. (And a fix to that fix, reported
+ by Dragan Milicic.)
+ + Fixed obsolete link in the `New Features' Help menu entry.
+
+ * 22.77 (2003/08/25):
+ + Fixed bug #784204 (failed assertion with Motif at startup)
+ + Removed the check for the DVI file inode number in forward
+ search, since (as opposed to original xdvi) xdvik expands the
+ DVI filename to a full path, so it's sufficient to match the
+ full path.
+ + Fixed bug #779521 (crashes when printing with temporary file
+ enabled; thanks to Bernhard Walle for spotting this).
+ + Fixed bug #769025 (saving the DVI file may result in a corrupted
+ copy; thanks to Ulrich Scholz for reporting and help with
+ debugging it).
+ + Always dump `literal' PS specials (starting with `!') to
+ the output file, otherwise things like draftcopy won't work
+ for partially saved DVI files.
+ + New application icons (lion with `X').
+
+ * 22.76.1 (2003/06/28):
+ + Implemented a -watchfile option, as in gv (#547137).
+ + Implemented feature request #759865: To avoid `DVI file
+ corrupted' messages (and some race conditions with the
+ drawing routines that might result in `bad opcode' errors
+ when paging through a DVI file while it is being written by
+ TeX), xdvik now creates a backup version of the file being
+ viewed. This file is swapped with a fresh version of the
+ original each time the original file has been written
+ completely by TeX. The command line option `-notempfile'
+ can be used to revert to the previous behaviour (no
+ temporary file).
+ + Fixed a bug with up-or-previous() and down-or-next()
+ ignoring keep flag (which broke gs display, since that
+ relied on home()).
+ + Enabled XtAppAddTimeout() for Xaw, just like for Motif.
+ + Removed the STATUSLINE conditional compilation (which was
+ broken).
+ + Added a `pixels' ruler unit.
+ + Implemented a workaround for the `stale pixmaps' problem
+ with the gs x11alpha driver (#633420), by first drawing a
+ rectangle in background color of the size of the bounding
+ box to clear the pixmap.
+ + Fixed bugs #762621 (-sourceposition and -unique didn't fork
+ properly) and #762765 (printing/saving of marked pages was
+ broken) in the (withdrawn) version 22.76; thanks to
+ Zhang Lin-Bo and Bernhard Walle for reporting these bugs.
+ + Removed the XPM application icon used since xdvik-22.74, after it
+ became apparent that it was a plagiarized version of OzTeX's icon
+ (in an older version). Reported by OzTeX's author Andrew Trevorrow;
+ our sincere apologies to him.
+
+ * 22.74.3 (2003/06/17):
+ + Security fix for MIME types: Escape all special characters
+ (e.g. backticks) in the filename argument to prevent execution
+ of malicious shell code when launching a MIME viewer.
+ + Fixed a bug in the up-or-previous() action (#754805; thanks
+ to Bernhard Walle), and changed the behaviour of the `keep'
+ flag so that up-or-previous() and down-or-next() ignore it
+ (after all, the ordinary up() and down() actions will already
+ keep the position, so they can be used instead if you don't
+ want the scrolling).
+ + Made XBell honour the bell volume (set e.g. by xset; #751763;
+ thanks to Bernhard Walle for reporting this).
+
+ * 22.74.2 (2003/06/01):
+ + Fixed a bug with `.dvi' extension not being added if file had a
+ `.' in it (#743876; thanks to Markus Kohm for noting it). Now
+ the algorithm is the same as in non-k xdvi for files passed on
+ the command line. For files opened via hyperlinks, no extension
+ is added.
+ + Fixed a bug with wrong topic name in `Help' pulldown menu
+ (#743280; thanks to Bernhard Walle for reporting this).
+ + Fixed another bug with Omega .vf font searching (#746551;
+ thanks to Alexej Kryukov for reporting it).
+
+ * 22.74.1 (2003/05/25):
+ + Fixed bug with misplaced link underlining when first character in
+ the link is an accented composite character (#737643; thanks to
+ Christian Ullrich for spotting this).
+ + Made forward search also work when file had been changed
+ and not yet reloaded (#738387).
+ + Fixed typos in `-expertmode' description in man page
+ (followups to #737019).
+ + Fixed a compilation problem when --disable-t1lib is used
+ (thanks to Ross Alexander for providing patches).
+ + Fixed a bug with `-s n' argument not working when -fullscreen
+ is given as well, reported by Zhang Lin-Bo.
+ + Fixed a bug with forward search not warning when it hadn't found
+ the file name in the specials.
+ + Made forward search canonicalize all `../', `./' and `//' in
+ the `-sourceposition' argument and in the source specials.
+ + Fixed a bug with window size not being reset correctly when
+ activating expert mode in fullscreen mode (Xaw).
+ + Added a help topic for `ruler mode'.
+ + Fixed a bug with the icon and Xaw menu code causing
+ BadMatch X errors (#740982).
+ + Setting mouse translations in Motif's `mainTranslations'
+ erroneously disabled the default pagelist translations (reported
+ by Zhang Lin-Bo).
+ + Made usage() output the options in sorted order (thanks to
+ Nelson Beebe for the patch).
+ + Added a `-unique' option (as in KDVI) for loading a new file
+ into a running instance of xdvik.
+ + Fixed a bug with the Motif `PS' options menu (#743085; thanks to
+ Bernhard Walle for finding this).
+ + Fixed a bug with xdvi always appending a `.dvi' extension even if
+ the file already had an extension (#743182; thanks to David Feest
+ for noting this).
+ + Fixed two bugs with compilation under Cygwin (-lXpm linker option
+ too early, and MAX() not defined in xaw_men.c; thanks to Geoffrey
+ Vallis for reporting these).
+ + Fixed a bug with scroll_page_if_needed() being called with wrong
+ arguments if forward search hadn't found a glyph and used the
+ special hotspot instead.
+
+ * 22.74 (2003/05/14):
+ + New option/X resource `-expertmode <n>' option replaces
+ `-statusline', `-toolbar' (and effectively also
+ `-expert', which is only supported for backwards
+ compatibility). This should fix bug #737019 and make
+ the interoperation of the various expert settings more
+ evident.
+
+ * 22.74-beta4 (2003/05/13):
+ + Fixed a bug with Omega and T1fonts (thanks to Hossein
+ Movahhedian for reporting it).
+ + Fixed a bug with t1lib not correctly setting dvi_adv
+ for .notdef chars (thanks to Zhang-Lin Bo for spotting it
+ and providing a patch).
+ + Added configure check for including `-lXpm' option.
+ + Fixed a bug with tooltips sometimes popping up without
+ the pointer being over them.
+ + Fixed a bug with the -statusline option causing a segfault
+ when toggling -expert mode (#721807, thanks to Axel Riese).
+ + Expert mode now also removes the scrollbars (#718224);
+ menu bar/status line are togglable independently.
+
+ * 22.74-beta2 (2003/03/27):
+ + Added Paul's fix for the Solaris core dump problem, and
+ re-enabled the Motif timer fix for #674992. (Special thanks
+ to Dragan Milicic for help with debugging this.)
+ + Fixed a bug with the NumLock key disabling lowercase
+ key accelerators (#708935; thanks to Diego Santa Cruz
+ for spotting this.)
+ + Replaced MIMELIBDIR and MAILCAPDIR by the more standard
+ path definitions EXTENSIONMAPS and MAILCAPS (RFC 1343).
+ Mailcap parsing now honours the `test=' and `needsterminal'
+ fields.
+ + Improved `Usage' output by showing the option that hadn't
+ been recognized (suggested by Gabriel Zachmann).
+ + Fixed bug that instance that last had focus wasn't used for
+ forward search when there were several instances of xdvi
+ displaying the same file (#619070).
+ + Fixed xdvizilla permissions on install (#705158).
+ + Fixed a bug with the OLD_XAW detection in the configure script
+ (reported by Reiner Steib).
+ + Made hyperlinks also work with image anchors. (Thanks to
+ Gabriel Zachmann for spotting this.)
+
+ * 22.74-beta1 (2003/03/20):
+ + Reverted change for bug #674992 since it causes core dumps
+ on Solaris.
+ + Fixed wrong values for b6(r) and b7(r) paper sizes.
+ + Added warning about not implemented `hdvips' specials
+ + Fixed bug with PgUp/PgDown key (#610206; thanks to
+ Ingo Krabbe for finding the fix).
+ + Fixed a const/_Xconst mismatch (#693647; thanks to
+ Matthias Koeppe for spotting it).
+ + fixed a few hyperref bugs with links of the form
+ file:foo#target not working properly (#693306; thanks
+ to Kostas Oikonomou for finding this), and a memory
+ corruption caused by the -anchorposition argument.
+ + Upgraded to kpathsea 3.4.5.
+ + New layout for help window (topics list in left pane).
+
+ * 22.73-beta1 (2003/02/23):
+ + Fixed bug with Motif print log hanging (#674992, as in
+ xdvi-22.72), and another race condition with the print
+ process (as in xdvi-22.73).
+ + Fixed segfault that happened when starting without PS rendering
+ and switching it on later (#684880)
+ + Fixed a bug with underlines positioned too low on wrapped hyperlinks
+ (#685652)
+ + Made text fields in print dialog resize when window is resized.
+ + Made popups respect the window manager closing/destroy action
+ + Print command now may contain pipes (#685235).
+ + Added resources `dvipsHangTime' and `dvipsFailHangTime' for
+ customizing the time the dvips print log remains open
+ (#684620).
+ + Implemented simple but hopefully effective `ruler mode'
+ (feature request #525129).
+ + Removed the old `grid' mode, which didn't have any real
+ purpose at all.
+ + Fixed description of the `-pause' option in the man page.
+
+ * 22.71-beta1 (2003/02/10):
+ + New Xaw GUI layout: pulldown menus instead of buttons,
+ added a page list for easier navigation.
+ + New Motif GUI layout, including a toolbar and a page list.
+ + Removed libwww; use web browser instead to retrieve
+ remote documents.
+ + Added support for color specials (as in xdvi-22.50), and
+ colored hyperlinks.
+ + Added support for papersize specials (as in xdvi-22.66).
+ + Added page list for easier navigation.
+ + Added `Print' (as in xdvi-22.53) and `Save' dialogs.
+ + Added a fullscreen mode (works reliably with Motif only)
+ and a simple `pause' feature
+ + Added string debugging options (e.g. `-debug T1').
+ + Swapped the DBG_PS (64) and DBG_OPEN (32) debugging options,
+ so that the kpathsea options now are a continuous range.
+
+ * 22.40y1 (2003/08/24):
+ + Fixed a typo in xdvi.c and in the man page (X resource is
+ called t1lib, not not1lib). Reported to debian-tetex-maint
+ by Matt Swift.
+ + Fixed a segfault occuring when loading nonexistent graphics
+ files if the filename or PSfile special contains `:' (#793395;
+ many thanks to Frank Küster for help while debugging this).
+ + NOTE: 22.40y is now considered `frozen' and will not be further
+ developed; only major bugs (which we don't expect at this point)
+ will be fixed. Users and distributors are asked to switch to the
+ 22.7x branch instead.
+
+ * 22.40y (2003/06/06):
+ + Fixed a bug with Omega .vf font searching (#746551);
+ as in 22.74.2.
+
+ * 22.40x (2003/04/23):
+ + Fixed a bug with .tfm files not being produced for
+ Type1 fonts for which mf sources exist, posted to dctt
+ (<slrnbaaj4g.1h4.Bernhard.Walle@news.bwalle.de>).
+
+ * 22.40w (2003/04/06):
+ + Fixed wrong values for b6(r) and b7(r) paper sizes
+ + Added warnings about not implemented `hdvips' specials,
+ and when requesting .notdef glyphs from a type1 font
+ + Added executable permissions to xdvizilla (#705158)
+ + Fixed a memory corruption bug when opening links to
+ local files fails (#715793)
+
+ * 22.40v (2003/02/01):
+ + Replaced all strdup() instances by xstrdup().
+ + Fixed a compatibility problem with AIX3 in xserver-info.c.
+ + Some documentation changes (README.t1fonts, README.t1mapper).
+
+ * 22.40u (2003/01/18):
+ + Fixed bug #669426 (scrolling the message popups could
+ result in BadMatch X Errors in case xdvi's color depth was
+ larger than the default depth of the screen).
+ + Updated to kpathsea 3.4.4.
+ + Some minor changes in documentation and status messages.
+
+ * 22.40t (2002/12/27):
+ + Fixed some prototype declarations.
+ + Made shell command in xdvi-search.el also work with (t)csh
+ (#649173).
+
+ * 22.40s (2002/11/30):
+ + Update for changed EPS handling in ghostscript 8.00,
+ which had caused previous xdvi(k) versions to hang (#644702).
+ + Replaced the startxdvi script by internal subshell handling
+ in xdvi-search.el, as suggested by Thomas Gerds
+ <gerds@paracelsus.fdm.uni-freiburg.de>.
+
+ * 22.40r (2002/11/14):
+ + Prevent the magnifier from popping up in the button panel.
+ + Removed vsnprintf() from wwwfetch.c.
+ + Fixed return value in xdvi_exit().
+
+ * 22.40q (2002/11/12):
+ + Fixed broken configure check for memicmp().
+ + Fixed a glitch in the fontname hash table lookup.
+ + Fixed a broken prototype with display postscript.
+
+ * 22.40p (2002/11/10):
+ + Fixed --version and --help options (#626569).
+ + Fixed a bug with TT fonts in X giving an error with the file
+ selector (#627607)
+ + Used kpathsea hash table to speed up processing of large .map
+ files.
+ + Added help page on mouse buttons.
+ + Added X server info for ease of debugging.
+
+ * 22.40o (2002/10/17):
+ + More changes for ANSI C; fixed a few compilation problems
+ on Tru64 v5.1, HP-UX-10.20 and Mac OS X.
+ + Upgraded to kpathsea v.3.3.8, and libwww version 5.4.0.
+ + Show numerical prefix in the statusline.
+ + Fixed a bug with `FIXME_ps_lock' not being defined when
+ configuring "with-ps=dps" (thanks to Norman Wattenberg
+ for reporting and fixing it).
+ + Improved warnings about incorrect papersize options.
+ + New actions do-href() and do-href-newwindow() to allow
+ binding a mouse event independent of magnifier binding.
+ + Some additions to the man page.
+ + Fixed bug #518761: Xdvik won't exit(1) any more when
+ there had been a problem parsing a Type1 encoding or font file.
+ + Fixed bug #619632: try Type1 fallback first, then PK
+ fallback, and generate PK fallback if it's not already present.
+ + Added a wrapper script `xdvizilla' that makes xdvi act as a
+ Mozilla helper application, which can also deal with .tar files.
+
+ * 22.40n (2002/09/15):
+ + Fixed a few bugs in xdvi-search.el (thanks to Reiner Steib
+ for spotting them, and suggesting patches)
+ + Merged in changes for libs and configure from teTeX-beta
+ (had been planned only for HEAD, but the situation became
+ too messy) - thanks to Thomas Esser for the great work in
+ teTeX that made this much easier ;-)
+ This means that --with-system-wwwlib and --with-system-t1lib
+ now finally work properly.
+ + Removed K&R compatibility macros to address bugs with gcc 3.2
+ on Solaris, and simplify the setup.
+ Users who really need K&R support should look at Paul Vojta's
+ version of xdvi instead: http://math.berkeley.edu/~vojta/xdvi.html
+ + Added progress indicator for file downloads
+
+ * 22.40m (2002/09/14):
+ + Same as 22.40n, except that the depend.mk file had contained
+ references to locally installed libwww headers that had made it
+ unusable.
+ For that reason, 22.40m was withdrawn and replaced by 22.40n.
+
+ * 22.40l (2002/09/01):
+ + Fixed a memory leak (#599082, discovered and patched by
+ Nobuyuki Tsuchimura)
+ + Updated configure to deal with Mac OS X (bug #597977)
+ + Change rules for multiple entries in .map files: Now later entries
+ override previous ones, which is the same behaviour as dvips. Also,
+ xdvik now gives a warning if such a case occurs.
+ + Fixed a memory corruption bug that could occur when
+ switching from a file for which PK font creation failed to
+ another file in the file selection dialog
+ + Documentation changes and minor GUI changes (button positions,
+ re-introduce `First' and `Last' buttons that had been lost
+ in some previous change, de-iconify window on forward search)
+ + Fixed a bug with values <= 0 for the `+page' option causing
+ xdvi to exit ungracefully (#601722, again discovered and patched by
+ Nobuyuki Tsuchimura)
+
+ * 22.40k (2002/05/21):
+ + Fixed bug #559113 (segfault with large .map files)
+ + Fixed a bug in 22.40j with magnifier sometimes not
+ appearing for files opened via the file selection dialog
+
+ * 22.40j (2002/04/30):
+ + Fix the compatibility problems with Ghostview v.7.04 and
+ 7.20 (see the thread "xdvi 22.40i status" in the tex-k
+ mailing list, and feature request #525127).
+ + Fix bug #550357 that might cause segfaults when doing a forward
+ search on a corrupted DVI file.
+ + Replace grid1, grid2 and grid3 resources/options by
+ rulecolor resource/option, and make grid and magnifier
+ window use this resource.
+ + Fix a typo in lucida.map (replaced 850 by .850)
+
+ * 22.40i (2002/04/08):
+ + Fixed buffer overflow bug in hypertex.c that broke opening
+ a new xdvi instance with Mouse-2 on hyperlink
+
+ * 22.40h (2002/03/19):
+ + Removal of t1lib documentation and sample fonts reduces
+ package size from 3MB to 2MB.
+ + Fix hyperref bugs #505100 and #473361, and a failed assertion
+ when starting a command (e.g. the EDITOR) fails with no output.
+ + Additional configure options for xaw3d and neXtaw.
+
+ * 22.40g (2002/01/08):
+ + Upgrade to t1lib v1.3.1.
+ + Fix bug with XInternAtoms not available in X11R5.
+ + Fix bug #478034 (shell escapes were incorrectly treated as URLs).
+ + Fix bug #500386 (wrong scaling of faked small caps fonts).
+ + Don't exit with usage message when n in the `+n' command line
+ option (for goto-page) exceeds the total number of pages, but go to
+ the last page instead.
+
+ * 22.40f (2001/11/02):
+ + Updgrade to t1lib v1.2.
+ + Fix a t1lib rendering bug with mfmodes different from 600dpi (#474213).
+
+ * 22.40e (2001/10/09):
+ + fixed a serious bug in previous version: libwww_wrapper_HTLoadToFile
+ (use of xfopen) caused an infinite recursion when saving a remote file
+ to disk.
+ + minor change in README files
+
+ * 22.40d (2001/10/08):
+ + Use libwww_wrapper_HTLoadToFile to make xdvik more immune to libwww bugs
+ and interface changes.
+
+ * 22.40c (2001/08/06):
+ + Fix some T1 font sizing problems when switching between
+ documents (#441029, #443743)
+ + Fix a memory leak with popup windows
+ + Fix a libwww bug (segfault with invalid URIs, #434836)
+ + Improve error messages when fetching remote files fails
+ * 22.40b (2001/06/18):
+ + Fix bug with popup windows causing BadMatch X errors
+ under certain color settings (reported by T. Esser; patch from
+ xdvi-22.42).
+ * 22.40a (2001/06/07):
+ + Speed up T1 font loading by disabling afm files.
+ + Change .enc file handling to use same format as dvips
+ (requires update of xdvi.cfg).
+ + Fix a bug with `OK' button not working when several popups
+ are active.
+ * 22.40 (2001/06/01):
+ + Fix some segfaults with font generation and popup
+ windows on Solaris (thanks to T. Esser for reporting and helping
+ to fix).
+ * 22.39 (2001/05/28):
+ + Direct rendering of T1 Postscript(TM) fonts with t1lib.
+ + Source special support (forward + backward search) as in
+ xdvi.
+ + New GUI elements: statusline, message windows, help window.
+ + New event and action handling (from xdvi), with configurable
+ buttons.
+ + New actions: drag canvas with mouse, smooth scrolling with
+ arrow keys, and minor adjustments of other actions.
+ + Minor changes in hyperref and mime handling code to make it
+ more robust.
+ * 22.15 (1999/08/22):
+ + Compiles and works on SunOS 4.
+ * 22.08c (1999/06/15):
+ + The message 'Not a DVI file' accompanied by
+ xdvi terminating should be a lot more rare now. The mime-typing
+ and href mechanism was fixed somewhat.
+ * 22.08b (1999/06/12):
+ + Compressed PS files on more than one page
+ works better. Gets rid of /tmp/xdviXXXXX0: file exists messages
+ and the wrong PS graphics on the wrong page.
+ * 22.08 (1999/06/11):
+ + The "Help" button reappears.
+ * 22.05b (8/5/1999):
+ + Prototype and variable declaration fixups.
+ * 22.04 (1999/02/11):
+ + Adapt cleanup code to the k version. xdvik uses
+ a directory for tmp files, xdvi does not. Other tmp file cleanups;
+ it should be possible to access documents with more than 3
+ included figures by http now.
+ * 22.01 (1999/02/15):
+ Beta release again.
+ + Fix for (rare?) file-descriptor overflow.
+ + Fix for compilation warning about urlocalize
+ + Added `tags' target in top Makefile
+ + 22 would always use the antialiasing device of gs. Fixed.
+ * 22 (1999/02/05):
+ + Stable release. Sync with Paul Vojtas xdvi-22.
+ There are no functional changes since the last release, only some
+ tidying up.
+
+ Changes made during the xdvik-21 cycle:
+ * Documentation updates
+ * Numerous porting enhancements: In particular native and addon CCs
+ of AIX, HP-UX and Solaris now works.
+ * Several small cosmetical fixes.
+ * Clearification of copyright and licesing terms in documentation
+ and --version information.
+ * The percent lables on the shrink buttons are back. They also have
+ good shrink factors for both 300 and 600 dpi resolutions. Anyone
+ using 1200 dpi fonts with xdvi are welcome to contribute a patch
+ for that.
+ * Percent labels on user specified shrink buttons.
+ * Got rid of SIGSEGV when showing figures in dvi files whose path
+ contains / (ie. other than in .)
+ * Got rid of SIGSEGV when showing figures in remote (http:, ftp:)
+ files. Doing
+ xdvi http://www.math.uio.no/~janl/tex/tex.dvi
+ now works, with figures and all. Except if they're compressed.
+ * On IRIX and DEC-Unix, if your X libs are in a nonstandard place,
+ so that -L/path/X11 is needed, you also need -Wl,-rpath,/path/X11.
+ Autoconf already supported Solaris' -R.
+ * The Reopen button and automatic redisplay when the dvi file was
+ updated was broken. This will also make it reopen web retrived
+ files. If it will serve as the reload button in a WWW browser is
+ another matter entierly though.
+ * xdvi could not open the old file if Cancel was selected in the
+ selfile dialogue.
+ * The filename returned from the selfile dialogue was not being
+ URLized as it should.
+ * Use tempnam(3) to generate temporary directory name
+ * Reorganized to same hierarchy as upcomming teTeX 0.9 and tex-k 7.3
+ releases, by Thomas Esser.
+ * Update of libwww and kpathsea also by Thomas Esser.
+ * The shrink buttons work better. Patch by Keith Refson.
+ * Missing / in xfilepath in xdvi-sh
+ * Omega xdvik compilation problems fixed
+ * Selfile fix from Dr. Werner Fink helps the CANCEL button to work.
+ * mime.c patch from Allin Cottrell makes hypertex browsing more
+ reliable.
+ * xdvik always assumed that #foo is a URL fragment reference and
+ removed it unconditionaly. Emacs uses # as temporary file prefix
+ (and infix) and so emacs' TeX mode produced .tex and thus .dvi
+ files with # in the name. Problem found by many and solutions
+ suggested by many. Only remove #foo if the dvi name is an URL. To
+ open local files you had better not use URL format ;-)
+ * xdvik 21.21 was produced from xdvik 20c and xdvi-21.21. Two whole
+ days of work to get the merge sane.
diff --git a/Build/source/texk/xdvik/ChangeLog b/Build/source/texk/xdvik/ChangeLog
new file mode 100644
index 00000000000..bfb06942ce8
--- /dev/null
+++ b/Build/source/texk/xdvik/ChangeLog
@@ -0,0 +1,393 @@
+2020-03-02 Karl Berry <karl@freefriends.org>
+
+ * main.c (is_good_dvi_file): avoid using strnlen, not present
+ on Solaris.
+ https://tug.org/pipermail/tlbuild/2020q1/004659.html
+
+2020-03-01 Karl Berry <karl@freefriends.org>
+
+ * Import xdvi-22.87.04 from
+ https://sourceforge.net/projects/xdvi/files/xdvik, includes
+ changes made here.
+
+2019-07-22 Karl Berry <karl@freefriends.org>
+
+ * psgs.c (initGS): don't use now-gone-from-ghostscript execute
+ operator; from Paul Vojta.
+
+2019-05-31 Karl Berry <karl@freefriends.org>
+
+ * ac/xdvik.ac (xdvi-x-toolkit): the default is always xaw,
+ and has been for a long time. Nelson mail to tlbuild,
+ 31 May 2019 11:39:52.
+
+2019-03-25 Karl Berry <karl@freefriends.org>
+
+ * xdvi.1.in: omit unused second font letter for option names.
+ From Debian.
+
+2018-01-17 Karl Berry <karl@freefriends.org>
+
+ * xdvi.1.in: remove trailing whitespace to placate Debian.
+ Use \& instead of "," after end-of-line "e.g." for consistency.
+ Remove spurious doubled words.
+
+2018-01-17 Norbert Preining <norbert@preining.info>
+
+ * add .desktop file
+ * Makefile.am: add desktop file installation
+
+2017-08-07 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
+
+ * Makefile.am: config.xdvi is installed under
+ texmf-dist/dvips/xdvi, not texmf-dist/dvips/config.
+
+2016-04-06 Karl Berry <karl@tug.org>
+
+ * Import xdvik-22.87.03.
+
+2015-04-17 Karl Berry <karl@tug.org>
+
+ * psheader.txt (/psfts, /startTexFig, /doclip, /endTexFig):
+ remove these defns from (obsolete and nonfree) psfig.
+ Report from Werner Fink, 14 Apr 2015 17:16:23.
+
+2014-12-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xdvi.c (set_windowsize): Use "%u" to print unsigned int.
+ * hypertex.h: Correct typo in spelling of header guard.
+
+2014-06-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * encodings.c: Do not compile close_iconv() when not used.
+ * translations.h: Do not #include "c-auto.h".
+ * xdvi.h: Do not #include "c-auto.h" and "kpathsea/c-auto.h".
+
+ * m4/xdvi-xinput-2-1.m4: Test link instead of compile step.
+
+2014-06-19 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * ft.c, gui/xaw_menu.c, hypertex.c: Avoid undefined behaviour
+ when char is signed.
+
+2014-06-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * squeeze/Makefile.am: Drop the obsolete ACLOCAL_AMFLAGS.
+
+2014-05-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * m4/xdvi-xinput-2-1.m4: Change the default to disable 'smooth
+ scrolling' for native TL build.
+
+2014-04-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Imported xdvik-22.87.tar.gz
+ from http://sourceforge.net/projects/xdvi/files/xdvik/.
+
+2013-09-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Drop ACLOCAL_AMFLAGS.
+ * configure.ac: Use AC_CONFIG_MACRO_DIRS.
+
+2013-07-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * *.[ch], gui/*.[ch], tests/*.[ch]: Include "xdvi-config.h"
+ first in all compilable source files but not in headers, as
+ claimed in a comment at the top of xdvi-config.h.
+
+2013-07-01 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * font-open.c, psdps.c, xdvi.h: Replace bcopy(f, t, l) =>
+ memcpy(t, f, l).
+ * psgs.c: Replace rindex() => strrchr().
+
+2013-06-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xlwradioP.h: May need to #include <X11/Xaw/XawInit.h>.
+
+2013-06-27 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Drop variables that are set but not used:
+ * dvi-draw.c: 'actual_w'.
+ * events.c: 'arg_bak' and 'clear_statusline'.
+ * gui/print-dialog.c: 'dest_label' and 'range_label'.
+ * gui/search-dialog.c: 'timeout'.
+ * hypertex.c: 'x_delta'.
+ * special.c: 'found' (two times).
+ * xdvi.c: 'exclusive'.
+
+2013-06-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * m4/xdvi-check-iconv.m4: Somewhat improved logic.
+
+2013-04-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Imported xdvik-22.86.tar.gz
+ from http://sourceforge.net/projects/xdvi/files/xdvik/.
+
+ * Makefile.am: Renamed ChangeLog.TL => ChangeLog.
+ (install-data-hook): Make sure $(DESTDIR)$(dvipsconfdir) exists.
+
+ * util.c (find_str_int_hash): Return type of hash_lookup() is
+ 'const_string *'.
+
+ * ft.c (read_ft_char): Count bmTypeT words instead of bytes and
+ avoid cast causing 'strict-aliasing rules' warning.
+
+2013-02-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am (xdvidir, pixmapdir): Change texmf => texmf-dist.
+
+2012-12-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * util.c: Adapt to modified hash_lookup() return type.
+ * Makefile.am, squeeze/Makefile.am: Enable silent rules.
+
+2012-11-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am, tests/Makefile.am: Avoid use of deprecated INCLUDES.
+
+2012-04-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Remove some obsolete comments.
+
+ * m4/xdvi-check-iconv.m4, m4/xdvi-check-langinfo.m4,
+ m4/xdvi-func-working-vsnprintf.m4: Update copyright statements
+ with info provided by Paul Vojta <vojta@math.berkeley.edu>.
+
+2012-04-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xdvi.c (run_dvi_file): Avoid unaligned access on some 64-bit
+ systems. Mail from Nelson H. F. Beebe <beebe@math.utah.edu>
+ [tlbuild] Mon, 16 Apr 2012 18:48:34.
+
+2012-04-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Imported xdvik-22.85.tar.gz
+ from http://sourceforge.net/projects/xdvi/files/xdvik/.
+
+ * mksedscript: Correctly handle strings with embedded blanks,
+ e.g., '#define PACKAGE_STRING "xdvik 22.85"' and similar.
+
+2012-03-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * mime.c, xdvi.1.in: Use /usr/local/etc/{mimetypes=>mime.types}.
+
+2012-03-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xdvi.1.in: Remove an unmatched #endif and formatting bugs.
+ * Makefile.am: Fixed a typo (in comment).
+
+2012-02-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Drop XDVI_CC_CONCAT and XDVI_SYS_SUNOS_4, the
+ results are not used.
+ * m4/xdvi-cc-concat.m4, m4/xdvi-sys-sunos4.m4: Removed.
+
+2011-12-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Replace ${prefix}/texmf => $(datarootdir)/texmf.
+
+2011-07-30 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * font-open.[ch] (font_open): Constify `char **' parameter.
+ * dvi-init.c (load_font): Cast font_open() argument to
+ `const char **'.
+
+2011-06-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * read-mapfile.c (read_map_file): Allow find_suffix() to return
+ a const string.
+
+2011-03-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * hypertex.c (launch_xdvi): `program_invocation_name' has been
+ renamed into `kpse_invocation_name'.
+
+2010-05-25 Karl Berry <karl@tug.org>
+
+ * m4/xdvi-check-iconv.m4 (--with-iconv): new option to
+ completely disable checking for iconv. Needed due to the local
+ configuration of the machine used to build the sparc-linux
+ binaries (namely, weyl.math.utah.edu).
+
+2010-05-19 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/run_tests.c, test_dl_list.c: Cast size_t to long for
+ printing to avoid warnings on 64Bit systems.
+
+2010-03-29 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Remove AC_TYPE_SIZE_T, now part of KPSE_COMMON.
+
+2009-12-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/test_string_utils.c (test_my_stristr): Make the test
+ more stringent (and closer to the original code).
+
+2009-12-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/test_string_utils.c (test_my_stristr): Make test result
+ independent of compiler optimizations (constant folding).
+
+2009-12-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/test_string_utils.c (test_expand_filename):
+ Do not prepend cwd to absolute filenames.
+
+2009-11-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Suppress some compiler warnings (too many).
+
+2009-11-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac, xdvi.h: Require recent kpathsea version.
+
+2009-08-27 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Avoid some maximal compiler warnings.
+ * encodings.c (cjk2unicode): Unconstify string arg.
+ * events.c (show_timers): Constify string arg.
+ * gui/sfPath.c (SFLogin): Constify string members.
+ (SFstrdup): Convert arg1 to result that can be assigned to const
+ strings, constify remaining arg.
+ (SFunreadableDir): Constify local var.
+ * gui/sfPath.[ch] (SFchdir): Constify string arg.
+ * hypertex.c (remote_URL_schemes): 'char *const'=>'const char*'.
+ * main.c (compare_strings): 'const char**'=>'const char*const*'.
+ * mime.c (mailcap_map): Constify string members.
+ * pixmaps/toolbar.xpm, pixmaps/toolbar2.xpm: Constify pixmaps.
+
+
+2009-08-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Avoid some maximal compiler warnings.
+ * dvi-init.c (get_tmp_dvi_name), gui/Tip.c (foo),
+ gui/sfDir.c (foo), gui/sfDraw.c (foo), gui/sfPath.c (foo),
+ gui/sfSelFile.c (foo), gui/xaw_menu.c (foo),
+ gui/xlwradio.c (foo), gui/xm_colorsel.c (foo),
+ gui/xm_filesel.c (foo), gui/xm_menu.c (foo),
+ gui/xm_prefs.c (foo), gui/xm_prefs_appearance.c (foo),
+ gui/xm_prefs_fonts.c (foo), gui/xm_prefs_helpers.c (foo),
+ gui/xm_prefs_page.c (foo), gui/xm_prefs_scroll.c (foo),
+ gui/xm_toolbar.c (foo), image-magick.c (clear_cache, foo),
+ pagehist.c (page_history_clear),
+ psdps.c (DPSErrorProcHandler, foo),
+ psgs.c (gs_resume_prescan, foo),
+ psnews.c (initNeWS, foo), util.c (do_abort):
+ ANSI C function definitions, i.e., '()'=>'(void)'.
+ * xserver-info.c (print_display_info, print_visual_info,
+ print_screen_info, foo): ANSI C function definitions.
+
+2009-08-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Check for <kpathsea/version.h> and ...
+ * xdvi.h: ... skip extern decl if found.
+
+2009-06-29 Karl Berry <karl@tug.org>
+
+ * gui/help-window.c (default_help_general): avoid embedding
+ date in binary.
+
+2009-06-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * dvi-draw.c: do not #include "kpathsea/c-vararg.h" (after
+ #include <stdarg.h>).
+ * string-utils.h, xdvi.h, gui/message-window.c,
+ gui/statusline.c, tests/test_string_utils.c:
+ #include <stdarg.h>, not "kpathsea/c-vararg.h".
+
+ * xdvi.h: remove NeedFunctionPrototypes et al.
+
+2009-06-03 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * events.c: avoid declaration after statement.
+
+ from Vladimir Volovich <vvv@vsu.ru>.
+
+2009-05-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * CHANGES: fixed version/relase-date such that mksedscript can
+ extract them.
+
+2009-04-28 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xdvi.h: guard typedef of iconv_char_pptrT by '#if HAVE_ICONV_H'.
+
+ * squeeze/squeeze.c: add '#include <string.h>'.
+
+2009-04-18 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * xdvi.1.in (warnspecials): fixed duplicate entry, removing
+ an #ifkpathsea without matching #endif.
+
+2009-03-31 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Imported ftp://tug.org/tex/xdvik-22.84.15.tar.gz and
+ adapted to new TeX Live build system (Automake & Co.).
+ Renamed original files XXX -> XXX-22.84.15.
+
+ * squeeze.c (removed): File moved ...
+ * squeeze/squeeze.c (new): ... to here. Don't include
+ any system dependent kpathsea headers, such that squeeze/
+ can be configured separately for the build system.
+
+2009-03-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * CHANGES: fixed version/relase-date such that mksedscript can
+ extract them.
+
+2008-07-01 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Imported ftp://tug.org/tex/xdvik-22.84.14.tar.gz and
+ adapted to new TeX Live build system (autoconf-2.59+).
+
+ * Makefile.in.orig, acconfig.h.orig, aclocal.m4.orig,
+ configure.in.orig, depend.mk.orig, gui/Makefile.in.orig,
+ gui/depend.mk.orig, kpathsea.ac.orig, tests/Makefile.in.orig,
+ tests/depend.mk.orig, withenable.ac.orig (all new):
+ Original files from xdvik-22.84.14.
+
+ * Makefile.in, gui/Makefile.in, tests/Makefile.in:
+ Added '@configure_input@' line and replace ac_include by
+ kpse_include.
+
+ * acinclude.m4 (new): Renamed from aclocal.m4.
+ Renamed cache variables (must contain '_cv_').
+
+ * acinclude.m4, configure.in, withenable.ac:
+ Added lots of m4 quoting and third args of AC_DEFINE.
+
+ * acconfig.h (removed): Use AC_DEFINE with three args to
+ provide templates.
+
+ * configure.in:
+ Replaced AC_OUTPUT with arguments by KPSE_CONFIG_FILES,
+ AC_CONFIG_FILES and AC_OUTPUT without arg.
+
+ * kpathsea.ac (LIBKPATHSEACPPFLAGS): Set to '-I$(kpathsea_parent)'
+ instead of '-I$(kpathsea_dir)' to avoid confusion between
+ <c-auto.h> and <kpathsea/c-auto.h>.
+
+ * depend.mk, gui/depend.mk, tests/depend.mk: Regenerated and
+ cleaned by hand ('make depend' didn't quite do that).
+
+ * aclocal.m4, c-auto.in, configure: Regenerated.
+
+2008-02-29 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * acinclude.m4: added quotes to DEFUN's first args, added
+ AC_DEFINES's third arg to provide autoheader templates ...
+ * configure.in, withenable.ac: added AC_DEFINES's third arg to provide
+ autoheader templates ...
+ * acconfig.h: ... removed.
+
+2008-01-31 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Convert from autoconf-2.13 to autoconf-2.59+:
+ * configure.in (AC_PREREQ): Require autoconf-2.59.
+ * Makefile.in, gui/Makefile.in: Add @configure_input@ lines.
+ * acinclude.m4 (new): Renamed from aclocal.m4.
+ * aclocal.m4 (new): Generated (aclocal -I ../m4).
+ * ../../libs/t1lib/t1lib.ac: Fixed a typo.
+ * configure: Regenerated (autoconf).
diff --git a/Build/source/texk/xdvik/FAQ b/Build/source/texk/xdvik/FAQ
new file mode 100644
index 00000000000..bf0414cdbf0
--- /dev/null
+++ b/Build/source/texk/xdvik/FAQ
@@ -0,0 +1,248 @@
+This is an adapted version of Paul Vojta's FAQ for (non-k) xdvi, which is
+available from <URL:http://math.berkeley.edu/~vojta/xdvi_faq.txt>.
+
+This file answers the following questions about installing xdvi:
+
+ 1. Why do I get the message, ``Caution: overstrike characters may be
+ incorrect'' when running netscape and xdvi simultaneously, and why
+ does the screen output look so grainy?
+ 2. I have font files cmr10.tfm, etc. Why can't xdvi use them?
+ 3. I can't seem to set the font path correctly. Can you help me?
+ 4. Whenever I run xdvi, it prints out things like:
+ - mktexpk --mfmode cx --bdpi 300 --mag 'magstep(0)' --dpi 300 cmr7 '>&3'
+ mktexpk: /var/cache/fonts/pk/cx/public/cm/cmr7.300pk already exists.
+ Why is this?
+ 5. Why can't xdvi correctly display metapost files containing text?
+ 6. Why do I get weird vertical color stripes when using xdvi on my S3
+ Virge video card?
+ 7. What does the message "gs: No such file or directory" mean, and why
+ does xdvi need to call ghostscript?
+ 8. I am using gs 5.50 to render PostScript figures, and I find that
+ sometimes characters appear on the wrong page. Why is that?
+ 9. I am using gs 3.33 to render PostScript figures, but find that it
+ cuts some off below or to the right of a certain point, and others
+ are omitted entirely.
+ 10. I am trying to display PostScript specials with -DPS_GS, but
+ instead I get the message `gs: gs: Malformed ghostview color property.'
+ 11. What is this "_get_wmShellWidgetClass undefined" error?
+
+Last modified: 2002/08/23
+
+----------
+
+1. Why do I get the message, ``Caution: overstrike characters may be
+ incorrect'' when running netscape and xdvi simultaneously, and why
+ does the screen output look so grainy?
+
+This is because your video setup has only a limited number (typically 256)
+of different colors that can be displayed at any given time, and netscape
+is using most of them. There are several ways around this problem:
+
+ o Start xdvi before netscape. This should eliminate the problem for
+ that copy of xdvi (only).
+ o Invoke netscape via "netscape -ncols 130" This limits netscape's
+ color usage to 130. Other numbers may be used as well.
+ o Invoke netscape via "netscape -install" This causes netscape to run
+ with its own colormap. A disadvantage of this approach is that
+ netscape's colors will be bizarre when the cursor is outside netscape's
+ window, and conversely all other colors on the screen will look funny
+ when the cursor is in the netscape window.
+
+The screen output looks so grainy because xdvi is not able to use its
+anti-aliasing features without enough colors.
+
+----------
+
+2. I have font files cmr10.tfm, etc. Why can't xdvi use them?
+
+tfm files contain only minimal information about the characters
+in a font: just the height, width, depth, and kerning and ligature
+information. To obtain information about the shapes of the
+characters, xdvi needs pk, gf or pfb files. (pxl files also contain
+this information, but are obsolete. There are utilities to convert
+them to pk files though.)
+
+----------
+
+3. I can't seem to set the font path correctly. Can you help me?
+
+Try
+ xdvi -debug 4000 file.dvi
+to find out where xdvi is looking for the fonts.
+
+----------
+
+4. Whenever I run xdvi, it prints out things like:
+ - mktexpk --mfmode cx --bdpi 300 --mag 'magstep(0)' --dpi 300 cmr7 '>&3'
+ mktexpk: /var/cache/fonts/pk/cx/public/cm/cmr7.300pk already exists.
+ Why is this?
+
+It means either that:
+
+ (1) Your ls-R database is not up to date (fix this by running texhash), or
+ (2) Your font path is not set correctly (see #3, above).
+
+----------
+
+5. Why can't xdvi correctly display metapost files containing text?
+
+The problem is that the PS files created by MP are (normally) not
+self-contained. xdvi delegates the display of PS files to
+ghostscript, which fails to handle those files.
+
+A solution is to instruct MP to create true EPS files, by including
+ prologues:=2;
+at the top of the document. If you have the CM postscript fonts
+installed so that ghostscript can find them, you can continue to use
+the CM fonts, otherwise you'll have to switch to Times or such for the
+illustrations.
+
+Switching the fonts can be done setting 'defaultfont' to something
+like "ptmr8r" (for Times). For the TeX material in 'btex .. etex'
+blocks, it is best to set up the fonts once in a 'verbatimtex .. etex'
+block. (And same for LaTeX of course.)
+
+This answer courtesy of Olaf Weber.
+
+----------
+
+6. Why do I get weird vertical color stripes when using xdvi on my
+ S3 Virge video card?
+
+This is a bug in the XF86_S3V X server. It has been reported to XFree86.
+The response from them is that the XF86_S3V server is being phased out
+and that users should use the XF86_SVGA server instead (which also, as of
+XFree86 3.3.3, supports the S3 Virge chipset).
+
+----------
+
+7. What does the message "gs: No such file or directory" mean, and why
+ does xdvi need to call ghostscript?
+
+The message "gs: No such file or directory" means that xdvi needs to call
+ghostscript, but does not find it on your system. Ghostscript is a program
+used for rendering PostScript. It is needed by xdvi (1) for displaying
+PostScript specials in documents, and (2) for rendering PostScript fonts
+occurring in documents. In the latter case, xdvi calls a script (usually
+named mktexpk) which in turn calls the program gsftopk to render the font
+in a form usable by xdvi.
+
+----------
+
+8. I am using gs 5.50 to render PostScript figures, and I find that
+ sometimes characters appear on the wrong page. Why is that?
+
+This is a bug in ghostscript 5.50. The following patch will fix it:
+
+*** gdevx.c.orig Fri Jul 17 07:31:27 1998
+--- gdevx.c Sat Oct 17 23:42:50 1998
+***************
+*** 59,65 ****
+ ((gx_device_X *)(dev))->up_area = 0,\
+ ((gx_device_X *)(dev))->up_count = 0
+ #define update_flush(dev)\
+! if ( ((gx_device_X *)(dev))->up_area != 0 ) update_do_flush(dev)
+ private void update_do_flush(P1(gx_device *));
+
+ #define flush_text(dev)\
+--- 59,66 ----
+ ((gx_device_X *)(dev))->up_area = 0,\
+ ((gx_device_X *)(dev))->up_count = 0
+ #define update_flush(dev)\
+! if ( ((gx_device_X *)(dev))->up_area != 0 || IN_TEXT((gx_device_X *)(dev)) )\
+! update_do_flush(dev)
+ private void update_do_flush(P1(gx_device *));
+
+ #define flush_text(dev)\
+
+
+----------
+
+9. I am using gs 3.33 to render PostScript figures, but find that it
+ cuts some off below or to the right of a certain point, and others
+ are omitted entirely.
+
+You should apply the following patch. This will also fix similar errors
+with ghostview. This patch supersedes a previous patch I have suggested
+to some people.
+
+*** gdevxini.c.orig Sun Nov 6 13:46:42 1994
+--- gdevxini.c Mon Jun 5 15:40:18 1995
+***************
+*** 319,344 ****
+
+ /* The following sets the imageable area according to the */
+ /* bounding box and margins sent by ghostview. */
+! { float m[4];
+! m[0] = (llx - left_margin) / 72.0; /* left */
+! m[1] = (lly - bottom_margin) / 72.0; /* bottom */
+! m[2] = xdev->width / xdev->x_pixels_per_inch -
+! (urx + right_margin) / 72.0; /* right */
+! m[3] = xdev->height / xdev->y_pixels_per_inch -
+! (ury + top_margin) / 72.0; /* top */
+!
+! /******
+! ****** For reasons I don't understand,
+! ****** we have to set the margins to zero here
+! ****** in order for Ghostview to do landscape display right.
+! ******/
+! #if 0
+! m[0] = m[1] = m[2] = m[3] = 0;
+! #endif
+!
+! gx_device_set_margins((gx_device *)xdev, m, false);
+! }
+!
+ } else if (xdev->pwin == (Window)None) {
+ eprintf("gs: Cannot get ghostview property.\n");
+ exit(1);
+--- 319,329 ----
+
+ /* The following sets the imageable area according to the */
+ /* bounding box and margins sent by ghostview. */
+! xdev->ImagingBBox[0] = llx - left_margin;
+! xdev->ImagingBBox[1] = lly - bottom_margin;
+! xdev->ImagingBBox[2] = urx + right_margin;
+! xdev->ImagingBBox[3] = ury + top_margin;
+! xdev->ImagingBBox_set = true;
+ } else if (xdev->pwin == (Window)None) {
+ eprintf("gs: Cannot get ghostview property.\n");
+ exit(1);
+
+----------
+
+10. I am trying to display PostScript specials with -DPS_GS, but
+ instead I get the message `gs: gs: Malformed ghostview color property.'
+
+xdvi needs at least version 2.6.2 of ghostscript. It will also run with
+ghostscript 2.6.1, provided you have applied fixes 1-4. This particular
+error message means that you are running gs 2.6.1 without fixes 1-4.
+Probably you should get a newer version of ghostscript.
+
+----------
+
+11. What is this "_get_wmShellWidgetClass undefined" error?
+
+ In SunOS 4.1.2 Sun fixed a shared-library bug in ld which conflicts
+with the way X builds the shared Xmu library, causing these symbols, notably,
+to be undefined when building some X11 clients on SunOS 4.1.[23]:
+ _get_wmShellWidgetClass
+ _get_applicationShellWidgetClass
+Compiling "-Bstatic -lXmu -Bdynamic" is overkill; be sure to set
+OSTeenyVersion correctly in the config/sun.cf file and rebuild X11R5.
+
+To solve the problem if you are using OpenWindows 3.0 (X11R4-based Xt), please
+contact your local Sun office and request the following patches:
+
+Patch i.d. Description
+100512-02 4.1.x OpenWindows 3.0 libXt Jumbo patch
+100573-04 OpenWindows 3.0: xstdcmap fails to set XStandardColomap for
+ 24-bit machines [this also fixes bug 1087332, "With patched
+ ld and libc, customer is getting undefined symbols"]
+
+[Greg Earle, earle@Sun.COM; 7/92]
+
+A source patch for use with the X11R4 libraries was developed by Conrad
+Kimball (cek@sdc.boeing.com); it retrofits into R4 some fixes made in R5 to
+get around this problem. The patch is on ftp.x.org in [1/93]
+ contrib/X11R4_sunos4.1.2_patch_version3.Z
diff --git a/Build/source/texk/xdvik/LESSTIF-BUGS b/Build/source/texk/xdvik/LESSTIF-BUGS
new file mode 100644
index 00000000000..52a117ec20a
--- /dev/null
+++ b/Build/source/texk/xdvik/LESSTIF-BUGS
@@ -0,0 +1,37 @@
+
+Bugs of current xdvik with LessTif
+==================================
+
+This is a list of known bugs if current xdvik is compiled with
+lesstif-0.93.18 (in decreasing severity).
+
+Some of them may be bugs in xdvik, others bugs with LessTif. Currently
+I don't have time and/or deeper knowledge of X to look into them.
+People who are annoyed by these bugs should use either OpenMotif, or
+the Xaw version of xdvik instead. Ideas and tips are welcome ...
+-- S.U.
+
+- Page list: Toggling expert mode or the page list produces strange
+ results when page list is switched on again: List appears too wide
+ (hides part of horizontal scrollbar) and too short. When the page
+ list preference is set to 'Off', the pagelist is displayed
+ nevertheless (#1493853).
+
+- Main window layout: window is too narrow when starting in expert
+ mode (e.g. 80x900) and too wide (entire screen) in non-expert mode.
+ Workaround: Use -geometry argument to force a sensible window size.
+
+- Removing the scrollbars in expert mode doesn't work.
+
+- Newline character `\n' in LabelGadget texts doesn't cause a line
+ break. Workaround: Xdvi uses shorter labels when compiled with LessTif.
+
+- Spinbox replacement in LessTif looks ugly. Workaround: Xdvi
+ doesn't use Spinbox when compiled with LessTif.
+
+- Preferences window: Headings list (left window) is a few pixels
+ too small, cutoff of longest title. The list has a horizontal
+ scrollbar even though it's not needed, and the part that is
+ cut off can't be scrolled to. Workaround: Use extra trailing
+ whitespace for longest title in LessTif.
+
diff --git a/Build/source/texk/xdvik/Makefile.am b/Build/source/texk/xdvik/Makefile.am
new file mode 100644
index 00000000000..16d3cca80d3
--- /dev/null
+++ b/Build/source/texk/xdvik/Makefile.am
@@ -0,0 +1,267 @@
+## Makefile.am for the TeX Live subdirectory texk/xdvik/
+##
+## Copyright (C) 2017 Karl Berry <tex-live@tug.org>
+## Copyright (C) 2009-2015 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+##
+AM_CFLAGS = $(WARNING_CFLAGS)
+
+SUBDIRS = squeeze . tests
+
+include common.am
+
+AM_CPPFLAGS = -I$(srcdir)/gui $(common_includes)
+
+## The object files created from ./*.c and gui/*.c are used for both
+## ./xdvi-bin and tests/run_tests.
+## In order not to compile them twice, we put them into a library.
+noinst_LIBRARIES = libxdvi.a
+
+nodist_libxdvi_a_SOURCES = psheader.c
+
+libxdvi_a_SOURCES = \
+ alloc-debug.h \
+ browser.c \
+ browser.h \
+ c-openmx.h \
+ dl_list.c \
+ dl_list.h \
+ dvi-draw.c \
+ dvi-draw.h \
+ dvi-init.c \
+ dvi-init.h \
+ dvi.h \
+ dvisel.c \
+ dvisel.h \
+ encodings.c \
+ encodings.h \
+ events.c \
+ events.h \
+ exit-handlers.c \
+ exit-handlers.h \
+ filehist.c \
+ filehist.h \
+ font-open.c \
+ font-open.h \
+ ft.c \
+ gf.c \
+ hypertex.c \
+ hypertex.h \
+ image-magick.c \
+ image-magick.h \
+ mime.c \
+ mime.h \
+ my-snprintf.c \
+ my-snprintf.h \
+ my-vsnprintf.c \
+ my-vsnprintf.h \
+ pagehist.c \
+ pagehist.h \
+ pk.c \
+ print-internal.c \
+ print-internal.h \
+ psdps.c \
+ psdps.h \
+ psgs.c \
+ psgs.h \
+ psnews.c \
+ psnews.h \
+ search-internal.c \
+ search-internal.h \
+ special.c \
+ special.h \
+ string-utils.c \
+ string-utils.h \
+ string_list.c \
+ string_list.h \
+ translations.h \
+ util.c \
+ util.h \
+ version.h \
+ vf.c \
+ x_util.c \
+ x_util.h \
+ xdvi.c \
+ xdvi-config.h \
+ xdvi-debug.h \
+ xserver-info.c \
+ xdvi.h \
+ xserver-info.h
+
+## We cannot easily use two different libraries due to the mutual
+## dependencies between routines in ./*.c and gui/*.c.
+libxdvi_a_SOURCES += \
+ gui/Panner.c \
+ gui/Panner.h \
+ gui/PannerP.h \
+ gui/Tip.c \
+ gui/Tip.h \
+ gui/TipP.h \
+ gui/help-window.c \
+ gui/help-window.h \
+ gui/mag.c \
+ gui/mag.h \
+ gui/menu.c \
+ gui/menu.h \
+ gui/message-window.c \
+ gui/message-window.h \
+ gui/pagesel.c \
+ gui/pagesel.h \
+ gui/print-dialog.c \
+ gui/print-dialog.h \
+ gui/print-log.c \
+ gui/print-log.h \
+ gui/search-dialog.c \
+ gui/search-dialog.h \
+ gui/selection.c \
+ gui/selection.h \
+ gui/sfDir.c \
+ gui/sfDir.h \
+ gui/sfDraw.c \
+ gui/sfDraw.h \
+ gui/sfPath.c \
+ gui/sfPath.h \
+ gui/sfSelFile.c \
+ gui/sfSelFile.h \
+ gui/sfinternal.h \
+ gui/statusline.c \
+ gui/statusline.h \
+ gui/topic-window.c \
+ gui/topic-window.h \
+ gui/xaw_bitmaps.c \
+ gui/xaw_bitmaps.h \
+ gui/xaw_menu.c \
+ gui/xaw_menu.h \
+ gui/xicon.c \
+ gui/xicon.h \
+ gui/xlwradio.c \
+ gui/xlwradio.h \
+ gui/xlwradioP.h \
+ gui/xm_colorsel.c \
+ gui/xm_colorsel.h \
+ gui/xm_filesel.c \
+ gui/xm_menu.c \
+ gui/xm_menu.h \
+ gui/xm_prefs.c \
+ gui/xm_prefs.h \
+ gui/xm_prefsP.h \
+ gui/xm_prefs_appearance.c \
+ gui/xm_prefs_appearance.h \
+ gui/xm_prefs_fonts.c \
+ gui/xm_prefs_fonts.h \
+ gui/xm_prefs_helpers.c \
+ gui/xm_prefs_helpers.h \
+ gui/xm_prefs_page.c \
+ gui/xm_prefs_page.h \
+ gui/xm_prefs_scroll.c \
+ gui/xm_prefs_scroll.h \
+ gui/xm_toolbar.c \
+ gui/xm_toolbar.h
+
+$(libxdvi_a_OBJECTS): config.force
+
+config.force: $(common_dependencies)
+ echo timestamp >config.force
+ $(SHELL) ./config.status --recheck
+
+DISTCLEANFILES = config.force
+
+bin_SCRIPTS = xdvi
+
+bin_PROGRAMS = xdvi-bin
+
+xdvi_bin_SOURCES = main.c
+
+$(xdvi_bin_OBJECTS): libxdvi.a $(common_dependencies)
+
+LDADD = libxdvi.a $(common_ldadd)
+
+# When cross-compiling, EXEEXT for the build and host systems may differ.
+# Thus we depend on the auxiliary file squeeze/stamp-squeeze.
+psheader.c: psheader.txt squeeze/stamp-squeeze
+ $(AM_V_GEN)squeeze/squeeze $(srcdir)/psheader.txt $@
+
+squeeze/stamp-squeeze:
+ cd squeeze && $(MAKE) $(AM_MAKEFLAGS) stamp-squeeze
+
+EXTRA_DIST = psheader.txt
+CLEANFILES = psheader.c
+
+nodist_man1_MANS = xdvi.1
+
+xdvi.1: xdvi.1.in sedscript
+ $(AM_V_GEN)sed -f sedscript <$(srcdir)/xdvi.1.in >$@
+
+sedscript: mksedscript CHANGES Makefile c-auto.h
+ $(AM_V_GEN)$(SHELL) $(srcdir)/mksedscript $(srcdir) $(DEFS) $(PS_DEF) >$@
+
+EXTRA_DIST += mksedscript xdvi.1.in
+CLEANFILES += sedscript xdvi.1
+
+xdvidir = $(datarootdir)/texmf-dist/xdvi
+dist_xdvi_DATA = texmf/XDvi
+
+pixmapdir = $(datarootdir)/texmf-dist/xdvi/pixmap
+dist_pixmap_DATA = pixmaps/toolbar.xpm pixmaps/toolbar2.xpm
+
+dvipsconfdir = $(datarootdir)/texmf-dist/dvips/xdvi
+dist_noinst_DATA = texmf/config.xdvi
+
+desktopdir = $(datarootdir)/applications
+desktop_DATA = xdvi.desktop
+
+install-data-hook:
+ @echo " $(MKDIR_P) '$(DESTDIR)$(dvipsconfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(dvipsconfdir)" || exit 1; \
+ if grep "original config.xdvi --" "$(DESTDIR)$(dvipsconfdir)/config.xdvi" >/dev/null 2>&1 \
+ || test ! -r "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; then \
+ echo " $(INSTALL_DATA) '$(srcdir)/texmf/config.xdvi' '$(DESTDIR)$(dvipsconfdir)/config.xdvi'"; \
+ $(INSTALL_DATA) "$(srcdir)/texmf/config.xdvi" "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; \
+ else :; fi
+
+uninstall-hook:
+ @if grep "original config.xdvi --" "$(DESTDIR)$(dvipsconfdir)/config.xdvi" >/dev/null 2>&1 \
+ || test ! -r "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; then \
+ echo " rm -f '$(DESTDIR)$(dvipsconfdir)/config.xdvi'"; \
+ rm -f "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; \
+ else :; fi
+
+## Not used
+##
+EXTRA_DIST += \
+ BUGS \
+ CHANGES \
+ FAQ \
+ LESSTIF-BUGS \
+ README.t1fonts \
+ README.t1mapper \
+ pixmaps/drag_horiz.xbm \
+ pixmaps/drag_horiz_mask.xbm \
+ pixmaps/drag_omni.xbm \
+ pixmaps/drag_omni_mask.xbm \
+ pixmaps/drag_vert.xbm \
+ pixmaps/drag_vert_mask.xbm \
+ pixmaps/fist.xbm \
+ pixmaps/fist_mask.xbm \
+ pixmaps/hand.xbm \
+ pixmaps/hand_mask.xbm \
+ pixmaps/magglass.xbm \
+ pixmaps/magglass_mask.xbm \
+ pixmaps/time16.xbm \
+ pixmaps/time16_mask.xbm \
+ pixmaps/xdvi16x16.xpm \
+ pixmaps/xdvi32x32.xpm \
+ pixmaps/xdvi48x48.xpm \
+ t1mapper \
+ t1mapper.1 \
+ texmf-alt/README \
+ texmf-alt/charter2.map \
+ texmf-alt/lucida.map \
+ texmf-alt/marvosym.map \
+ texmf-alt/xdvifont.map \
+ texmf-alt/xypic.map \
+ xdvi-search.el \
+ xdvi.icon \
+ xdvizilla \
+ xdvizilla.1
+
diff --git a/Build/source/texk/xdvik/Makefile.in b/Build/source/texk/xdvik/Makefile.in
new file mode 100644
index 00000000000..51012476209
--- /dev/null
+++ b/Build/source/texk/xdvik/Makefile.in
@@ -0,0 +1,1683 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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 = xdvi-bin$(EXEEXT)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/xdvi-c-bitmap-type.m4 \
+ $(top_srcdir)/m4/xdvi-check-iconv.m4 \
+ $(top_srcdir)/m4/xdvi-check-langinfo.m4 \
+ $(top_srcdir)/m4/xdvi-check-xaw.m4 \
+ $(top_srcdir)/m4/xdvi-find-motif.m4 \
+ $(top_srcdir)/m4/xdvi-find-xpm.m4 \
+ $(top_srcdir)/m4/xdvi-func-memicmp.m4 \
+ $(top_srcdir)/m4/xdvi-func-poll.m4 \
+ $(top_srcdir)/m4/xdvi-func-setsid-in-fork.m4 \
+ $(top_srcdir)/m4/xdvi-func-working-vsnprintf.m4 \
+ $(top_srcdir)/m4/xdvi-func-xkbbell.m4 \
+ $(top_srcdir)/m4/xdvi-gs-lib-path.m4 \
+ $(top_srcdir)/m4/xdvi-linker-multiple-defns.m4 \
+ $(top_srcdir)/m4/xdvi-sys-old-linux.m4 \
+ $(top_srcdir)/m4/xdvi-sys-streams.m4 \
+ $(top_srcdir)/m4/xdvi-xinput-2-1.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-freetype2-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-zlib-flags.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)/ac/xdvik.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(dist_noinst_DATA) $(dist_pixmap_DATA) \
+ $(dist_xdvi_DATA) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = c-auto.h
+CONFIG_CLEAN_FILES = xdvi
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(desktopdir)" \
+ "$(DESTDIR)$(pixmapdir)" "$(DESTDIR)$(xdvidir)"
+PROGRAMS = $(bin_PROGRAMS)
+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 =
+libxdvi_a_AR = $(AR) $(ARFLAGS)
+libxdvi_a_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libxdvi_a_OBJECTS = browser.$(OBJEXT) dl_list.$(OBJEXT) \
+ dvi-draw.$(OBJEXT) dvi-init.$(OBJEXT) dvisel.$(OBJEXT) \
+ encodings.$(OBJEXT) events.$(OBJEXT) exit-handlers.$(OBJEXT) \
+ filehist.$(OBJEXT) font-open.$(OBJEXT) ft.$(OBJEXT) \
+ gf.$(OBJEXT) hypertex.$(OBJEXT) image-magick.$(OBJEXT) \
+ mime.$(OBJEXT) my-snprintf.$(OBJEXT) my-vsnprintf.$(OBJEXT) \
+ pagehist.$(OBJEXT) pk.$(OBJEXT) print-internal.$(OBJEXT) \
+ psdps.$(OBJEXT) psgs.$(OBJEXT) psnews.$(OBJEXT) \
+ search-internal.$(OBJEXT) special.$(OBJEXT) \
+ string-utils.$(OBJEXT) string_list.$(OBJEXT) util.$(OBJEXT) \
+ vf.$(OBJEXT) x_util.$(OBJEXT) xdvi.$(OBJEXT) \
+ xserver-info.$(OBJEXT) gui/Panner.$(OBJEXT) gui/Tip.$(OBJEXT) \
+ gui/help-window.$(OBJEXT) gui/mag.$(OBJEXT) gui/menu.$(OBJEXT) \
+ gui/message-window.$(OBJEXT) gui/pagesel.$(OBJEXT) \
+ gui/print-dialog.$(OBJEXT) gui/print-log.$(OBJEXT) \
+ gui/search-dialog.$(OBJEXT) gui/selection.$(OBJEXT) \
+ gui/sfDir.$(OBJEXT) gui/sfDraw.$(OBJEXT) gui/sfPath.$(OBJEXT) \
+ gui/sfSelFile.$(OBJEXT) gui/statusline.$(OBJEXT) \
+ gui/topic-window.$(OBJEXT) gui/xaw_bitmaps.$(OBJEXT) \
+ gui/xaw_menu.$(OBJEXT) gui/xicon.$(OBJEXT) \
+ gui/xlwradio.$(OBJEXT) gui/xm_colorsel.$(OBJEXT) \
+ gui/xm_filesel.$(OBJEXT) gui/xm_menu.$(OBJEXT) \
+ gui/xm_prefs.$(OBJEXT) gui/xm_prefs_appearance.$(OBJEXT) \
+ gui/xm_prefs_fonts.$(OBJEXT) gui/xm_prefs_helpers.$(OBJEXT) \
+ gui/xm_prefs_page.$(OBJEXT) gui/xm_prefs_scroll.$(OBJEXT) \
+ gui/xm_toolbar.$(OBJEXT)
+nodist_libxdvi_a_OBJECTS = psheader.$(OBJEXT)
+libxdvi_a_OBJECTS = $(am_libxdvi_a_OBJECTS) \
+ $(nodist_libxdvi_a_OBJECTS)
+am_xdvi_bin_OBJECTS = main.$(OBJEXT)
+xdvi_bin_OBJECTS = $(am_xdvi_bin_OBJECTS)
+xdvi_bin_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_4 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_3)
+am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_4)
+xdvi_bin_DEPENDENCIES = libxdvi.a $(am__DEPENDENCIES_5)
+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__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; }; \
+ }
+SCRIPTS = $(bin_SCRIPTS)
+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@
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/browser.Po ./$(DEPDIR)/dl_list.Po \
+ ./$(DEPDIR)/dvi-draw.Po ./$(DEPDIR)/dvi-init.Po \
+ ./$(DEPDIR)/dvisel.Po ./$(DEPDIR)/encodings.Po \
+ ./$(DEPDIR)/events.Po ./$(DEPDIR)/exit-handlers.Po \
+ ./$(DEPDIR)/filehist.Po ./$(DEPDIR)/font-open.Po \
+ ./$(DEPDIR)/ft.Po ./$(DEPDIR)/gf.Po ./$(DEPDIR)/hypertex.Po \
+ ./$(DEPDIR)/image-magick.Po ./$(DEPDIR)/main.Po \
+ ./$(DEPDIR)/mime.Po ./$(DEPDIR)/my-snprintf.Po \
+ ./$(DEPDIR)/my-vsnprintf.Po ./$(DEPDIR)/pagehist.Po \
+ ./$(DEPDIR)/pk.Po ./$(DEPDIR)/print-internal.Po \
+ ./$(DEPDIR)/psdps.Po ./$(DEPDIR)/psgs.Po \
+ ./$(DEPDIR)/psheader.Po ./$(DEPDIR)/psnews.Po \
+ ./$(DEPDIR)/search-internal.Po ./$(DEPDIR)/special.Po \
+ ./$(DEPDIR)/string-utils.Po ./$(DEPDIR)/string_list.Po \
+ ./$(DEPDIR)/util.Po ./$(DEPDIR)/vf.Po ./$(DEPDIR)/x_util.Po \
+ ./$(DEPDIR)/xdvi.Po ./$(DEPDIR)/xserver-info.Po \
+ gui/$(DEPDIR)/Panner.Po gui/$(DEPDIR)/Tip.Po \
+ gui/$(DEPDIR)/help-window.Po gui/$(DEPDIR)/mag.Po \
+ gui/$(DEPDIR)/menu.Po gui/$(DEPDIR)/message-window.Po \
+ gui/$(DEPDIR)/pagesel.Po gui/$(DEPDIR)/print-dialog.Po \
+ gui/$(DEPDIR)/print-log.Po gui/$(DEPDIR)/search-dialog.Po \
+ gui/$(DEPDIR)/selection.Po gui/$(DEPDIR)/sfDir.Po \
+ gui/$(DEPDIR)/sfDraw.Po gui/$(DEPDIR)/sfPath.Po \
+ gui/$(DEPDIR)/sfSelFile.Po gui/$(DEPDIR)/statusline.Po \
+ gui/$(DEPDIR)/topic-window.Po gui/$(DEPDIR)/xaw_bitmaps.Po \
+ gui/$(DEPDIR)/xaw_menu.Po gui/$(DEPDIR)/xicon.Po \
+ gui/$(DEPDIR)/xlwradio.Po gui/$(DEPDIR)/xm_colorsel.Po \
+ gui/$(DEPDIR)/xm_filesel.Po gui/$(DEPDIR)/xm_menu.Po \
+ gui/$(DEPDIR)/xm_prefs.Po gui/$(DEPDIR)/xm_prefs_appearance.Po \
+ gui/$(DEPDIR)/xm_prefs_fonts.Po \
+ gui/$(DEPDIR)/xm_prefs_helpers.Po \
+ gui/$(DEPDIR)/xm_prefs_page.Po \
+ gui/$(DEPDIR)/xm_prefs_scroll.Po gui/$(DEPDIR)/xm_toolbar.Po
+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 =
+SOURCES = $(libxdvi_a_SOURCES) $(nodist_libxdvi_a_SOURCES) \
+ $(xdvi_bin_SOURCES)
+DIST_SOURCES = $(libxdvi_a_SOURCES) $(xdvi_bin_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
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(nodist_man1_MANS)
+DATA = $(desktop_DATA) $(dist_noinst_DATA) $(dist_pixmap_DATA) \
+ $(dist_xdvi_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 \
+ cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
+ c-auto.in
+# 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
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/c-auto.in \
+ $(srcdir)/common.am $(srcdir)/xdvi-sh.in \
+ $(top_srcdir)/../../build-aux/compile \
+ $(top_srcdir)/../../build-aux/config.guess \
+ $(top_srcdir)/../../build-aux/config.sub \
+ $(top_srcdir)/../../build-aux/depcomp \
+ $(top_srcdir)/../../build-aux/install-sh \
+ $(top_srcdir)/../../build-aux/ltmain.sh \
+ $(top_srcdir)/../../build-aux/missing ../../build-aux/ar-lib \
+ ../../build-aux/compile ../../build-aux/config.guess \
+ ../../build-aux/config.sub ../../build-aux/depcomp \
+ ../../build-aux/install-sh ../../build-aux/ltmain.sh \
+ ../../build-aux/missing ../../build-aux/texinfo.tex \
+ ../../build-aux/ylwrap ChangeLog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+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"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+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@
+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@
+FREETYPE2_DEPEND = @FREETYPE2_DEPEND@
+FREETYPE2_INCLUDES = @FREETYPE2_INCLUDES@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+FT2_CONFIG = @FT2_CONFIG@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+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@
+PKG_CONFIG = @PKG_CONFIG@
+PS_DEF = @PS_DEF@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+XDVIK_VERSION = @XDVIK_VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_DEPEND = @ZLIB_DEPEND@
+ZLIB_INCLUDES = @ZLIB_INCLUDES@
+ZLIB_LIBS = @ZLIB_LIBS@
+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_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@
+exec_prefix = @exec_prefix@
+final_exec_name = @final_exec_name@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+iconv_includes = @iconv_includes@
+iconv_libpath = @iconv_libpath@
+iconv_libs = @iconv_libs@
+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@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+x_ext_lib = @x_ext_lib@
+x_linker_options = @x_linker_options@
+x_tool_libs = @x_tool_libs@
+x_xmu_lib = @x_xmu_lib@
+x_xpm_libs = @x_xpm_libs@
+AM_CFLAGS = $(WARNING_CFLAGS)
+SUBDIRS = squeeze . tests
+x_cppflags = $(X_CFLAGS) $(iconv_includes)
+common_includes = $(PS_DEF) $(KPATHSEA_INCLUDES) $(FREETYPE2_INCLUDES) $(x_cppflags)
+x_ldflags = $(X_LIBS) $(x_linker_options) $(iconv_libpath)
+x_extra_libs = $(X_EXTRA_LIBS) $(iconv_libs)
+xdvi_x_libs = $(x_ldflags) $(x_tool_libs) $(x_xmu_lib) -lXt \
+ $(X_PRE_LIBS) $(x_ext_lib) $(x_xpm_libs) -lX11 $(x_extra_libs)
+common_ldadd = $(KPATHSEA_LIBS) $(FREETYPE2_LIBS) $(xdvi_x_libs)
+common_dependencies = $(KPATHSEA_DEPEND) $(FREETYPE2_DEPEND)
+libxdvi_dependencies = ${top_srcdir}/*.[ch] ${top_srcdir}/gui/*.[ch] ${top_builddir}/psheader.c
+AM_CPPFLAGS = -I$(srcdir)/gui $(common_includes)
+noinst_LIBRARIES = libxdvi.a
+nodist_libxdvi_a_SOURCES = psheader.c
+libxdvi_a_SOURCES = alloc-debug.h browser.c browser.h c-openmx.h \
+ dl_list.c dl_list.h dvi-draw.c dvi-draw.h dvi-init.c \
+ dvi-init.h dvi.h dvisel.c dvisel.h encodings.c encodings.h \
+ events.c events.h exit-handlers.c exit-handlers.h filehist.c \
+ filehist.h font-open.c font-open.h ft.c gf.c hypertex.c \
+ hypertex.h image-magick.c image-magick.h mime.c mime.h \
+ my-snprintf.c my-snprintf.h my-vsnprintf.c my-vsnprintf.h \
+ pagehist.c pagehist.h pk.c print-internal.c print-internal.h \
+ psdps.c psdps.h psgs.c psgs.h psnews.c psnews.h \
+ search-internal.c search-internal.h special.c special.h \
+ string-utils.c string-utils.h string_list.c string_list.h \
+ translations.h util.c util.h version.h vf.c x_util.c x_util.h \
+ xdvi.c xdvi-config.h xdvi-debug.h xserver-info.c xdvi.h \
+ xserver-info.h gui/Panner.c gui/Panner.h gui/PannerP.h \
+ gui/Tip.c gui/Tip.h gui/TipP.h gui/help-window.c \
+ gui/help-window.h gui/mag.c gui/mag.h gui/menu.c gui/menu.h \
+ gui/message-window.c gui/message-window.h gui/pagesel.c \
+ gui/pagesel.h gui/print-dialog.c gui/print-dialog.h \
+ gui/print-log.c gui/print-log.h gui/search-dialog.c \
+ gui/search-dialog.h gui/selection.c gui/selection.h \
+ gui/sfDir.c gui/sfDir.h gui/sfDraw.c gui/sfDraw.h gui/sfPath.c \
+ gui/sfPath.h gui/sfSelFile.c gui/sfSelFile.h gui/sfinternal.h \
+ gui/statusline.c gui/statusline.h gui/topic-window.c \
+ gui/topic-window.h gui/xaw_bitmaps.c gui/xaw_bitmaps.h \
+ gui/xaw_menu.c gui/xaw_menu.h gui/xicon.c gui/xicon.h \
+ gui/xlwradio.c gui/xlwradio.h gui/xlwradioP.h \
+ gui/xm_colorsel.c gui/xm_colorsel.h gui/xm_filesel.c \
+ gui/xm_menu.c gui/xm_menu.h gui/xm_prefs.c gui/xm_prefs.h \
+ gui/xm_prefsP.h gui/xm_prefs_appearance.c \
+ gui/xm_prefs_appearance.h gui/xm_prefs_fonts.c \
+ gui/xm_prefs_fonts.h gui/xm_prefs_helpers.c \
+ gui/xm_prefs_helpers.h gui/xm_prefs_page.c gui/xm_prefs_page.h \
+ gui/xm_prefs_scroll.c gui/xm_prefs_scroll.h gui/xm_toolbar.c \
+ gui/xm_toolbar.h
+DISTCLEANFILES = config.force
+bin_SCRIPTS = xdvi
+xdvi_bin_SOURCES = main.c
+LDADD = libxdvi.a $(common_ldadd)
+EXTRA_DIST = psheader.txt mksedscript xdvi.1.in BUGS CHANGES FAQ \
+ LESSTIF-BUGS README.t1fonts README.t1mapper \
+ pixmaps/drag_horiz.xbm pixmaps/drag_horiz_mask.xbm \
+ pixmaps/drag_omni.xbm pixmaps/drag_omni_mask.xbm \
+ pixmaps/drag_vert.xbm pixmaps/drag_vert_mask.xbm \
+ pixmaps/fist.xbm pixmaps/fist_mask.xbm pixmaps/hand.xbm \
+ pixmaps/hand_mask.xbm pixmaps/magglass.xbm \
+ pixmaps/magglass_mask.xbm pixmaps/time16.xbm \
+ pixmaps/time16_mask.xbm pixmaps/xdvi16x16.xpm \
+ pixmaps/xdvi32x32.xpm pixmaps/xdvi48x48.xpm t1mapper \
+ t1mapper.1 texmf-alt/README texmf-alt/charter2.map \
+ texmf-alt/lucida.map texmf-alt/marvosym.map \
+ texmf-alt/xdvifont.map texmf-alt/xypic.map xdvi-search.el \
+ xdvi.icon xdvizilla xdvizilla.1
+CLEANFILES = psheader.c sedscript xdvi.1
+nodist_man1_MANS = xdvi.1
+xdvidir = $(datarootdir)/texmf-dist/xdvi
+dist_xdvi_DATA = texmf/XDvi
+pixmapdir = $(datarootdir)/texmf-dist/xdvi/pixmap
+dist_pixmap_DATA = pixmaps/toolbar.xpm pixmaps/toolbar2.xpm
+dvipsconfdir = $(datarootdir)/texmf-dist/dvips/xdvi
+dist_noinst_DATA = texmf/config.xdvi
+desktopdir = $(datarootdir)/applications
+desktop_DATA = xdvi.desktop
+all: c-auto.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/common.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(srcdir)/common.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+c-auto.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/c-auto.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status c-auto.h
+$(srcdir)/c-auto.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f c-auto.h stamp-h1
+xdvi: $(top_builddir)/config.status $(srcdir)/xdvi-sh.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+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
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+gui/$(am__dirstamp):
+ @$(MKDIR_P) gui
+ @: > gui/$(am__dirstamp)
+gui/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) gui/$(DEPDIR)
+ @: > gui/$(DEPDIR)/$(am__dirstamp)
+gui/Panner.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/Tip.$(OBJEXT): gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp)
+gui/help-window.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/mag.$(OBJEXT): gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp)
+gui/menu.$(OBJEXT): gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp)
+gui/message-window.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/pagesel.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/print-dialog.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/print-log.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/search-dialog.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/selection.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/sfDir.$(OBJEXT): gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp)
+gui/sfDraw.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/sfPath.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/sfSelFile.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/statusline.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/topic-window.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xaw_bitmaps.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xaw_menu.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xicon.$(OBJEXT): gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp)
+gui/xlwradio.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_colorsel.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_filesel.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_menu.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs_appearance.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs_fonts.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs_helpers.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs_page.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_prefs_scroll.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+gui/xm_toolbar.$(OBJEXT): gui/$(am__dirstamp) \
+ gui/$(DEPDIR)/$(am__dirstamp)
+
+libxdvi.a: $(libxdvi_a_OBJECTS) $(libxdvi_a_DEPENDENCIES) $(EXTRA_libxdvi_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libxdvi.a
+ $(AM_V_AR)$(libxdvi_a_AR) libxdvi.a $(libxdvi_a_OBJECTS) $(libxdvi_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libxdvi.a
+
+xdvi-bin$(EXEEXT): $(xdvi_bin_OBJECTS) $(xdvi_bin_DEPENDENCIES) $(EXTRA_xdvi_bin_DEPENDENCIES)
+ @rm -f xdvi-bin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(xdvi_bin_OBJECTS) $(xdvi_bin_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_SCRIPTS)'; 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 \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n' \
+ -e 'h;s|.*|.|' \
+ -e 'p;x;s,.*/,,;$(transform)' | 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; \
+ if (++n[d] == $(am__install_max)) { \
+ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 's,.*/,,;$(transform)'`; \
+ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f gui/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/browser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dl_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvi-draw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvi-init.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvisel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encodings.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exit-handlers.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filehist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/font-open.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ft.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypertex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image-magick.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/my-snprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/my-vsnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pagehist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pk.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-internal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psdps.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psgs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psheader.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psnews.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search-internal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/special.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x_util.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdvi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xserver-info.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/Panner.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/Tip.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/help-window.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/mag.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/menu.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/message-window.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/pagesel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/print-dialog.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/print-log.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/search-dialog.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/selection.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/sfDir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/sfDraw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/sfPath.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/sfSelFile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/statusline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/topic-window.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xaw_bitmaps.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xaw_menu.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xicon.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xlwradio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_colorsel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_filesel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_menu.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs_appearance.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs_fonts.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs_helpers.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs_page.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_prefs_scroll.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/xm_toolbar.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.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 $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+install-man1: $(nodist_man1_MANS)
+ @$(NORMAL_INSTALL)
+ @list1='$(nodist_man1_MANS)'; \
+ list2=''; \
+ 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='$(nodist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | 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)
+install-desktopDATA: $(desktop_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || 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)$(desktopdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \
+ done
+
+uninstall-desktopDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir)
+install-dist_pixmapDATA: $(dist_pixmap_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || 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)$(pixmapdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \
+ done
+
+uninstall-dist_pixmapDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir)
+install-dist_xdviDATA: $(dist_xdvi_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(dist_xdvi_DATA)'; test -n "$(xdvidir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(xdvidir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(xdvidir)" || 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)$(xdvidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(xdvidir)" || exit $$?; \
+ done
+
+uninstall-dist_xdviDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_xdvi_DATA)'; test -n "$(xdvidir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(xdvidir)'; $(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=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ 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"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+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
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @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
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \
+ c-auto.h
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(pixmapdir)" "$(DESTDIR)$(xdvidir)"; 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:
+ -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)
+ -rm -f gui/$(DEPDIR)/$(am__dirstamp)
+ -rm -f gui/$(am__dirstamp)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f ./$(DEPDIR)/browser.Po
+ -rm -f ./$(DEPDIR)/dl_list.Po
+ -rm -f ./$(DEPDIR)/dvi-draw.Po
+ -rm -f ./$(DEPDIR)/dvi-init.Po
+ -rm -f ./$(DEPDIR)/dvisel.Po
+ -rm -f ./$(DEPDIR)/encodings.Po
+ -rm -f ./$(DEPDIR)/events.Po
+ -rm -f ./$(DEPDIR)/exit-handlers.Po
+ -rm -f ./$(DEPDIR)/filehist.Po
+ -rm -f ./$(DEPDIR)/font-open.Po
+ -rm -f ./$(DEPDIR)/ft.Po
+ -rm -f ./$(DEPDIR)/gf.Po
+ -rm -f ./$(DEPDIR)/hypertex.Po
+ -rm -f ./$(DEPDIR)/image-magick.Po
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/mime.Po
+ -rm -f ./$(DEPDIR)/my-snprintf.Po
+ -rm -f ./$(DEPDIR)/my-vsnprintf.Po
+ -rm -f ./$(DEPDIR)/pagehist.Po
+ -rm -f ./$(DEPDIR)/pk.Po
+ -rm -f ./$(DEPDIR)/print-internal.Po
+ -rm -f ./$(DEPDIR)/psdps.Po
+ -rm -f ./$(DEPDIR)/psgs.Po
+ -rm -f ./$(DEPDIR)/psheader.Po
+ -rm -f ./$(DEPDIR)/psnews.Po
+ -rm -f ./$(DEPDIR)/search-internal.Po
+ -rm -f ./$(DEPDIR)/special.Po
+ -rm -f ./$(DEPDIR)/string-utils.Po
+ -rm -f ./$(DEPDIR)/string_list.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f ./$(DEPDIR)/vf.Po
+ -rm -f ./$(DEPDIR)/x_util.Po
+ -rm -f ./$(DEPDIR)/xdvi.Po
+ -rm -f ./$(DEPDIR)/xserver-info.Po
+ -rm -f gui/$(DEPDIR)/Panner.Po
+ -rm -f gui/$(DEPDIR)/Tip.Po
+ -rm -f gui/$(DEPDIR)/help-window.Po
+ -rm -f gui/$(DEPDIR)/mag.Po
+ -rm -f gui/$(DEPDIR)/menu.Po
+ -rm -f gui/$(DEPDIR)/message-window.Po
+ -rm -f gui/$(DEPDIR)/pagesel.Po
+ -rm -f gui/$(DEPDIR)/print-dialog.Po
+ -rm -f gui/$(DEPDIR)/print-log.Po
+ -rm -f gui/$(DEPDIR)/search-dialog.Po
+ -rm -f gui/$(DEPDIR)/selection.Po
+ -rm -f gui/$(DEPDIR)/sfDir.Po
+ -rm -f gui/$(DEPDIR)/sfDraw.Po
+ -rm -f gui/$(DEPDIR)/sfPath.Po
+ -rm -f gui/$(DEPDIR)/sfSelFile.Po
+ -rm -f gui/$(DEPDIR)/statusline.Po
+ -rm -f gui/$(DEPDIR)/topic-window.Po
+ -rm -f gui/$(DEPDIR)/xaw_bitmaps.Po
+ -rm -f gui/$(DEPDIR)/xaw_menu.Po
+ -rm -f gui/$(DEPDIR)/xicon.Po
+ -rm -f gui/$(DEPDIR)/xlwradio.Po
+ -rm -f gui/$(DEPDIR)/xm_colorsel.Po
+ -rm -f gui/$(DEPDIR)/xm_filesel.Po
+ -rm -f gui/$(DEPDIR)/xm_menu.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_appearance.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_fonts.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_helpers.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_page.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_scroll.Po
+ -rm -f gui/$(DEPDIR)/xm_toolbar.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-desktopDATA install-dist_pixmapDATA \
+ install-dist_xdviDATA install-man
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+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 $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f ./$(DEPDIR)/browser.Po
+ -rm -f ./$(DEPDIR)/dl_list.Po
+ -rm -f ./$(DEPDIR)/dvi-draw.Po
+ -rm -f ./$(DEPDIR)/dvi-init.Po
+ -rm -f ./$(DEPDIR)/dvisel.Po
+ -rm -f ./$(DEPDIR)/encodings.Po
+ -rm -f ./$(DEPDIR)/events.Po
+ -rm -f ./$(DEPDIR)/exit-handlers.Po
+ -rm -f ./$(DEPDIR)/filehist.Po
+ -rm -f ./$(DEPDIR)/font-open.Po
+ -rm -f ./$(DEPDIR)/ft.Po
+ -rm -f ./$(DEPDIR)/gf.Po
+ -rm -f ./$(DEPDIR)/hypertex.Po
+ -rm -f ./$(DEPDIR)/image-magick.Po
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/mime.Po
+ -rm -f ./$(DEPDIR)/my-snprintf.Po
+ -rm -f ./$(DEPDIR)/my-vsnprintf.Po
+ -rm -f ./$(DEPDIR)/pagehist.Po
+ -rm -f ./$(DEPDIR)/pk.Po
+ -rm -f ./$(DEPDIR)/print-internal.Po
+ -rm -f ./$(DEPDIR)/psdps.Po
+ -rm -f ./$(DEPDIR)/psgs.Po
+ -rm -f ./$(DEPDIR)/psheader.Po
+ -rm -f ./$(DEPDIR)/psnews.Po
+ -rm -f ./$(DEPDIR)/search-internal.Po
+ -rm -f ./$(DEPDIR)/special.Po
+ -rm -f ./$(DEPDIR)/string-utils.Po
+ -rm -f ./$(DEPDIR)/string_list.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f ./$(DEPDIR)/vf.Po
+ -rm -f ./$(DEPDIR)/x_util.Po
+ -rm -f ./$(DEPDIR)/xdvi.Po
+ -rm -f ./$(DEPDIR)/xserver-info.Po
+ -rm -f gui/$(DEPDIR)/Panner.Po
+ -rm -f gui/$(DEPDIR)/Tip.Po
+ -rm -f gui/$(DEPDIR)/help-window.Po
+ -rm -f gui/$(DEPDIR)/mag.Po
+ -rm -f gui/$(DEPDIR)/menu.Po
+ -rm -f gui/$(DEPDIR)/message-window.Po
+ -rm -f gui/$(DEPDIR)/pagesel.Po
+ -rm -f gui/$(DEPDIR)/print-dialog.Po
+ -rm -f gui/$(DEPDIR)/print-log.Po
+ -rm -f gui/$(DEPDIR)/search-dialog.Po
+ -rm -f gui/$(DEPDIR)/selection.Po
+ -rm -f gui/$(DEPDIR)/sfDir.Po
+ -rm -f gui/$(DEPDIR)/sfDraw.Po
+ -rm -f gui/$(DEPDIR)/sfPath.Po
+ -rm -f gui/$(DEPDIR)/sfSelFile.Po
+ -rm -f gui/$(DEPDIR)/statusline.Po
+ -rm -f gui/$(DEPDIR)/topic-window.Po
+ -rm -f gui/$(DEPDIR)/xaw_bitmaps.Po
+ -rm -f gui/$(DEPDIR)/xaw_menu.Po
+ -rm -f gui/$(DEPDIR)/xicon.Po
+ -rm -f gui/$(DEPDIR)/xlwradio.Po
+ -rm -f gui/$(DEPDIR)/xm_colorsel.Po
+ -rm -f gui/$(DEPDIR)/xm_filesel.Po
+ -rm -f gui/$(DEPDIR)/xm_menu.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_appearance.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_fonts.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_helpers.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_page.Po
+ -rm -f gui/$(DEPDIR)/xm_prefs_scroll.Po
+ -rm -f gui/$(DEPDIR)/xm_toolbar.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-desktopDATA uninstall-dist_pixmapDATA \
+ uninstall-dist_xdviDATA uninstall-man
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) all install-am install-data-am \
+ install-strip uninstall-am
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--depfiles am--refresh check check-am clean \
+ clean-binPROGRAMS clean-cscope clean-generic clean-libtool \
+ clean-noinstLIBRARIES cscope cscopelist-am ctags ctags-am dist \
+ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+ dist-xz dist-zip dist-zstd distcheck distclean \
+ distclean-compile distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-binSCRIPTS \
+ install-data install-data-am install-data-hook \
+ install-desktopDATA install-dist_pixmapDATA \
+ install-dist_xdviDATA 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 installdirs-am \
+ 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-binSCRIPTS \
+ uninstall-desktopDATA uninstall-dist_pixmapDATA \
+ uninstall-dist_xdviDATA uninstall-hook uninstall-man \
+ uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+@KPATHSEA_RULE@
+@FREETYPE2_RULE@
+
+$(libxdvi_a_OBJECTS): config.force
+
+config.force: $(common_dependencies)
+ echo timestamp >config.force
+ $(SHELL) ./config.status --recheck
+
+$(xdvi_bin_OBJECTS): libxdvi.a $(common_dependencies)
+
+# When cross-compiling, EXEEXT for the build and host systems may differ.
+# Thus we depend on the auxiliary file squeeze/stamp-squeeze.
+psheader.c: psheader.txt squeeze/stamp-squeeze
+ $(AM_V_GEN)squeeze/squeeze $(srcdir)/psheader.txt $@
+
+squeeze/stamp-squeeze:
+ cd squeeze && $(MAKE) $(AM_MAKEFLAGS) stamp-squeeze
+
+xdvi.1: xdvi.1.in sedscript
+ $(AM_V_GEN)sed -f sedscript <$(srcdir)/xdvi.1.in >$@
+
+sedscript: mksedscript CHANGES Makefile c-auto.h
+ $(AM_V_GEN)$(SHELL) $(srcdir)/mksedscript $(srcdir) $(DEFS) $(PS_DEF) >$@
+
+install-data-hook:
+ @echo " $(MKDIR_P) '$(DESTDIR)$(dvipsconfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(dvipsconfdir)" || exit 1; \
+ if grep "original config.xdvi --" "$(DESTDIR)$(dvipsconfdir)/config.xdvi" >/dev/null 2>&1 \
+ || test ! -r "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; then \
+ echo " $(INSTALL_DATA) '$(srcdir)/texmf/config.xdvi' '$(DESTDIR)$(dvipsconfdir)/config.xdvi'"; \
+ $(INSTALL_DATA) "$(srcdir)/texmf/config.xdvi" "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; \
+ else :; fi
+
+uninstall-hook:
+ @if grep "original config.xdvi --" "$(DESTDIR)$(dvipsconfdir)/config.xdvi" >/dev/null 2>&1 \
+ || test ! -r "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; then \
+ echo " rm -f '$(DESTDIR)$(dvipsconfdir)/config.xdvi'"; \
+ rm -f "$(DESTDIR)$(dvipsconfdir)/config.xdvi"; \
+ else :; fi
+
+# 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/xdvik/README.t1fonts b/Build/source/texk/xdvik/README.t1fonts
new file mode 100644
index 00000000000..692fe2dcf32
--- /dev/null
+++ b/Build/source/texk/xdvik/README.t1fonts
@@ -0,0 +1,186 @@
+
+README for using PostScript Type 1 fonts with xdvik
+===================================================
+
+Starting with version 22.86, xdvik supports direct display of
+PostScript Type 1 fonts using freetype (version 2). (Prior versions used
+t1lib, which is no longer supported.) Unlike the bitmapped TeX PK fonts
+that xdvik used to depend upon, Type 1 fonts only need to be stored in
+one size on disk. This means no more waiting for mktexpk runs when
+viewing DVI files with previously unused fonts or at a different
+resolution, less hassle with temporary directories filling up with
+PK files, etc.
+
+To be able to support Type 1 fonts, xdvi uses a config.xdvi file. The
+standard `make install' process will copy the file from texmf/config.xdvi
+which is suitable for recent TeX Live distributions.
+(If the file exists already and has been modified from the
+original, the modified file will not be overwritten). Apart from the
+section `Debugging your font setup', this README contains mostly
+instructions for versions of teTeX older than 1.0.x or non-teTeX
+systems; users of teTeX >= 1.0.x and TeX Live should ignore these instructions,
+and only consult the `Debugging' section in case of problems with
+the Type 1 fonts setup.
+
+Note that xdvi can always use a TeX bitmap (PK) font as a fallback
+(produced via mktexpk, which in turn invokes ps2pk or gsftopk), so
+it's not vital that xdvi is configured for Type 1 fonts. However, for
+the reasons mentioned above, setting up xdvi properly for Type 1 fonts
+is usually preferable.
+
+
+==========================================================
+Instructions for users of older teTeX versions (< 1.0), or
+non-teTeX systems:
+==========================================================
+
+Xdvi needs to load all Type 1 fonts from disk, which means that it
+(just like dvips) needs to translate the TeX names for fonts to
+filenames, load encoding vectors according to map files and so on.
+This process is governed by fontmap files, which use the same format
+as dvips.
+
+The section `Fontmap file format' below and the dvips documentation
+contain more information on the fontmap file format.
+
+
+=================
+Font Search Order
+=================
+
+The order in which xdvi tries to load a font file is:
+1. Virtual fonts
+2. Type 1 fonts
+3. PK fonts
+4. (If xdvi was compiled with gf support:) GF fonts
+
+For example, consider the search for TeX's default font `cmr10'. In
+most texk/TeX Live installations the file cmr10.pfb is present in the
+texmf tree. This means that it is found at step 2 in the search and
+the Type 1 font is used. Currently xdvi handles fonts with no
+"implied" encoding (such as cmr10) without configuration. Most texk and
+TeX Live installations come with the Blue Sky Research/Y&Y Type 1 versions
+of Knuth's fonts, and xdvi will be able to use them with no further
+action.
+
+The 35 `standard PostScript fonts', such as Times Roman, are are
+usually available under a different name for previewing the file with
+ghostscript. These font files can be used by xdvi, too, and xdvi mimics
+ghostscript's process for finding them. However, this is usually unnecessary,
+since TeX Live comes with fonts that can be used in place of those provided
+with ghostscript.
+
+As an alternative, these 35 fonts to be copied to a place where xdvi
+can find them. Users of older systems can use the
+`t1mapper' script to copy/symlink the required files to a directory
+where xdvi can find them; please see the file README.t1mapper and the
+manual page of t1mapper for more information. This support may be dropped
+in later versions of xdvi.
+
+
+===================
+Fontmap file format
+===================
+
+In principle Xdvi only accepts a subset of the fontmaps used by dvips
+and pdftex. In practice the restrictions are not very restraining.
+For a description of the font map file syntax, see the `psfonts.map'
+section of the dvips manual (dvips.{texi,dvi,pdf}).
+
+Xdvi accepts fontmaps that obey these rules:
+
+1. The encoding files must have a .enc extention or be included by the
+ <[ ... syntax in the fontmap. Encoding is optional. The ReEncodeFont
+ keyword and its argument is tolerated, but it is _ignored_. xdvi
+ looks for a <foo.enc or <[foo to determine the encoding vector, and
+ re-encode the font.
+
+2. The other file in the map line must be a font file in pfa or pfb
+ format. The extension need not be included for the sake of xdvi,
+ but dvips and pdftex might need it, so it is better to include it when
+ using shared fontmap files.
+
+3. There may not be any other input files on a fontmap line.
+
+ Xdvi is not a printer and cannot accept arbitrary postscript
+ prologues or set up things in fontmaps.
+
+4. Xdvi decodes the ExtendFont and SlantFont commands in the quoted
+ postscript code and the extension factor and slanting is applied
+ to the font when displayed. Any other magic done by the quoted
+ PostScript code won't be understood by xdvi.
+
+
+=========================
+Debugging your font setup
+=========================
+
+If your Type 1 font setup doesn't work, please check the following:
+
+1. Make sure that xdvi finds your config.xdvi file (this file is optional;
+ by default it will use the same map files as dvips lists in its config.ps
+ file). If you use it, the file should be located in a directory
+ referenced by the TEXINPUTS variable, which can be either set in your
+ shell environment, or in your texmf.cnf file. This directory is generally
+ something ending in texmf/dvips/config or texmf-dist/dvips/config .
+
+2. Make sure that xdvi can find the map files listed in your config.xdvi
+ file, or in config.ps. Use the `-debug 3968' option for
+ xdvi to see where it searches for the files. E.g., with the (ba)sh
+ shell:
+
+ $ xdvi -debug 3968 ~/test.dvi 2>&1 | grep xyz.map
+
+ For a successful search, the end of the grep'ed output should
+ look like this:
+ kdebug:fopen(/some/path/xyz.map, r) => 0x81cccd8
+
+ If the search is not successful, look at the debugging output in
+ more detail, checking which variable settings contribute to the
+ path where a file is searched.
+
+ Generally, if you have problems here, then you also have them with dvips.
+
+3. Make sure that xdvi finds the Type 1 versions of your fonts. E.g.
+ if your texmf tree is located in /usr/local/share/texmf,
+ for a minimal LaTeX file like
+
+ \documentclass{minimal}
+ \begin{document}test\end{document}
+
+ the command
+ $ xdvi -debug 3968 ~/test.dvi 2>&1 | grep cmr10.pfb
+
+ should contain a line at the bottom that looks similar to this:
+ kdebug:search(cmr10.pfb) => /usr/local/share/texmf/fonts/type1/bluesky/cm/cmr10.pfb
+
+ Check the settings of TEXMFMAIN, TEXMF and T1FONTS in your
+ texmf.cnf file if this doesn't work.
+
+
+See also kpathsea.pdf and texlive-en.pdf for more information on the
+how kpathsea works.
+
+
+Some common sources of problems:
+
+- You have several texmf.cnf files on your system, and xdvi isn't
+ using the one you expect. Use the following command to find out
+ which:
+ $ xdvi -debug 3968 ~/test.dvi 2>&1 | grep texmf.cnf | grep fopen
+
+- The SELFAUTO... variables are used to define one of the TEXMF or
+ XDVIINPUTS variables in texmf.cnf, but xdvi.bin hasn't been
+ installed in a path that is compatible with SELFAUTO....
+ For example, if your texmf tree is
+ /usr/share/texmf/web2c/
+ and the search path contains
+ {$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}:
+ then xdvi.bin should be contained two directories below
+ /usr, e.g. in /usr/local/bin/xdvi.bin. ($SELFAUTOPARENT is
+ a misnomer in that it actually denotes the grand-parent
+ of the current directory, i.e. two levels up in the directory
+ hierarchy).
+
+ As a fix, either set XDVIINPUTS in your shell environment, or install
+ xdvi.bin in its proper place.
diff --git a/Build/source/texk/xdvik/README.t1mapper b/Build/source/texk/xdvik/README.t1mapper
new file mode 100644
index 00000000000..925600b415e
--- /dev/null
+++ b/Build/source/texk/xdvik/README.t1mapper
@@ -0,0 +1,187 @@
+
+README for t1mapper
+===================
+
+T1mapper is a utility for mapping/copying PostScript(tm) Type1 fonts
+from various sources (e.g. an existing ghostscript installation) into
+the texmf source tree to make them available for xdvik.
+
+The instructions in this README do not apply to users of recent teTeX
+(teTeX-beta or teTeX >= 1.0) or TeXLive (>= 6b) distributions; these
+already contain the required fonts within the texmf tree.
+
+For general information on the use of t1fonts with xdvik, please
+see the file README.t1fonts.
+
+
+
+T1mapper is written in Perl, and it should make it rather easy to
+install type1 fonts in a way such that xdvik can use them. The manual
+page of t1mapper(1) gives a short command overview, and the following
+sections describe the font installation in more detail.
+
+1. Installing the "standard" postscript fonts
+
+Have gs (ghostscript) version >= 4.x installed (or downloaded and
+unpacked), including both font packages ('std' and 'other'). If you
+have gs on your machine already you can check what version you have
+with the command 'gs -help'; this also tells you where the installed
+gs stores its fonts. Find the Fontmap file and the fonts. If you
+can't find them, pretend you don't have them and follow the
+instructions in the next paragraph.
+
+If you don't have gs installed you need to get it and and the font
+packages. A likely source of a recent ghostscript is
+
+http://sourceforge.net/projects/ghostscript/
+http://www.gnu.org/software/ghostscript/ghostscript.html
+
+
+You'll need to download the 2 font directories (`std' and `other')
+and the source package. From the latter, t1mapper only needs the file
+'Fontmap' or 'Fontmap.GS'.
+Install the files somewhere, e.g. to /usr/local/share/ghostscript/fonts.
+If you wonder about the contents of the Ghostscript font packages, and
+their relation to the "real" type1 fonts used in printers, please look
+at the GS docs.
+
+Decide where to install the font files for xdvi;
+/usr/local/teTeX/share/texmf/fonts/type1/gs is a likely place. Now
+run t1mapper (probably as root) to install the fonts:
+
+ t1mapper -lns -gs /usr/local/share/ghostscript/5.50/Fontmap \
+ /usr/local/share/ghostscript/fonts \
+ /usr/local/teTeX/share/texmf/fonts/type1/gs
+
+Notes:
+- For the meaning of -lns -gs and other t1mapper options, see below.
+- If you unpacked the gs packages and installed them by hand, please
+ correct the Fontmap path.
+- The directory
+ /usr/local/teTeX/share/texmf/fonts/type1/gs
+ will be created if it does not already exist.
+- With ghostscript >= 6.51, `Fontmap' is only a wrapper for `Fontmap.GS'.
+ Use `Fontmap.GS' instead of `Fontmap' in the invocation of t1mapper.
+
+In some versions of Linux, such as Red Hat Linux 7.x, the files have
+been split into two directories. Listing the contents of the gs related
+font packages reveals that they have been put in both
+/usr/share/fonts/default/ghostscript and
+/usr/share/fonts/default/Type1. If you use such a distribution, this
+might be the commands to use:
+
+ t1mapper -lns -gs /usr/share/ghostscript/5.50/Fontmap \
+ /usr/share/fonts/default/ghostscript \
+ /usr/share/texmf/fonts/type1/gs
+ t1mapper -lns -gs /usr/share/ghostscript/5.50/Fontmap \
+ /usr/share/fonts/default/Type1 \
+ /usr/share/texmf/fonts/type1/gs
+
+When the command is complete, all the fonts gs knows about will have
+been copied to /usr/local/teTeX/share/texmf/fonts/type1/gs. This will
+give you the standard PostScript fonts as well as some others.
+
+2. Installing Other Postscript Fonts
+
+If you already have some type1 fonts (other than the ones from
+ghostscript), you might want to add them as well. Some sites have
+extensive postscript font collections. All these fonts can be used.
+
+Additionaly, if you use a machine with a comercial Unix version (such
+as IRIX, Solaris, AIX, HP-UX, ...) it is quite likely that some type1
+fonts are installed on the machine. These can be used by ghostscript
+and xdvi. If you don't know where they are search for filenames such
+as '*.pfa', '*.pfb', and 'Times-Roman*' and you should be able to find
+them.
+
+To add the fonts found on a Solaris machine, use this command:
+
+t1mapper -lns /usr/local/teTeX/share/texmf/fonts/type1/gs \
+ /usr/openwin/lib/X11/fonts/Type1/*.pfa
+
+Run the command on all the type1 fonts you want to be able to use in
+xdvi.
+
+Notes:
+- Do not run t1mapper on the TeX type1 fonts (cm* and so on).
+- Fonts from the `Lucida' family have a rather difficult structure
+ and might be difficult to install. Please see the files xdvi.cfg and
+ lucida.map.
+
+Copying/linking them all to the same directory will ensure that only
+one version of each font is available to xdvi. t1mapper will remove
+any font version already available in the target directory before
+moving a font there.
+
+The -lns option will cause t1mapper to symlink the fonts instead of
+copying them, saving a good deal of disk space. Here's a quick summary
+of the options that can be used to customize what t1mapper does with
+the files:
+
+ -cp copy the font files, this is the default and will always work
+ and never break down on you.
+ -ln make hard links, this requires all the fonts to be on the same disk.
+ -lns make symbolic links, this requires that you do not remove the fonts
+ linked, or xdvi will not be able to use them anymore.
+ -lnlns attempt hard-link first, if it fails make symbolic link.
+ -lncp attempt hard-link first, if it fails copy the file. This is a way
+ to save some diskspace if possible, with no risk of files
+ disapearing.
+
+3. AFM files
+
+AFM files are not needed by xdvik. TFM files have more accurate width
+data and *must* be used to get correct alignment.
+
+
+4a. Standard TeX fonts in postscript version
+
+If you don't have cmr10.pfb, i.e., the type1 version of the
+traditional TeX fonts you need to get them from CTAN, e.g.,
+ftp.tex.ac.uk:/tex-archive/fonts/cm/ps-type1/bluesky/pfb/. Just drop
+them in a texmf directory, such as fonts/type1/bluesky/cm/. No
+further configuration should be needed to use these fonts.
+
+4b. AMS TeX fonts in postscript version
+
+Additionaly, get
+/tex-archive/fonts/amsfonts/ps-type1/amsps-unix.tar.gz and install the
+pfb files in fonts/type1/bluesky/ams.
+
+4c. More TeX fonts in postscript version
+
+There are some more type1 fonts in
+/tex-archive/fonts/cm/ps-type1/bakoma/pfb. As with the bluesky fonts
+drop them in a directory, such as fonts/type1/bakoma. There is a
+large overlap between the bakoma and bluesky fonts, you can save some
+confusion and diskspace by removing the bakoma fonts that have bluesky
+equivalents.
+
+(Side note: There are licensing restrictions on the use of the bakoma
+fonts which might prevent you from using them; one of them being the
+inclusion in finished documents. However, DVI files are not `finished'
+documents in this sense, since they don't contain the font shapes
+themselves; instead, xdvi needs to locate the fonts on disk.)
+
+If you do not want dvips to use the bakoma fonts, make sure that they are
+not referenced in any of the dvips fontmaps.
+
+5. Xdvi config files
+
+If you did not do 'make install' you will want to copy
+texk/xdvik/texmf/* from the source distribution into
+/usr/local/teTeX/share/texmf/xdvi. This copies some important
+configuration files describing encoding vectors and fonts to xdvi (see
+above).
+
+6. Almost finished
+
+All the font files are now where they should be. If you use a file
+database it's time to update it. TeTeX users run 'texhash' to obtain
+this effect.
+
+Xdvi can now find all the nice files and will not need pk versions of
+all those fonts.
+
+If you experience problems, please see the section `Debugging your
+font setup' in the file README.t1fonts.
diff --git a/Build/source/texk/xdvik/ac/withenable.ac b/Build/source/texk/xdvik/ac/withenable.ac
new file mode 100644
index 00000000000..35efd6831e5
--- /dev/null
+++ b/Build/source/texk/xdvik/ac/withenable.ac
@@ -0,0 +1,10 @@
+## texk/xdvik/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/
+dnl
+dnl Copyright (C) 2009-2013 Peter Breitenlohner <tex-live@tug.org>
+dnl You may freely use, modify and/or distribute this file.
+dnl
+dnl extra_dirs = texk/xdvik/squeeze
+dnl
+## configure options and TL libraries required for xdvik
+KPSE_ENABLE_PROG([xdvik], [kpathsea freetype2], [x])
+m4_include(kpse_TL[texk/xdvik/ac/xdvik.ac])
diff --git a/Build/source/texk/xdvik/ac/xdvik.ac b/Build/source/texk/xdvik/ac/xdvik.ac
new file mode 100644
index 00000000000..90477d5bb5c
--- /dev/null
+++ b/Build/source/texk/xdvik/ac/xdvik.ac
@@ -0,0 +1,11 @@
+## texk/xdvik/ac/xdvik.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/
+dnl
+dnl Copyright 2019 Karl Berry <tex-live@tug.org>
+dnl Copyright 2009 Peter Breitenlohner <tex-live@tug.org>
+dnl You may freely use, modify and/or distribute this file.
+dnl
+## configure options for xdvik
+AC_ARG_WITH([xdvi-x-toolkit],
+ AS_HELP_STRING([--with-xdvi-x-toolkit=KIT],
+ [Use toolkit KIT (xaw/motif/xaw3d/neXtaw) for xdvi
+ @<:@default: Xaw@:>@]))
diff --git a/Build/source/texk/xdvik/aclocal.m4 b/Build/source/texk/xdvik/aclocal.m4
new file mode 100644
index 00000000000..b0f8a162cfc
--- /dev/null
+++ b/Build/source/texk/xdvik/aclocal.m4
@@ -0,0 +1,1194 @@
+# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.3], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/xdvi-c-bitmap-type.m4])
+m4_include([m4/xdvi-check-iconv.m4])
+m4_include([m4/xdvi-check-langinfo.m4])
+m4_include([m4/xdvi-check-xaw.m4])
+m4_include([m4/xdvi-find-motif.m4])
+m4_include([m4/xdvi-find-xpm.m4])
+m4_include([m4/xdvi-func-memicmp.m4])
+m4_include([m4/xdvi-func-poll.m4])
+m4_include([m4/xdvi-func-setsid-in-fork.m4])
+m4_include([m4/xdvi-func-working-vsnprintf.m4])
+m4_include([m4/xdvi-func-xkbbell.m4])
+m4_include([m4/xdvi-gs-lib-path.m4])
+m4_include([m4/xdvi-linker-multiple-defns.m4])
+m4_include([m4/xdvi-sys-old-linux.m4])
+m4_include([m4/xdvi-sys-streams.m4])
+m4_include([m4/xdvi-xinput-2-1.m4])
+m4_include([../../m4/kpse-common.m4])
+m4_include([../../m4/kpse-freetype2-flags.m4])
+m4_include([../../m4/kpse-kpathsea-flags.m4])
+m4_include([../../m4/kpse-warnings.m4])
+m4_include([../../m4/kpse-zlib-flags.m4])
+m4_include([../../m4/libtool.m4])
+m4_include([../../m4/ltoptions.m4])
+m4_include([../../m4/ltsugar.m4])
+m4_include([../../m4/ltversion.m4])
+m4_include([../../m4/lt~obsolete.m4])
diff --git a/Build/source/texk/xdvik/alloc-debug.h b/Build/source/texk/xdvik/alloc-debug.h
new file mode 100644
index 00000000000..f729ce82fa1
--- /dev/null
+++ b/Build/source/texk/xdvik/alloc-debug.h
@@ -0,0 +1,33 @@
+#ifndef ALLOC_DEBUG_H__
+#define ALLOC_DEBUG_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/*
+ * Simplistic macros to help finding `hot spots'/bugs in memory handling.
+ * Require that MALLOC(x) is never a single statement following an if(),
+ * else() etc. without braces, and never in the middle of a variable
+ * declarations list.
+ */
+
+/* #define DEBUG_MEMORY_HANDLING */
+
+#ifdef DEBUG_MEMORY_HANDLING
+#define XMALLOC(x,y) ( \
+ fprintf(stderr, "=== %s:%d: malloc(%p (%s), %d)\n", __FILE__, __LINE__, x, #x, y), \
+ xmalloc(y))
+#define XREALLOC(x,y) ( \
+ fprintf(stderr, "=== %s:%d: realloc(%p (%s), %d)\n", __FILE__, __LINE__, x, #x, y), \
+ xrealloc(x, y))
+#define FREE(x) ( \
+ fprintf(stderr, "=== %s:%d: free(%p (%s))\n", __FILE__, __LINE__, x, #x), \
+ free(x))
+#else
+#define XMALLOC(x,y) xmalloc(y)
+#define XREALLOC(x,y) xrealloc(x,y)
+#define FREE(x) free(x)
+#endif
+
+#endif /* ALLOC_DEBUG_H__ */
diff --git a/Build/source/texk/xdvik/browser.c b/Build/source/texk/xdvik/browser.c
new file mode 100644
index 00000000000..59a1d227377
--- /dev/null
+++ b/Build/source/texk/xdvik/browser.c
@@ -0,0 +1,279 @@
+/* routines for launching a browser to retrieve remote documents.
+ * Copyright(C) 2002-2004 the xdvik development team.
+ */
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include <ctype.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+
+#include <sys/types.h>
+#include <sys/wait.h> /* for waitpid(), WEXITSTATUS */
+
+#include "util.h"
+#include "message-window.h"
+#include "events.h"
+#include "browser.h"
+#include "string-utils.h"
+#include "statusline.h"
+
+static const char *const default_browser_cmd =
+"xdg-open %s"
+":htmlview %s"
+":firefox -remote \"openURL(%s,new-window)\""
+":mozilla -remote \"openURL(%s,new-window)\""
+":netscape -remote \"openURL(%s,new-window)\""
+":xterm -e w3m %s"
+":xterm -e lynx %s"
+":xterm -e wget %s";
+
+static Boolean
+do_fork_browser(char *argv[])
+{
+ pid_t pid;
+ switch(pid = vfork()) {
+ case -1: /* forking error */
+ perror("fork");
+ return False;
+ case 0: /* child */
+ execvp(argv[0], argv);
+ /* arrive here only if execvp failed */
+ XDVI_ERROR((stderr, "Execution of %s failed: %s", argv[0], strerror(errno)));
+ _exit(EXIT_FAILURE);
+ return False; /* notreached - make compiler happy */
+ default: /* parent */
+ {
+ int timeout;
+ for (timeout = 0; timeout < 15; timeout++) {
+ int status;
+ if (waitpid(pid, &status, WNOHANG)) {
+ TRACE_HTEX((stderr, "waiting for %d: %d", (int)pid, status));
+ if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) != 0) {
+ fprintf(stderr, "Command `%s' exited with error status %d\n",
+ argv[0], WEXITSTATUS(status));
+ return False;
+ }
+ else {
+ TRACE_HTEX((stderr, "Child exited OK."));
+ return True;
+ }
+ }
+ else { /* when do we arrive here?? */
+ sleep(1);
+ }
+ }
+ else { /* waiting for child to finish */
+ sleep(1);
+ }
+ }
+ return True; /* child not finished in time */
+ }
+ }
+}
+
+static Boolean
+fork_browser(const char *browser, const char *url)
+{
+ char *cmd, *orig_cmd, *last_arg;
+ char **argv = NULL;
+ int argv_len = 0;
+ int i = 0, j = 0;
+ int match = 0;
+ int retval;
+
+
+ cmd = xmalloc(strlen(browser) + strlen(url) + 1);
+ orig_cmd = cmd; /* for freeing it later */
+ last_arg = cmd;
+
+ /* skip over leading space */
+ while (isspace((int)browser[i]))
+ i++;
+
+ while (browser[i] != '\0') {
+ while (j >= argv_len) {
+ argv_len += 10;
+ argv = xrealloc(argv, argv_len * sizeof *argv);
+ }
+ /* chop into separate arguments at spaces */
+ if (isspace((int)browser[i])) {
+ *cmd++ = '\0';
+ argv[j++] = format_arg(last_arg, url, &match);
+ last_arg = cmd;
+ /* skip over multiple spaces */
+ while (isspace((int)browser[i]))
+ i++;
+ }
+ /* remove quotes around arguments containing spaces */
+ else if (browser[i] == '\'' || browser[i] == '"') {
+ int len = 0;
+ /* normalize %% and replace %s by URL */
+ argv[j++] = unquote_arg(browser+i, url, &match, &len);
+ if (len == 0) { /* excess quote at end of arg; try to recover: */
+ j--;
+ break;
+ }
+ i += len + 1;
+ }
+ else {
+ *cmd++ = browser[i++];
+ }
+ }
+ *cmd = browser[i]; /* null-teminate */
+ /* append last, unless it contained only skipped spaces */
+ if (strlen(last_arg) > 0) {
+ argv[j++] = format_arg(last_arg, url, &match);
+ }
+
+ if (match == 0)
+ argv[j++] = xstrdup(url);
+ argv[j++] = NULL;
+
+ for (i = 0; argv[i] != NULL; i++) {
+ TRACE_HTEX((stderr, "arg[%d]: |%s|", i, argv[i]));
+ }
+
+ /* This will wait for child exits: */
+ retval = do_fork_browser(argv);
+ for (i = 0; argv[i] != NULL; i++)
+ free(argv[i]);
+ free(orig_cmd);
+ free(argv);
+ return retval;
+}
+
+void
+launch_browser(const char *filename)
+{
+ const char *browser;
+ int pid;
+ struct xchild *my_child;
+ struct xio *my_io;
+ int err_pipe[2];
+
+ /* try to set it from possible resources: First command-line argument
+ or X resource, then environment variables, then default_browser_cmd
+ */
+ for (;;) {
+ if ((browser = resource.browser) != NULL)
+ break;
+ if ((browser = getenv("BROWSER")) != NULL)
+ break;
+ if ((browser = getenv("WWWBROWSER")) != NULL)
+ break;
+ XDVI_INFO((stderr, "Browser not set (xdvi.wwwBrowser, -browser or $BROWSER environment variable)."));
+ XDVI_INFO((stderr, "Using built-in default: `%s'",
+ default_browser_cmd));
+ browser = default_browser_cmd;
+ break;
+ }
+
+ /* fork first time so that we can wait for children, without
+ freezing the GUI. FIXME: this copies stuff from
+ fork_process for the inter-process communication stuff -
+ it would be better to have this in one function. */
+ my_child = xmalloc(sizeof *my_child);
+ my_io = xmalloc(sizeof *my_io);
+ statusline_info(STATUS_MEDIUM, "Trying to launch browser ...");
+ /* flush output buffers to avoid double buffering (i.e. data
+ waiting in the output buffer being written twice, by the parent
+ and the child) */
+ fflush(stdout);
+ fflush(stderr);
+
+ if (pipe(err_pipe) < 0) {
+ perror("pipe");
+ _exit(-1);
+ }
+
+ switch (pid = fork()) {
+ case -1: /* forking error */
+ perror("fork");
+ close(err_pipe[0]);
+ close(err_pipe[1]);
+ return;
+ case 0: /* child */
+ {
+ char *tmp_browser = xstrdup(browser);
+
+ close(err_pipe[0]); /* no reading from stderr */
+
+ /* make stderr of child go to err_pipe[1] */
+ if (dup2(err_pipe[1], STDERR_FILENO) != STDERR_FILENO) {
+ perror("dup2 for stderr");
+ _exit(EXIT_FAILURE);
+ return; /* make compiler happy */
+ }
+
+ /*
+ BROWSER is a colon-separated list of commands, in decreasing preference;
+ use the first that can be forked successfully. Note that the return
+ value of the command isn't used at all (with GUI programs, xdvi shouldn't
+ hang until they terminate!)
+ */
+ while (tmp_browser != NULL) {
+ char *next = strchr(tmp_browser, ':');
+ if (next != NULL) {
+ *next++ = '\0';
+ }
+ TRACE_HTEX((stderr, "trying browser |%s|", tmp_browser));
+ /* fork a second time to start the browser */
+ if (fork_browser(tmp_browser, filename)) { /* foking worked */
+ _exit(EXIT_SUCCESS);
+ }
+ tmp_browser = next;
+ }
+ /* child arrives here only if none of the commands worked */
+ XDVI_WARNING((stderr, "None of the browser commands in the `browser' resource (%s) worked\n",
+ browser));
+ free(tmp_browser);
+ _exit(EXIT_FAILURE);
+ }
+ default: /* parent */
+ close(err_pipe[1]); /* no writing to stderr */
+
+ my_io->next = NULL;
+ my_io->fd = err_pipe[0];
+ my_io->xio_events = XIO_IN;
+#if HAVE_POLL
+ my_io->pfd = NULL;
+#endif
+ my_io->read_proc = read_child_error;
+ my_io->write_proc = NULL;
+ my_io->data = NULL;
+
+ my_child->next = NULL;
+ my_child->pid = pid;
+ my_child->name = NULL;
+ my_child->proc = handle_child_exit;
+ my_child->data = NULL;
+ my_child->io = my_io;
+
+ set_chld(my_child);
+ statusline_info(STATUS_MEDIUM, "Trying to launch browser ... done.");
+ }
+}
+
+
diff --git a/Build/source/texk/xdvik/browser.h b/Build/source/texk/xdvik/browser.h
new file mode 100644
index 00000000000..0a5d13296be
--- /dev/null
+++ b/Build/source/texk/xdvik/browser.h
@@ -0,0 +1,29 @@
+/* public interface for launching a browser to retrieve remote documents.
+ * Copyright(C) 2002-2004 the xdvik development team.
+ */
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef BROWSER_H_
+#define BROWSER_H_
+
+extern void launch_browser(const char *filename);
+
+#endif /* BROWSER_H_ */
diff --git a/Build/source/texk/xdvik/c-auto.in b/Build/source/texk/xdvik/c-auto.in
new file mode 100644
index 00000000000..de496e16188
--- /dev/null
+++ b/Build/source/texk/xdvik/c-auto.in
@@ -0,0 +1,457 @@
+/* c-auto.in. Generated from configure.ac by autoheader. */
+
+/* Define to use A4 as the default paper size. */
+#undef A4
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to the length (in bytes) of type BMTYPE. */
+#undef BMBYTES
+
+/* Define to determine the integer type to be used in bitmaps. The type used
+ will be "unsigned BMTYPE". */
+#undef BMTYPE
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+#undef CLOSEDIR_VOID
+
+/* Define to enable support for color specials. */
+#undef COLOR
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to point to the default command to use for printing (optional). */
+#undef DEFAULT_DVIPS_PATH
+
+/* Define to set the default path for ghostscript-style font searching. */
+#undef DEFAULT_GS_LIB_PATH
+
+/* Define to point to the default command to use for printing (optional). */
+#undef DEFAULT_PS2PDF_PATH
+
+/* Define if you are using Linux 2.1.xxx -- 2.2.8, or if you find it
+ necessary. */
+#undef FLAKY_SIGPOLL
+
+/* Define to compile in the FreeType2 library. */
+#undef FREETYPE
+
+/* Define to enable greyscale anti-aliasing for shrunken bitmaps. */
+#undef GREY
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <assert.h> header file. */
+#undef HAVE_ASSERT_H
+
+/* Define to 1 if you have the declaration of `isascii', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISASCII
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the `fchdir' function. */
+#undef HAVE_FCHDIR
+
+/* Define to 1 if you have the <float.h> header file. */
+#undef HAVE_FLOAT_H
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getpwnam' function. */
+#undef HAVE_GETPWNAM
+
+/* Define to 1 if you have the `getpwuid' function. */
+#undef HAVE_GETPWUID
+
+/* Define to 1 if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define to 1 if you have the `getwd' function. */
+#undef HAVE_GETWD
+
+/* Define if your system allows setsid() within vfork(). */
+#undef HAVE_GOOD_SETSID_VFORK
+
+/* Define if the vsnprintf function works. */
+#undef HAVE_GOOD_VSNPRINTF
+
+/* Define to 1 if you have the `iconv' function. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <iconv.h> header file. */
+#undef HAVE_ICONV_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isinf' function. */
+#undef HAVE_ISINF
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `lstat' function. */
+#undef HAVE_LSTAT
+
+/* Define to 1 if you have the `memcmp' function. */
+#undef HAVE_MEMCMP
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define if the memicmp() function is in <string.h> */
+#undef HAVE_MEMICMP
+
+/* 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 `mktemp' function. */
+#undef HAVE_MKTEMP
+
+/* 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 <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define if you have an old version of the Xaw library */
+#undef HAVE_OLD_XAW
+
+/* Define if your system has <poll.h> and poll(). */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `realpath' function. */
+#undef HAVE_REALPATH
+
+/* Define to 1 if you have the <regex.h> header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the <select.h> header file. */
+#undef HAVE_SELECT_H
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* 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 `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define if your system has STREAMS (and if X uses it). */
+#undef HAVE_STREAMS
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if cpp supports the ANSI # stringizing operator. */
+#undef HAVE_STRINGIZE
+
+/* 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 `strrchr' function. */
+#undef HAVE_STRRCHR
+
+/* Define to 1 if `st_mtim' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_MTIM
+
+/* Define to 1 if you have the <sys/bsdtypes.h> header file. */
+#undef HAVE_SYS_BSDTYPES_H
+
+/* 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/fcntl.h> header file. */
+#undef HAVE_SYS_FCNTL_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/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* 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 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define if the CODESET argument to nl_langinfo works. */
+#undef HAVE_WORKING_NL_LANGINFO_CODESET
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if you have the <X11/IntrinsicI.h> header file. */
+#undef HAVE_X11_INTRINSICI_H
+
+/* Define to 1 if you have the <X11/Intrinsic.h> header file. */
+#undef HAVE_X11_INTRINSIC_H
+
+/* Define to 1 if you have the <X11/Xmu/Editres.h> header file. */
+#undef HAVE_X11_XMU_EDITRES_H
+
+/* Define to 1 if you have the <X11/Xmu/Xmu.h> header file. */
+#undef HAVE_X11_XMU_XMU_H
+
+/* Define to 1 if you have the <X11/Xosdefs.h> header file. */
+#undef HAVE_X11_XOSDEFS_H
+
+/* Define if you have the <X11/xpm.h> header file. */
+#undef HAVE_X11_XPM_H
+
+/* Define if your system has XInput version 2.1 or higher. */
+#undef HAVE_XI21
+
+/* Define if your system has XkbBell(). */
+#undef HAVE_XKB_BELL_EXT
+
+/* Define to 1 if you have the <Xm/XpmP.h> header file. */
+#undef HAVE_XM_XPMP_H
+
+/* Define if you have the <xpm.h> header file (not in X11, e.g. Solaris 5.8).
+ */
+#undef HAVE_XPM_H
+
+/* Define the type of the iconv input string (char ** or const char **) */
+#undef ICONV_CHAR_PPTR_TYPE
+
+/* Define if your system allows multiple definitions of functions. */
+#undef LD_ALLOWS_MULTIPLE_DEFINITIONS
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Define to use ImageMagick */
+#undef MAGICK
+
+/* Define to use the Motif toolkit. */
+#undef MOTIF
+
+/* 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
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* The size of `unsigned char', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_CHAR
+
+/* 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 `unsigned short', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_SHORT
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to use Xaw panner. */
+#undef USE_XAW_PANNER
+
+/* Define if you want to use the Xpm library */
+#undef USE_XPM
+
+/* 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 use the Xaw toolkit. */
+#undef XAW
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* Define to 1 if <zlib.h> declares 'z_const'. */
+#undef ZLIB_CONST
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT32_T
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT64_T
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int64_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `long' if <sys/types.h> does not define. */
+#undef ptrdiff_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to the type of an unsigned integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint32_t
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint64_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
+
+/* Define as empty if not declared in <zlib.h>. */
+#undef z_const
diff --git a/Build/source/texk/xdvik/c-openmx.h b/Build/source/texk/xdvik/c-openmx.h
new file mode 100644
index 00000000000..1a3560fa6bb
--- /dev/null
+++ b/Build/source/texk/xdvik/c-openmx.h
@@ -0,0 +1,37 @@
+/* c-openmx.h: define OPEN_MAX, the maximum number of open files a
+ process can have. Possibly dynamically determined.
+
+Copyright (C) 1993 Karl Berry.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef C_OPENMX_H_
+#define C_OPENMX_H_
+
+#include "kpathsea/c-limits.h"
+
+#ifndef OPEN_MAX
+#ifdef _SC_OPEN_MAX
+#define OPEN_MAX sysconf (_SC_OPEN_MAX)
+#else /* no SC_OPEN_MAX */
+#ifdef NOFILE
+#define OPEN_MAX NOFILE
+#else /* no NOFILE */
+#define OPEN_MAX 24 /* The POSIX minimum. */
+#endif /* no NOFILE */
+#endif /* no _SC_OPEN_MAX */
+#endif /* no OPEN_MAX */
+
+#endif /* not C_OPENMX_H_ */
diff --git a/Build/source/texk/xdvik/common.am b/Build/source/texk/xdvik/common.am
new file mode 100644
index 00000000000..e438eed6654
--- /dev/null
+++ b/Build/source/texk/xdvik/common.am
@@ -0,0 +1,34 @@
+## texk/xdvik/common.am: Makefile fragment for the TeX Live subdirectory texk/xdvik/
+##
+## Copyright (C) 2009-2013 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+##
+## Make `#include <X11/...>' work.
+x_cppflags = $(X_CFLAGS) $(iconv_includes)
+common_includes = $(PS_DEF) $(KPATHSEA_INCLUDES) $(FREETYPE2_INCLUDES) $(x_cppflags)
+
+## Make `-lX...' work. Follow the library order used in X11R6 itself.
+##
+## Since libXaw7 needs libXpm we put x_xpm_libs after the tool_libs,
+## but before -lX11.
+## libXp may be needed by libXm and libXaw (the now defunct libXaw8),
+## if required libXp has been added to x_ext_lib.
+## libXmu needs to come before Xt and after the toolkit libs.
+x_ldflags = $(X_LIBS) $(x_linker_options) $(iconv_libpath)
+x_extra_libs = $(X_EXTRA_LIBS) $(iconv_libs)
+xdvi_x_libs = $(x_ldflags) $(x_tool_libs) $(x_xmu_lib) -lXt $(X_PRE_LIBS)
+xdvi_x_libs += $(x_ext_lib) $(x_xpm_libs) -lX11 $(x_extra_libs)
+
+common_ldadd = $(KPATHSEA_LIBS) $(FREETYPE2_LIBS) $(xdvi_x_libs)
+
+common_dependencies = $(KPATHSEA_DEPEND) $(FREETYPE2_DEPEND)
+
+## Dependencies for libxdvi.a
+##
+libxdvi_dependencies = ${top_srcdir}/*.[ch] ${top_srcdir}/gui/*.[ch] ${top_builddir}/psheader.c
+
+## Rebuild libkpathsea
+@KPATHSEA_RULE@
+## Rebuild freetype2
+@FREETYPE2_RULE@
+
diff --git a/Build/source/texk/xdvik/configure b/Build/source/texk/xdvik/configure
new file mode 100755
index 00000000000..179c2be0618
--- /dev/null
+++ b/Build/source/texk/xdvik/configure
@@ -0,0 +1,21663 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for xdvik 22.87.04.
+#
+# Report bugs to <tex-k@tug.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='xdvik'
+PACKAGE_TARNAME='xdvik'
+PACKAGE_VERSION='22.87.04'
+PACKAGE_STRING='xdvik 22.87.04'
+PACKAGE_BUGREPORT='tex-k@tug.org'
+PACKAGE_URL=''
+
+ac_unique_file="xdvi.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+subdirs
+XDVIK_VERSION
+FREETYPE2_RULE
+FREETYPE2_DEPEND
+FREETYPE2_LIBS
+FREETYPE2_INCLUDES
+FT2_CONFIG
+ZLIB_RULE
+ZLIB_DEPEND
+ZLIB_LIBS
+ZLIB_INCLUDES
+KPATHSEA_RULE
+KPATHSEA_DEPEND
+KPATHSEA_LIBS
+KPATHSEA_INCLUDES
+PKG_CONFIG
+final_exec_name
+x_tool_libs
+x_ext_lib
+x_xpm_libs
+x_xmu_lib
+iconv_libs
+iconv_libpath
+iconv_includes
+x_linker_options
+X_EXTRA_LIBS
+X_LIBS
+X_PRE_LIBS
+X_CFLAGS
+XMKMF
+LIBOBJS
+ALLOCA
+PS_DEF
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+WARNING_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_compiler_warnings
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+with_xdvi_x_toolkit
+with_ps
+enable_a4
+with_x
+enable_xi2_scrolling
+with_iconv
+with_iconv_include
+with_iconv_libdir
+enable_magick
+with_xpm
+with_xpm_includes
+with_xpm_libraries
+with_motif_include
+with_motif_libdir
+with_system_kpathsea
+with_system_zlib
+with_zlib_includes
+with_zlib_libdir
+with_system_freetype2
+with_default_gs_lib_path
+with_default_dvips_path
+with_default_ps2pdf_path
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+LT_SYS_LIBRARY_PATH
+CPP
+XMKMF'
+ac_subdirs_all='squeeze'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures xdvik 22.87.04 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/xdvik]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of xdvik 22.87.04:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-compiler-warnings=[no|min|yes|max|all]
+ Turn on compiler warnings [default: yes if
+ maintainer-mode, min otherwise]
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-static[=PKGS] build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --disable-largefile omit support for large files
+ --disable-a4 Set default paper size to letter and default unit to
+ inch
+ --enable-xi2-scrolling Use XInput 2.1 'smooth scrolling' if available
+ (default: disabled for native TL build)
+ --enable-magick Use ImageMagick to load/render image files.
+ EXPERIMENTAL - DO NOT USE!
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --with-xdvi-x-toolkit=KIT
+ Use toolkit KIT (xaw/motif/xaw3d/neXtaw) for xdvi
+ [default: Xaw]
+ --with-ps=PS Use PostScript (PS=no/yes/gs/dps/news, default gs)
+ --with-x use the X Window System
+ --with-iconv Use an iconv library [default=check]
+ --with-iconv-include=DIR
+ Specify the location of <iconv.h> header
+ --with-iconv-libdir=DIR Specify the location of iconv (-liconv or -lrecode)
+ library
+ --without-xpm Do not use the Xpm library (will disable the
+ toolbar)
+ --with-xpm-include=DIR Specify the location of Xpm include files
+ --with-xpm-libdir=DIR Specify the location of Xpm libraries
+ --with-motif-include=DIR
+ Specify the location of Motif include files
+ --with-motif-libdir=DIR Specify the location of Motif libraries
+ --with-system-kpathsea use installed kpathsea headers and library (requires
+ pkg-config)
+ --with-system-zlib use installed zlib headers and library
+ --with-zlib-includes=DIR
+ zlib headers installed in DIR
+ --with-zlib-libdir=DIR zlib library installed in DIR
+ --with-system-freetype2 use installed freetype2 headers and library
+ (requires freetype-config)
+ --with-default-gs-lib-path=PATH
+ set default path for finding font aliases to PATH
+ --with-default-dvips-path=CMD
+ Use CMD as default DVI to PS converter
+ --with-default-ps2pdf-path=CMD
+ Use CMD as default PS to PDF converter
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CPP C preprocessor
+ XMKMF Path to xmkmf, Makefile generator for X Window System
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <tex-k@tug.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+xdvik configure 22.87.04
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ---------------------------- ##
+## Report this to tex-k@tug.org ##
+## ---------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_find_intX_t LINENO BITS VAR
+# -----------------------------------
+# Finds a signed integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_intX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+$as_echo_n "checking for int$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in int$2_t 'int' 'long int' \
+ 'long long int' 'short int' 'signed char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ case $ac_type in #(
+ int$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_intX_t
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid; break
+else
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=$ac_mid; break
+else
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid
+else
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by xdvik $as_me 22.87.04, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_aux_dir=
+for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+
+
+am__api_version='1.16'
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+# Check whether --enable-compiler-warnings was given.
+if test "${enable_compiler_warnings+set}" = set; then :
+ enableval=$enable_compiler_warnings;
+fi
+case $enable_compiler_warnings in #(
+ no | min | yes | max | all) :
+ ;; #(
+ *) :
+ if test "x$enable_maintainer_mode" = xyes; then :
+ enable_compiler_warnings=yes
+else
+ enable_compiler_warnings=min
+fi ;;
+esac
+
+case `pwd` in
+ *\ * | *\ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in fgrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+ withval=$with_sysroot;
+else
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in dd; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_cc_needs_belf=yes
+else
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_ld_exported_symbols_list=yes
+else
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+##tldbg KPSE_COMMON: xdvik ().
+##tldbg KPSE_BASIC: Remember xdvik () as Kpse_Package (for future messages).
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='xdvik'
+ VERSION='22.87.04'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler accepts prototypes" >&5
+$as_echo_n "checking whether the compiler accepts prototypes... " >&6; }
+if ${kb_cv_c_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+extern void foo(int i,...);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kb_cv_c_prototypes=yes
+else
+ kb_cv_c_prototypes=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kb_cv_c_prototypes" >&5
+$as_echo "$kb_cv_c_prototypes" >&6; }
+if test "x$kb_cv_c_prototypes" = xno; then
+ as_fn_error $? "Sorry, your compiler does not understand prototypes." "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5
+$as_echo_n "checking what warning flags to pass to the C compiler... " >&6; }
+if ${kpse_cv_warning_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$GCC" = xyes; then
+ kpse_cv_warning_cflags=
+if test "x$enable_compiler_warnings" != xno; then
+ kpse_cv_warning_cflags="-Wimplicit -Wreturn-type"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #(
+ *) :
+ ;;
+esac
+ case `$CC -dumpversion` in #(
+ 3.[234].* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmin; then
+ kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations"
+ if test "x$enable_compiler_warnings" != xyes; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmax; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow"
+ fi
+ fi
+ fi
+fi
+elif test "x$enable_compiler_warnings" = xno; then
+ kpse_cv_warning_cflags=
+else
+ kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5
+$as_echo "$kpse_cv_warning_cflags" >&6; }
+WARNING_CFLAGS=$kpse_cv_warning_cflags
+
+
+
+
+
+
+
+
+
+
+
+
+# Set options
+enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+$as_echo "$AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+$as_echo "$ac_ct_AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_AS" = x; then
+ AS="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AS=$ac_ct_AS
+ fi
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+ ;;
+esac
+
+test -z "$AS" && AS=as
+
+
+
+
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+
+ # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else
+ if ${lt_cv_with_aix_soname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_irix_exported_symbol=yes
+else
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_shl_load=yes
+else
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_svld_dlopen=yes
+else
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_dld_link=yes
+else
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP"; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_source+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
+$as_echo_n "checking whether closedir returns void... " >&6; }
+if ${ac_cv_func_closedir_void+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_closedir_void=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header_dirent>
+#ifndef __cplusplus
+int closedir ();
+#endif
+
+int
+main ()
+{
+return closedir (opendir (".")) != 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_closedir_void=no
+else
+ ac_cv_func_closedir_void=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
+$as_echo "$ac_cv_func_closedir_void" >&6; }
+if test $ac_cv_func_closedir_void = yes; then
+
+$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
+
+fi
+
+for ac_header in assert.h float.h limits.h pwd.h stdlib.h sys/param.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in putenv
+do :
+ ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PUTENV 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getcwd getwd memcmp memcpy mkstemp mktemp strchr strrchr
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t"
+case $ac_cv_c_int64_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int64_t $ac_cv_c_int64_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
+case $ac_cv_c_uint64_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT64_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t $ac_cv_c_uint64_t
+_ACEOF
+;;
+ esac
+
+case :$ac_cv_c_int64_t:$ac_cv_c_int64_t: in #(
+ *':no:'*) :
+ as_fn_error $? "Sorry, your compiler does not support 64-bit integer types." "$LINENO" 5 ;; #(
+ *) :
+ ;;
+esac
+ac_fn_c_check_decl "$LINENO" "isascii" "ac_cv_have_decl_isascii" "#include <ctype.h>
+"
+if test "x$ac_cv_have_decl_isascii" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISASCII $ac_have_decl
+_ACEOF
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_MTIM 1
+_ACEOF
+
+
+fi
+
+
+if test "x$host_alias" != x && test "x$build_alias" = x; then :
+ as_fn_error $? "when cross-compiling you must specify both --host and --build." "$LINENO" 5
+fi
+eval kpse_build_alias=\${build_alias-$build}
+
+
+## texk/xdvik/ac/xdvik.ac: configure.ac fragment for the TeX Live subdirectory texk/xdvik/
+## configure options for xdvik
+
+# Check whether --with-xdvi-x-toolkit was given.
+if test "${with_xdvi_x_toolkit+set}" = set; then :
+ withval=$with_xdvi_x_toolkit;
+fi
+
+
+
+# Reduce compiler warnings, there are just too many.
+WARNING_CFLAGS=`echo $WARNING_CFLAGS | sed -e 's/ -Wcast-qual/ /' -e 's/ -Wwrite-strings/ /'`
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5
+$as_echo_n "checking for library containing pow... " >&6; }
+if ${ac_cv_search_pow+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pow ();
+int
+main ()
+{
+return pow ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_pow=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_pow+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_pow+:} false; then :
+
+else
+ ac_cv_search_pow=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5
+$as_echo "$ac_cv_search_pow" >&6; }
+ac_res=$ac_cv_search_pow
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+
+# Check whether --with-ps was given.
+if test "${with_ps+set}" = set; then :
+ withval=$with_ps;
+fi
+
+case $with_ps in #(
+ "" | yes | gs) :
+ PS_DEF=-DPS_GS ;; #(
+ no) :
+ PS_DEF= ;; #(
+ dps) :
+ PS_DEF=-DPS_DPS ;; #(
+ news) :
+ PS_DEF=-DPS_NEWS ;; #(
+ *) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown--with-ps argument \`$with_ps'; using gs." >&5
+$as_echo "$as_me: WARNING: unknown--with-ps argument \`$with_ps'; using gs." >&2;}
+ PS_DEF=-DPS_GS ;;
+esac
+
+
+
+$as_echo "#define GREY 1" >>confdefs.h
+
+
+
+$as_echo "#define COLOR 1" >>confdefs.h
+
+
+
+$as_echo "#define FREETYPE 1" >>confdefs.h
+
+
+
+# Check whether --enable-a4 was given.
+if test "${enable_a4+set}" = set; then :
+ enableval=$enable_a4;
+fi
+
+if test "x$enable_a4" = xno; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Disabled a4/cm, using letter/in instead" >&5
+$as_echo "$as_me: Disabled a4/cm, using letter/in instead" >&6;}
+else
+
+$as_echo "#define A4 1" >>confdefs.h
+
+fi
+
+ac_config_headers="$ac_config_headers c-auto.h:c-auto.in"
+
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+for ac_header in vfork.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
+if test "x$ac_cv_header_vfork_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VFORK_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in fork vfork
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test "x$ac_cv_func_fork" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
+$as_echo_n "checking for working fork... " >&6; }
+if ${ac_cv_func_fork_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_fork_works=cross
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* By Ruediger Kuhlmann. */
+ return fork () < 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_fork_works=yes
+else
+ ac_cv_func_fork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
+$as_echo "$ac_cv_func_fork_works" >&6; }
+
+else
+ ac_cv_func_fork_works=$ac_cv_func_fork
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+ *-*-amigaos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+ *)
+ ac_cv_func_fork_works=yes
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
+$as_echo_n "checking for working vfork... " >&6; }
+if ${ac_cv_func_vfork_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_vfork_works=cross
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Thanks to Paul Eggert for this test. */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+ argument registers are propagated back to the parent. The compiler
+ is told about this with #include <vfork.h>, but some compilers
+ (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a
+ static variable whose address is put into a register that is
+ clobbered by the vfork. */
+static void
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+ static pid_t child;
+ if (!child) {
+ child = vfork ();
+ if (child < 0) {
+ perror ("vfork");
+ _exit(2);
+ }
+ if (!child) {
+ arg = getpid();
+ write(-1, "", 0);
+ _exit (arg);
+ }
+ }
+}
+
+int
+main ()
+{
+ pid_t parent = getpid ();
+ pid_t child;
+
+ sparc_address_test (0);
+
+ child = vfork ();
+
+ if (child == 0) {
+ /* Here is another test for sparc vfork register problems. This
+ test uses lots of local variables, at least as many local
+ variables as main has allocated so far including compiler
+ temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris
+ 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should
+ reuse the register of parent for one of the local variables,
+ since it will think that parent can't possibly be used any more
+ in this routine. Assigning to the local variable will thus
+ munge parent in the parent process. */
+ pid_t
+ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+ /* Convince the compiler that p..p7 are live; otherwise, it might
+ use the same hardware register for all 8 local variables. */
+ if (p != p1 || p != p2 || p != p3 || p != p4
+ || p != p5 || p != p6 || p != p7)
+ _exit(1);
+
+ /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+ from child file descriptors. If the child closes a descriptor
+ before it execs or exits, this munges the parent's descriptor
+ as well. Test for this by closing stdout in the child. */
+ _exit(close(fileno(stdout)) != 0);
+ } else {
+ int status;
+ struct stat st;
+
+ while (wait(&status) != child)
+ ;
+ return (
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+
+ /* Did the vfork/compiler bug occur? */
+ || parent != getpid()
+
+ /* Did the file descriptor bug occur? */
+ || fstat(fileno(stdout), &st) != 0
+ );
+ }
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_vfork_works=yes
+else
+ ac_cv_func_vfork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
+$as_echo "$ac_cv_func_vfork_works" >&6; }
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+ ac_cv_func_vfork_works=$ac_cv_func_vfork
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
+
+else
+
+$as_echo "#define vfork fork" >>confdefs.h
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
+
+fi
+
+for ac_func in vprintf
+do :
+ ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
+if test "x$ac_cv_func_vprintf" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VPRINTF 1
+_ACEOF
+
+ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt"
+if test "x$ac_cv_func__doprnt" = xyes; then :
+
+$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h
+
+fi
+
+fi
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working implementation of (v)snprintf()" >&5
+$as_echo_n "checking for a working implementation of (v)snprintf()... " >&6; }
+if ${xdvi_cv_func_good_vsnprintf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ xdvi_cv_func_good_vsnprintf=no # safe value for cross-compiling
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef IRIX
+#define _XOPEN_SOURCE 500
+#endif
+#include <stdio.h>
+int
+main ()
+{
+char s[2];
+ int retval = snprintf(s, 2, "test");
+ if (retval > -1 && retval != 4) /* neither negative nor desired size, not OK */
+ return 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ xdvi_cv_func_good_vsnprintf=yes
+else
+ xdvi_cv_func_good_vsnprintf=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_func_good_vsnprintf" >&5
+$as_echo "$xdvi_cv_func_good_vsnprintf" >&6; }
+if test "x$xdvi_cv_func_good_vsnprintf" = xyes; then
+
+$as_echo "#define HAVE_GOOD_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for memicmp" >&5
+$as_echo_n "checking for memicmp... " >&6; }
+if ${xdvi_cv_memicmp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+int
+main ()
+{
+(void)memicmp((char *)NULL, (char *)NULL, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_memicmp=yes
+else
+ xdvi_cv_memicmp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_memicmp" >&5
+$as_echo "$xdvi_cv_memicmp" >&6; }
+if test "x$xdvi_cv_memicmp" = xyes; then
+
+$as_echo "#define HAVE_MEMICMP 1" >>confdefs.h
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
+if ${ac_cv_working_alloca_h+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_working_alloca_h=yes
+else
+ ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
+if ${ac_cv_func_alloca_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca (size_t);
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_func_alloca_works=yes
+else
+ ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+$as_echo "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
+if ${ac_cv_os_cray+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then :
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+ break
+fi
+
+ done
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
+if ${ac_cv_c_stack_direction+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_c_stack_direction=0
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_c_stack_direction=1
+else
+ ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor stringizing operator" >&5
+$as_echo_n "checking for preprocessor stringizing operator... " >&6; }
+if ${ac_cv_c_stringize+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define x(y) #y
+
+char *s = x(teststring);
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "#teststring" >/dev/null 2>&1; then :
+ ac_cv_c_stringize=no
+else
+ ac_cv_c_stringize=yes
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stringize" >&5
+$as_echo "$ac_cv_c_stringize" >&6; }
+if test $ac_cv_c_stringize = yes; then
+
+$as_echo "#define HAVE_STRINGIZE 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5
+$as_echo_n "checking for working memcmp... " >&6; }
+if ${ac_cv_func_memcmp_working+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_memcmp_working=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Some versions of memcmp are not 8-bit clean. */
+ char c0 = '\100', c1 = '\200', c2 = '\201';
+ if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)
+ return 1;
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ char foo[21];
+ char bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ char *a = foo + i;
+ char *b = bar + i;
+ strcpy (a, "--------01111111");
+ strcpy (b, "--------10000000");
+ if (memcmp (a, b, 16) >= 0)
+ return 1;
+ }
+ return 0;
+ }
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_memcmp_working=yes
+else
+ ac_cv_func_memcmp_working=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5
+$as_echo "$ac_cv_func_memcmp_working" >&6; }
+test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in
+ *" memcmp.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS memcmp.$ac_objext"
+ ;;
+esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if ${ac_cv_header_sys_wait_h+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_sys_wait_h=yes
+else
+ ac_cv_header_sys_wait_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if ${ac_cv_type_signal+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_type_signal=int
+else
+ ac_cv_type_signal=void
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes; then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_c_bigendian=no
+else
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
+$as_echo_n "checking for X... " >&6; }
+
+
+# Check whether --with-x was given.
+if test "${with_x+set}" = set; then :
+ withval=$with_x;
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ case $x_includes,$x_libraries in #(
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+ *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -f -r conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ cat >Imakefile <<'_ACEOF'
+incroot:
+ @echo incroot='${INCROOT}'
+usrlibdir:
+ @echo usrlibdir='${USRLIBDIR}'
+libdir:
+ @echo libdir='${LIBDIR}'
+_ACEOF
+ if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+ for ac_var in incroot usrlibdir libdir; do
+ eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
+ done
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl dylib la dll; do
+ if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+ test -f "$ac_im_libdir/libX11.$ac_extension"; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ac_x_includes= ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /usr/lib64 | /lib | /lib64) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -f -r conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Xlib.h.
+ # First, try using that file with no special directory specified.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Xlib.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lX11 $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Xlib.h>
+int
+main ()
+{
+XrmInitialize ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ LIBS=$ac_save_LIBS
+for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl dylib la dll; do
+ if test -r "$ac_dir/libX11.$ac_extension"; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+case $ac_x_includes,$ac_x_libraries in #(
+ no,* | *,no | *\'*)
+ # Didn't find X, or a directory has "'" in its name.
+ ac_cv_have_x="have_x=no";; #(
+ *)
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$ac_x_includes'\
+ ac_x_libraries='$ac_x_libraries'"
+esac
+fi
+;; #(
+ *) have_x=yes;;
+ esac
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
+$as_echo "$have_x" >&6; }
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes\
+ ac_x_includes='$x_includes'\
+ ac_x_libraries='$x_libraries'"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
+$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
+fi
+
+if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+
+$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h
+
+ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
+$as_echo_n "checking whether -R must be followed by a space... " >&6; }
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ ac_xsave_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ X_LIBS="$X_LIBS -R$x_libraries"
+else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ X_LIBS="$X_LIBS -R $x_libraries"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
+$as_echo "neither works" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_c_werror_flag=$ac_xsave_c_werror_flag
+ LIBS=$ac_xsave_LIBS
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn Johnson says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And Karl Berry says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XOpenDisplay ();
+int
+main ()
+{
+return XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
+if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else
+ ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
+$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
+if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dnet_ntoa ();
+int
+main ()
+{
+return dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+ ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_xsave_LIBS"
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to T.E. Dickey.
+ # The functions gethostbyname, getservbyname, and inet_addr are
+ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+ ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_gethostbyname = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
+$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
+if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_bsd_gethostbyname=yes
+else
+ ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
+$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+ fi
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says Simon Leinen: it contains gethostby*
+ # variants that don't use the name server (or something). -lsocket
+ # must be given before -lnsl if both are needed. We assume that
+ # if connect needs -lnsl, so does gethostbyname.
+ ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
+if test "x$ac_cv_func_connect" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_connect = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+$as_echo_n "checking for connect in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_connect+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char connect ();
+int
+main ()
+{
+return connect ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_connect=yes
+else
+ ac_cv_lib_socket_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+$as_echo "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes; then :
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
+if test "x$ac_cv_func_remove" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_remove = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
+$as_echo_n "checking for remove in -lposix... " >&6; }
+if ${ac_cv_lib_posix_remove+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char remove ();
+int
+main ()
+{
+return remove ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_posix_remove=yes
+else
+ ac_cv_lib_posix_remove=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
+$as_echo "$ac_cv_lib_posix_remove" >&6; }
+if test "x$ac_cv_lib_posix_remove" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
+if test "x$ac_cv_func_shmat" = xyes; then :
+
+fi
+
+ if test $ac_cv_func_shmat = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
+$as_echo_n "checking for shmat in -lipc... " >&6; }
+if ${ac_cv_lib_ipc_shmat+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shmat ();
+int
+main ()
+{
+return shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ipc_shmat=yes
+else
+ ac_cv_lib_ipc_shmat=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
+$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
+if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS=$LDFLAGS
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # John Interrante, Karl Berry
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
+$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
+if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char IceConnectionNumber ();
+int
+main ()
+{
+return IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+ ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+ LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+
+if test "x$ac_cv_func_vfork_works" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for whether setsid() is allowed within vfork()" >&5
+$as_echo_n "checking for whether setsid() is allowed within vfork()... " >&6; }
+if ${xdvi_cv_setsid_in_vfork+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ xdvi_cv_setsid_in_vfork=no # safe value for cross-compiling
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Test adapted from Gnu autoconf */
+/* Thanks to Paul Eggert for this test. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_VFORK_H
+#include <vfork.h>
+#endif
+int
+main ()
+{
+
+ pid_t parent = getpid ();
+ pid_t child;
+
+ child = vfork ();
+
+ if (child == 0) {
+ if (setsid () == -1)
+ _exit(1);
+ _exit(0);
+ } else {
+ int status;
+
+ while (wait(&status) != child)
+ ;
+ exit(
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+ );
+ }
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ xdvi_cv_setsid_in_vfork=yes
+else
+ xdvi_cv_setsid_in_vfork=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_setsid_in_vfork" >&5
+$as_echo "$xdvi_cv_setsid_in_vfork" >&6; }
+if test "x$xdvi_cv_setsid_in_vfork" = xyes; then
+
+$as_echo "#define HAVE_GOOD_SETSID_VFORK 1" >>confdefs.h
+
+fi
+fi
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5
+$as_echo_n "checking size of unsigned int... " >&6; }
+if ${ac_cv_sizeof_unsigned_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned int)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_int=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5
+$as_echo "$ac_cv_sizeof_unsigned_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5
+$as_echo_n "checking size of unsigned short... " >&6; }
+if ${ac_cv_sizeof_unsigned_short+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_short" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned short)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_short=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5
+$as_echo "$ac_cv_sizeof_unsigned_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short
+_ACEOF
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned char" >&5
+$as_echo_n "checking size of unsigned char... " >&6; }
+if ${ac_cv_sizeof_unsigned_char+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned char))" "ac_cv_sizeof_unsigned_char" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_char" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned char)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_char=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_char" >&5
+$as_echo "$ac_cv_sizeof_unsigned_char" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_CHAR $ac_cv_sizeof_unsigned_char
+_ACEOF
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for integer type to use in bitmaps" >&5
+$as_echo_n "checking for integer type to use in bitmaps... " >&6; }
+if ${xdvi_cv_bitmap_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if (test $ac_cv_sizeof_unsigned_long = 4 || test $ac_cv_sizeof_unsigned_long = 2) \
+ && test $ac_cv_sizeof_unsigned_long != $ac_cv_sizeof_unsigned_int; then :
+ xdvi_cv_bitmap_type="BMTYPE=long BMBYTES=$ac_cv_sizeof_unsigned_long"
+elif test $ac_cv_sizeof_unsigned_int = 4 || test $ac_cv_sizeof_unsigned_int = 2; then :
+ xdvi_cv_bitmap_type="BMTYPE=int BMBYTES=$ac_cv_sizeof_unsigned_int"
+elif test $ac_cv_sizeof_unsigned_short = 4 || test $ac_cv_sizeof_unsigned_short = 2; then :
+ xdvi_cv_bitmap_type="BMTYPE=short BMBYTES=$ac_cv_sizeof_unsigned_short"
+else
+ xdvi_cv_bitmap_type="BMTYPE=char BMBYTES=$ac_cv_sizeof_unsigned_cher"
+fi
+fi
+
+eval "$xdvi_cv_bitmap_type"
+
+cat >>confdefs.h <<_ACEOF
+#define BMTYPE $BMTYPE
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define BMBYTES $BMBYTES
+_ACEOF
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsigned $BMTYPE, size = $BMBYTES" >&5
+$as_echo "unsigned $BMTYPE, size = $BMBYTES" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stropts.h and isastream()" >&5
+$as_echo_n "checking for stropts.h and isastream()... " >&6; }
+if ${xdvi_cv_sys_streams+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stropts.h>
+int
+main ()
+{
+#ifndef I_SETSIG
+choke me
+#else
+isastream(0);
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_sys_streams=yes
+else
+ xdvi_cv_sys_streams=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_sys_streams" >&5
+$as_echo "$xdvi_cv_sys_streams" >&6; }
+if test "x$xdvi_cv_sys_streams" = xyes; then
+
+$as_echo "#define HAVE_STREAMS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for certain old versions of Linux" >&5
+$as_echo_n "checking for certain old versions of Linux... " >&6; }
+if ${xdvi_cv_sys_old_linux+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "`(uname -sr) 2>/dev/null`" in #(
+ "Linux 2."[01].* | "Linux 2.2."[0-8] | "Linux 2.2."[0-8]-*) :
+ xdvi_cv_sys_old_linux=yes ;; #(
+ *) :
+ xdvi_cv_sys_old_linux=no ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_sys_old_linux" >&5
+$as_echo "$xdvi_cv_sys_old_linux" >&6; }
+if test "x$xdvi_cv_sys_old_linux" = xyes; then
+
+$as_echo "#define FLAKY_SIGPOLL 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for poll.h and poll()" >&5
+$as_echo_n "checking for poll.h and poll()... " >&6; }
+if ${xdvi_cv_func_poll+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <poll.h>
+int
+main ()
+{
+poll((struct pollfd *) 0, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_func_poll=yes
+else
+ xdvi_cv_func_poll=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_func_poll" >&5
+$as_echo "$xdvi_cv_func_poll" >&6; }
+if test "x$xdvi_cv_func_poll" = xyes; then
+
+$as_echo "#define HAVE_POLL 1" >>confdefs.h
+
+else
+ for ac_header in sys/select.h select.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKB Bell extension" >&5
+$as_echo_n "checking for XKB Bell extension... " >&6; }
+if ${xdvi_cv_func_xkb_bell+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_save_LIBS=$LIBS
+LIBS="$X_PRE_LIBS"" $LIBS $X_LIBS -lX11"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <X11/X.h>
+#include <X11/XKBlib.h> /* has the prototype */
+
+int
+main ()
+{
+
+ Atom y;
+ XkbBell((Display *)0, (Window)0, 0, y);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_func_xkb_bell=yes
+else
+ xdvi_cv_func_xkb_bell=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$xdvi_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_func_xkb_bell" >&5
+$as_echo "$xdvi_cv_func_xkb_bell" >&6; }
+if test "$xdvi_cv_func_xkb_bell" = yes; then
+ X_PRE_LIBS="$X_PRE_LIBS"
+
+$as_echo "#define HAVE_XKB_BELL_EXT 1" >>confdefs.h
+
+fi
+# Check whether --enable-xi2-scrolling was given.
+if test "${enable_xi2_scrolling+set}" = set; then :
+ enableval=$enable_xi2_scrolling;
+fi
+
+case $enable_xi2_scrolling in #(
+ yes | no) :
+ : ;; #(
+ *) :
+ if test "x$enable_native_texlive_build" = xyes; then :
+ enable_xi2_scrolling=no
+else
+ enable_xi2_scrolling=yes
+fi ;;
+esac
+if test "x$enable_xi2_scrolling" = xyes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XInput version 2.1 or higher" >&5
+$as_echo_n "checking for XInput version 2.1 or higher... " >&6; }
+if ${xdvi_cv_xinput_2_1+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_xi2_save_LIBS=$LIBS
+xdvi_xi2_save_CFLAGS=$CFLAGS
+xdvi_xi2_save_CPPFLAGS=$CPPFLAGS
+xdvi_xi2_save_LDFLAGS=$LDFLAGS
+LIBS="$X_PRE_LIBS -lXi $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/extensions/XInput2.h>
+int
+main ()
+{
+Display *DISP; int ndevices;
+XIDeviceInfo *info = XIQueryDevice(DISP, XIAllDevices, &ndevices);
+#if (XI_2_Major < 2 || (XI_2_Major == 2 && XI_2_Minor < 1))
+choke me "XInput version is < 2.1"
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_xinput_2_1=yes
+else
+ xdvi_cv_xinput_2_1=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$xdvi_xi2_save_LIBS
+CFLAGS=$xdvi_xi2_save_CFLAGS
+CPPFLAGS=$xdvi_xi2_save_CPPFLAGS
+LDFLAGS=$xdvi_xi2_save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_xinput_2_1" >&5
+$as_echo "$xdvi_cv_xinput_2_1" >&6; }
+if test "x$xdvi_cv_xinput_2_1" = xyes; then
+
+$as_echo "#define HAVE_XI21 1" >>confdefs.h
+
+ X_PRE_LIBS="$X_PRE_LIBS -lXi"
+fi
+fi
+
+
+
+
+# Check for `--allow-multiple-definition' linker flag
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports multiple definitions and for required flags" >&5
+$as_echo_n "checking if linker supports multiple definitions and for required flags... " >&6; }
+if ${xdvi_cv_linker_multiple_defns+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_ld_save_LDFLAGS=$LDFLAGS
+ LDFLAGS="-Xlinker --allow-multiple-definition"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+void foo(void);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_linker_multiple_defns=$LDFLAGS
+else
+ xdvi_ld_save_LIBS=$LIBS
+ xdvi_ld_save_CFLAGS=$CFLAGS
+ xdvi_ld_save_CPPFLAGS=$CPPFLAGS
+
+ LIBS="$X_PRE_LIBS -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+ CFLAGS="$X_CFLAGS $CFLAGS"
+ CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+ LDFLAGS="$X_LIBS $xdvi_ld_save_LDFLAGS"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+
+ XtIntervalId XtAppAddTimeOut(XtAppContext app,
+ unsigned long interval,
+ XtTimerCallbackProc proc,
+ XtPointer closure)
+ {
+ (void)app; (void)interval; (void)proc; (void)closure;
+ return (XtIntervalId)0;
+ }
+int
+main ()
+{
+XtIntervalId i = 0; XtRemoveTimeOut(i);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_linker_multiple_defns="none required"
+else
+ xdvi_cv_linker_multiple_defns=unsupported
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+ LIBS=$xdvi_ld_save_LIBS
+ CFLAGS=$xdvi_ld_save_CFLAGS
+ CPPFLAGS=$xdvi_ld_save_CPPFLAGS
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$xdvi_ld_save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_linker_multiple_defns" >&5
+$as_echo "$xdvi_cv_linker_multiple_defns" >&6; }
+
+x_linker_options=""
+case $xdvi_cv_linker_multiple_defns in #(
+ "none required") :
+
+$as_echo "#define LD_ALLOWS_MULTIPLE_DEFINITIONS 1" >>confdefs.h
+ ;; #(
+ unsupported) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Linker does not allow multiple definitions.
+ *****************************************************************
+ * Warning: Your linker does not allow multiple definitions. *
+ * This does not make xdvik unusable, but it will cause problems *
+ * with event handling: Some widgets, e.g. the print log window, *
+ * tooltips, statusline messages and hyperlink location markers *
+ * will not be updated until the mouse is moved. *
+ *****************************************************************" >&5
+$as_echo "$as_me: WARNING: Linker does not allow multiple definitions.
+ *****************************************************************
+ * Warning: Your linker does not allow multiple definitions. *
+ * This does not make xdvik unusable, but it will cause problems *
+ * with event handling: Some widgets, e.g. the print log window, *
+ * tooltips, statusline messages and hyperlink location markers *
+ * will not be updated until the mouse is moved. *
+ *****************************************************************" >&2;} ;; #(
+ *) :
+ x_linker_options=$xdvi_cv_linker_multiple_defns
+ $as_echo "#define LD_ALLOWS_MULTIPLE_DEFINITIONS 1" >>confdefs.h
+ ;;
+esac
+
+
+
+for ac_header in stdint.h inttypes.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t"
+case $ac_cv_c_uint32_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT32_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint32_t $ac_cv_c_uint32_t
+_ACEOF
+;;
+ esac
+
+ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ptrdiff_t long
+_ACEOF
+
+fi
+
+
+for ac_func in mkstemp memcpy strerror waitpid sigaction strchr setenv \
+ fchdir getcwd getpwnam getuid getpwuid \
+ lstat ftruncate snprintf vsnprintf realpath
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+# <sys/bsdtypes.h> is for ISC 4.0, to define fd_set in psgs.c.
+# regex.h is needed for regexp support in DVI search.
+for ac_header in netdb.h sys/bsdtypes.h sys/param.h unistd.h sys/fcntl.h regex.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for iconv
+
+# Check whether --with-iconv was given.
+if test "${with_iconv+set}" = set; then :
+ withval=$with_iconv;
+else
+ with_iconv=check
+fi
+
+# Check whether --with-iconv-include was given.
+if test "${with_iconv_include+set}" = set; then :
+ withval=$with_iconv_include;
+fi
+
+# Check whether --with-iconv-libdir was given.
+if test "${with_iconv_libdir+set}" = set; then :
+ withval=$with_iconv_libdir;
+fi
+case $with_iconv_include in #(
+ yes | no | "") :
+ iconv_includes= ;; #(
+ *) :
+ iconv_includes="-I$with_iconv_include" ;;
+esac
+case $with_iconv_libdir in #(
+ yes | no | "") :
+ iconv_libpath= ;; #(
+ *) :
+ iconv_libpath="-L$with_iconv_libdir" ;;
+esac
+if test "x$with_iconv" != xno; then :
+ xdvi_iconv_save_CPPFLAGS=$CPPFLAGS
+ for ac_header in iconv.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_iconv_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ICONV_H 1
+_ACEOF
+ # Check if -liconv or -lrecode is needed for iconv()
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing iconv" >&5
+$as_echo_n "checking for library containing iconv... " >&6; }
+if ${xdvi_cv_search_iconv+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_iconv_save_LDFLAGS=$LDFLAGS
+xdvi_iconv_save_LIBS=$LIBS
+LDFLAGS="$iconv_libpath $LDFLAGS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ ;
+ return 0;
+}
+_ACEOF
+xdvi_cv_search_iconv=no
+for xdvi_lib in "" -liconv -lrecode; do
+ LIBS="$xdvi_lib $xdvi_iconv_save_LIBS"
+ if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_search_iconv=$xdvi_lib
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+done
+test "x$xdvi_cv_search_iconv" = x && xdvi_cv_search_iconv="none required"
+LDFLAGS=$xdvi_iconv_save_LDFLAGS
+LIBS=$xdvi_iconv_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_search_iconv" >&5
+$as_echo "$xdvi_cv_search_iconv" >&6; }
+
+ if test "x$xdvi_cv_search_iconv" != xno; then
+ if test "x$xdvi_cv_search_iconv" = "xnone required"; then
+ iconv_libs=
+ else
+ iconv_libs=$xdvi_cv_search_iconv
+ fi
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv input type" >&5
+$as_echo_n "checking for iconv input type... " >&6; }
+if ${xdvi_cv_iconv_char_pptr_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* iconv() definitions may differ depending on following macros ... */
+#ifdef __hpux
+/* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED
+ * leads to poll() not realizing that a file descriptor is writable in psgs.c.
+ */
+# define _HPUX_SOURCE 1
+#else
+# ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 600
+# endif
+# define _XOPEN_SOURCE_EXTENDED 1
+# define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */
+# define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */
+# define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */
+#endif
+
+#include <iconv.h>
+
+int
+main ()
+{
+extern size_t iconv(iconv_t, char **, size_t *, char**, size_t*);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ xdvi_cv_iconv_char_pptr_type='char **'
+else
+ xdvi_cv_iconv_char_pptr_type='const char **'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_iconv_char_pptr_type" >&5
+$as_echo "$xdvi_cv_iconv_char_pptr_type" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CHAR_PPTR_TYPE $xdvi_cv_iconv_char_pptr_type
+_ACEOF
+
+
+ fi
+fi
+
+done
+
+ CPPFLAGS=$xdvi_iconv_save_CPPFLAGS
+
+fi
+
+
+
+
+# Checks for langinfo
+for ac_func in nl_langinfo
+do :
+ ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NL_LANGINFO 1
+_ACEOF
+
+fi
+done
+
+for ac_header in langinfo.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default"
+if test "x$ac_cv_header_langinfo_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LANGINFO_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "x$ac_cv_func_nl_langinfo:$ac_cv_header_langinfo_h" = xyes:yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if nl_langinfo(CODESET) is working" >&5
+$as_echo_n "checking if nl_langinfo(CODESET) is working... " >&6; }
+if ${xdvi_cv_nl_langinfo_codeset+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_nl_langinfo_codeset=yes
+else
+ xdvi_cv_nl_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_nl_langinfo_codeset" >&5
+$as_echo "$xdvi_cv_nl_langinfo_codeset" >&6; }
+ if test "x$xdvi_cv_nl_langinfo_codeset" = xyes; then :
+
+$as_echo "#define HAVE_WORKING_NL_LANGINFO_CODESET 1" >>confdefs.h
+
+fi
+fi
+
+
+# Check X11 headers.
+# X11/IntrinsicI.h is needed for LateBindings (to roll our own translations)
+xdvi_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+for ac_header in X11/Intrinsic.h X11/IntrinsicI.h X11/Xosdefs.h X11/xpm.h \
+ Xm/XpmP.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+# For editres, we need to check both the header and define a linker option.
+for ac_header in X11/Xmu/Editres.h X11/Xmu/Xmu.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_X11_INTRINSIC_H
+# include <X11/Intrinsic.h>
+#endif
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ x_xmu_lib=-lXmu
+else
+ x_xmu_lib=
+fi
+
+done
+
+
+CPPFLAGS=$xdvi_save_CPPFLAGS
+
+# Check whether --enable-magick was given.
+if test "${enable_magick+set}" = set; then :
+ enableval=$enable_magick;
+fi
+
+if test "x$enable_magick" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ImageMagick version" >&5
+$as_echo_n "checking for ImageMagick version... " >&6; }
+ if MAGICK_VER=`Magick-config --version 2>/dev/null`; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGICK_VER" >&5
+$as_echo "$MAGICK_VER" >&6; }
+ set dummy `echo $MAGICK_VER | sed -e 's/\./ /g'`
+ MAGICK_VER_MAJOR=$2
+ MAGICK_VER_MINOR=$3
+ if expr $MAGICK_VER_MAJOR \> 4 >/dev/null && \
+ (expr $MAGICK_VER_MAJOR \> 5 >/dev/null || \
+ expr $MAGICK_VER_MINOR \> 2 >/dev/null); then
+ MAGICK_CPP="-DMAGICK_VER_MAJOR=$MAGICK_VER_MAJOR -DMAGICK_VER_MINOR=$MAGICK_VER_MINOR `Magick-config --cppflags`"
+ MAGICK_LD="`Magick-config --libs` `Magick-config --ldflags`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: ImageMagick support enabled" >&5
+$as_echo "$as_me: ImageMagick support enabled" >&6;}
+ X_CFLAGS="$X_CFLAGS $MAGICK_CPP"
+ X_EXTRA_LIBS="$X_EXTRA_LIBS $MAGICK_LD"
+
+$as_echo "#define MAGICK 1" >>confdefs.h
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: ImageMagick version too old - disabled" >&5
+$as_echo "$as_me: ImageMagick version too old - disabled" >&6;}
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot run 'Magick-config' - ImageMagick support disabled" >&5
+$as_echo "cannot run 'Magick-config' - ImageMagick support disabled" >&6; }
+ fi
+fi
+
+# Check whether -lXpm can be used
+
+
+# Check whether --with-xpm was given.
+if test "${with_xpm+set}" = set; then :
+ withval=$with_xpm;
+fi
+
+# Check whether --with-xpm-includes was given.
+if test "${with_xpm_includes+set}" = set; then :
+ withval=$with_xpm_includes; xpm_includes=$withval
+else
+ xpm_includes=
+fi
+
+# Check whether --with-xpm-libraries was given.
+if test "${with_xpm_libraries+set}" = set; then :
+ withval=$with_xpm_libraries; xpm_libraries=$withval
+else
+ xpm_libraries=
+fi
+if test "x$with_xpm" = xno; then
+ xpm_includes=no
+ xpm_libraries=no
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xpm" >&5
+$as_echo_n "checking for Xpm... " >&6; }
+#
+# Check the headers.
+#
+if test "x$xpm_includes" = x; then
+ if ${xdvi_cv_xpm_includes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_xpm_save_CFLAGS=$CFLAGS
+xdvi_xpm_save_CPPFLAGS=$CPPFLAGS
+#
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+#
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/xpm.h>
+int
+main ()
+{
+int a;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # X11/xpm.h is in the standard search path.
+ xdvi_cv_xpm_includes=default
+else
+ # X11/xpm.h is not in the standard search path.
+ xdvi_cv_xpm_includes=no
+# Locate it and put its directory in `xpm_includes'
+#
+# /usr/include/Motif* are used on HP-UX (Motif).
+# /usr/include/X11* are used on HP-UX (X and Xaw).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Xaw).
+# Other directories are just guesses.
+for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \
+ /usr/X11/include /usr/X11R5/include /usr/X11R6/include \
+ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \
+ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \
+ /usr/dt/include /usr/openwin/include \
+ /usr/dt/*/include /opt/*/include /usr/include/Motif* \
+ "${prefix}"/*/include /usr/*/include /usr/local/*/include \
+ "${prefix}"/include/* /usr/include/* /usr/local/include/*
+do
+ if test -f "$dir/X11/xpm.h"; then
+ xdvi_cv_xpm_includes=$dir
+ break
+ elif test -f "$dir/xpm.h"; then
+ xdvi_cv_xpm_includes=$dir
+ break
+ fi
+done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+#
+CFLAGS=$xdvi_xpm_save_CFLAGS
+CPPFLAGS=$xdvi_xpm_save_CPPFLAGS
+fi
+
+#
+xpm_includes=$xdvi_cv_xpm_includes
+
+fi
+if test "x$xpm_includes" = xdefault; then
+
+$as_echo "#define HAVE_X11_XPM_H 1" >>confdefs.h
+
+elif test -f "$xpm_includes/X11/xpm.h"; then
+ $as_echo "#define HAVE_X11_XPM_H 1" >>confdefs.h
+
+elif test -f "$xpm_includes/xpm.h"; then
+
+$as_echo "#define HAVE_XPM_H 1" >>confdefs.h
+
+fi
+#
+# Add Xpm definition to X_CFLAGS (and remember previous value)
+#
+xdvi_xpm_save_X_CFLAGS=$X_CFLAGS
+if test "x$xpm_includes" != xdefault \
+ && test "x$xpm_includes" != "x$x_includes" && test "x$xpm_includes" != xno
+then
+ X_CFLAGS="-I$xpm_includes $X_CFLAGS"
+fi
+#
+# Check the libraries.
+#
+if test "x$xpm_libraries" = x; then
+ if ${xdvi_cv_xpm_libraries+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_xpm_save_LIBS=$LIBS
+xdvi_xpm_save_CFLAGS=$CFLAGS
+xdvi_xpm_save_CPPFLAGS=$CPPFLAGS
+xdvi_xpm_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXpm -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+#include <X11/xpm.h>
+int
+main ()
+{
+XtToolkitInitialize();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ # libxpm.a is in the standard search path.
+ xdvi_cv_xpm_libraries=default
+else
+ # libXpm.a is not in the standard search path.
+ xdvi_cv_xpm_libraries=no
+# Locate it and put its directory in `xpm_libraries'
+#
+# /usr/lib/Motif* are used on HP-UX (Motif).
+# /usr/lib/X11* are used on HP-UX (X and Xpm).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Xpm).
+# Other directories are just guesses.
+for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \
+ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \
+ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \
+ /usr/dt/lib /usr/openwin/lib \
+ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \
+ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \
+ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*
+do
+ if test -d "$dir" && test "`ls $dir/libXpm.* 2> /dev/null`" != ""; then
+ xdvi_cv_xpm_libraries=$dir
+ break
+ fi
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+#
+LIBS=$xdvi_xpm_save_LIBS
+CFLAGS=$xdvi_xpm_save_CFLAGS
+CPPFLAGS=$xdvi_xpm_save_CPPFLAGS
+LDFLAGS=$xdvi_xpm_save_LDFLAGS
+fi
+
+#
+xpm_libraries="$xdvi_cv_xpm_libraries"
+fi
+#
+# Report the results of headers and libraries.
+#
+xdvi_use_xpm=yes
+#
+#
+xpm_libraries_result=$xpm_libraries
+if test "x$xpm_libraries_result" = xdefault; then
+ xpm_libraries_result="in default path"
+elif test "x$xpm_libraries_result" = xno; then
+ xpm_libraries_result="(none)"
+ xdvi_use_xpm=no
+fi
+#
+xpm_includes_result=$xpm_includes
+if test "x$xpm_includes_result" = xdefault; then
+ xpm_includes_result="in default path"
+elif test "x$xpm_includes_result" = xno; then
+ xpm_includes_result="(none)"
+ xdvi_use_xpm=no
+fi
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $xpm_libraries_result, headers $xpm_includes_result" >&5
+$as_echo "libraries $xpm_libraries_result, headers $xpm_includes_result" >&6; }
+#
+if test "x$xdvi_use_xpm" = xyes; then
+ #
+ # Add Xpm definition to X_LIBS
+ #
+ if test "x$xpm_libraries" != xdefault \
+ && test "x$xpm_libraries" != "x$x_libraries" && test "x$xpm_libraries" != xno
+ then
+ case "$X_LIBS" in
+ *-R\ *) X_LIBS="-L$xpm_libraries -R $xpm_libraries $X_LIBS";;
+ *-R*) X_LIBS="-L$xpm_libraries -R$xpm_libraries $X_LIBS";;
+ *) X_LIBS="-L$xpm_libraries $X_LIBS";;
+ esac
+ fi
+ #
+
+$as_echo "#define USE_XPM 1" >>confdefs.h
+
+ x_xpm_libs="-lXpm"
+else
+ # Restore previous X_CFLAGS
+ X_CFLAGS=$xdvi_xpm_save_X_CFLAGS
+ $as_echo "#define USE_XPM 0" >>confdefs.h
+
+ x_xpm_libs=
+fi
+
+
+
+# Check for libXext.
+if test -n "$x_libraries"; then :
+ XLFLAG="-L$x_libraries"
+else
+ XLFLAG=
+fi
+if test -z "$x_ext_lib"; then # allow envvar override
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XextCreateExtension in -lXext" >&5
+$as_echo_n "checking for XextCreateExtension in -lXext... " >&6; }
+if ${ac_cv_lib_Xext_XextCreateExtension+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext -lX11 $X_EXTRA_LIBS $XLFLAG $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XextCreateExtension ();
+int
+main ()
+{
+return XextCreateExtension ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xext_XextCreateExtension=yes
+else
+ ac_cv_lib_Xext_XextCreateExtension=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XextCreateExtension" >&5
+$as_echo "$ac_cv_lib_Xext_XextCreateExtension" >&6; }
+if test "x$ac_cv_lib_Xext_XextCreateExtension" = xyes; then :
+ x_ext_lib='-lXext'
+fi
+
+fi
+
+
+# Check for libXp.
+# Although libXp is now defunct (no longer part of XOrg), older versions
+# of libXm may need to link with libXp; same for the equally defunct libXaw8.
+# We certainly don't want to include libXp unless necessary, since this might
+# only perpetuate the need to keep libXp.so around.
+# Moreover for ELF shared libraries a requirement for libXp.so is probably
+# encoded into libXm.so and/or libXaw.so and need not be specified explicitly.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XpQueryVersion in -lXp" >&5
+$as_echo_n "checking for XpQueryVersion in -lXp... " >&6; }
+if ${ac_cv_lib_Xp_XpQueryVersion+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXp $x_ext_lib -lX11 $X_EXTRA_LIBS $XLFLAG $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XpQueryVersion ();
+int
+main ()
+{
+return XpQueryVersion ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xp_XpQueryVersion=yes
+else
+ ac_cv_lib_Xp_XpQueryVersion=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xp_XpQueryVersion" >&5
+$as_echo "$ac_cv_lib_Xp_XpQueryVersion" >&6; }
+if test "x$ac_cv_lib_Xp_XpQueryVersion" = xyes; then :
+ x_xp_lib='-lXp'
+fi
+
+
+if test "x$enable_build" != xno || test -f config.force; then
+
+# Check which toolkit was specified
+case $with_xdvi_x_toolkit in #(
+ next | nextaw | neXtaw) :
+ val=neXtaw ;; #(
+ xaw3d) :
+ val=xaw3d ;; #(
+ "" | x | xa | xaw) :
+ val=xaw ;; #(
+ y | ye | yes) :
+ val=yes ;; #(
+ m | mo | mot | moti | motif) :
+ val=motif ;; #(
+ *) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown --with-xdvi-x-toolkit argument
+ \`$with_xdvi_x_toolkit'; using xaw." >&5
+$as_echo "$as_me: WARNING: unknown --with-xdvi-x-toolkit argument
+ \`$with_xdvi_x_toolkit'; using xaw." >&2;}
+ val=xaw ;;
+esac
+with_xdvi_x_toolkit=$val
+
+if test "x$with_xdvi_x_toolkit" = xxaw3d; then
+ prog_extension="xaw3d"
+ x_tool_libs="-lXaw3d"
+elif test "x$with_xdvi_x_toolkit" = xneXtaw; then
+ prog_extension="nextaw"
+ x_tool_libs="-lneXtaw"
+else
+ # Check for Xaw headers and library version
+ save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xaw headers" >&5
+$as_echo_n "checking for Xaw headers... " >&6; }
+if ${xdvi_cv_xaw_headers+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xaw/Form.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ xdvi_cv_xaw_headers=yes
+else
+ xdvi_cv_xaw_headers=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_xaw_headers" >&5
+$as_echo "$xdvi_cv_xaw_headers" >&6; }
+xdvi_have_xaw=$xdvi_cv_xaw_headers
+#
+if test "x$xdvi_have_xaw" = xyes; then
+ ac_fn_c_check_member "$LINENO" "SimpleClassPart" "extension" "ac_cv_member_SimpleClassPart_extension" "
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/SimpleP.h>
+"
+if test "x$ac_cv_member_SimpleClassPart_extension" = xyes; then :
+
+else
+
+$as_echo "#define HAVE_OLD_XAW 1" >>confdefs.h
+
+fi
+
+
+fi
+CPPFLAGS=$save_CPPFLAGS
+
+ if test "x$with_xdvi_x_toolkit" != xxaw; then
+ if test "x$with_xdvi_x_toolkit" = xmotif; then
+ # Requested motiv
+ default_toolkit=none
+ else
+ # Requested motiv with Xaw as fallback
+ default_toolkit=Xaw
+ fi
+
+
+# Check whether --with-motif-include was given.
+if test "${with_motif_include+set}" = set; then :
+ withval=$with_motif_include; motif_include=$withval
+else
+ motif_include=
+fi
+
+# Check whether --with-motif-libdir was given.
+if test "${with_motif_libdir+set}" = set; then :
+ withval=$with_motif_libdir; motif_libdir=$withval
+else
+ motif_libdir=
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Motif" >&5
+$as_echo_n "checking for Motif... " >&6; }
+#
+# Search the include files.
+#
+if test "x$motif_include" = x; then
+ if ${xdvi_cv_motif_include+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+#
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+#
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <Xm/Xm.h>
+int
+main ()
+{
+int a;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ # Xm/Xm.h is in the standard search path.
+ xdvi_cv_motif_include=default
+else
+ # Xm/Xm.h is not in the standard search path.
+ xdvi_cv_motif_include=no
+# Locate it and put its directory in `motif_include'
+#
+# /usr/include/Motif* are used on HP-UX (Motif).
+# /usr/include/X11* are used on HP-UX (X and Athena).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Athena).
+# Other directories are just guesses.
+for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \
+ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \
+ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \
+ /usr/dt/include /usr/openwin/include \
+ /usr/dt/*/include /opt/*/include /usr/include/Motif* \
+ "${prefix}"/*/include /usr/*/include /usr/local/*/include \
+ "${prefix}"/include/* /usr/include/* /usr/local/include/*; do
+ if test -f "$dir/Xm/Xm.h"; then
+ xdvi_cv_motif_include=$dir
+ break
+ fi
+done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+#
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS
+fi
+
+motif_include=$xdvi_cv_motif_include
+
+fi
+#
+# Add Motif definition to X_CFLAGS (and remember previous value)
+#
+xdvi_motif_save_X_CFLAGS=$X_CFLAGS
+if test "x$motif_include" != xdefault \
+ && test "x$motif_include" != "x$x_includes" && test "x$motif_include" != xno
+then
+ X_CFLAGS="-I$motif_include $X_CFLAGS"
+fi
+#
+# Now for the libraries.
+#
+if test "x$motif_libdir" = x; then
+ if ${xdvi_cv_motif_libdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_motif_save_LIBS=$LIBS
+xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+xdvi_motif_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXm $x_xp_lib -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>
+int
+main ()
+{
+XtToolkitInitialize();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ # libXm.a is in the standard search path.
+ xdvi_cv_motif_libdir=default
+else
+ # libXm.a is not in the standard search path.
+ xdvi_cv_motif_libdir=no
+# Locate it and put its directory in `motif_libdir'
+#
+# /usr/lib/Motif* are used on HP-UX (Motif).
+# /usr/lib/X11* are used on HP-UX (X and Athena).
+# /usr/dt is used on Solaris (Motif).
+# /usr/lesstif is used on Linux (Lesstif).
+# /usr/openwin is used on Solaris (X and Athena).
+# Other directories are just guesses.
+for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \
+ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \
+ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \
+ /usr/dt/lib /usr/openwin/lib \
+ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \
+ /usr/lesstif*/lib /usr/lib/Lesstif* \
+ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \
+ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*; do
+ if test -d "$dir" && test "`ls $dir/libXm.* 2> /dev/null`" != ""; then
+ xdvi_cv_motif_libdir=$dir
+ break
+ fi
+done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+#
+LIBS=$xdvi_motif_save_LIBS
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS
+LDFLAGS=$xdvi_motif_save_LDFLAGS
+fi
+
+#
+motif_libdir="$xdvi_cv_motif_libdir"
+
+fi
+#
+# Report the results of headers and libraries.
+#
+xdvi_have_motif=yes
+#
+motif_libdir_result=$motif_libdir
+if test "x$motif_libdir_result" = xdefault; then
+ motif_libdir_result="in default path"
+elif test "x$motif_libdir_result" = xno; then
+ motif_libdir_result="(none)"
+ xdvi_have_motif=no
+fi
+#
+motif_include_result=$motif_include
+if test "x$motif_include_result" = xdefault; then
+ motif_include_result="in default path"
+elif test "x$motif_include_result" = xno; then
+ motif_include_result="(none)"
+ xdvi_have_motif=no
+fi
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $motif_libdir_result, headers $motif_include_result" >&5
+$as_echo "libraries $motif_libdir_result, headers $motif_include_result" >&6; }
+#
+if test "x$xdvi_have_motif" = xyes; then
+ #
+ # Add Motif definition to X_LIBS
+ #
+ if test "x$motif_libdir" != xdefault \
+ && test "x$motif_libdir" != "x$x_libraries" && test "x$motif_libdir" != no
+ then
+ case "$X_LIBS" in
+ *-R\ *) X_LIBS="-L$motif_libdir -R $motif_libdir $X_LIBS";;
+ *-R*) X_LIBS="-L$motif_libdir -R$motif_libdir $X_LIBS";;
+ *) X_LIBS="-L$motif_libdir $X_LIBS";;
+ esac
+ fi
+ #
+ prog_extension="motif"
+
+$as_echo "#define MOTIF 1" >>confdefs.h
+
+ x_tool_libs="-lXm"
+ if test "x$x_xp_lib" != x; then
+ # check if libXm requires libXp
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libXm requires libXp" >&5
+$as_echo_n "checking if libXm requires libXp... " >&6; }
+if ${xdvi_cv_motif_xp+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ xdvi_motif_save_LIBS=$LIBS
+xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+xdvi_motif_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXm -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>
+int
+main ()
+{
+XtToolkitInitialize();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ xdvi_cv_motif_xp=no
+else
+ xdvi_cv_motif_xp=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+#
+LIBS=$xdvi_motif_save_LIBS
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS
+LDFLAGS=$xdvi_motif_save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_motif_xp" >&5
+$as_echo "$xdvi_cv_motif_xp" >&6; }
+if test "x$xdvi_cv_motif_xp" = xyes; then
+ x_tool_libs="$x_tool_libs $x_xp_lib"
+fi
+
+ fi
+ # now warn if we're using LessTif (see LESSTIF-BUGS for why ...)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LessTif" >&5
+$as_echo_n "checking for LessTif... " >&6; }
+if ${xdvi_cv_using_lesstif+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>
+int
+main ()
+{
+const char *p = LesstifVERSION_STRING;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ xdvi_cv_using_lesstif=yes
+else
+ xdvi_cv_using_lesstif=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CPPFLAGS=$save_CPPFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_using_lesstif" >&5
+$as_echo "$xdvi_cv_using_lesstif" >&6; }
+if test "x$xdvi_cv_using_lesstif" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: LessTif header detected.
+ *****************************************************************
+ * Warning: You are using LessTif instead of OpenMotif. *
+ * Some GUI elements might be broken; please see the file *
+ * *
+ * texk/xdvik/LESSTIF-BUGS *
+ * *
+ * for more information. *
+ *****************************************************************" >&5
+$as_echo "$as_me: WARNING: LessTif header detected.
+ *****************************************************************
+ * Warning: You are using LessTif instead of OpenMotif. *
+ * Some GUI elements might be broken; please see the file *
+ * *
+ * texk/xdvik/LESSTIF-BUGS *
+ * *
+ * for more information. *
+ *****************************************************************" >&2;}
+fi
+
+ # Check whether to compile for Motif with Xaw Panner.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile in panner (requires Xaw)" >&5
+$as_echo_n "checking whether to compile in panner (requires Xaw)... " >&6; }
+if ${xdvi_cv_use_xaw_panner+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xaw/Reports.h>
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ xdvi_cv_use_xaw_panner=yes
+else
+ xdvi_cv_use_xaw_panner=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+CPPFLAGS=$save_CPPFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_use_xaw_panner" >&5
+$as_echo "$xdvi_cv_use_xaw_panner" >&6; }
+if test "x$xdvi_cv_use_xaw_panner" = xyes; then
+
+$as_echo "#define USE_XAW_PANNER 1" >>confdefs.h
+
+fi
+
+elif test "x$default_toolkit" = xnone; then
+ as_fn_error $? "No Motif." "$LINENO" 5
+else
+ # Restore previous X_CFLAGS
+ X_CFLAGS=$xdvi_motif_save_X_CFLAGS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: No Motif, using Xaw." >&5
+$as_echo "$as_me: No Motif, using Xaw." >&6;}
+ with_xdvi_x_toolkit="xaw"
+fi
+
+
+ fi
+ if test "x$with_xdvi_x_toolkit" = xxaw; then
+ # Requested or fallback to Xaw, check for library
+
+if test "x$xdvi_have_xaw" = xyes; then
+ # First try without libXp
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XawInitializeWidgetSet in -lXaw" >&5
+$as_echo_n "checking for XawInitializeWidgetSet in -lXaw... " >&6; }
+if ${ac_cv_lib_Xaw_XawInitializeWidgetSet+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXaw $x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XawInitializeWidgetSet ();
+int
+main ()
+{
+return XawInitializeWidgetSet ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xaw_XawInitializeWidgetSet=yes
+else
+ ac_cv_lib_Xaw_XawInitializeWidgetSet=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xaw_XawInitializeWidgetSet" >&5
+$as_echo "$ac_cv_lib_Xaw_XawInitializeWidgetSet" >&6; }
+if test "x$ac_cv_lib_Xaw_XawInitializeWidgetSet" = xyes; then :
+ x_tool_libs="-lXaw"
+else
+ # libXaw without libXp failed
+ if test "x$x_xp_lib" = x; then
+ xdvi_have_xaw=no
+ else
+ # Now try with libXp
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XawTextReplace in -lXaw" >&5
+$as_echo_n "checking for XawTextReplace in -lXaw... " >&6; }
+if ${ac_cv_lib_Xaw_XawTextReplace+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXaw $x_xp_lib $x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XawTextReplace ();
+int
+main ()
+{
+return XawTextReplace ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xaw_XawTextReplace=yes
+else
+ ac_cv_lib_Xaw_XawTextReplace=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xaw_XawTextReplace" >&5
+$as_echo "$ac_cv_lib_Xaw_XawTextReplace" >&6; }
+if test "x$ac_cv_lib_Xaw_XawTextReplace" = xyes; then :
+ x_tool_libs="-lXaw $x_xp_lib"
+else
+ xdvi_have_xaw=no
+fi
+
+ fi
+fi
+
+fi
+if test "x$xdvi_have_xaw" = xyes; then
+ prog_extension="xaw"
+
+$as_echo "#define XAW 1" >>confdefs.h
+
+else
+ as_fn_error $? "Sorry, you will need at least the Xaw header/library files to compile xdvik." "$LINENO" 5
+fi
+
+ fi
+fi
+
+final_exec_name="xdvi-$prog_extension"
+program_transform_name="'s,xdvi-bin,$final_exec_name,'"
+
+
+
+
+
+# If we're on Solaris and we want DPS, then add the extra compilation stuff
+# to get it.
+if echo "$PS_DEF" | grep PS_DPS >/dev/null; then
+ if test "`(uname) 2>/dev/null`" = SunOS \
+ && uname -r | grep '^5' >/dev/null; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: adding DPS includes and libraries for Solaris" >&5
+$as_echo "$as_me: adding DPS includes and libraries for Solaris" >&6;}
+ X_CFLAGS="$X_CFLAGS -I/usr/openwin/include/X11"
+ X_LIBS="$X_LIBS -R/usr/openwin/lib /usr/openwin/lib/libdps.so $ac_sunmath"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf in -lsunmath" >&5
+$as_echo_n "checking for isinf in -lsunmath... " >&6; }
+if ${ac_cv_lib_sunmath_isinf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsunmath $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char isinf ();
+int
+main ()
+{
+return isinf ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sunmath_isinf=yes
+else
+ ac_cv_lib_sunmath_isinf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sunmath_isinf" >&5
+$as_echo "$ac_cv_lib_sunmath_isinf" >&6; }
+if test "x$ac_cv_lib_sunmath_isinf" = xyes; then :
+ X_LIBS="$X_LIBS -lsunmath"
+fi
+
+ for ac_func in isinf
+do :
+ ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
+if test "x$ac_cv_func_isinf" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ISINF 1
+_ACEOF
+
+fi
+done
+
+ for ac_header in ieeefp.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default"
+if test "x$ac_cv_header_ieeefp_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_IEEEFP_H 1
+_ACEOF
+
+fi
+
+done
+
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: adding DPS libraries for SunOS 4.x" >&5
+$as_echo "$as_me: adding DPS libraries for SunOS 4.x" >&6;}
+ X_LIBS="$X_LIBS -ldps"
+ fi
+elif echo "$PS_DEF" | grep PS_NEWS >/dev/null; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: adding NeWS libraries" >&5
+$as_echo "$as_me: adding NeWS libraries" >&6;}
+ X_LIBS="$X_LIBS -lxview -lcps -lolgx -lxvps"
+fi
+
+kpse_save_CPPFLAGS=$CPPFLAGS
+kpse_save_LIBS=$LIBS
+
+##tldbg _KPSE_INIT: Initialize TL infrastructure.
+kpse_BLD=`(cd "./../../." && pwd)`
+kpse_SRC=`(cd "$srcdir/../../." && pwd)`
+
+##tldbg _KPSE_USE_LIBTOOL: Generate a libtool script for use in configure tests.
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+xdvik config.lt 22.87.04
+configured by $0, generated by GNU Autoconf 2.69.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $#
+do
+ case $1 in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) as_fn_error $? "unrecognized option: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+
+ *) as_fn_error $? "unrecognized argument: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute 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 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT 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, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="./libtool --mode=link --tag=CC $ac_link"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PKG_CONFIG"; then
+ ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PKG_CONFIG="${ac_tool_prefix}pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_PKG_CONFIG"; then
+ ac_ct_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_PKG_CONFIG"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG
+if test -n "$ac_ct_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5
+$as_echo "$ac_ct_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_PKG_CONFIG" = x; then
+ PKG_CONFIG="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_ct_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_prog_PKG_CONFIG"
+fi
+
+##tldbg _KPSE_LIB_FLAGS: Setup kpathsea (-lkpathsea) flags.
+echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=kpathsea, libname=kpathsea, options=lt, tlincl=-IBLD/texk -ISRC/texk, tllib=BLD/texk/kpathsea/libkpathsea.la, tlextra=, rebuildsrcdeps=${top_srcdir}/../kpathsea/*.[ch], rebuildblddeps=${top_builddir}/../kpathsea/paths.h.' >&5
+##tldbg _KPSE_LIB_FLAGS_TL: kpathsea (kpathsea) lt.
+
+# Check whether --with-system-kpathsea was given.
+if test "${with_system_kpathsea+set}" = set; then :
+ withval=$with_system_kpathsea;
+fi
+if test "x$with_system_kpathsea" = xyes; then
+ if $PKG_CONFIG kpathsea; then
+ KPATHSEA_INCLUDES=`$PKG_CONFIG kpathsea --cflags`
+ KPATHSEA_LIBS=`$PKG_CONFIG kpathsea --libs`
+elif test "x$need_kpathsea:$with_system_kpathsea" = xyes:yes; then
+ as_fn_error $? "did not find kpathsea" "$LINENO" 5
+fi
+else
+ KPATHSEA_INCLUDES="-I$kpse_BLD/texk -I$kpse_SRC/texk"
+ KPATHSEA_LIBS="$kpse_BLD/texk/kpathsea/libkpathsea.la"
+ KPATHSEA_DEPEND='${top_builddir}/../kpathsea/libkpathsea.la'
+ KPATHSEA_RULE='# Rebuild libkpathsea
+$(KPATHSEA_DEPEND): ${top_srcdir}/../kpathsea/*.[ch] ${top_builddir}/../kpathsea/paths.h
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild
+${top_builddir}/../kpathsea/paths.h:
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild'
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libkpathsea supports debugging" >&5
+$as_echo_n "checking if libkpathsea supports debugging... " >&6; }
+if ${kpse_cv_kpse_debug+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval CPPFLAGS=\"$KPATHSEA_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$KPATHSEA_LIBS \$LIBS\"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+int
+main ()
+{
+FILE *f = fopen("f", "r")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kpse_cv_kpse_debug=yes
+else
+ kpse_cv_kpse_debug=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_kpse_debug" >&5
+$as_echo "$kpse_cv_kpse_debug" >&6; }
+if test "x$kpse_cv_kpse_debug" != xyes; then :
+ KPATHSEA_INCLUDES="$KPATHSEA_INCLUDES -DNO_DEBUG"
+fi
+
+##tldbg _KPSE_LIB_FLAGS: Setup zlib (-lz) flags.
+echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=zlib, libname=z, options=, tlincl=-IBLD/libs/zlib/include, tllib=BLD/libs/zlib/libz.a, tlextra=, rebuildsrcdeps=, rebuildblddeps=${top_builddir}/../../libs/zlib/include/zconf.h.' >&5
+##tldbg _KPSE_LIB_FLAGS_TL: zlib (z) .
+
+# Check whether --with-system-zlib was given.
+if test "${with_system_zlib+set}" = set; then :
+ withval=$with_system_zlib;
+fi
+
+# Check whether --with-zlib-includes was given.
+if test "${with_zlib_includes+set}" = set; then :
+ withval=$with_zlib_includes;
+fi
+
+# Check whether --with-zlib-libdir was given.
+if test "${with_zlib_libdir+set}" = set; then :
+ withval=$with_zlib_libdir;
+fi
+if test "x$with_system_zlib" = xyes; then
+ ##tldbg _KPSE_LIB_FLAGS_SYSTEM: zlib (z).
+if test "x$with_zlib_includes" != x && test "x$with_zlib_includes" != xyes; then
+ ZLIB_INCLUDES="-I$with_zlib_includes"
+fi
+ZLIB_LIBS="-lz"
+if test "x$with_zlib_libdir" != x && test "x$with_zlib_libdir" != xyes; then
+ ZLIB_LIBS="-L$with_zlib_libdir $ZLIB_LIBS"
+fi
+else
+ ZLIB_INCLUDES="-I$kpse_BLD/libs/zlib/include"
+ ZLIB_LIBS="$kpse_BLD/libs/zlib/libz.a"
+ ZLIB_DEPEND='${top_builddir}/../../libs/zlib/libz.a'
+ ZLIB_RULE='# Rebuild libz
+$(ZLIB_DEPEND): ${top_builddir}/../../libs/zlib/include/zconf.h
+ cd ${top_builddir}/../../libs/zlib && $(MAKE) $(AM_MAKEFLAGS) rebuild
+${top_builddir}/../../libs/zlib/include/zconf.h:
+ cd ${top_builddir}/../../libs/zlib && $(MAKE) $(AM_MAKEFLAGS) rebuild'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if <zlib.h> defines 'z_const'" >&5
+$as_echo_n "checking if <zlib.h> defines 'z_const'... " >&6; }
+if ${kpse_cv_have_decl_z_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval CPPFLAGS=\"$ZLIB_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$ZLIB_LIBS \$LIBS\"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <zlib.h>
+int
+main ()
+{
+z_const char * foo();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ kpse_cv_have_decl_z_const=yes
+else
+ kpse_cv_have_decl_z_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_have_decl_z_const" >&5
+$as_echo "$kpse_cv_have_decl_z_const" >&6; }
+case $kpse_cv_have_decl_z_const in #(
+ yes) :
+
+$as_echo "#define ZLIB_CONST 1" >>confdefs.h
+ ;; #(
+ *) :
+
+$as_echo "#define z_const /**/" >>confdefs.h
+ ;;
+esac
+
+##tldbg _KPSE_LIB_FLAGS: Setup freetype2 (-lfreetype) flags.
+echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=freetype2, libname=freetype, options=, tlincl=-IBLD/libs/freetype2/freetype2, tllib=BLD/libs/freetype2/libfreetype.a, tlextra=, rebuildsrcdeps=, rebuildblddeps=${top_builddir}/../../libs/freetype2/freetype2/ft2build.h.' >&5
+##tldbg _KPSE_LIB_FLAGS_TL: freetype2 (freetype) .
+
+# Check whether --with-system-freetype2 was given.
+if test "${with_system_freetype2+set}" = set; then :
+ withval=$with_system_freetype2;
+fi
+if test "x$with_system_freetype2" = xyes; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}freetype-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}freetype-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_FT2_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$FT2_CONFIG"; then
+ ac_cv_prog_FT2_CONFIG="$FT2_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FT2_CONFIG="${ac_tool_prefix}freetype-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+FT2_CONFIG=$ac_cv_prog_FT2_CONFIG
+if test -n "$FT2_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FT2_CONFIG" >&5
+$as_echo "$FT2_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_FT2_CONFIG"; then
+ ac_ct_FT2_CONFIG=$FT2_CONFIG
+ # Extract the first word of "freetype-config", so it can be a program name with args.
+set dummy freetype-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_FT2_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_FT2_CONFIG"; then
+ ac_cv_prog_ac_ct_FT2_CONFIG="$ac_ct_FT2_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FT2_CONFIG="freetype-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FT2_CONFIG=$ac_cv_prog_ac_ct_FT2_CONFIG
+if test -n "$ac_ct_FT2_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FT2_CONFIG" >&5
+$as_echo "$ac_ct_FT2_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_FT2_CONFIG" = x; then
+ FT2_CONFIG="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ FT2_CONFIG=$ac_ct_FT2_CONFIG
+ fi
+else
+ FT2_CONFIG="$ac_cv_prog_FT2_CONFIG"
+fi
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PKG_CONFIG"; then
+ ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PKG_CONFIG="${ac_tool_prefix}pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_PKG_CONFIG"; then
+ ac_ct_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_PKG_CONFIG"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG
+if test -n "$ac_ct_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5
+$as_echo "$ac_ct_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_PKG_CONFIG" = x; then
+ PKG_CONFIG="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_ct_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_prog_PKG_CONFIG"
+fi
+if $FT2_CONFIG --ftversion >/dev/null 2>&1; then
+ FREETYPE2_INCLUDES=`$FT2_CONFIG --cflags`
+ FREETYPE2_LIBS=`$FT2_CONFIG --libs`
+elif $PKG_CONFIG --libs freetype2 >/dev/null 2>&1; then
+ FREETYPE2_INCLUDES=`$PKG_CONFIG --cflags freetype2`
+ FREETYPE2_LIBS=`$PKG_CONFIG --libs freetype2`
+elif test "x$need_freetype2:$with_system_freetype2" = xyes:yes; then
+ as_fn_error $? "did not find freetype-config required for system freetype2 library" "$LINENO" 5
+fi
+else
+ FREETYPE2_INCLUDES="-I$kpse_BLD/libs/freetype2/freetype2"
+ FREETYPE2_LIBS="$kpse_BLD/libs/freetype2/libfreetype.a"
+ FREETYPE2_DEPEND='${top_builddir}/../../libs/freetype2/libfreetype.a'
+ FREETYPE2_RULE='# Rebuild libfreetype
+$(FREETYPE2_DEPEND): ${top_builddir}/../../libs/freetype2/freetype2/ft2build.h
+ cd ${top_builddir}/../../libs/freetype2 && $(MAKE) $(AM_MAKEFLAGS) rebuild
+${top_builddir}/../../libs/freetype2/freetype2/ft2build.h:
+ cd ${top_builddir}/../../libs/freetype2 && $(MAKE) $(AM_MAKEFLAGS) rebuild'
+fi
+
+
+
+# Check whether --with-default-gs-lib-path was given.
+if test "${with_default_gs_lib_path+set}" = set; then :
+ withval=$with_default_gs_lib_path;
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_GS_LIB_PATH "$withval"
+_ACEOF
+
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the path to be used for Ghostscript searches" >&5
+$as_echo_n "checking for the path to be used for Ghostscript searches... " >&6; }
+if ${xdvi_cv_gs_lib_path+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if gs -h >/dev/null 2>&1; then
+ ac_tmp="`gs -h \
+ | sed \
+ -e '1,/Search path:/d' \
+ -e '/For more information/,$d' \
+ -e '/Initialization files are compiled/d' \
+ -e 's/$/\/\/\//' \
+ -e 's/^ //' \
+ | tr '\n' '/'`"
+ # Solaris 9 sed doesn't handle incomplete lines at eof
+ xdvi_cv_gs_lib_path=`echo "$ac_tmp" \
+ | sed -e 's/\/\/\/\// /g' -e 's/ *$//' -e 's/ : /:/g'`
+else
+ xdvi_cv_gs_lib_path=/usr/local/share/ghostscript/fonts:/usr/local/lib/ghostscript/fonts:/usr/share/ghostscript/fonts:/var/lib/ghostscript/fonts:/usr/share/cups/fonts:/usr/share/fonts
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine Ghostscript search path; using $xdvi_cv_gs_lib_path" >&5
+$as_echo "$as_me: WARNING: Could not determine Ghostscript search path; using $xdvi_cv_gs_lib_path" >&2;}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xdvi_cv_gs_lib_path" >&5
+$as_echo "$xdvi_cv_gs_lib_path" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_GS_LIB_PATH "$xdvi_cv_gs_lib_path"
+_ACEOF
+
+
+fi
+
+
+eval CPPFLAGS=\"$KPATHSEA_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$KPATHSEA_LIBS \$LIBS\"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether kpathsea declares the kpse_enc_format" >&5
+$as_echo_n "checking whether kpathsea declares the kpse_enc_format... " >&6; }
+if ${kpse_cv_have_enc_format+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+int
+main ()
+{
+kpse_enc_format
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kpse_cv_have_enc_format=yes
+else
+ kpse_cv_have_enc_format=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_have_enc_format" >&5
+$as_echo "$kpse_cv_have_enc_format" >&6; }
+if test "x$kpse_cv_have_enc_format" = xyes; then :
+
+else
+ as_fn_error $? "your kpathsea has no kpse_enc_format." "$LINENO" 5
+fi
+
+ac_fn_c_check_header_mongrel "$LINENO" "kpathsea/version.h" "ac_cv_header_kpathsea_version_h" "$ac_includes_default"
+if test "x$ac_cv_header_kpathsea_version_h" = xyes; then :
+
+else
+ as_fn_error $? "Sorry, kpathsea too old" "$LINENO" 5
+fi
+
+
+
+CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+
+echo timestamp >config.force
+fi
+
+
+# Check whether --with-default-dvips-path was given.
+if test "${with_default_dvips_path+set}" = set; then :
+ withval=$with_default_dvips_path;
+else
+ with_default_dvips_path="dvips"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_DVIPS_PATH "$with_default_dvips_path"
+_ACEOF
+
+
+
+# Check whether --with-default-ps2pdf-path was given.
+if test "${with_default_ps2pdf_path+set}" = set; then :
+ withval=$with_default_ps2pdf_path;
+else
+ with_default_ps2pdf_path="ps2pdf"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_PS2PDF_PATH "$with_default_ps2pdf_path"
+_ACEOF
+
+
+XDVIK_VERSION=22.87.04
+
+
+ac_config_files="$ac_config_files Makefile tests/Makefile"
+
+
+ac_config_files="$ac_config_files xdvi:xdvi-sh.in"
+
+
+
+
+subdirs="$subdirs squeeze"
+
+
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by xdvik $as_me 22.87.04, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <tex-k@tug.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+xdvik config.status 22.87.04
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+ac_aux_dir='$ac_aux_dir'
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "c-auto.h") CONFIG_HEADERS="$CONFIG_HEADERS c-auto.h:c-auto.in" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ "xdvi") CONFIG_FILES="$CONFIG_FILES xdvi:xdvi-sh.in" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute 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 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT 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, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+ ;;
+ "xdvi":F) chmod +x xdvi ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+if test "x$cross_compiling" = xyes; then :
+ if test "x$cache_file" != x/dev/null; then :
+ cache_file=config.cache
+fi
+ac_configure_args="$ac_configure_args --host='$kpse_build_alias' \
+CC='$BUILDCC' CFLAGS='$BUILDCFLAGS' \
+CPPFLAGS='$BUILDCPPFLAGS' LDFLAGS='$BUILDLDFLAGS'"
+fi
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+ # so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ eval "set x $ac_configure_args"
+ shift
+ for ac_arg
+ do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+ | --c=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ --disable-option-checking)
+ ;;
+ *)
+ case $ac_arg in
+ *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_arg="--prefix=$prefix"
+ case $ac_arg in
+ *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+ # Pass --silent
+ if test "$silent" = yes; then
+ ac_sub_configure_args="--silent $ac_sub_configure_args"
+ fi
+
+ # Always prepend --disable-option-checking to silence warnings, since
+ # different subdirs can have different --enable and --with options.
+ ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d "$srcdir/$ac_dir" || continue
+
+ ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+ $as_echo "$ac_msg" >&6
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ cd "$ac_dir"
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ ac_sub_configure=$ac_srcdir/configure.gnu
+ elif test -f "$ac_srcdir/configure"; then
+ ac_sub_configure=$ac_srcdir/configure
+ elif test -f "$ac_srcdir/configure.in"; then
+ # This should be Cygnus configure.
+ ac_sub_configure=$ac_aux_dir/configure
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative name.
+ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+ fi
+
+ cd "$ac_popdir"
+ done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/Build/source/texk/xdvik/configure.ac b/Build/source/texk/xdvik/configure.ac
new file mode 100644
index 00000000000..a25b166e1ab
--- /dev/null
+++ b/Build/source/texk/xdvik/configure.ac
@@ -0,0 +1,305 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl Copyright (C) 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+dnl
+dnl This file is free software; the copyright holder
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+m4_define([xdvik_version], [22.87.04])
+AC_INIT([xdvik], xdvik_version, [tex-k@tug.org])
+AC_PREREQ([2.65])
+AC_CONFIG_SRCDIR([xdvi.c])
+AC_CONFIG_AUX_DIR([../../build-aux])
+AC_CONFIG_MACRO_DIRS([../../m4 m4])
+
+dnl Common code for all programs using libkpathsea.
+KPSE_COMMON([xdvik])
+KPSE_CANONICAL_HOST
+
+dnl Include additional code for xdvik.
+m4_include([ac/xdvik.ac])
+
+# Reduce compiler warnings, there are just too many.
+WARNING_CFLAGS=`echo $WARNING_CFLAGS | sed -e 's/ -Wcast-qual/ /' -e 's/ -Wwrite-strings/ /'`
+
+AC_SEARCH_LIBS([pow], [m])
+
+AC_ARG_WITH([ps],
+ AS_HELP_STRING([--with-ps=PS],
+ [Use PostScript (PS=no/yes/gs/dps/news, default gs)]))
+AS_CASE([$with_ps],
+ ["" | yes | gs], [PS_DEF=-DPS_GS],
+ [no], [PS_DEF=],
+ [dps], [PS_DEF=-DPS_DPS],
+ [news], [PS_DEF=-DPS_NEWS],
+ [AC_MSG_WARN([unknown--with-ps argument `$with_ps'; using gs.])
+ PS_DEF=-DPS_GS])
+AC_SUBST([PS_DEF])
+
+dnl Required, not optional.
+dnl AC_ARG_ENABLE([grey],
+dnl AS_HELP_STRING([--disable-grey],
+dnl [Disable greyscale anti-aliasing for shrunken bitmaps]))
+AC_DEFINE([GREY], 1, [Define to enable greyscale anti-aliasing for shrunken bitmaps.])
+
+dnl Required, not optional.
+dnl AC_ARG_ENABLE([color],
+dnl AS_HELP_STRING([--disable-color],
+dnl [Disable support for color specials]))
+AC_DEFINE([COLOR], 1, [Define to enable support for color specials.])
+
+dnl Required, not optional.
+dnl AC_ARG_ENABLE([freetype],
+dnl AS_HELP_STRING([--disable-freetype],
+dnl [Do not use FreeType2 (direct rendering of Type1 fonts)]))
+AC_DEFINE([FREETYPE], 1, [Define to compile in the FreeType2 library.])
+
+dnl OBSOLETE AC_ARG_ENABLE([gf],
+dnl OBSOLETE AS_HELP_STRING([--enable-gf],
+dnl OBSOLETE [Enable gf format pixel files (in addition to pk)]))
+dnl OBSOLETE AC_DEFINE([USE_GF], 1, [Define to enable gf format files (in addition to pk format).])
+
+AC_ARG_ENABLE([a4],
+ AS_HELP_STRING([--disable-a4],
+ [Set default paper size to letter and default unit to inch]))
+AS_IF([test "x$enable_a4" = xno],
+ [AC_MSG_NOTICE([Disabled a4/cm, using letter/in instead])],
+ [AC_DEFINE([A4], 1, [Define to use A4 as the default paper size.])])
+
+AC_CONFIG_HEADERS([c-auto.h:c-auto.in])
+
+AC_FUNC_FORK
+AC_FUNC_VPRINTF
+XDVI_FUNC_WORKING_VSNPRINTF
+XDVI_FUNC_MEMICMP
+AC_FUNC_ALLOCA
+AC_C_STRINGIZE
+AC_FUNC_MEMCMP
+AC_HEADER_SYS_WAIT
+AC_TYPE_SIGNAL
+AC_C_BIGENDIAN
+AC_PATH_XTRA
+
+dnl XDVI checks by Paul Vojta
+XDVI_FUNC_SETSID_IN_VFORK
+XDVI_C_BITMAP_TYPE
+XDVI_SYS_STREAMS
+XDVI_SYS_OLD_LINUX
+XDVI_FUNC_POLL
+XDVI_FUNC_XKB_BELL
+XDVI_XINPUT_2_1
+
+dnl #######
+
+dnl COMPILER_WARNINGS
+
+dnl #######
+
+# Check for `--allow-multiple-definition' linker flag
+XDVI_LINKER_MULTIPLE_DEFNS
+
+AC_CHECK_HEADERS([stdint.h inttypes.h])
+AC_TYPE_UINT32_T
+AC_CHECK_TYPE([ptrdiff_t], [],
+ [AC_DEFINE_UNQUOTED([ptrdiff_t], [long],
+ [Define to `long' if <sys/types.h> does not define.])])
+
+AC_CHECK_FUNCS([mkstemp memcpy strerror waitpid sigaction strchr setenv \
+ fchdir getcwd getpwnam getuid getpwuid \
+ lstat ftruncate snprintf vsnprintf realpath])
+
+# <sys/bsdtypes.h> is for ISC 4.0, to define fd_set in psgs.c.
+# regex.h is needed for regexp support in DVI search.
+AC_CHECK_HEADERS([netdb.h sys/bsdtypes.h sys/param.h unistd.h sys/fcntl.h regex.h])
+
+# Checks for iconv
+XDVI_CHECK_ICONV
+
+# Checks for langinfo
+XDVI_CHECK_LANGINFO
+
+# Check X11 headers.
+# X11/IntrinsicI.h is needed for LateBindings (to roll our own translations)
+xdvi_save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_CHECK_HEADERS([X11/Intrinsic.h X11/IntrinsicI.h X11/Xosdefs.h X11/xpm.h \
+ Xm/XpmP.h])
+# For editres, we need to check both the header and define a linker option.
+AC_CHECK_HEADERS([X11/Xmu/Editres.h X11/Xmu/Xmu.h],
+ [x_xmu_lib=-lXmu],
+ [x_xmu_lib=],
+ [#ifdef HAVE_X11_INTRINSIC_H
+# include <X11/Intrinsic.h>
+#endif])
+AC_SUBST([x_xmu_lib])
+CPPFLAGS=$xdvi_save_CPPFLAGS
+
+AC_ARG_ENABLE([magick],
+ AS_HELP_STRING([--enable-magick],
+ [Use ImageMagick to load/render image files.
+ EXPERIMENTAL - DO NOT USE!]))
+if test "x$enable_magick" = xyes; then
+ AC_MSG_CHECKING([for ImageMagick version])
+ if MAGICK_VER=`Magick-config --version 2>/dev/null`; then
+ AC_MSG_RESULT([$MAGICK_VER])
+ set dummy `echo $MAGICK_VER | sed -e 's/\./ /g'`
+ MAGICK_VER_MAJOR=$2
+ MAGICK_VER_MINOR=$3
+ if expr $MAGICK_VER_MAJOR \> 4 >/dev/null && \
+ (expr $MAGICK_VER_MAJOR \> 5 >/dev/null || \
+ expr $MAGICK_VER_MINOR \> 2 >/dev/null); then
+ MAGICK_CPP="-DMAGICK_VER_MAJOR=$MAGICK_VER_MAJOR -DMAGICK_VER_MINOR=$MAGICK_VER_MINOR `Magick-config --cppflags`"
+ MAGICK_LD="`Magick-config --libs` `Magick-config --ldflags`"
+ AC_MSG_NOTICE([ImageMagick support enabled])
+ X_CFLAGS="$X_CFLAGS $MAGICK_CPP"
+ X_EXTRA_LIBS="$X_EXTRA_LIBS $MAGICK_LD"
+ AC_DEFINE([MAGICK], 1, [Define to use ImageMagick])
+ else
+ AC_MSG_NOTICE([ImageMagick version too old - disabled])
+ fi
+ else
+ AC_MSG_RESULT([cannot run 'Magick-config' - ImageMagick support disabled])
+ fi
+fi
+
+# Check whether -lXpm can be used
+XDVI_FIND_XPM
+
+# Check for libXext.
+AS_IF([test -n "$x_libraries"],
+ [XLFLAG="-L$x_libraries"],
+ [XLFLAG=])
+if test -z "$x_ext_lib"; then # allow envvar override
+ AC_CHECK_LIB([Xext], [XextCreateExtension],
+ [x_ext_lib='-lXext'], [],
+ [-lX11 $X_EXTRA_LIBS $XLFLAG])
+fi
+AC_SUBST([x_ext_lib])
+
+# Check for libXp.
+# Although libXp is now defunct (no longer part of XOrg), older versions
+# of libXm may need to link with libXp; same for the equally defunct libXaw8.
+# We certainly don't want to include libXp unless necessary, since this might
+# only perpetuate the need to keep libXp.so around.
+# Moreover for ELF shared libraries a requirement for libXp.so is probably
+# encoded into libXm.so and/or libXaw.so and need not be specified explicitly.
+AC_CHECK_LIB([Xp], [XpQueryVersion],
+ [x_xp_lib='-lXp'], [],
+ [$x_ext_lib -lX11 $X_EXTRA_LIBS $XLFLAG])
+
+if test "x$enable_build" != xno || test -f config.force; then
+
+# Check which toolkit was specified
+AS_CASE([$with_xdvi_x_toolkit],
+ [next | nextaw | neXtaw], [val=neXtaw],
+ [xaw3d], [val=xaw3d],
+ ["" | x | xa | xaw], [val=xaw],
+ [y | ye | yes], [val=yes],
+ [m | mo | mot | moti | motif], [val=motif],
+ [AC_MSG_WARN([unknown --with-xdvi-x-toolkit argument
+ `$with_xdvi_x_toolkit'; using xaw.])
+ val=xaw])
+with_xdvi_x_toolkit=$val
+
+if test "x$with_xdvi_x_toolkit" = xxaw3d; then
+ prog_extension="xaw3d"
+ x_tool_libs="-lXaw3d"
+elif test "x$with_xdvi_x_toolkit" = xneXtaw; then
+ prog_extension="nextaw"
+ x_tool_libs="-lneXtaw"
+else
+ # Check for Xaw headers and library version
+ XDVI_CHECK_XAW_HEADERS
+ if test "x$with_xdvi_x_toolkit" != xxaw; then
+ if test "x$with_xdvi_x_toolkit" = xmotif; then
+ # Requested motiv
+ default_toolkit=none
+ else
+ # Requested motiv with Xaw as fallback
+ default_toolkit=Xaw
+ fi
+ XDVI_FIND_MOTIF
+ fi
+ if test "x$with_xdvi_x_toolkit" = xxaw; then
+ # Requested or fallback to Xaw, check for library
+ XDVI_CHECK_XAW_LIBRARY
+ fi
+fi
+AC_SUBST([x_tool_libs])
+final_exec_name="xdvi-$prog_extension"
+program_transform_name="'s,xdvi-bin,$final_exec_name,'"
+AC_SUBST([final_exec_name])
+
+dnl #######
+
+dnl $program_transform_name replacement
+
+dnl #######
+
+# If we're on Solaris and we want DPS, then add the extra compilation stuff
+# to get it.
+if echo "$PS_DEF" | grep PS_DPS >/dev/null; then
+ if test "`(uname) 2>/dev/null`" = SunOS \
+ && uname -r | grep '^5' >/dev/null; then
+ AC_MSG_NOTICE([adding DPS includes and libraries for Solaris])
+ X_CFLAGS="$X_CFLAGS -I/usr/openwin/include/X11"
+ X_LIBS="$X_LIBS -R/usr/openwin/lib /usr/openwin/lib/libdps.so $ac_sunmath"
+ AC_CHECK_LIB([sunmath], [isinf],
+ [X_LIBS="$X_LIBS -lsunmath"])
+ dnl We only need isinf and ieeefp.h to work around a Solaris bug in
+ dnl -ldps; see psdps.c. isinf is in -lsunmath.
+ AC_CHECK_FUNCS([isinf])
+ AC_CHECK_HEADERS([ieeefp.h])
+ else
+ dnl SunOS 4.x is simpler.
+ AC_MSG_NOTICE([adding DPS libraries for SunOS 4.x])
+ X_LIBS="$X_LIBS -ldps"
+ fi
+elif echo "$PS_DEF" | grep PS_NEWS >/dev/null; then
+ AC_MSG_NOTICE([adding NeWS libraries])
+ X_LIBS="$X_LIBS -lxview -lcps -lolgx -lxvps"
+fi
+
+KPSE_KPATHSEA_FLAGS
+KPSE_FREETYPE2_FLAGS
+
+XDVI_GS_LIB_PATH
+
+KPSE_ADD_FLAGS([kpathsea])
+
+KPSE_CHECK_KPSE_FORMAT([enc], [],
+ [AC_MSG_ERROR([your kpathsea has no kpse_enc_format.])])
+AC_CHECK_HEADER([kpathsea/version.h], [],
+ [AC_MSG_ERROR([Sorry, kpathsea too old])])
+
+KPSE_RESTORE_FLAGS
+
+echo timestamp >config.force
+fi
+
+AC_ARG_WITH([default-dvips-path],
+ AS_HELP_STRING([--with-default-dvips-path=CMD],
+ [Use CMD as default DVI to PS converter]), ,
+ [with_default_dvips_path="dvips"])
+AC_DEFINE_UNQUOTED([DEFAULT_DVIPS_PATH], ["$with_default_dvips_path"],
+ [Define to point to the default command to use for printing (optional).])
+
+AC_ARG_WITH([default-ps2pdf-path],
+ AS_HELP_STRING([--with-default-ps2pdf-path=CMD],
+ [Use CMD as default PS to PDF converter]), ,
+ [with_default_ps2pdf_path="ps2pdf"])
+AC_DEFINE_UNQUOTED([DEFAULT_PS2PDF_PATH], ["$with_default_ps2pdf_path"],
+ [Define to point to the default command to use for printing (optional).])
+
+XDVIK_VERSION=xdvik_version
+AC_SUBST([XDVIK_VERSION])
+
+AC_CONFIG_FILES([Makefile tests/Makefile])
+
+AC_CONFIG_FILES([xdvi:xdvi-sh.in], [chmod +x xdvi])
+
+dnl The subdirectory squeeze must be configured for the build system.
+KPSE_NATIVE_SUBDIRS([squeeze])
+
+AC_OUTPUT
diff --git a/Build/source/texk/xdvik/dl_list.c b/Build/source/texk/xdvik/dl_list.c
new file mode 100644
index 00000000000..7d8787ecc47
--- /dev/null
+++ b/Build/source/texk/xdvik/dl_list.c
@@ -0,0 +1,165 @@
+#include "xdvi-config.h"
+#include "dl_list.h"
+
+size_t dl_list_len(struct dl_list *list)
+{
+ size_t len = 0;
+ struct dl_list *ptr;
+ for (ptr = list; ptr != NULL; ptr = ptr->next, len++) { ; }
+ return len;
+}
+
+/*
+ Insert item to the list and return the result.
+*/
+struct dl_list *
+dl_list_insert(struct dl_list *list, void *item)
+{
+ struct dl_list *new_elem = xmalloc(sizeof *new_elem);
+ new_elem->item = item;
+ new_elem->next = NULL;
+ new_elem->prev = NULL;
+
+ if (list == NULL) {
+ list = new_elem;
+ }
+ else {
+ /* append after current position */
+ struct dl_list *ptr = list;
+
+ new_elem->next = ptr->next;
+ new_elem->prev = ptr;
+
+ if (ptr->next != NULL)
+ ptr->next->prev = new_elem;
+
+ ptr->next = new_elem;
+ }
+ return new_elem;
+}
+
+/*
+ Return head of the list.
+*/
+struct dl_list *
+dl_list_head(struct dl_list *list)
+{
+ for (; list != NULL && list->prev != NULL; list = list->prev) { ; }
+ return list;
+}
+
+/*
+ Put a new item at the front of the list (current front is passed in first argument)
+ and return its position.
+*/
+struct dl_list *
+dl_list_push_front(struct dl_list *list, void *item)
+{
+ struct dl_list *new_elem = xmalloc(sizeof *new_elem);
+ new_elem->item = item;
+ new_elem->next = NULL;
+ new_elem->prev = NULL;
+
+ if (list != NULL) { /* prepend to current position */
+ new_elem->next = list;
+ list->prev = new_elem;
+ }
+ return new_elem;
+}
+
+/*
+ Truncate list so that current pointer is the last element.
+*/
+struct dl_list *
+dl_list_truncate(struct dl_list *list)
+{
+ struct dl_list *ptr = list->next;
+ struct dl_list *save;
+
+ list->next = NULL;
+
+ while (ptr != NULL) {
+ save = ptr->next;
+ free(ptr);
+ ptr = save;
+ }
+ return list;
+}
+
+/*
+ Truncate list at the head (i.e. remove the first element from it - head must be passed to this list),
+ and return the result.
+*/
+struct dl_list *
+dl_list_truncate_head(struct dl_list *list)
+{
+ struct dl_list *ptr = list->next;
+ if (list->next != NULL)
+ list->next->prev = NULL;
+ free(list);
+ return ptr;
+}
+
+/*
+ If the item pointed to by *list isn't the head of the list, remove it,
+ set *list to the previous item, and return True. Else return False.
+*/
+Boolean
+dl_list_remove_item(struct dl_list **list)
+{
+ struct dl_list *ptr = *list; /* item to remove */
+ if (ptr->prev == NULL)
+ return False;
+ ptr->prev->next = ptr->next;
+ if (ptr->next != NULL)
+ ptr->next->prev = ptr->prev;
+ /* update list */
+ *list = (*list)->prev;
+ /* remove item */
+ free(ptr);
+
+ return True;
+}
+
+void
+dl_list_apply(struct dl_list *list, void (*func)(const void *item))
+{
+ struct dl_list *ptr;
+ for (ptr = list; ptr != NULL; ptr = ptr->next) {
+ func(ptr->item);
+ }
+}
+
+/*
+ Remove all items matching compare_func() from list. Must be called
+ with a pointer to the head of the list, which is also returned.
+ Returns the number of removed items in `count'.
+*/
+struct dl_list *
+dl_list_remove(struct dl_list *list, const void *item,
+ int *count,
+ void **removed_item,
+ Boolean (*compare_func)(const void *item1, const void *item2))
+{
+ struct dl_list *ptr = list;
+ while (ptr != NULL) {
+ struct dl_list *next = ptr->next;
+ if (compare_func(ptr->item, item)) { /* match */
+ *removed_item = ptr->item;
+ (*count)++;
+ if (ptr->prev != NULL) {
+ ptr->prev->next = ptr->next;
+ }
+ else { /* removed first element */
+ list = list->next;
+ }
+
+ if (ptr->next != NULL)
+ ptr->next->prev = ptr->prev;
+ free(ptr);
+ ptr = NULL;
+ }
+ ptr = next;
+ }
+ return list;
+}
diff --git a/Build/source/texk/xdvik/dl_list.h b/Build/source/texk/xdvik/dl_list.h
new file mode 100644
index 00000000000..0c246cc328e
--- /dev/null
+++ b/Build/source/texk/xdvik/dl_list.h
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include "xdvi.h"
+#include "version.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/hash.h"
+#include "kpathsea/tex-file.h"
+
+/* double linked list */
+struct dl_list {
+ void *item;
+ struct dl_list *prev;
+ struct dl_list *next;
+};
+
+void dl_list_apply(struct dl_list *list, void (*func)(const void *item));
+size_t dl_list_len(struct dl_list *list);
+struct dl_list *dl_list_head(struct dl_list *list);
+struct dl_list *dl_list_push_front(struct dl_list *list, void *item);
+struct dl_list *dl_list_insert(struct dl_list *list, void *item);
+struct dl_list *dl_list_truncate(struct dl_list *list);
+struct dl_list *dl_list_truncate_head(struct dl_list *list);
+struct dl_list *dl_list_remove(struct dl_list *list,
+ const void *elem,
+ int *count,
+ void **item,
+ Boolean (*compare_func)(const void *item1, const void *item2));
+Boolean dl_list_remove_item(struct dl_list **list);
diff --git a/Build/source/texk/xdvik/dvi-draw.c b/Build/source/texk/xdvik/dvi-draw.c
new file mode 100644
index 00000000000..c938508d00f
--- /dev/null
+++ b/Build/source/texk/xdvik/dvi-draw.c
@@ -0,0 +1,5326 @@
+/* The rest of the code has the following copyright:
+
+Copyright (c) 1990-2019 Paul Vojta and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include <stdarg.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <setjmp.h>
+
+#define USE_HASH
+
+#include <ctype.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/magstep.h"
+#include "kpathsea/tex-file.h"
+
+#include <string.h>
+
+#include "dvi.h"
+#include "string-utils.h"
+#include "util.h"
+#include "x_util.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "font-open.h"
+#include "statusline.h"
+#include "hypertex.h"
+#include "special.h"
+#include "my-snprintf.h"
+#include "kpathsea/tex-file.h"
+#include "mag.h"
+#include "message-window.h"
+
+#include "dvi-draw.h"
+#include "search-internal.h"
+#include "encodings.h"
+#include "pagesel.h"
+#include "pagehist.h"
+
+#if FREETYPE
+ /* other freetype includes are already done in dvi-init.h */
+# include FT_TYPE1_TABLES_H
+#endif
+
+#ifdef RGB_ANTI_ALIASING
+#define TRACE_AA 0
+#define TRACE_AA1 1
+#define TRACE_AA3 0
+#else
+#define TRACE_AA 0
+#define TRACE_AA1 0
+#define TRACE_AA3 0
+#endif
+
+#define MY_DEBUG 0
+
+#if MY_DEBUG
+# define TRACE_FIND_VERBOSE(x) TRACE_FIND(x)
+#else
+# define TRACE_FIND_VERBOSE(x) /* as nothing */
+#endif
+
+#if PS && PS_GS
+#include "psgs.h"
+#endif /* PS && PS_GS */
+
+#ifdef DOPRNT /* define this if vfprintf gives you trouble */
+# define vfprintf(stream, message, args) _doprnt(message, args, stream)
+#endif
+
+#define BUF_SIZE 1024
+
+/*
+ * All calculations are done with shrink factor = 1, so we re-do some
+ * macros accordingly. Many of these are also defined in special.c.
+ */
+
+#define xpixel_conv(x) ((int) ((x) >> 16))
+#define xpixel_round(x) ((int) ROUNDUP(x, 1 << 16))
+
+#define G_PXL_H xpixel_conv(currinf.data.dvi_h)
+#define G_OFFSET_X (resource.xoffset_int << 16) + (3 << 15)
+#define G_OFFSET_Y (resource.yoffset_int << 16) + (3 << 15)
+
+#if PS
+int scanned_page_ps;
+int scanned_page_ps_bak;
+#endif
+
+#if COLOR
+int scanned_page_color;
+#endif
+
+int scanned_page_reset, scanned_page;
+
+struct drawinf currinf;
+Boolean htex_inside_href = False; /* whether we're inside a href */
+
+Boolean drawing_mag = False;
+
+static struct frame frame0; /* dummy head of list */
+#ifdef TEXXET
+static struct frame *scan_frame; /* head frame for scanning */
+#endif
+
+static const char *const reverse_search_helptext =
+"Forward/reverse search allows you to jump from a point "
+"in the DVI file to the corresponding location in the .tex source file, and vice versa. "
+"To make this possible, the .tex file needs to be compiled with source special support. "
+"This can be done by using either a package like \"srcltx.sty\" or \"srctex.sty\", "
+"or a command-line switch like \"-src\" for the TeX executable. "
+"See the xdvi man page (section SOURCE SPECIALS) "
+"for more information about this.";
+
+static ubyte dvi_buffer[DVI_BUFFER_LEN];
+ubyte *G_dvi_buf_ptr = dvi_buffer;
+static struct frame *current_frame;
+
+/* Points to drawinf record containing current dvi file location (for update by
+ geom_scan). */
+static struct drawinf *dvi_pointer_frame = NULL;
+
+#ifdef TEXXET
+#define DIR currinf.dir
+#else
+#define DIR 1
+#endif
+
+/*
+ * Explanation of the following constant:
+ * offset_[xy] << 16: margin (defaults to one inch)
+ * currwin.shrinkfactor << 16: one pixel page border
+ * currwin.shrinkfactor << 15: rounding for pixel_conv
+ */
+#define OFFSET_X (resource.xoffset_int << 16) + (currwin.shrinkfactor * 3 << 15)
+#define OFFSET_Y (resource.yoffset_int << 16) + (currwin.shrinkfactor * 3 << 15)
+
+#if (BMBYTES == 1)
+bmUnitT bit_masks[] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff
+};
+#else
+#if (BMBYTES == 2)
+bmUnitT bit_masks[] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff, 0x1ff, 0x3ff, 0x7ff,
+ 0xfff, 0x1fff, 0x3fff, 0x7fff,
+ 0xffff
+};
+#else /* BMBYTES == 4 */
+bmUnitT bit_masks[] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff, 0x1ff, 0x3ff, 0x7ff,
+ 0xfff, 0x1fff, 0x3fff, 0x7fff,
+ 0xffff, 0x1ffff, 0x3ffff, 0x7ffff,
+ 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff,
+ 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff,
+ 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+ 0xffffffff
+};
+#endif
+#endif
+
+#ifdef VMS
+#define off_t int
+#endif
+extern off_t lseek();
+
+#ifndef SEEK_SET /* if <unistd.h> is not provided (or for <X11R5) */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#endif
+
+static void draw_part(FILE *fp, struct frame *minframe, double current_dimconv);
+
+static void source_fwd_draw_box(void);
+
+
+
+/*
+ * X routines.
+ */
+
+/*
+ * Put a rectangle on the screen.
+ */
+static void
+put_rule(int x, int y, unsigned int w, unsigned int h)
+{
+ if (htex_inside_href)
+ htex_record_position(x, y, w, h);
+ if (x < globals.win_expose.max_x && x + (int)w >= globals.win_expose.min_x && y < globals.win_expose.max_y && y + (int)h >= globals.win_expose.min_y) {
+ if (--globals.ev.ctr == 0) {
+ if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) {
+ /* fprintf(stderr, "longjmp1!\n"); */
+ longjmp(globals.ev.canit, 1);
+ }
+ }
+#if COLOR
+ if (fg_active != fg_current)
+ do_color_change();
+#endif
+ XFillRectangle(DISP, currwin.win,
+ globals.gc.rule,
+ x - currwin.base_x,
+ y - currwin.base_y,
+ w ? w : 1,
+ h ? h : 1);
+ }
+}
+
+static void
+put_bitmap(struct bitmap *bitmap, int x, int y)
+{
+ if (globals.debug & DBG_BITMAP)
+ printf("X(%d,%d)\n", x - currwin.base_x, y - currwin.base_y);
+ if (htex_inside_href)
+ htex_record_position(x, y, bitmap->w, bitmap->h);
+ if (x < globals.win_expose.max_x && x + (int)bitmap->w >= globals.win_expose.min_x &&
+ y < globals.win_expose.max_y && y + (int)bitmap->h >= globals.win_expose.min_y) {
+ if (--globals.ev.ctr == 0)
+ if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) {
+ /* fprintf(stderr, "longjmp2!\n"); */
+ longjmp(globals.ev.canit, 1);
+ }
+#if COLOR
+ if (fg_active != fg_current)
+ do_color_change();
+#endif
+ G_image->width = bitmap->w;
+ G_image->height = bitmap->h;
+ G_image->data = bitmap->bits;
+ G_image->bytes_per_line = bitmap->bytes_wide;
+ XPutImage(DISP, currwin.win, globals.gc.fore, G_image,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y, bitmap->w, bitmap->h);
+ if (globals.gc.fore2) {
+ XPutImage(DISP, currwin.win, globals.gc.fore2, G_image,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ bitmap->w, bitmap->h);
+ }
+ }
+}
+
+#if GREY
+
+/* Anti-aliasing stuff.
+ The method used here is supersampling of the unshrunk glyph (this
+ also means that no anti-aliasing happens at shrink 1). A sample
+ of the number of bits that are `on' in the unsrunk glyph determines
+ the grey level of the shrunk image.
+*/
+
+/* Pixel lookup tables for anti-aliasing: These store all possible
+ supersampling values (i.e. number of bits set in the unshrunk
+ image) for the given shrink factor. E.g. at shrink level 2, the
+ size of the pixel table is 4; in other words, 1 pixel in the shrunk
+ image corresponds to 4 pixels in the unshrunk image. Thus, the possible
+ values for shrink level 2 are: black, 1/4 (0x404040), 1/2 (0x808080),
+ 3/4 (0xc0c0c0) and white (0xffffff).
+*/
+static Pixel *pixeltbl;
+static Pixel *pixeltbl_gc2; /* drawing to globals.gc.fore2 (compare pixmap2_gc2) */
+
+static void shrink_glyph_grey(struct glyph *);
+
+static void
+put_image(struct glyph *g, int x, int y)
+{
+ XImage *img = g->image2;
+
+ if (htex_inside_href)
+ htex_record_position(x, y, img->width, img->height);
+ if (x < globals.win_expose.max_x && x + img->width >= globals.win_expose.min_x &&
+ y < globals.win_expose.max_y && y + img->height >= globals.win_expose.min_y) {
+ if (--globals.ev.ctr == 0)
+ if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) {
+ /* fprintf(stderr, "longjmp3!\n"); */
+ longjmp(globals.ev.canit, 1);
+ }
+
+#if COLOR
+ if (g->fg != fg_current) /* if color change since last use */
+ shrink_glyph_grey(g);
+ else if (fg_active != fg_current) /* if GCs need updating */
+ do_color_change();
+#endif
+ /* TODO: Can we increase gamma locally to make the inverted text more readable?
+
+ and to draw the background, so something like this:
+ XFillRectangle(DISP, currwin.win, globals.gc.fore, x - currwin.base_x, y - currwin.base_y,
+ (unsigned int)img->width * 2, (unsigned int)img->height * 2);
+
+ test this with color changes!!
+ */
+ /*TEST_DELAY("check point 1 ...")*/
+ XPutImage(DISP, currwin.win, globals.gc.fore, img,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ (unsigned int)img->width, (unsigned int)img->height);
+ /*TEST_DELAY("check point 2 ...")*/
+
+ if (globals.gc.fore2 != NULL) {
+ img->data = g->pixmap2_gc2;
+ XPutImage(DISP, currwin.win, globals.gc.fore2, img,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ (unsigned int)img->width, (unsigned int)img->height);
+ img->data = g->pixmap2;
+ }
+ /*TEST_DELAY("check point 3 ...")*/
+ }
+}
+#endif /* GREY */
+
+/*
+ * Draw the border of a rectangle on the screen.
+ * This should be replaced by a grey background both in Xaw and Motif
+ * as soon as #470325 is fixed (see also FIXED_FLUSHING_PAGING).
+ */
+static void
+draw_border(int x, int y, unsigned int width, unsigned int height, GC ourGC)
+{
+ --width;
+ --height;
+ XDrawRectangle(DISP, currwin.win, ourGC, x, y, width, height);
+}
+
+/* draw the grid */
+static void
+put_grid(int x, int y,
+ unsigned int width, unsigned int height, unsigned int unit,
+ GC gc)
+{
+ int i;
+ float sep;
+ unsigned int tmp;
+
+ --width;
+ --height;
+
+
+ /* draw vertial grid */
+#define DRAWGRID_VER(gc) for (i = 1; \
+ (tmp = x + (int)(i * sep)) < x + width; \
+ i++) \
+ XFillRectangle(DISP, currwin.win, (gc), \
+ tmp, y, 1, height)
+ /* draw horizontal grid */
+#define DRAWGRID_HOR(gc) for (i = 1; \
+ (tmp = y + (int)(i * sep)) < y + height; \
+ i++) \
+ XFillRectangle(DISP, currwin.win, (gc), \
+ x, tmp, width, 1)
+
+ if (resource.grid_mode > 2) { /* third level grid */
+ sep = (float)unit / 4.0;
+ DRAWGRID_VER(gc);
+ DRAWGRID_HOR(gc);
+ }
+
+ if (resource.grid_mode > 1) { /* second level grid */
+ sep = (float)unit / 2.0;
+ DRAWGRID_VER(gc);
+ DRAWGRID_HOR(gc);
+ }
+
+ if (resource.grid_mode > 0) { /* first level grid */
+ sep = (float)unit;
+ DRAWGRID_VER(gc);
+ DRAWGRID_HOR(gc);
+ }
+}
+#undef DRAWGRID_VER
+#undef DRAWGRID_HOR
+
+/*
+ * Byte reading routines for dvi file.
+ */
+
+#define xtell(fp, pos) (lseek(fileno(fp), 0L, SEEK_CUR) - \
+ (currinf.end - (pos)))
+
+static ubyte
+xxone(FILE *fp)
+{
+ if (currinf.virtual) {
+ ++currinf.pos;
+ return EOP;
+ }
+
+ currinf.end = G_dvi_buf_ptr
+ + read(fileno(fp), (char *)(currinf.pos = G_dvi_buf_ptr), DVI_BUFFER_LEN);
+ return currinf.end > G_dvi_buf_ptr ? *(currinf.pos)++ : EOF;
+}
+
+#define xone(fp) (currinf.pos < currinf.end ? *(currinf.pos)++ : xxone(fp))
+
+static unsigned long
+xnum(FILE *fp, ubyte size)
+{
+ long x = 0;
+
+ while (size--)
+ x = (x << 8) | xone(fp);
+ return x;
+}
+
+static long
+xsnum(FILE *fp, ubyte size)
+{
+ long x;
+
+#if __STDC__
+ x = (signed char)xone(fp);
+#else
+ x = xone(fp);
+ if (x & 0x80)
+ x -= 0x100;
+#endif
+ while (--size)
+ x = (x << 8) | xone(fp);
+ return x;
+}
+
+#define xsfour(fp) xsnum(fp, 4)
+
+static void
+xskip(FILE *fp, long offset)
+{
+ currinf.pos += offset;
+ if (!currinf.virtual && currinf.pos > currinf.end)
+ (void)lseek(fileno(fp), (long)(currinf.pos - currinf.end), SEEK_CUR);
+}
+
+void
+dvi_fmt_error(const char *message, ...)
+{
+
+ va_list args;
+ va_start(args, message);
+ fprintf(stderr, "%s: ", globals.program_name);
+ (void)vfprintf(stderr, message, args);
+ va_end(args);
+ if (currinf.virtual)
+ fprintf(stderr, " in virtual font %s\n", currinf.virtual->fontname);
+ else
+ fprintf(stderr, ", offset %ld\n", (long)xtell(globals.dvi_file.bak_fp, currinf.pos - 1));
+ /* #ifndef NDEBUG */
+ /* xdvi_exit(EXIT_FAILURE); */
+ /* #else */
+ XDVI_ABORT((stderr, "I'll abort now, to help you debugging this."));
+ /* #endif */
+}
+
+
+/*
+ * Code for debugging options.
+ */
+
+static void
+print_bitmap(struct bitmap *bitmap)
+{
+ bmUnitT *ptr = (bmUnitT *)bitmap->bits;
+ int x, y, i;
+
+ ASSERT(ptr != NULL, "Invalid bitmap bits");
+
+ printf("w = %d, h = %d, bytes wide = %d\n",
+ bitmap->w, bitmap->h, bitmap->bytes_wide);
+ for (y = 0; y < (int)bitmap->h; ++y) {
+ for (x = bitmap->bytes_wide; x > 0; x -= BMBYTES) {
+#ifdef WORDS_BIGENDIAN
+ for (i = BMBITS - 1; i >= 0; --i)
+ putchar((*ptr & (1 << i)) ? '@' : '.');
+#else
+ for (i = 0; i < BMBITS; ++i)
+ putchar((*ptr & (1 << i)) ? '@' : '.');
+#endif
+ ++ptr;
+ }
+ putchar('\n');
+ }
+}
+
+static void
+print_char(ubyte ch, struct glyph *g)
+{
+ printf("char %d", ch);
+ if (isprint(ch))
+ printf(" (%c)", ch);
+ putchar('\n');
+ printf("x = %d, y = %d, dvi = %ld\n", g->x, g->y, g->dvi_adv);
+ print_bitmap(&g->bitmap);
+}
+
+static const char *dvi_table1[] = {
+ "SET1", "SET2", NULL, NULL, "SETRULE", "PUT1", "PUT2", NULL,
+ NULL, "PUTRULE", "NOP", "BOP", "EOP", "PUSH", "POP", "RIGHT1",
+ "RIGHT2", "RIGHT3", "RIGHT4", "W0", "W1", "W2", "W3", "W4",
+ "X0", "X1", "X2", "X3", "X4", "DOWN1", "DOWN2", "DOWN3",
+ "DOWN4", "Y0", "Y1", "Y2", "Y3", "Y4", "Z0", "Z1",
+ "Z2", "Z3", "Z4"
+};
+
+static const char *dvi_table2[] = {
+ "FNT1", "FNT2", "FNT3", "FNT4", "XXX1", "XXX2", "XXX3", "XXX4",
+ "FNTDEF1", "FNTDEF2", "FNTDEF3", "FNTDEF4", "PRE", "POST", "POSTPOST",
+ "SREFL", "EREFL", NULL, NULL, NULL, NULL
+};
+
+static void
+print_dvi(ubyte ch)
+{
+ const char *s;
+
+ fprintf(stderr, "%4d %4d ", PXL_H, PXL_V);
+ if (ch <= (ubyte) (SETCHAR0 + 127)) {
+ fprintf(stderr, "SETCHAR%-3d", ch - SETCHAR0);
+ if (isprint(ch))
+ fprintf(stderr, " (%c)", ch);
+ fputc('\n', stderr);
+ return;
+ }
+ else if (ch < FNTNUM0)
+ s = dvi_table1[ch - 128];
+ else if (ch <= (ubyte) (FNTNUM0 + 63)) {
+ fprintf(stderr, "FNTNUM%d\n", ch - FNTNUM0);
+ return;
+ }
+ else
+ s = dvi_table2[ch - (FNTNUM0 + 64)];
+ if (s) {
+ fputs(s, stderr);
+ fputc('\n', stderr);
+ }
+ else
+ XDVI_FATAL((stderr, "print_dvi: unknown op-code %d", ch));
+}
+
+
+/*
+ * Count the number of set bits in a 4x4-region of the bitmap
+ */
+
+static char sample_count[] = {
+ 0, 1, 1, 2,
+ 1, 2, 2, 3,
+ 1, 2, 2, 3,
+ 2, 3, 3, 4
+};
+
+/*
+ * For greyscaling, return the number of bits that are set in a given region
+ * of width w and height h of the bitmap `bits', starting horizontally after
+ * `bit_skip' bits, where `bytes_wide' is the same as the `bytes_wide' field
+ * in the bitmap struct (scan line width in bytes).
+ * Note that `bits' is really a one-dimensional array, i.e. all the rows
+ * are put in sequence into one single row.
+ */
+static int
+sample(bmUnitT *bits, int bytes_wide, int bit_skip, int w, int h)
+{
+ bmUnitT *beg_ptr, *end_ptr, *curr_ptr;
+ int bits_left;
+ int n, bit_shift, wid;
+
+#if TRACE_AA
+ fprintf(stderr, "sample: %d bytes wide, %d skip, %d w, %d h\n", bytes_wide, bit_skip, w, h);
+#endif
+
+ beg_ptr = bits + bit_skip / BMBITS;
+ end_ptr = ADD(bits, h * bytes_wide);
+
+#if TRACE_AA
+ fprintf(stderr, "beg_ptr: %p, end: %p\n", (void *)beg_ptr, (void *)end_ptr);
+#endif
+
+ bits_left = w;
+#ifdef WORDS_BIGENDIAN
+ bit_shift = BMBITS - bit_skip % BMBITS;
+#else
+ bit_shift = bit_skip % BMBITS;
+#endif
+#if TRACE_AA
+ fprintf(stderr, "shift: %d\n", bit_shift);
+#endif
+ n = 0;
+
+ while (bits_left) {
+#ifdef WORDS_BIGENDIAN
+ wid = bit_shift;
+#else
+ wid = BMBITS - bit_shift;
+#endif
+ if (wid > bits_left)
+ wid = bits_left;
+ if (wid > 4) /* why? */
+ wid = 4;
+#ifdef WORDS_BIGENDIAN
+ bit_shift -= wid;
+#endif
+ for (curr_ptr = beg_ptr;
+ curr_ptr < end_ptr;
+ curr_ptr = ADD(curr_ptr, bytes_wide)) {
+#if TRACE_AA
+ int i;
+ for (i = 0; i < bytes_wide; i++) {
+ fprintf(stderr, "%d ", *(curr_ptr + i));
+ }
+ fprintf(stderr, "\nMask: %d; count: %d\n", wid,
+ sample_count[ (*curr_ptr >> bit_shift) & bit_masks[wid] ]);
+#endif
+ n += sample_count[ (*curr_ptr >> bit_shift) & bit_masks[wid] ];
+ }
+#ifdef WORDS_BIGENDIAN
+ if (bit_shift == 0) {
+ bit_shift = BMBITS;
+ ++beg_ptr;
+ }
+#else
+ bit_shift += wid;
+ if (bit_shift == BMBITS) {
+ bit_shift = 0;
+ ++beg_ptr;
+ }
+#endif
+ bits_left -= wid;
+ /* fprintf(stderr, "bits_left: %d\n", bits_left); */
+ }
+ return n;
+}
+
+static void
+shrink_glyph(struct glyph *g)
+{
+ int shrunk_bytes_wide, shrunk_height;
+ int rows_left, rows, init_cols;
+ int cols_left;
+ int cols;
+ bmUnitT *unshrunk_ptr, *shrunk_ptr;
+ bmUnitT m, *cp;
+ /* threshold for which a bit will be set to `on' in the shrunken bitmap */
+ int min_sample = currwin.shrinkfactor * currwin.shrinkfactor * resource.density / 100;
+ int row_num;
+
+ /* These machinations ensure that the character is shrunk according to
+ its hot point, rather than its upper left-hand corner. */
+ g->x2 = g->x / currwin.shrinkfactor;
+ init_cols = g->x - g->x2 * currwin.shrinkfactor;
+ if (init_cols <= 0)
+ init_cols += currwin.shrinkfactor;
+ else
+ ++g->x2;
+ g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor);
+ /* include row zero with the positively numbered rows */
+ row_num = g->y + 1;
+ g->y2 = row_num / currwin.shrinkfactor;
+ rows = row_num - g->y2 * currwin.shrinkfactor;
+ if (rows <= 0) {
+ rows += currwin.shrinkfactor;
+ --g->y2;
+ }
+ g->bitmap2.h = shrunk_height
+ = g->y2 + ROUNDUP((int)g->bitmap.h - row_num, currwin.shrinkfactor) + 1;
+ alloc_bitmap(&g->bitmap2);
+
+ unshrunk_ptr = (bmUnitT *) g->bitmap.bits;
+ shrunk_ptr = (bmUnitT *) g->bitmap2.bits;
+ shrunk_bytes_wide = g->bitmap2.bytes_wide;
+ rows_left = g->bitmap.h;
+ memset((char *)shrunk_ptr, '\0', shrunk_bytes_wide * shrunk_height);
+
+ while (rows_left) {
+ if (rows > rows_left)
+ rows = rows_left;
+ cols_left = g->bitmap.w;
+#ifndef WORDS_BIGENDIAN
+ m = 1; /* XXX was (1 << 0) */
+#else
+ m = ((bmUnitT)1 << (BMBITS - 1));
+#endif
+ cp = shrunk_ptr;
+ cols = init_cols;
+ while (cols_left) {
+ /* ??? */
+ if (cols > cols_left)
+ cols = cols_left;
+ /* set a bit to `on' if it's over the threshold */
+ if (sample(unshrunk_ptr, g->bitmap.bytes_wide,
+ (int)g->bitmap.w - cols_left, cols, rows)
+ >= min_sample)
+ *cp |= m;
+#ifndef WORDS_BIGENDIAN
+ if (m == ((bmUnitT)1 << (BMBITS - 1))) {
+ m = 1; /* XXX was (1 << 0) */
+ ++cp;
+ }
+ else
+ m <<= 1;
+#else
+ if (m == 1) { /* XXX was (1 << 0) */
+ m = ((bmUnitT)1 << (BMBITS - 1));
+ ++cp;
+ }
+ else
+ m >>= 1;
+#endif
+ cols_left -= cols;
+ cols = currwin.shrinkfactor;
+ }
+ shrunk_ptr += shrunk_bytes_wide / sizeof(bmUnitT);
+ unshrunk_ptr += rows * g->bitmap.bytes_wide / sizeof(bmUnitT);
+ /* *((char **)&shrunk_ptr) += shrunk_bytes_wide; */
+ /* *((char **)&unshrunk_ptr) += rows * g->bitmap.bytes_wide; */
+ rows_left -= rows;
+ rows = currwin.shrinkfactor;
+ }
+ g->y2 = g->y / currwin.shrinkfactor;
+ if (globals.debug & DBG_BITMAP)
+ print_bitmap(&g->bitmap2);
+}
+
+#ifdef GREY
+
+#ifdef RGB_ANTI_ALIASING
+/* void */
+/* filter_colors(Pixel *p1, Pixel *p2) */
+/* { */
+/* Pixel res1, res2; */
+
+/* int res1_r = *p1 & G_visual->red_mask; */
+/* int res1_g = *p1 & G_visual->green_mask; */
+/* int res1_b = *p1 & G_visual->blue_mask; */
+
+/* int res2_r = *p2 & G_visual->red_mask; */
+/* int res2_g = *p2 & G_visual->green_mask; */
+/* int res2_b = *p2 & G_visual->blue_mask; */
+/* } */
+
+static void
+color_filter_image(struct glyph *g)
+{
+ int rows = g->bitmap2.h;
+ int cols = g->bitmap2.w;
+ int i, j, k;
+ int arr_size = rows * cols * 3;
+ unsigned char *arr = xmalloc(arr_size * sizeof *arr);
+ unsigned char *arr2 = xmalloc(arr_size * sizeof *arr2);
+
+ fprintf(stderr, "total: %d\n", arr_size);
+
+ for (i = 0, j = 0; j < rows; j++) {
+ for (k = 0; k < cols; k++) {
+ Pixel p = XGetPixel(g->image2, k, j);
+#if TRACE_AA3
+ fprintf(stderr, "k: %d, j: %d, idx: %d\n", k, j, i);
+#endif
+ arr[i] = (p & G_visual->red_mask) >> 16;
+ arr[i + 1] = (p & G_visual->green_mask) >> 8;
+ arr[i + 2] = (p & G_visual->blue_mask);
+#if TRACE_AA3
+ fprintf(stderr, "0x%.6lX -> %d, %d, %d\n", p, arr[i], arr[i + 1], arr[i + 2]);
+#endif
+ i += 3;
+ }
+ }
+
+ for (i = 0; i < arr_size; i++) {
+ if (i == 0) { /* merge two elems */
+ if (i == arr_size - 1) /* only one elem, do nothing */
+ break;
+ arr2[i] = (int)(resource.subpixel_energy[0] * arr[i] +
+ resource.subpixel_energy[1] * arr[i + 1] + 0.5);
+ }
+ else if (i == arr_size - 1) { /* merge two elems */
+ if (i == 0) /* only one elem, do nothing */
+ break;
+ arr2[i] = (int)(resource.subpixel_energy[1] * arr[i - 1] +
+ resource.subpixel_energy[0] * arr[i] + 0.5);
+ }
+ else { /* merge three elems */
+ arr2[i] = (int)(resource.subpixel_energy[1] * arr[i - 1] +
+ resource.subpixel_energy[0] * arr[i] +
+ resource.subpixel_energy[1] * arr[i + 1] + 0.5);
+#if TRACE_AA3
+ fprintf(stderr, "%d, %d, %d -> %d\n", arr[i - 1], arr[i], arr[i + 1], arr2[i]);
+#endif
+ }
+ }
+
+ for (i = 0, j = 0; j < rows; j++) {
+ for (k = 0; k < cols; k++) {
+ Pixel p = arr2[i] << 16 | (arr2[i + 1] << 8) | arr2[i + 2];
+#if TRACE_AA3
+ fprintf(stderr, "%d, %d, %d -> 0x%.6lX\n", arr2[i], arr2[i + 1], arr2[i + 2], p);
+#endif
+ XPutPixel(g->image2, k, j, p);
+ i += 3;
+ }
+ }
+
+ free(arr);
+ free(arr2);
+}
+
+#endif
+
+static void
+shrink_glyph_grey(struct glyph *g)
+{
+ int rows_left, rows, init_cols;
+ int cols_left;
+ int cols;
+ int x, y;
+ long thesample;
+ /* int min_sample = currwin.shrinkfactor * currwin.shrinkfactor * resource.density / 100; */
+ Pixel onoff, onoff2;
+ bmUnitT *unshrunk_ptr;
+ unsigned int size;
+ int row_num;
+
+#if COLOR
+ if (fg_active != fg_current) {
+ do_color_change();
+ }
+#endif
+ if (pixeltbl == NULL) { /* fix #1611508 (segfault when starting with -nogrey) */
+ do_color_change();
+ }
+
+ /* TODO: rounding errors causing color fringing (see HACK comment below):
+
+ \documentclass{article}
+ \pagestyle{empty}
+
+ \begin{document}
+ l
+ \end{document}
+
+ With ./xdvi-xaw.bin -name xdvi -subpixel rgb -s 4 ./test.dvi:
+
+ subpixel order: rgb = 1
+ g->x2: 0, init_cols: -2
+ AFTER: g->x2: 0, init_cols: 2
+
+ but with ./xdvi-xaw.bin -name xdvi -s 4 ./test.dvi:
+
+ g->x2: 0, init_cols: -3
+ AFTER: g->x2: 0, init_cols: 1
+ */
+
+ /* These machinations ensure that the character is shrunk according to
+ its hot point, rather than its upper left-hand corner. */
+#ifdef RGB_ANTI_ALIASING
+ if (resource.subpixel_order == SUBPIXEL_NONE)
+ g->x2 = g->x / currwin.shrinkfactor;
+ else {
+ if (g->x < 0)
+ g->x2 = (int)(g->x / 3.0 - 0.5) / currwin.shrinkfactor;
+ else
+ g->x2 = (int)(g->x / 3.0 + 0.5) / currwin.shrinkfactor;
+ }
+
+ if (resource.subpixel_order == SUBPIXEL_NONE)
+ init_cols = g->x - g->x2 * currwin.shrinkfactor;
+ else {
+ if (g->x < 0)
+ init_cols = (int)(g->x / 3.0 - 0.5) - g->x2 * currwin.shrinkfactor;
+ else
+ init_cols = (int)(g->x / 3.0 + 0.5) - g->x2 * currwin.shrinkfactor;
+ fprintf(stderr, "g->x: %d, g->x2: %d, init_cols: %d\n", g->x, g->x2, init_cols);
+ }
+#else
+ g->x2 = g->x / currwin.shrinkfactor;
+ init_cols = g->x - g->x2 * currwin.shrinkfactor;
+#endif
+
+ if (init_cols <= 0)
+ init_cols += currwin.shrinkfactor;
+ else
+ ++(g->x2);
+
+#ifdef RGB_ANTI_ALIASING
+
+ if (resource.subpixel_order == SUBPIXEL_NONE)
+ g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor);
+ else {
+ fprintf(stderr, "AFTER: g->x2: %d, init_cols: %d\n", g->x2, init_cols);
+ /* fprintf(stderr, "g->bitmap.w / 3.0 + 0.5: %d; g->x / 3.0: %d; all: %d, %d\n", */
+ /* (int)(g->bitmap.w / 3.0 + 0.5), */
+ /* (int)(g->x / 3.0), */
+ /* (int)((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0), */
+ /* g->x2 + (int)((((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0) + currwin.shrinkfactor - 1) / currwin.shrinkfactor)); */
+ g->bitmap2.w = g->x2 + ROUNDUP((int)((g->bitmap.w / 3.0 + 0.5) - g->x / 3.0), currwin.shrinkfactor);
+ /* fprintf(stderr, "g->bitmap.w: %d\n", g->bitmap2.w); */
+ }
+#else
+ g->bitmap2.w = g->x2 + ROUNDUP((int)g->bitmap.w - g->x, currwin.shrinkfactor);
+#endif
+
+ /* include row zero with the positively numbered rows */
+ row_num = g->y + 1;
+#ifdef DBG_AA
+ fprintf(stderr, "row_num: %d\n", row_num);
+#endif /* DBG_AA */
+ /* g->y2 is the new height of the image: */
+ g->y2 = row_num / currwin.shrinkfactor;
+#ifdef DBG_AA
+ fprintf(stderr, "g->y2: %d\n", g->y2);
+#endif /* DBG_AA */
+ /* in C89 and before, result of division can `truncate towards negative infinity'
+ (i.e., round to the larger digit) for negative quotients, hence we need
+ to test for rows < 0. OTOH, if rows = 0, use currwin.shrinkfactor instead
+ (why?)
+ */
+ if ((rows = row_num - g->y2 * currwin.shrinkfactor) <= 0) {
+ rows += currwin.shrinkfactor;
+ --(g->y2);
+ }
+ g->bitmap2.h = g->y2 + ROUNDUP((int)g->bitmap.h - row_num, currwin.shrinkfactor) + 1;
+
+#if TRACE_AA1
+ if (resource.subpixel_order != SUBPIXEL_NONE) {
+ fprintf(stderr, "\nbitmap.h: %d, bitmap.w: %d\n", g->bitmap2.h, g->bitmap2.w);
+ }
+#endif /* DBG_AA */
+
+ /* allocate pixmap for antialiasing ... */
+ if (g->pixmap2 == NULL) {
+ g->image2 = XCreateImage(DISP, G_visual, G_depth, ZPixmap,
+ 0, (char *)NULL, g->bitmap2.w, g->bitmap2.h,
+ BMBITS, 0);
+ size = g->image2->bytes_per_line * g->bitmap2.h;
+ g->pixmap2 = g->image2->data = xmalloc(size != 0 ? size : 1);
+ }
+ /* ... and the pixmap used for globals.gc.fore2: */
+ if (globals.gc.fore2 != NULL && g->pixmap2_gc2 == NULL) {
+ size = g->image2->bytes_per_line * g->bitmap2.h;
+ g->pixmap2_gc2 = xmalloc(size != 0 ? size : 1);
+ }
+
+#if 0
+ if (resource.subpixel_order != SUBPIXEL_NONE) {
+ fprintf(stderr, "\n============= BITMAP ==============\n");
+ print_bitmap(&g->bitmap);
+ }
+#endif
+
+ unshrunk_ptr = (bmUnitT *)g->bitmap.bits;
+ rows_left = g->bitmap.h;
+ y = 0;
+ /* the basic algorithm is the same as in the nogrey code, with the main
+ exception that the return value of sample() is used. */
+ while (rows_left) {
+#ifdef RGB_ANTI_ALIASING
+ Pixel pixel = 0;
+ Pixel pixel2 = 0;
+#endif
+ x = 0;
+ if (rows > rows_left) /* why - extra safety? */
+ rows = rows_left;
+ cols_left = g->bitmap.w;
+ /* fprintf(stderr, "init_cols: %d\n", init_cols); */
+ cols = init_cols;
+ while (cols_left) {
+ if (cols > cols_left) /* why - extra safety? */
+ cols = cols_left;
+
+ thesample = sample(unshrunk_ptr, g->bitmap.bytes_wide,
+ (int)g->bitmap.w - cols_left, cols, rows);
+
+ /* if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[2] != 0) */
+ /* onoff = thesample >= min_sample ? 0xffffff : 0; */
+ /* else */
+ onoff = pixeltbl[thesample];
+
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_PK) {
+ int c;
+ /* fprintf(stderr, "onoff: %d\n", onoff); */
+ if (onoff > 65536)
+ c = onoff / 65536;
+ else if (onoff > 256)
+ c = onoff / 256;
+ else
+ c = onoff;
+ if (c == 0)
+ fprintf(stdout, ",..");
+ else
+ fprintf(stdout, ",%.2x", c);
+ }
+#endif
+
+#ifdef RGB_ANTI_ALIASING
+ if (resource.subpixel_order != SUBPIXEL_NONE) {
+ int div = x / 3;
+ int rest = x % 3;
+
+ if (resource.subpixel_order == SUBPIXEL_RGB) {
+ if (rest == 0)
+ pixel = onoff & G_visual->red_mask;
+ else if (rest == 1)
+ pixel |= onoff & G_visual->green_mask;
+ else
+ pixel |= onoff & G_visual->blue_mask;
+ }
+ else { /* SUBPIXEL_BGR */
+ if (rest == 0)
+ pixel = onoff & G_visual->blue_mask;
+ else if (rest == 1)
+ pixel |= onoff & G_visual->green_mask;
+ else
+ pixel |= onoff & G_visual->red_mask;
+ }
+
+#if 0 && TRACE_AA1
+ fprintf(stderr, "sample: %ld; row %d, col %d, left %d: 0x%.6lx; pixel: 0x%.6lx at pos %d,%d (x:%d)\n",
+ thesample, rows, cols, cols_left, onoff, pixel, div, y, x);
+#endif /* TRACE_AA */
+ fprintf(stderr, "pixel at %d\n", div);
+ XPutPixel(g->image2, div, y, pixel);
+
+ /* HACK to fix color fringing problem */
+ if (div + 1 < g->bitmap2.w) {
+ fprintf(stderr, "rest pixel at %d\n", div);
+ XPutPixel(g->image2, div + 1, y, 0);
+ }
+ }
+ else {
+#if 0 && TRACE_AA1
+ fprintf(stderr, "sample: %ld; row %d, col %d, left %d: 0x%.6lx at pos %d, %d\n",
+ thesample, rows, cols, cols_left, onoff, x, y);
+#endif /* TRACE_AA */
+ XPutPixel(g->image2, x, y, onoff);
+ }
+#else
+ XPutPixel(g->image2, x, y, onoff);
+#endif /* RGB_ANTI_ALIASING */
+ if (globals.gc.fore2 != NULL) {
+ onoff2 = pixeltbl_gc2[thesample];
+#ifdef RGB_ANTI_ALIASING
+ if (resource.subpixel_order != SUBPIXEL_NONE) {
+ int div = x / 3;
+ int rest = x % 3;
+
+ if (resource.subpixel_order == SUBPIXEL_RGB) {
+ if (rest == 0)
+ pixel2 = onoff2 & G_visual->red_mask;
+ else if (rest == 1)
+ pixel2 |= onoff2 & G_visual->green_mask;
+ else
+ pixel2 |= onoff2 & G_visual->blue_mask;
+ }
+ else { /* SUBPIXEL_BGR */
+ if (rest == 0)
+ pixel2 = onoff2 & G_visual->blue_mask;
+ else if (rest == 1)
+ pixel2 |= onoff2 & G_visual->green_mask;
+ else
+ pixel2 |= onoff2 & G_visual->red_mask;
+ }
+
+ g->image2->data = g->pixmap2_gc2;
+#if TRACE_AA1
+ fprintf(stderr, "fore2 at %d, %d\n", div, y);
+#endif
+ XPutPixel(g->image2, div, y, pixel2);
+ g->image2->data = g->pixmap2;
+ }
+ else {
+#else /* RGB_ANTI_ALIASING */
+ g->image2->data = g->pixmap2_gc2;
+ XPutPixel(g->image2, x, y, onoff2);
+ g->image2->data = g->pixmap2;
+#endif
+#ifdef RGB_ANTI_ALIASING
+ }
+#endif
+ }
+
+#if 0 && TRACE_AA1
+ fprintf(stderr, "subtracting %d from %d: %d\n", cols, cols_left, cols_left - cols);
+#endif
+ cols_left -= cols;
+ cols = currwin.shrinkfactor;
+ x++;
+ }
+ /* advance pointer by the number of rows covered */
+ /* fprintf(stderr, "++: %d; %d, %d\n", rows * g->bitmap.bytes_wide, g->bitmap.bytes_wide, sizeof(bmUnitT)); */
+ unshrunk_ptr += rows * g->bitmap.bytes_wide / sizeof(bmUnitT);
+ /* *((char **)&unshrunk_ptr) += rows * g->bitmap.bytes_wide; */
+ rows_left -= rows;
+ rows = currwin.shrinkfactor;
+ y++;
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_PK)
+ fprintf(stdout, "\n");
+#endif
+ }
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_PK)
+ fprintf(stdout, "\n");
+#endif
+
+#if 0
+ fprintf(stderr, "y: %d, bitmap.h: %d\n", y, (int)g->bitmap2.h);
+#endif /* DBG_AA */
+
+ /* fill remaining rows not covered before (how?) */
+ while (y < (int)g->bitmap2.h) {
+ for (x = 0; x < (int)g->bitmap2.w; x++) {
+ /* int c = *pixeltbl; */
+#if TRACE_AA1
+ fprintf(stderr, "Remaining at %d, %d: 0x%.6lx\n", x, y, *pixeltbl);
+#endif
+ XPutPixel(g->image2, x, y, *pixeltbl);
+ /* if (c == 0) */
+ /* fprintf(stdout, ",.."); */
+ /* else */
+ /* fprintf(stdout, ",%.2x", c); */
+ if (globals.gc.fore2 != NULL) {
+ g->image2->data = g->pixmap2_gc2;
+#if TRACE_AA1
+ fprintf(stderr, "image2 at %d, %d: 0x%.6lx\n", x, y, *pixeltbl_gc2);
+#endif
+ XPutPixel(g->image2, x, y, *pixeltbl_gc2);
+ g->image2->data = g->pixmap2;
+ }
+ }
+ y++;
+ }
+
+#ifdef RGB_ANTI_ALIASING
+ if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[1] != 0)
+ color_filter_image(g);
+ if (resource.subpixel_order != SUBPIXEL_NONE && resource.subpixel_energy[2] != 0)
+ color_filter_image(g);
+#endif
+
+ g->y2 = g->y / currwin.shrinkfactor;
+#if COLOR
+ g->fg = fg_current;
+#endif
+}
+#endif /* GREY */
+
+/*
+ * Find font #n.
+ */
+
+static void
+change_font(unsigned long n)
+{
+ struct tn *tnp;
+
+ if (n < currinf.tn_table_len)
+ currinf.fontp = currinf.tn_table[n];
+ else {
+ currinf.fontp = NULL;
+ for (tnp = currinf.tn_head; tnp != NULL; tnp = tnp->next)
+ if (tnp->TeXnumber == n) {
+ currinf.fontp = tnp->fontp;
+ break;
+ }
+ }
+ if (currinf.fontp == NULL)
+ XDVI_FATAL((stderr, "Non-existent font number %ld", n));
+ if (currinf.fontp->set_char_p == NULL)
+ XDVI_FATAL((stderr, "No procedure to set font %ld, %s", n, currinf.fontp->fontname));
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+}
+
+
+/*
+ * Open a font file.
+ */
+
+void
+open_font_file(struct font *fontp)
+{
+ if (fontp->file == NULL) {
+ fontp->file = XFOPEN(fontp->filename, OPEN_MODE);
+ if (fontp->file == NULL)
+ XDVI_FATAL((stderr, "Couldn't re-locate font file `%s'", fontp->filename));
+ }
+}
+
+/*
+ * Read and return a 0-terminated special string allocated in static memory
+ * (i.e. contents will be overwritten by next call of this function).
+ */
+
+static char *
+read_special(FILE *fp, long nbytes)
+{
+ static char *spcl = NULL;
+ static long spcl_len = -1;
+ char *p;
+
+ if (nbytes > spcl_len) {
+ spcl = xrealloc(spcl, (unsigned)nbytes + 1);
+ spcl_len = nbytes;
+ }
+ p = spcl;
+ for (;;) {
+ int i = currinf.end - currinf.pos;
+
+ if (i > nbytes)
+ i = nbytes;
+ memcpy(p, (char *)currinf.pos, i);
+ currinf.pos += i;
+ p += i;
+ nbytes -= i;
+ if (nbytes == 0)
+ break;
+ (void)xxone(fp);
+ --currinf.pos;
+ }
+ *p = '\0';
+ return spcl;
+}
+
+/*
+ * Table used for scanning. If >= 0, then skip that many bytes.
+ * M1 means end of page, M2 means special, M3 means FNTDEF,
+ * M4 means unrecognizable, and M5 means doesn't belong here.
+ */
+
+#define M1 255
+#define M2 254
+#define M3 253
+#define M4 252
+#define M5 251
+#define MM 251
+
+static ubyte scantable[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* chars 0 - 127 */
+ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, /* SET1,SET2 (128,129) */
+ /* -,-,SETRULE,PUT1,PUT2,-,-,PUTRULE,NOP,BOP (130-139) */
+ M4, M4, 8, 1, 2, M4, M4, 8, 0, 44,
+ M1, 0, 0, 1, 2, 3, 4, 0, 1, 2, /* EOP,PUSH,POP,RIGHT1-4,W0M2 (140-149) */
+ 3, 4, 0, 1, 2, 3, 4, 1, 2, 3, /* W3-4,X0-4,DOWN1-3 (150-159) */
+ 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, /* DOWN4,Y0-4,Z0-3 (160-169) */
+ 4, /* Z4 (170) */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* change font 171 - 234 */
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, M2, /* FNT1-4,XXX1 (235-239) */
+ /* XXX2-4,FNTDEF1-4,PRE,POST,POSTPOST (240-249) */
+ M2, M2, M2, M3, M3, M3, M3, M5, M5, M5,
+ 0, 0, M4, M4, M4, M4
+}; /* SREFL,EREFL,-,-,-,- (250-255) */
+
+/*
+ * This is the generic scanning routine. It assumes that currinf, etc.
+ * are ready to go at the start of the page to be scanned.
+ */
+
+
+
+Boolean
+spcl_scan(Boolean (*spcl_proc)(char *str, int str_len, void *data), void *data, Boolean return_if_found, FILE *fp)
+{
+ ubyte ch;
+ ubyte n;
+ long a;
+
+ for (;;) {
+ ch = xone(fp);
+ /* print_dvi(ch); */
+ n = scantable[ch];
+ if (n < MM)
+ while (n-- != 0)
+ (void)xone(fp);
+ else if (n == M1)
+ break; /* end of page */
+ else
+ switch (n) {
+ case M2: /* special */
+ a = xnum(fp, ch - XXX1 + 1);
+ if (a > 0) {
+ if (spcl_proc(read_special(fp, a), a, data) && return_if_found) {
+ return True;
+ }
+ }
+ break;
+ case M3: /* FNTDEF */
+ xskip(fp, (long)(12 + ch - FNTDEF1 + 1));
+ ch = xone(fp);
+ xskip(fp, (long)ch + (long)xone(fp));
+ break;
+ case M4: /* unrecognizable */
+ XDVI_FATAL((stderr, "unknown op-code %d", ch));
+ break;
+ case M5: /* doesn't belong */
+ dvi_fmt_error("spcl_scan: shouldn't happen: %s encountered",
+ dvi_table2[ch - (FNTNUM0 + 64)]);
+ break;
+ }
+ }
+ return False;
+}
+
+#define xspell_conv(n) spell_conv0(n, current_dimconv)
+
+/*
+ * Prescanning routine for dvi file. This looks for specials like
+ * `header=' and `!'.
+ */
+
+void
+prescan(FILE *fp)
+{
+ if (fp == NULL) {
+ return;
+ }
+
+ TRACE_FILES((stderr, "prescan on %p", (void *)fp));
+
+ (void)lseek(fileno(fp), pageinfo_get_offset(scanned_page + 1), SEEK_SET);
+ G_dvi_buf_ptr = dvi_buffer;
+ currinf.pos = currinf.end = G_dvi_buf_ptr;
+ for (;;) {
+ if (scanned_page == -1) { /* on first page */
+ TRACE_FILES((stderr, "prescan on page 1"));
+ pageinfo_set_page_width(scanned_page + 1, pageinfo_get_page_width(total_pages));
+ pageinfo_set_page_height(scanned_page + 1, pageinfo_get_page_height(total_pages));
+ pageinfo_set_window_width(scanned_page + 1, pageinfo_get_window_width(total_pages));
+ pageinfo_set_window_height(scanned_page + 1, pageinfo_get_window_height(total_pages));
+ }
+ else {
+ TRACE_FILES((stderr, "prescan on page %d", scanned_page));
+ pageinfo_set_page_width(scanned_page + 1, pageinfo_get_page_width(scanned_page));
+ pageinfo_set_page_height(scanned_page + 1, pageinfo_get_page_height(scanned_page));
+ pageinfo_set_window_width(scanned_page + 1, pageinfo_get_window_width(scanned_page));
+ pageinfo_set_window_height(scanned_page + 1, pageinfo_get_window_height(scanned_page));
+ }
+ if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE) {
+ break;
+ }
+ /* NOTE: longjmp(globals.ev.canit) should not be done within
+ read_events(). */
+ htex_prescan_save();
+ htex_prescan_initpage();
+
+ if (!setjmp(globals.ev.canit)) {
+ struct htex_prescan_data data;
+ int pre_depth, depth;
+ data.pageno = scanned_page + 1;
+ data.scan_type = HTEX_ANCHOR_NUM; /* just for the anchor numbers */
+ pre_depth = htex_prescan_get_depth();
+ (void)spcl_scan(scan_special, &data, False, fp);
+
+ depth = htex_prescan_get_depth();
+
+ if (depth > pre_depth) {
+ /* we have a mismatched anchor. We currently don't deal with
+ _nested_ mismatched anchors (ugh), so there's only one
+ anchor string that can be used as info on the next page. */
+ int anchor_num = htex_prescan_get_mismatched_anchor_num(depth);
+ /* scan again to find the anchor string at anchor number `anchor_num' */
+ (void)lseek(fileno(fp), pageinfo_get_offset(scanned_page + 1), SEEK_SET);
+ currinf.pos = currinf.end = G_dvi_buf_ptr;
+ data.anchor_num = anchor_num;
+ data.scan_type = HTEX_ANCHOR_STRING;
+ htex_prescan_reset_firstpass();
+ (void)spcl_scan(scan_special, &data, False, fp);
+ depth = htex_prescan_get_depth();
+ }
+ else if (depth > 0 && scanned_page >= 0) { /* mismatch was on a previous page */
+ htex_prescan_carry_over(scanned_page, scanned_page + 1);
+ }
+ }
+ else { /* if interrupted */
+ htex_prescan_restore(scanned_page + 1);
+#if PS
+ psp.interrupt();
+#endif
+ break;
+ }
+ if (globals.ev.flags & EV_GE_NEWPAGE)
+ break;
+ ++scanned_page;
+#if COLOR
+ if (scanned_page_color < scanned_page) {
+ scan_color_eop();
+ scanned_page_color = scanned_page;
+ }
+#endif
+#if PS
+ if (scanned_page_ps < scanned_page)
+ scanned_page_ps = scanned_page;
+#endif
+ if (scanned_page >= current_page)
+ break;
+ }
+
+#if PS
+ if (!(globals.ev.flags & EV_GE_NEWPAGE))
+ psp.endheader();
+#endif
+}
+
+/*
+ * Routines to print characters.
+ */
+
+setcharRetvalT
+set_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch)
+{
+ struct glyph *g;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar)
+ realloc_font(currinf.fontp, (wide_ubyte)ch);
+ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) {
+ if (g->addr == 0) {
+ if (!resource.hush_chars)
+ XDVI_WARNING((stderr, "Character %d not defined in font %s", ch, currinf.fontp->fontname));
+ g->addr = -1;
+#ifdef TEXXET
+ return;
+#else
+ return 0L;
+#endif
+ }
+ if (g->addr == -1) {
+#ifdef TEXXET
+ return;
+#else
+ return 0L; /* previously flagged missing char */
+#endif
+ }
+#if FREETYPE
+ if (currinf.fontp->ft == NULL) /* if not freetype font */
+#endif
+ {
+ open_font_file(currinf.fontp);
+ fseek(currinf.fontp->file, g->addr, SEEK_SET);
+ }
+ (*currinf.fontp->read_char) (currinf.fontp, ch);
+ if (globals.debug & DBG_BITMAP)
+ print_char((ubyte) ch, g);
+ currinf.fontp->timestamp = ++current_timestamp;
+ }
+
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= g->dvi_adv;
+
+ if (scan_frame == NULL) {
+#endif
+
+#ifdef RGB_ANTI_ALIASING
+ if (currwin.shrinkfactor == -1) {
+ put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y);
+ }
+#ifdef __GNUC__
+#warning TODO: implement horizontal AA at shrink 1
+#endif
+#else
+ if (currwin.shrinkfactor == 1) {
+ put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y);
+ }
+#endif
+ else {
+#ifdef GREY
+ if (resource.use_grey) {
+ if (g->pixmap2 == NULL) {
+#ifdef DBG_AA
+ fprintf(stderr, "shrinking the bitmap!\n");
+#endif /* DBG_AA */
+ /* print_bitmap(&g->bitmap); */
+ shrink_glyph_grey(g);
+ }
+ put_image(g, PXL_H - g->x2, PXL_V - g->y2);
+ }
+ else {
+ if (g->bitmap2.bits == NULL) {
+ shrink_glyph(g);
+ }
+ put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
+ }
+#else
+ if (g->bitmap2.bits == NULL) {
+ shrink_glyph(g);
+ }
+ put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
+#endif
+ }
+#ifdef TEXXET
+ }
+ if (cmd == PUT1 || (resource.omega && cmd == PUT2))
+ DVI_H = dvi_h_sav;
+ else if (currinf.dir > 0)
+ DVI_H += g->dvi_adv;
+ return;
+#else
+ return g->dvi_adv;
+#endif
+}
+
+/*
+ * Routines to print characters.
+ */
+
+static void
+warn_setting_empty_char(void)
+{
+ /* this is probably serious enough for a GUI warning */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ /* helptext */
+ "Xdvi tries all of the following possibilities in turn, and "
+ "all of them have failed:\n\n"
+ " (1) If the resource type1 is set, try a PostScript Type 1 "
+ "version of a font.\n\n"
+ " (2) Otherwise, or if the Type 1 version hasn't been found, "
+ "try to "
+ "locate, or generate via mktexpk, a TeX Pixel (PK) version of "
+ "the font.\n\n"
+ " (3) Use the fallback font defined via the \"altfont\" "
+ "resource (cmr10 by default), "
+ "both as Type 1 and as PK version, at various resolutions.\n\n"
+ "It seems that your font setup is defective.\n",
+ /* errmsg */
+ "Error loading font %s: Neither a Type 1 version nor "
+ "a pixel version could be found. The character(s) "
+ "will be left blank.",
+ currinf.fontp->fontname);
+}
+
+static setcharRetvalT
+set_empty_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch)
+{
+#ifdef TEXXET
+ UNUSED(cmd);
+#endif
+ UNUSED(ch);
+#ifdef TEXXET
+ return;
+#else
+ return 0L;
+#endif
+}
+
+setcharRetvalT
+load_n_set_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch)
+{
+ if (!load_font(currinf.fontp
+#if DELAYED_MKTEXPK
+ , True
+#endif
+ )) { /* if not found */
+ if (globals.ev.flags & EV_GE_NEWDOC) { /* if abort */
+ longjmp(globals.ev.canit, 1);
+ }
+
+ currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char;
+ warn_setting_empty_char();
+
+#ifdef TEXXET
+ return;
+#else
+ return 0L;
+#endif
+ }
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+#ifdef TEXXET
+ (*currinf.set_char_p) (cmd, ch);
+ return;
+#else
+ return (*currinf.set_char_p) (ch);
+#endif
+}
+
+setcharRetvalT
+set_vf_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch)
+{
+ struct macro *m;
+ struct drawinf oldinfo;
+ wide_ubyte oldmaxchar;
+ static ubyte c;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar)
+ realloc_virtual_font(currinf.fontp, ch);
+ if ((m = &currinf.fontp->macro[ch])->pos == NULL) {
+ if (!resource.hush_chars)
+ XDVI_WARNING((stderr, "Character %d not defined in font %s", ch, currinf.fontp->fontname));
+ m->pos = m->end = &c;
+#ifdef TEXXET
+ return;
+#else
+ return 0L;
+#endif
+ }
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= m->dvi_adv;
+ if (scan_frame == NULL) {
+#endif
+ oldinfo = currinf;
+ if (!currinf.virtual)
+ dvi_pointer_frame = &oldinfo;
+ oldmaxchar = maxchar;
+ WW = XX = YY = ZZ = 0;
+ currinf.tn_table_len = VFTABLELEN;
+ currinf.tn_table = currinf.fontp->vf_table;
+ currinf.tn_head = currinf.fontp->vf_chain;
+ currinf.pos = m->pos;
+ currinf.end = m->end;
+ currinf.virtual = currinf.fontp;
+
+ draw_part(globals.dvi_file.bak_fp, current_frame, currinf.fontp->dimconv);
+ if (currinf.pos != currinf.end + 1)
+ dvi_fmt_error("virtual character macro does not end correctly");
+ currinf = oldinfo;
+ if (!currinf.virtual)
+ dvi_pointer_frame = &currinf;
+ maxchar = oldmaxchar;
+#ifdef TEXXET
+ }
+ if (cmd == PUT1 || (resource.omega && cmd == PUT2))
+ DVI_H = dvi_h_sav;
+ else if (currinf.dir > 0)
+ DVI_H += m->dvi_adv;
+ return;
+#else
+ return m->dvi_adv;
+#endif
+}
+
+
+#if FREETYPE
+
+/*
+ * set_ft_char() is used as a set_char routine to handle delayed loading
+ * of freetype fonts. See more details in ft.c.
+ */
+
+static void
+do_load_freetype_font(void)
+{
+ if (!load_ft_font(currinf.fontp)) {
+ /* Revert to non-scalable font */
+ struct ftfont *ftp;
+
+ TRACE_FT((stderr,
+ "Font %s is not loadable; reverting to non-scalable font",
+ currinf.fontp->fontname));
+
+ ftp = currinf.fontp->ft;
+ ftp->t1->bad = True;
+ if (currinf.fontp == ftp->first_size) {
+ if (currinf.fontp->next_size == NULL) {
+ /* if this is the only size of this font face */
+ ftp->t1->ft = NULL;
+ free(ftp);
+ }
+ else {
+ struct font *fontp2;
+
+ ftp->first_size = fontp2 = currinf.fontp->next_size;
+ /*
+ * Opening the file might have succeeded at some other size,
+ * so we need to transfer that information to the next
+ * record in case it was put here.
+ */
+ fontp2->file = currinf.fontp->file;
+ currinf.fontp->file = NULL;
+ fontp2->filename = currinf.fontp->filename;
+ currinf.fontp->filename = NULL;
+ fontp2->timestamp = currinf.fontp->timestamp;
+ }
+ }
+ else {
+ struct font *fontp2;
+
+ fontp2 = ftp->first_size;
+ while (fontp2->next_size != currinf.fontp)
+ fontp2 = fontp2->next_size;
+ fontp2->next_size = currinf.fontp->next_size;
+ }
+ currinf.fontp->ft = NULL;
+ /* The virtual font machinery will take it from here. */
+ /* That will call load_font(), but it won't take us back to the */
+ /* freetype font, because that font will have been marked bad. */
+ currinf.set_char_p = load_n_set_char;
+ }
+ else
+ currinf.set_char_p = currinf.fontp->set_char_p = set_char;
+}
+
+setcharRetvalT
+set_ft_char(
+# if TEXXET
+ wide_ubyte cmd,
+# endif
+ wide_ubyte ch)
+{
+ do_load_freetype_font();
+
+# if !TEXXET
+ return (*currinf.set_char_p)(ch);
+# else
+ (*currinf.set_char_p)(cmd, ch);
+ return;
+# endif
+}
+
+#endif /* FREETYPE */
+
+
+static setcharRetvalT
+set_no_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch)
+{
+ if (currinf.virtual) {
+ currinf.fontp = currinf.virtual->first_font;
+ if (currinf.fontp != NULL) {
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+#ifdef TEXXET
+ (*currinf.set_char_p) (cmd, ch);
+ return;
+#else
+ return (*currinf.set_char_p) (ch);
+#endif
+ }
+ }
+ dvi_fmt_error("set_no_char: attempt to set character of unknown font");
+ exit(0);
+ /* NOTREACHED */
+}
+
+
+/*
+ * Set rule. Arguments are coordinates of lower left corner.
+ */
+
+static void
+set_rule(int h, int w)
+{
+#ifdef TEXXET
+ put_rule(PXL_H - (currinf.dir < 0 ? w - 1 : 0), PXL_V - h + 1,
+ (unsigned int)w, (unsigned int)h);
+#else
+ put_rule(PXL_H, PXL_V - h + 1, (unsigned int)w, (unsigned int)h);
+#endif
+}
+
+
+/*
+ * Interpret a sequence of dvi bytes (either the page from the dvi file,
+ * or a character from a virtual font).
+ */
+
+static void
+draw_part(FILE *fp, struct frame *minframe, double current_dimconv)
+{
+ ubyte ch = 0;
+#ifdef TEXXET
+ struct drawinf oldinfo;
+ wide_ubyte oldmaxchar = 0;
+ off_t file_pos = 0;
+ int refl_count = 0;
+#endif
+ int pause_cnt = 0;
+
+ globals.pausing.flag = False;
+
+ currinf.fontp = NULL;
+ currinf.set_char_p = set_no_char;
+#ifdef TEXXET
+ currinf.dir = 1;
+ scan_frame = NULL; /* indicates we're not scanning */
+#endif
+
+ for (;;) {
+ ch = xone(fp);
+ if (globals.debug & DBG_DVI) {
+ print_dvi(ch);
+ }
+ if (ch <= (ubyte)(SETCHAR0 + 127)) {
+#ifdef TEXXET
+ (*currinf.set_char_p) (ch, ch);
+#else
+ DVI_H += (*currinf.set_char_p) (ch);
+#endif
+ }
+ else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) {
+ change_font((unsigned long)(ch - FNTNUM0));
+ }
+ else {
+ long a, b;
+
+ switch (ch) {
+ case SET1:
+ case PUT1:
+#ifdef TEXXET
+ (*currinf.set_char_p) (ch, xone(fp));
+#else
+ a = (*currinf.set_char_p) (xone(fp));
+ if (ch != PUT1)
+ DVI_H += a;
+#endif
+ break;
+
+ case SET2:
+ case PUT2:
+ if (!resource.omega)
+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
+ __FILE__, __LINE__, ch);
+ else {
+#ifdef TEXXET
+ (*currinf.set_char_p) (ch, xnum(fp, 2));
+#else
+ a = (*currinf.set_char_p) (xnum(fp, 2));
+ if (ch != PUT2)
+ DVI_H += a;
+#endif
+ }
+ break;
+
+ case SETRULE:
+ /* Be careful, dvicopy outputs rules with
+ height = 0x80000000. We don't want any
+ SIGFPE here. */
+ a = xsfour(fp);
+ b = xspell_conv(xsfour(fp));
+ if (a > 0 && b > 0
+#ifdef TEXXET
+ && scan_frame == NULL
+#endif
+ ) {
+ set_rule(pixel_round(xspell_conv(a)), pixel_round(b));
+ }
+ DVI_H += DIR * b;
+ break;
+
+ case PUTRULE:
+ a = xspell_conv(xsfour(fp));
+ b = xspell_conv(xsfour(fp));
+ if (a > 0 && b > 0
+#ifdef TEXXET
+ && scan_frame == NULL
+#endif
+ ) {
+ set_rule(pixel_round(a), pixel_round(b));
+ }
+ break;
+
+ case NOP:
+ break;
+
+ case BOP:
+ xskip(fp, (long)11 * 4);
+ DVI_H = OFFSET_X;
+ DVI_V = OFFSET_Y;
+ PXL_V = pixel_conv(DVI_V);
+ WW = XX = YY = ZZ = 0;
+ break;
+
+ case EOP:
+ if (current_frame != minframe)
+ dvi_fmt_error("%s:%d: draw_part: stack not empty at EOP", __FILE__, __LINE__);
+ return;
+
+ case PUSH:
+ if (current_frame->next == NULL) {
+ struct frame *newp = xmalloc(sizeof *newp);
+
+ current_frame->next = newp;
+ newp->prev = current_frame;
+ newp->next = NULL;
+ }
+ current_frame = current_frame->next;
+ current_frame->data = currinf.data;
+ break;
+
+ case POP:
+ if (current_frame == minframe)
+ dvi_fmt_error("%s:%d: draw_part: more POPs than PUSHes", __FILE__, __LINE__);
+ currinf.data = current_frame->data;
+ current_frame = current_frame->prev;
+ break;
+
+#ifdef TEXXET
+ case SREFL:
+ if (scan_frame == NULL) {
+ /* we're not scanning: save some info. */
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ if (!currinf.virtual)
+ file_pos = xtell(fp, currinf.pos);
+ scan_frame = current_frame; /* now we're scanning */
+ refl_count = 0;
+ break;
+ }
+ /* we are scanning */
+ if (current_frame == scan_frame)
+ ++refl_count;
+ break;
+
+ case EREFL:
+ if (scan_frame != NULL) { /* if we're scanning */
+ if (current_frame == scan_frame && --refl_count < 0) {
+ /* we've hit the end of our scan */
+ scan_frame = NULL;
+ /* first: push */
+ if (current_frame->next == NULL) {
+ struct frame *newp = xmalloc(sizeof *newp);
+
+ current_frame->next = newp;
+ newp->prev = current_frame;
+ newp->next = NULL;
+ }
+ current_frame = current_frame->next;
+ current_frame->data = currinf.data;
+ /* next: restore old file position, XX, etc. */
+ if (!currinf.virtual) {
+ off_t bgn_pos = xtell(fp, G_dvi_buf_ptr);
+
+ if (file_pos >= bgn_pos) {
+ oldinfo.pos = dvi_buffer + (file_pos - bgn_pos);
+ oldinfo.end = currinf.end;
+ }
+ else {
+ (void)lseek(fileno(fp), file_pos, SEEK_SET);
+ oldinfo.pos = oldinfo.end;
+ }
+ }
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+ /* and then: recover position info. */
+ DVI_H = current_frame->data.dvi_h;
+ DVI_V = current_frame->data.dvi_v;
+ PXL_V = current_frame->data.pxl_v;
+ /* and finally, reverse direction */
+ currinf.dir = -currinf.dir;
+ }
+ break;
+ }
+ /* we're not scanning, */
+ /* so just reverse direction and then pop */
+ currinf.dir = -currinf.dir;
+ currinf.data = current_frame->data;
+ current_frame = current_frame->prev;
+ break;
+#endif /* TEXXET */
+
+ case RIGHT1:
+ case RIGHT2:
+ case RIGHT3:
+ case RIGHT4:
+ DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1));
+ break;
+
+ case W1:
+ case W2:
+ case W3:
+ case W4:
+ WW = xspell_conv(xsnum(fp, ch - W0));
+ case W0:
+ DVI_H += DIR * WW;
+ break;
+
+ case X1:
+ case X2:
+ case X3:
+ case X4:
+ XX = xspell_conv(xsnum(fp, ch - X0));
+ case X0:
+ DVI_H += DIR * XX;
+ break;
+
+ case DOWN1:
+ case DOWN2:
+ case DOWN3:
+ case DOWN4:
+ DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1));
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case Y1:
+ case Y2:
+ case Y3:
+ case Y4:
+ YY = xspell_conv(xsnum(fp, ch - Y0));
+ case Y0:
+ DVI_V += YY;
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case Z1:
+ case Z2:
+ case Z3:
+ case Z4:
+ ZZ = xspell_conv(xsnum(fp, ch - Z0));
+ case Z0:
+ DVI_V += ZZ;
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case FNT1:
+ case FNT2:
+ case FNT3:
+ case FNT4:
+ change_font(xnum(fp, ch - FNT1 + 1));
+ break;
+
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ a = xnum(fp, ch - XXX1 + 1);
+ if (a > 0) {
+ char *p = read_special(fp, a);
+ if (resource.pause && strcmp(p, resource.pause_special) == 0) {
+ if (++pause_cnt > globals.pausing.num) {
+ globals.pausing.flag = True;
+ /* can't use longjmp(globals.ev.canit, 1); */
+ return;
+ }
+ }
+ applicationDoSpecial(p, a);
+ }
+ break;
+
+ case FNTDEF1:
+ case FNTDEF2:
+ case FNTDEF3:
+ case FNTDEF4:
+ xskip(fp, (long)(12 + ch - FNTDEF1 + 1));
+ a = (long)xone(fp);
+ xskip(fp, a + (long)xone(fp));
+ break;
+
+#ifndef TEXXET
+ case SREFL:
+ case EREFL:
+#endif
+ case PRE:
+ case POST:
+ case POSTPOST:
+ dvi_fmt_error("%s:%d: draw_part: shouldn't happen: %s encountered",
+ __FILE__, __LINE__, dvi_table2[ch - (FNTNUM0 + 64)]);
+ break;
+
+ default:
+ dvi_fmt_error("%s:%d: draw_part: unknown op-code %d", __FILE__, __LINE__, ch);
+ } /* end switch */
+ } /* end else (ch not a SETCHAR or FNTNUM) */
+ } /* end for */
+}
+
+extern int waiting_for_anchor;
+
+static void
+warn_raw_postscript(void)
+{
+ static int *pagelist = NULL;
+ static int pagelist_size = 0;
+#ifdef PS
+ if (!resource.hush_stdout) {
+ if (total_pages >= pagelist_size) {
+ pagelist_size = total_pages + 1;
+ pagelist = xrealloc(pagelist, pagelist_size * sizeof *pagelist);
+ memset(pagelist, 0, pagelist_size * sizeof *pagelist);
+ }
+
+ ASSERT(pagelist_size > current_page, "pagelist_size too small");
+ if (pagelist[current_page] == 0) {
+ XDVI_WARNING((stderr, "Raw Postscript commands on page %d may be rendered incorrectly.",
+ current_page + 1));
+ pagelist[current_page] = 1;
+ }
+
+ /* too likely to overdraw important information */
+ /* statusline_info(STATUS_MEDIUM, */
+ /* "Warning: Postscript commands on this page may not display correctly."); */
+ }
+#endif /* PS */
+}
+
+void
+draw_page(void)
+{
+#if 0
+ volatile double save_gamma = 0.0;
+#endif /* 0 */
+ /* Check for changes in dvi file. */
+ if (dvi_file_changed()) {
+ return;
+ }
+
+ if (globals.dvi_file.bak_fp == NULL) {
+ return;
+ }
+
+#ifdef PS
+ have_raw_postscript = False;
+#endif
+
+#if COLOR
+ color_bottom = &fg_initial;
+ color_bot_size = 1;
+
+ if (page_colors.stack != NULL && current_page > 0) {
+ color_bottom = page_colors.stack[current_page - 1].colorstack;
+ color_bot_size = page_colors.stack[current_page - 1].stacksize;
+ }
+ rcs_top = NULL;
+ ASSERT(color_bot_size > 0, "color_bot_size mustn't become negative!");
+ ASSERT(color_bottom != NULL, "color_bottom mustn't become negative!");
+ set_fg_color(&color_bottom[color_bot_size - 1]);
+#endif /* COLOR */
+
+#if !FIXED_FLUSHING_PAGING
+ draw_border(-currwin.base_x, -currwin.base_y,
+ ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2,
+ ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2, globals.gc.high);
+#endif /* MOTIF */
+
+ if (resource.grid_mode > 0) { /* grid is wanted */
+ put_grid(-currwin.base_x, -currwin.base_y,
+ /* ROUNDUP(globals.page.unshrunk_w, currwin.shrinkfactor) + 2, */
+ /* ROUNDUP(globals.page.unshrunk_h, currwin.shrinkfactor) + 2, */
+ ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2,
+ ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2,
+ ROUNDUP(globals.grid_paper_unit, currwin.shrinkfactor),
+ globals.gc.high);
+ }
+
+ (void) lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(current_page), SEEK_SET);
+
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+ dvi_pointer_frame = &currinf;
+ drawing_mag = (currwin.win == magnifier.win);
+ psfig_begun = False;
+
+ htex_initpage(False, False, current_page);
+
+ if (currwin.win == mane.win) {
+ XRectangle rect;
+ rect.x = globals.win_expose.min_x;
+ rect.y = globals.win_expose.min_y;
+ rect.width = globals.win_expose.max_x - globals.win_expose.min_x;
+ rect.height = globals.win_expose.max_y - globals.win_expose.min_y;
+ /* fprintf(stderr, "clip: %d, %d, %d, %d\n", */
+ /* globals.win_expose.min_x, */
+ /* globals.win_expose.min_y, */
+ /* globals.win_expose.max_x - globals.win_expose.min_x, */
+ /* globals.win_expose.max_y - globals.win_expose.min_y); */
+#define SET_CLIP(gc) if (gc != NULL) XSetClipRectangles(DISP, gc, 0, 0, &rect, 1, Unsorted)
+#define CLEAR_CLIP(gc) if (gc != NULL) XSetClipMask(DISP, gc, None)
+ /* Set clip masks for all GC's */
+ SET_CLIP(globals.gc.fore);
+ SET_CLIP(globals.gc.fore2);
+ SET_CLIP(globals.gc.fore2_bak);
+ SET_CLIP(globals.gc.fore2_bak1);
+ SET_CLIP(globals.gc.rule);
+ SET_CLIP(globals.gc.high);
+ SET_CLIP(globals.gc.linkcolor);
+ SET_CLIP(globals.gc.copy);
+ }
+
+ if (!setjmp(globals.ev.canit)) {
+ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ ALL GLYPH DRAWING/RULE SETTING COMMANDS THAT MIGHT INVOKE
+ longjmp(globals.ev.canit)
+ MUST GO INSIDE THIS IF CASE, AND MUST NOT BE INVOKED FROM
+ SOMEWHERE ELSE!
+
+ Failure to check whether a command could (indirectly) invoke
+ such a drawing routine (like e.g. put_rule()) will result
+ in *really* strange bugs (see e.g. #616920, and probably also #471021).
+
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ */
+ /* generate an expose event */
+ if (search_have_match(current_page)) {
+ search_erase_highlighting(False);
+ }
+ if (globals.curr_mode == TEXT_MODE_ACTIVE) {
+ text_change_region(TEXT_SEL_ERASE, NULL);
+ }
+ draw_part(globals.dvi_file.bak_fp, current_frame = &frame0, dimconv);
+
+ if (have_raw_postscript) {
+ warn_raw_postscript();
+ }
+ }
+ else {
+ /* If we were interrupted, put the expose event back, so that the
+ * region gets redrawn. The if statement is necessary because the
+ * magnifier may have been destroyed as part of the interrupt. */
+ if (currwin.win == mane.win || currwin.win == magnifier.win) {
+ expose(currwin.win == mane.win ? &mane : &magnifier,
+ globals.win_expose.min_x - currwin.base_x, globals.win_expose.min_y - currwin.base_y,
+ globals.win_expose.max_x - globals.win_expose.min_x, globals.win_expose.max_y - globals.win_expose.min_y);
+ }
+
+#ifdef PS
+ psp.interrupt();
+#endif
+ globals.ev.flags &= ~EV_MAG_GONE;
+#if 0
+ if (search_have_match() && save_gamma != 0.0) {
+ resource.gamma = save_gamma;
+ do_color_change();
+ reset_fonts();
+ }
+#endif /* 0 */
+ }
+
+ drawing_mag = False;
+ dvi_pointer_frame = NULL;
+ if (currwin.win == mane.win) {
+ if (globals.src.fwd_box_page >= 0) {
+ source_fwd_draw_box(); /* draw box showing found source line */
+ }
+ htex_draw_anchormarkers();
+ }
+#ifdef PS
+ psp.endpage();
+#endif
+ if (currwin.win == mane.win && resource.postscript != 1) {
+ display_bboxes();
+ }
+ if (search_have_match(current_page)) {
+ /* highlight search match */
+ search_draw_inverted_regions();
+ }
+ if (currwin.win == mane.win && (globals.curr_mode == TEXT_MODE_ACTIVE)) {
+ /* highlight selection */
+ text_change_region(TEXT_SEL_REDRAW, NULL);
+ }
+ if (globals.curr_mode == RULER_MODE_ACTIVE) {
+ redraw_ruler();
+ }
+
+ clear_bboxes();
+
+ if (currwin.win == mane.win) {
+ CLEAR_CLIP(globals.gc.fore);
+ CLEAR_CLIP(globals.gc.fore2);
+ CLEAR_CLIP(globals.gc.fore2_bak);
+ CLEAR_CLIP(globals.gc.fore2_bak1);
+ CLEAR_CLIP(globals.gc.rule);
+ CLEAR_CLIP(globals.gc.high);
+ CLEAR_CLIP(globals.gc.linkcolor);
+ CLEAR_CLIP(globals.gc.copy);
+ }
+#undef SET_CLIP
+#undef CLEAR_CLIP
+
+ currwin.win = (Window) 0;
+}
+
+/* this sets the file-scope htex_anchor_type to the type of the anchor just scanned,
+ which is used by the drawing routines to determine whether current position is inside
+ an anchor. Called from special.c.
+*/
+void
+htex_do_special(const char *str, size_t len)
+{
+ if (INSIDE_MANE_WIN) {
+ htex_inside_href = htex_scan_anchor(str, len);
+ }
+}
+
+/*
+ * General dvi scanning routines. These are used for:
+ * o source special lookups and
+ * o finding the dimensions of links (if compiling with support for
+ * hypertext specials).
+ * This routine can be a bit slower than draw_page()/draw_part(), since
+ * it is not run that often; that is why it is a separate routine in
+ * spite of much duplication.
+ *
+ * Note that it does not use a separate copy of define_font().
+ */
+
+/*
+ * This set of routines can be called while draw_part() is active,
+ * so the global variables must be separate.
+ */
+
+static struct frame geom_frame0; /* dummy head of list */
+
+#ifdef TEXXET
+static struct frame *geom_scan_frame; /* head frame for scanning */
+#endif
+
+static struct frame *geom_current_frame;
+
+static uint32_t
+get_unicode_char(wide_ubyte ch, struct drawinf currinf, char *retbuf)
+{
+#if FREETYPE
+ /* attempt 1: if it's a Type1 font, get the Adobe character name
+ from FreeType's FT_Get_Glyph_Name */
+ if (currinf.fontp->ft != NULL) {
+ FT_Face face = currinf.fontp->ft->face;
+
+ ASSERT(face != NULL, "Font must have been loaded at this point!");
+ if (FT_Has_PS_Glyph_Names(face)) {
+ char buffer[32]; /* holds longest name in adobe2unicode_table */
+ int index = currinf.fontp->glyph[ch].addr;
+
+ if (index == 0
+ || FT_Get_Glyph_Name(face, index, buffer, sizeof buffer) != 0)
+ TRACE_FIND_VERBOSE((stderr, "T1 char: %d has no name", ch));
+ else {
+ TRACE_FIND_VERBOSE((stderr,
+ "T1 char: %d = `%s' (font: %s; enc: %s)",
+ ch, char_name,
+ currinf.fontp->fontname,
+ currinf.fontp->ft->t1->encname));
+ return adobe2unicode_name(buffer);
+ }
+ }
+ }
+#endif /* FREETYPE */
+ /* attempt 2: try to derive the encoding from the font name,
+ by looking it up in a list of known font names.
+ */
+ return guess_encoding(ch, currinf.fontp->fontname, retbuf);
+}
+
+#define MAX_CHARS 16 /* maximum number of unicode characters that one do_char can produce (rounded up ...) */
+static const size_t ALLOC_STEP = 1024;
+
+/* create a page break at BOP, unless we're at the start of the file */
+static void
+do_newpage(struct scan_info *info)
+{
+ struct word_info *w_info = (struct word_info *)info->data;
+ if (w_info->curr_buf_idx > 0) { /* not at start of file */
+ /* resize buffer if needed */
+ while (w_info->curr_buf_idx + MAX_CHARS >= w_info->txt_buf_size) {
+ w_info->txt_buf_size += ALLOC_STEP;
+ w_info->txt_buf = xrealloc(w_info->txt_buf, w_info->txt_buf_size);
+ }
+ w_info->txt_buf[w_info->curr_buf_idx++] = '\n';
+ }
+}
+
+static void
+reset_bboxes(struct word_info *info)
+{
+ size_t i;
+ for (i = 0; i < info->bboxes_size; i++) {
+ info->bboxes[i].ulx = INT_MAX;
+ info->bboxes[i].uly = INT_MAX;
+ info->bboxes[i].lrx = 0;
+ info->bboxes[i].lry = 0;
+ }
+}
+
+static void
+delete_last_bbox(struct word_info *info)
+{
+ info->bboxes[info->bboxes_idx].ulx = INT_MAX;
+ info->bboxes[info->bboxes_idx].uly = INT_MAX;
+ info->bboxes[info->bboxes_idx].lrx = 0;
+ info->bboxes[info->bboxes_idx].lry = 0;
+}
+
+static void
+finish_bbox(struct word_info *info)
+{
+ /* if (info->bboxes_idx == 0) /\* nothing to do *\/ */
+ /* return; */
+
+ info->bboxes_idx++;
+ while (info->bboxes_idx + 1 > info->bboxes_size) {
+ /* re-allocate info */
+ info->bboxes_size += 32;
+ info->bboxes = xrealloc(info->bboxes, info->bboxes_size * sizeof *(info->bboxes));
+ }
+ info->bboxes[info->bboxes_idx].ulx = INT_MAX;
+ info->bboxes[info->bboxes_idx].uly = INT_MAX;
+ info->bboxes[info->bboxes_idx].lrx = 0;
+ info->bboxes[info->bboxes_idx].lry = 0;
+
+#if 0
+ fprintf(stderr, "========= finish_bbox: index=%d, boxes:\n", info->bboxes_idx);
+ {
+ int i;
+ for (i = 0; i < info->bboxes_idx; i++) {
+ fprintf(stderr, "%d: x %d, y %d, w %d, h %d\n",
+ i, info->bboxes[i].ulx, info->bboxes[i].uly, info->bboxes[i].lrx, info->bboxes[i].lry);
+ }
+ }
+#endif /* 0 */
+}
+
+static void
+create_bbox(struct word_info *info, int x, int y, int w, int h)
+{
+#if 0
+ fprintf(stderr, "++++++++++++++ inside match: %d,%d,%d,%d!\n", x,y,w,h);
+ XDrawRectangle(DISP, mane.win, globals.gc.high,
+ x / (double)currwin.shrinkfactor + 0.5,
+ y / (double)currwin.shrinkfactor + 0.5,
+ w / (double)currwin.shrinkfactor + 0.5,
+ h / (double)currwin.shrinkfactor + 0.5);
+#endif
+ while (info->bboxes_idx + 1 > info->bboxes_size) {
+ /* re-allocate info */
+ size_t old_size = info->bboxes_size;
+ size_t i;
+ info->bboxes_size += 32;
+ info->bboxes = xrealloc(info->bboxes, info->bboxes_size * sizeof *(info->bboxes));
+ for (i = old_size; i < info->bboxes_size; i++) {
+ info->bboxes[i].ulx = INT_MAX;
+ info->bboxes[i].uly = INT_MAX;
+ info->bboxes[i].lrx = 0;
+ info->bboxes[i].lry = 0;
+ }
+
+ }
+ /* adjust size of box */
+ if (x < info->bboxes[info->bboxes_idx].ulx)
+ info->bboxes[info->bboxes_idx].ulx = x;
+ if (y < info->bboxes[info->bboxes_idx].uly)
+ info->bboxes[info->bboxes_idx].uly = y;
+ if (x + w > info->bboxes[info->bboxes_idx].lrx)
+ info->bboxes[info->bboxes_idx].lrx = x + w;
+ if (y + h > info->bboxes[info->bboxes_idx].lry)
+ info->bboxes[info->bboxes_idx].lry = y + h;
+#if 0
+ fprintf(stderr, "dimens: %d, %d, %d, %d\n",
+ info->bboxes[info->bboxes_idx].ulx,
+ info->bboxes[info->bboxes_idx].uly,
+ info->bboxes[info->bboxes_idx].lrx,
+ info->bboxes[info->bboxes_idx].lry);
+ fprintf(stderr, "============ create_bbox: index=%d, boxes:\n", info->bboxes_idx);
+ {
+ int i;
+ for (i = 0; i <= info->bboxes_idx; i++) {
+ fprintf(stderr, "%d: x %d, y %d, w %d, h %d\n",
+ i, info->bboxes[i].ulx, info->bboxes[i].uly, info->bboxes[i].lrx, info->bboxes[i].lry);
+ }
+ }
+#endif /* 0 */
+}
+
+static void
+map_index_positions(const struct search_info *searchinfo,
+ const struct page_mapping *page_mapping,
+ int *from, int *to)
+{
+ *from = searchinfo->from_pos;
+ *to = searchinfo->to_pos;
+
+ if (*from >= page_mapping[0].offset) { /* on second page of scan */
+#if 0
+ fprintf(stderr, "current_page: %d, from: %d, to: %d; subtracting %d for pageinfo at index 0\n",
+ current_page, *from, *to, page_mapping[0].offset);
+#endif /* 0 */
+ if (page_mapping[0].offset != -1) {
+ ASSERT(page_mapping[0].offset != -1, "page_mapping not properly initialized?");
+ (*from) -= page_mapping[0].offset;
+ (*to) -= page_mapping[0].offset;
+ }
+ ASSERT(*from >= 0, "index must be > 0");
+ ASSERT(*to >= 0, "index must be > 0");
+
+ }
+}
+
+/* decrement curr_buf_idx so that the previous character in info
+ * (which might be a multi-byte character) is erased.
+ */
+static void
+erase_prev_char(struct word_info *info)
+{
+ /* erase the hyphen, which might be a multibyte character */
+ if ((unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) < 0x80) { /* single-byte */
+ TRACE_FIND_VERBOSE((stderr, "1 XXX: %d",
+ (unsigned char)(info->txt_buf[info->curr_buf_idx - 1])));
+ info->txt_buf[--(info->curr_buf_idx)] = '\0';
+ }
+ else { /* skip back over multi-byte sequence */
+ while ((unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) >= 0x80
+ && (unsigned char)(info->txt_buf[info->curr_buf_idx - 1]) < 0xC0) { /* 10xxxxxx bytes */
+ TRACE_FIND_VERBOSE((stderr, "2 XXX: %d",
+ (unsigned char)(info->txt_buf[info->curr_buf_idx - 1])));
+ info->txt_buf[--(info->curr_buf_idx)] = '\0';
+ }
+ /* first byte (TODO: sanity check?) */
+ info->txt_buf[--(info->curr_buf_idx)] = '\0';
+ }
+}
+
+
+static Boolean
+inside_text_match(int curr_pos, int from, int to)
+{
+ return from < curr_pos && curr_pos <= to;
+}
+
+static Boolean reinit_scan = False;
+
+void
+reinit_text_scan(void) {
+ reinit_scan = True;
+}
+
+static Boolean
+inside_bbox(int x, int y, int w, int h,
+ struct bbox *bboxes)
+{
+ int mid_x, mid_y;
+#if 0
+ XDrawRectangle(DISP, mane.win, globals.gc.high,
+ x / (double)currwin.shrinkfactor + 0.5,
+ y / (double)currwin.shrinkfactor + 0.5,
+ w / (double)currwin.shrinkfactor + 0.5,
+ h / (double)currwin.shrinkfactor + 0.5);
+#endif
+ /* already treat it as inside if there's an overlap of more than 50% */
+ mid_x = x + w / 2.0;
+ mid_y = y + h / 2.0;
+#if 0
+ fprintf(stderr, "------- check:\n%d, %d\n%d, %d, %d, %d\n",
+ mid_x, mid_y, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry);
+#endif
+ if (bboxes->ulx <= mid_x &&
+ bboxes->uly <= mid_y &&
+ bboxes->lrx >= mid_x &&
+ bboxes->lry >= mid_y) {
+#if 0
+ fprintf(stderr, "====== MATCH:\n%d, %d\n%d, %d, %d, %d\n",
+ mid_x, mid_y, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry);
+#endif
+ return True;
+ }
+ return False;
+}
+
+static Boolean
+inside_bbox_line(int y, int h,
+ struct bbox *bboxes)
+{
+ int mid_y = y + h / 2.0;
+ if (bboxes->uly <= mid_y &&
+ bboxes->lry >= mid_y) {
+#if 0
+ fprintf(stderr, "MATCH:\n%d, %d, %d, %d\n%d, %d, %d, %d\n",
+ x, y, w, h, bboxes->ulx, bboxes->uly, bboxes->lrx, bboxes->lry);
+#endif
+ return True;
+ }
+ return False;
+}
+
+static void
+do_char(wide_ubyte ch,
+ struct drawinf currinf,
+ struct scan_info *info,
+ long pxl_v1, long pxl_v2,
+ long x1, long x2,
+ struct glyph *g)
+{
+ struct word_info *w_info = (struct word_info *)info->data;
+ struct search_settings *settings = NULL;
+ const struct page_mapping *page_mapping = NULL;
+ uint32_t u_glyph = 0, new_glyph = 0;
+ Boolean convert_to_lowercase = False;
+ /* if set to true, ignore whitespace before/after character (for CJK characters) */
+ Boolean ignore_whitespace = False;
+
+ /* default min space between words, in DVI units */
+ /* TODO: for T1 fonts, should we look at fontdimen2 / fontdimen4?
+ (e.g. tfminfo[fontmaps[currinf.fontp->t1id].tfmidx].fontdimen2)
+ */
+ long min_delta = (int)(1.5 * currinf.fontp->pixsize + 0.5) << 16;
+
+ size_t buf_offset = w_info->buffer_offset;
+
+ size_t i;
+ /* for delayed insertion of newlines in text selection mode */
+ static Boolean had_newline = False;
+ /* for whitespace insertion in text selection mode */
+ static Boolean had_chars_in_line = False;
+ static long last_dvi_h1 = 0, last_pxl_v = 0;
+ static long last_dvi_h2 = 0;
+ static long last_x = 0;
+ static uint32_t last_u_glyph = 0;
+ static int last_page = -1;
+ static int page_bak = -1;
+ const char *expanded_lig = NULL;
+ const uint32_t UNKNOWN_GLYPH_CODE = 0x003F; /* question mark */
+ char retbuf[MAX_CHARS];
+ retbuf[0] = '\0';
+
+ if (w_info != NULL && w_info->settings != NULL) {
+ settings = w_info->settings;
+ if (!settings->case_sensitive)
+ convert_to_lowercase = True;
+ }
+
+ if (w_info->bbox_pass) {
+ ASSERT(w_info != NULL, "");
+ ASSERT(w_info->page_mapping != NULL, "");
+ page_mapping = w_info->page_mapping;
+ }
+
+ if (reinit_scan || last_page != current_page) { /* reinit */
+ last_dvi_h1 = last_pxl_v = last_dvi_h2 = last_x = 0;
+ last_page = current_page;
+ last_u_glyph = 0;
+ w_info->bboxes_idx = 0;
+ reset_bboxes(w_info);
+ /* w_info->curr_buf_idx = 0; */
+ reinit_scan = False;
+ had_newline = False;
+ had_chars_in_line = False;
+ }
+
+ /* TRACE_FIND((stderr, "\n--------- POSITIONS: %ld, %ld, %ld, %ld", x1, pxl_v2, x2, y2)); */
+
+ if ((u_glyph = get_unicode_char(ch, currinf, retbuf)) == 0) {
+ if (retbuf[0] == '\0') {
+ TRACE_FIND((stderr, "unknown glyph `%lu'\n", (unsigned long)ch));
+ u_glyph = UNKNOWN_GLYPH_CODE;
+ }
+ else /* several characters in retbuf, will be evaluated later */
+ u_glyph = 0;
+ }
+
+ TRACE_FIND_VERBOSE((stderr, "UNICODE: 0x%.4X; idx: %ld",
+ (unsigned int)u_glyph,
+ (unsigned long)w_info->curr_buf_idx));
+
+ /* resize buffer if needed */
+ while (w_info->curr_buf_idx + MAX_CHARS >= w_info->txt_buf_size) {
+ w_info->txt_buf_size += ALLOC_STEP;
+ w_info->txt_buf = xrealloc(w_info->txt_buf, w_info->txt_buf_size);
+ }
+
+ /* Copy text into buffer, applying heuristics for special glyphs.
+ A `\0' is always appended, so that we have a valid C string;
+ if we have more text, this '\0' will be overwritten in the next call. */
+
+ /* apply accent/linebreak heuristics */
+ /* fprintf(stderr, "Checking: %ld > 0, %ld > 0\n", last_dvi_h1, last_pxl_v); */
+ if (last_dvi_h1 > 0 && last_pxl_v > 0) { /* had at least 1 character */
+ TRACE_FIND_VERBOSE((stderr, "++++ dvi_h: %ld, last_dvi_h1: %ld, w_info->curr_buf_idx: %ld",
+ DVI_H, last_dvi_h1, (unsigned long)w_info->curr_buf_idx));
+
+ /* spaces after/before ideographic characters are ignored */
+ if (is_ideograph(last_u_glyph) || is_ideograph(u_glyph))
+ ignore_whitespace = true;
+
+ /* first, check for linebreaks since accents are also triggered by negative hspace.
+ * Usually, a linebreak is signalled by vertical movement down. However, in multicolumn
+ * mode, it can also be a movement up, which we try to catch with the second condition. */
+ if (pxl_v2 > last_pxl_v + (int)(1.2 * currinf.fontp->pixsize + 0.5)
+ || (page_bak == current_page && pxl_v2 + (int)(6 * currinf.fontp->pixsize + 0.5) < last_pxl_v)) {
+ TRACE_FIND_VERBOSE((stderr, "linebreak (%ld > %ld + %d || %ld < %ld)!\n",
+ pxl_v2, last_pxl_v, (int)(1.2 * currinf.fontp->pixsize + 0.5),
+ pxl_v2 + (int)(6 * currinf.fontp->pixsize + 0.5), last_pxl_v));
+
+ /* remove hyphen followed by newline if ignore_hyphens option is set,
+ and we're scanning for string search: */
+ if ((w_info->search_scan_pass || w_info->bbox_pass)
+ && settings->ignore_hyphens && w_info->curr_buf_idx > 0
+ && is_hyphenchar(last_u_glyph)) {
+
+ erase_prev_char(w_info);
+ TRACE_FIND_VERBOSE((stderr, "%d > %d + %d? offset: %lu",
+ settings->searchinfo->from_pos,
+ (int)w_info->curr_buf_idx,
+ settings->hyphen_delta, (unsigned long)buf_offset));
+ if (!w_info->bbox_pass
+ && settings->searchinfo->from_pos
+ > (int)(w_info->curr_buf_idx + buf_offset + settings->hyphen_delta)) {
+ settings->hyphen_delta += 2;
+ }
+ TRACE_FIND((stderr, "erasing hyphen %lu at pos %lu with char %c; hyphen_delta is: %d",
+ (unsigned long)last_u_glyph, (unsigned long)w_info->curr_buf_idx, ch, settings->hyphen_delta));
+ /* If the position of this hyphen had been at the start of the bounding
+ box, this bounding box info is now invalid - delete it */
+ if (w_info->bbox_pass) {
+ int from, to;
+ map_index_positions(settings->searchinfo, page_mapping, &from, &to);
+ if ((int)w_info->curr_buf_idx == from) {
+ delete_last_bbox(w_info);
+ }
+ }
+ }
+ else { /* ignore_hyphens not set, insert newline */
+ /* Also save hyphen_delta, in case we need to update from_pos and to_pos
+ if user switched from ignore hyphens to don't ignore hyphens */
+ if (w_info->search_scan_pass && !w_info->bbox_pass
+ && is_hyphenchar(last_u_glyph)
+ && settings->searchinfo->from_pos + settings->hyphen_delta
+ >= (int)(w_info->curr_buf_idx + buf_offset)) {
+ settings->hyphen_delta += 2;
+ TRACE_FIND((stderr, "updating delta: %d at pos %d, curr_idx %d, offset: %lu",
+ settings->hyphen_delta, settings->searchinfo->from_pos,
+ (int)w_info->curr_buf_idx, (unsigned long)buf_offset));
+ }
+ if (w_info->text_selection_pass) {
+ if (inside_bbox(last_x, last_pxl_v, 5, 5, w_info->bboxes)
+ || (inside_bbox_line(last_pxl_v, 5, w_info->bboxes))) {
+ had_newline = True;
+ had_chars_in_line = False;
+ }
+ }
+ else if (w_info->search_scan_pass && settings->ignore_linebreaks && !ignore_whitespace)
+ w_info->txt_buf[w_info->curr_buf_idx++] = ' ';
+ else if (!ignore_whitespace)
+ w_info->txt_buf[w_info->curr_buf_idx++] = '\n';
+ }
+ if (w_info->bbox_pass) {
+ int from, to;
+ map_index_positions(settings->searchinfo, page_mapping, &from, &to);
+ if (inside_text_match((int)w_info->curr_buf_idx, from, to)) {
+ finish_bbox(w_info);
+ }
+ }
+ }
+ else if (w_info->curr_buf_idx > 0 && last_u_glyph != 0 && last_x > 0
+ && (!w_info->text_selection_pass
+ || (w_info->text_selection_pass
+ && inside_bbox(last_x, pxl_v2, x1 - last_x, pxl_v1 - pxl_v2, w_info->bboxes)))
+ && x1 < last_x /* overlapping glyphs: check for diacritics */
+ && ((new_glyph = get_accented_glyph(last_u_glyph, u_glyph)) != 0)) {
+ erase_prev_char(w_info);
+ /* use new glyph for next writing operation: */
+ u_glyph = new_glyph;
+ }
+ else if (!ignore_whitespace && last_dvi_h2 > 0 && DVI_H > last_dvi_h2 + min_delta) {
+ TRACE_FIND_VERBOSE((stderr, "space (%ld > %ld + %ld)!", DVI_H, last_dvi_h2, min_delta));
+ if (!w_info->text_selection_pass
+ || (w_info->text_selection_pass
+ && had_chars_in_line
+ && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h, w_info->bboxes))) {
+ w_info->txt_buf[w_info->curr_buf_idx++] = ' ';
+ w_info->txt_buf[w_info->curr_buf_idx] = '\0';
+ if (w_info->bbox_pass) {
+ int from, to;
+ map_index_positions(settings->searchinfo, page_mapping, &from, &to);
+ if (inside_text_match((int)w_info->curr_buf_idx, from, to)) {
+ TRACE_FIND_VERBOSE((stderr, "bounding box for space: %ld, %ld, %ld, %ld",
+ last_x, last_pxl_v, x1 - last_x, pxl_v1 - pxl_v2));
+ create_bbox(w_info, last_x, pxl_v2, x1 - last_x, pxl_v1 - pxl_v2);
+ }
+ }
+ }
+ }
+ }
+
+ last_page = current_page;
+ if (retbuf[0] != '\0'
+ || (expanded_lig = expand_ligature(u_glyph)) != NULL
+ /* when in search pass, normalize more characters */
+ || ((w_info->bbox_pass || w_info->search_scan_pass)
+ && (expanded_lig = search_normalize_chars(u_glyph)) != NULL)) {
+ /* expanded ligature, which is always in 7-bit ASCII -> copy into buffer */
+ size_t len;
+ if (retbuf[0] != '\0')
+ expanded_lig = retbuf;
+ len = strlen(expanded_lig);
+ TRACE_FIND_VERBOSE((stderr, "I: %lu to %lu",
+ (unsigned long)w_info->curr_buf_idx,
+ (unsigned long)(w_info->curr_buf_idx + len)));
+
+ if (!w_info->text_selection_pass
+ || (w_info->text_selection_pass && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h,
+ w_info->bboxes))) {
+
+ /* fprintf(stderr, "inserting1 %s\n", expanded_lig); */
+ if (had_newline) {
+ w_info->txt_buf[w_info->curr_buf_idx++] = '\n';
+ had_newline = False;
+ }
+ memcpy(w_info->txt_buf + w_info->curr_buf_idx, expanded_lig, len);
+ had_chars_in_line = True;
+ for (i = 0; i < len; i++) {
+ w_info->curr_buf_idx++;
+ /* fprintf(stderr, "setting index to: %d\n", w_info->curr_buf_idx); */
+ if (w_info->bbox_pass) {
+ int from, to;
+ map_index_positions(settings->searchinfo, page_mapping, &from, &to);
+ if (inside_text_match((int)w_info->curr_buf_idx, from, to)) {
+ create_bbox(w_info, x1, pxl_v2, x2 - x1, g->bitmap.h);
+ }
+ }
+ }
+ w_info->txt_buf[w_info->curr_buf_idx] = '\0';
+ }
+ }
+ else if (!w_info->text_selection_pass
+ || (w_info->text_selection_pass && inside_bbox(x1, pxl_v2, x2 - x1, g->bitmap.h, w_info->bboxes))) {
+ /* convert to utf8 */
+ char utf8_buf[MAX_CHARS]; /* ample ... */
+ size_t len;
+ /* convert to utf8, eventually lowercasing */
+ ucs4_to_utf8(u_glyph, utf8_buf, &len, convert_to_lowercase);
+ /* fprintf(stderr, "inserting2 %lu\n", u_glyph); */
+ if (had_newline) {
+ w_info->txt_buf[w_info->curr_buf_idx++] = '\n';
+ had_newline = False;
+ }
+ memcpy(w_info->txt_buf + w_info->curr_buf_idx, utf8_buf, len);
+ had_chars_in_line = True;
+ for (i = 0; i < len; i++) {
+ w_info->curr_buf_idx++;
+ /* fprintf(stderr, "setting index2 to: %d\n", w_info->curr_buf_idx); */
+ if (w_info->bbox_pass) {
+ int from, to;
+#if 0
+ int j;
+ fprintf(stderr, "current page_mapping:\n");
+ for (j = 0; j <= total_pages; j++) {
+ fprintf(stderr, "%d: %d\n", j, page_mapping[j]);
+ }
+#endif /* 0 */
+ /* fprintf(stderr, "mapping!\n"); */
+ map_index_positions(settings->searchinfo, page_mapping, &from, &to);
+ if (inside_text_match((int)w_info->curr_buf_idx, from, to)) {
+ create_bbox(w_info, x1, pxl_v2, x2 - x1, g->bitmap.h);
+ }
+ }
+ }
+ w_info->txt_buf[w_info->curr_buf_idx] = '\0'; /* ensure termination */
+ }
+
+ last_dvi_h1 = DVI_H;
+ last_u_glyph = u_glyph;
+ last_pxl_v = pxl_v1;
+ last_dvi_h2 = DVI_H + currinf.fontp->glyph[ch].dvi_adv;
+ last_x = x2;
+}
+
+/* handle a character in the text scanning routine */
+long
+text_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch)
+{
+ if (currinf.set_char_p == set_no_char) {
+ if (currinf.virtual == NULL
+ || (currinf.fontp = currinf.virtual->first_font) == NULL)
+ return 0; /* error; we'll catch it later */
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+ }
+
+ if (currinf.set_char_p == set_empty_char)
+ return 0; /* error; we'll catch it later */
+
+#if FREETYPE
+ if (currinf.set_char_p == set_ft_char)
+ do_load_freetype_font();
+#endif
+
+#if FREETYPE
+ while (currinf.set_char_p == load_n_set_char)
+#else
+ if (currinf.set_char_p == load_n_set_char)
+#endif
+ {
+ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */
+ return 0;
+ if (!load_font(currinf.fontp
+#if DELAYED_MKTEXPK
+ , True
+#endif
+ )) { /* if not found */
+ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */
+ return 0;
+
+ currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char;
+ warn_setting_empty_char();
+ return 0;
+ }
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+#if FREETYPE
+ if (currinf.set_char_p == set_ft_char)
+ do_load_freetype_font();
+#endif
+ }
+
+ if (currinf.set_char_p == set_char) {
+ struct glyph *g;
+ long x, y;
+
+ if (ch > maxchar)
+ return 0; /* catch the error later */
+ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) {
+ if (g->addr == 0)
+ return 0; /* catch the error later */
+ if (g->addr == -1)
+ return 0; /* previously flagged missing char */
+#if FREETYPE
+ if (currinf.fontp->ft == NULL) /* if not freetype font */
+#endif
+ {
+ open_font_file(currinf.fontp);
+ fseek(currinf.fontp->file, g->addr, SEEK_SET);
+ }
+ (*currinf.fontp->read_char) (currinf.fontp, ch);
+ if (globals.debug & DBG_BITMAP)
+ print_char((ubyte) ch, g);
+ currinf.fontp->timestamp = ++current_timestamp;
+ }
+#ifdef TEXXET
+ if (geom_scan_frame == NULL) {
+ long dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= g->dvi_adv;
+#endif
+ x = G_PXL_H - g->x;
+ y = PXL_V - g->y;
+ do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g);
+#ifdef TEXXET
+ DVI_H = dvi_h_sav;
+ }
+#endif
+ return DIR * g->dvi_adv;
+ }
+ else if (currinf.set_char_p == set_vf_char) {
+ struct macro *m;
+ struct drawinf oldinfo;
+ wide_ubyte oldmaxchar;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar)
+ return 0; /* catch the error later */
+ if ((m = &currinf.fontp->macro[ch])->pos == NULL)
+ return 0; /* catch the error later */
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= m->dvi_adv;
+ if (geom_scan_frame == NULL) {
+#endif
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ WW = XX = YY = ZZ = 0;
+ currinf.tn_table_len = VFTABLELEN;
+ currinf.tn_table = currinf.fontp->vf_table;
+ currinf.tn_head = currinf.fontp->vf_chain;
+ currinf.pos = m->pos;
+ currinf.end = m->end;
+ currinf.virtual = currinf.fontp;
+ geom_scan_part(text_do_char, fp, info, geom_current_frame, currinf.fontp->dimconv);
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+#ifdef TEXXET
+ DVI_H = dvi_h_sav;
+ }
+#endif
+ return DIR * m->dvi_adv;
+ }
+ else {
+ XDVI_FATAL((stderr, "currinf.set_char_p is not a registered routine!"));
+ }
+ /* NOTREACHED */
+ return 0;
+}
+
+/*
+ * Handle a character in geometric scanning routine.
+ */
+
+static long
+geom_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch)
+{
+ struct geom_info *g_info = info->data;
+
+ if (currinf.set_char_p == set_no_char) {
+ if (currinf.virtual == NULL
+ || (currinf.fontp = currinf.virtual->first_font) == NULL)
+ return 0; /* error; we'll catch it later */
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+ }
+
+ if (currinf.set_char_p == set_empty_char)
+ return 0; /* error; we'll catch it later */
+
+#if FREETYPE
+ if (currinf.set_char_p == set_ft_char)
+ do_load_freetype_font();
+#endif
+
+#if FREETYPE
+ while (currinf.set_char_p == load_n_set_char)
+#else
+ if (currinf.set_char_p == load_n_set_char)
+#endif
+ {
+ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */
+ return 0;
+ if (!load_font(currinf.fontp
+#if DELAYED_MKTEXPK
+ , True
+#endif
+ )) { /* if not found */
+ if (globals.ev.flags & EV_GE_NEWDOC) /* if abort */
+ return 0;
+
+ currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char;
+ warn_setting_empty_char();
+ return 0;
+ }
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+#if FREETYPE
+ if (currinf.set_char_p == set_ft_char)
+ do_load_freetype_font();
+#endif
+ }
+
+ if (currinf.set_char_p == set_char) {
+ struct glyph *g;
+ long x, y;
+
+ if (ch > maxchar)
+ return 0; /* catch the error later */
+ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) {
+ if (g->addr == 0)
+ return 0; /* catch the error later */
+ if (g->addr == -1)
+ return 0; /* previously flagged missing char */
+#if FREETYPE
+ if (currinf.fontp->ft == NULL) /* if not freetype font */
+#endif
+ {
+ open_font_file(currinf.fontp);
+ fseek(currinf.fontp->file, g->addr, SEEK_SET);
+ }
+ (*currinf.fontp->read_char) (currinf.fontp, ch);
+ if (globals.debug & DBG_BITMAP)
+ print_char((ubyte) ch, g);
+ currinf.fontp->timestamp = ++current_timestamp;
+ }
+#ifdef TEXXET
+ if (geom_scan_frame == NULL) {
+ long dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= g->dvi_adv;
+#endif
+ x = G_PXL_H - g->x;
+ y = PXL_V - g->y;
+ g_info->geom_box(info, x, y,
+ x + g->bitmap.w - 1, y + g->bitmap.h - 1);
+
+#ifdef TEXXET
+ DVI_H = dvi_h_sav;
+ }
+#endif
+ return DIR * g->dvi_adv;
+ }
+ else if (currinf.set_char_p == set_vf_char) {
+ struct macro *m;
+ struct drawinf oldinfo;
+ wide_ubyte oldmaxchar;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar)
+ return 0; /* catch the error later */
+ if ((m = &currinf.fontp->macro[ch])->pos == NULL)
+ return 0; /* catch the error later */
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0)
+ DVI_H -= m->dvi_adv;
+ if (geom_scan_frame == NULL) {
+#endif
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ WW = XX = YY = ZZ = 0;
+ currinf.tn_table_len = VFTABLELEN;
+ currinf.tn_table = currinf.fontp->vf_table;
+ currinf.tn_head = currinf.fontp->vf_chain;
+ currinf.pos = m->pos;
+ currinf.end = m->end;
+ currinf.virtual = currinf.fontp;
+ geom_scan_part(geom_do_char, fp, info, geom_current_frame, currinf.fontp->dimconv);
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+#ifdef TEXXET
+ DVI_H = dvi_h_sav;
+ }
+#endif
+ return DIR * m->dvi_adv;
+ }
+ else {
+ XDVI_FATAL((stderr, "currinf.set_char_p is not a registered routine!"));
+ }
+ /* NOTREACHED */
+ return 0;
+}
+
+/*
+ * Do a rule in the geometry-scanning routine.
+ */
+
+static void
+geom_do_rule(struct scan_info *info, long h, long w)
+{
+ long x, y;
+#ifdef TEXXET
+ long dvi_h_save = DVI_H;
+#endif
+ struct geom_info *g_info = info->data;
+
+#ifdef TEXXET
+ if (currinf.dir < 0)
+ DVI_H -= w - 1;
+#endif
+ x = G_PXL_H;
+ y = PXL_V;
+ g_info->geom_box(info, x, y - xpixel_round(h) + 1,
+ x + xpixel_round(w) - 1, y);
+#ifdef TEXXET
+ DVI_H = dvi_h_save;
+#endif
+}
+
+/*
+ * Geometric dvi scanner work routine. This does most of the work
+ * (a) reading from a page, and (b) executing vf macros.
+ */
+
+void
+geom_scan_part(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte),
+ FILE *fp, struct scan_info *info, struct frame *minframe, double current_dimconv)
+{
+ ubyte ch;
+#ifdef TEXXET
+ struct drawinf oldinfo;
+ wide_ubyte oldmaxchar = 0;
+ off_t file_pos = 0;
+ int refl_count = 0;
+#endif
+
+ currinf.fontp = NULL;
+ currinf.set_char_p = set_no_char;
+#ifdef TEXXET
+ currinf.dir = 1;
+ geom_scan_frame = NULL; /* indicates we're not scanning */
+#endif
+ for (;;) {
+ ch = xone(fp);
+ if (ch <= (ubyte)(SETCHAR0 + 127))
+ DVI_H += char_proc(fp, info, ch);
+ else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) {
+ change_font((unsigned long)(ch - FNTNUM0));
+ }
+ else {
+ long a, b;
+
+ switch (ch) {
+ case SET1:
+ case PUT1:
+ a = char_proc(fp, info, xone(fp));
+ if (ch != PUT1)
+ DVI_H += a;
+ break;
+
+ case SET2:
+ case PUT2:
+ if (!resource.omega)
+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
+ __FILE__, __LINE__, ch);
+ else {
+#ifdef TEXXET
+ char_proc(fp, info, xnum(fp, 2));
+#else
+ a = char_proc(fp, info, xnum(fp, 2));
+ if (ch != PUT2)
+ DVI_H += a;
+#endif
+ }
+ break;
+
+ case SETRULE:
+ /* Be careful, dvicopy outputs rules with
+ height = 0x80000000. We don't want any
+ SIGFPE here. */
+ a = xsfour(fp);
+ b = xspell_conv(xsfour(fp));
+ if (a >= 0 && b >= 0
+#ifdef TEXXET
+ && geom_scan_frame == NULL
+#endif
+ ) {
+ /* is this a geom scan? */
+ if (info->geom_special != NULL)
+ geom_do_rule(info, xspell_conv(a), b);
+ }
+ DVI_H += DIR * b;
+ break;
+
+ case PUTRULE:
+ a = xspell_conv(xsfour(fp));
+ b = xspell_conv(xsfour(fp));
+ if (a >= 0 && b >= 0
+#ifdef TEXXET
+ && geom_scan_frame == NULL
+#endif
+ ) {
+ /* is this a geom scan? */
+ if (info->geom_special != NULL)
+ geom_do_rule(info, a, b);
+ }
+ break;
+
+ case NOP:
+ break;
+
+ case BOP:
+ xskip(fp, (long)11 * 4);
+ DVI_H = G_OFFSET_X;
+ DVI_V = G_OFFSET_Y;
+ PXL_V = xpixel_conv(DVI_V);
+ WW = XX = YY = ZZ = 0;
+ /* create pagebreak in character scan */
+ if (info->geom_special == NULL) {
+ do_newpage(info);
+ }
+ break;
+
+ case PUSH:
+ if (geom_current_frame->next == NULL) {
+ struct frame *newp = xmalloc(sizeof *newp);
+
+ geom_current_frame->next = newp;
+ newp->prev = geom_current_frame;
+ newp->next = NULL;
+ }
+ geom_current_frame = geom_current_frame->next;
+ geom_current_frame->data = currinf.data;
+ break;
+
+ case POP:
+ if (geom_current_frame == minframe)
+ dvi_fmt_error("more POPs than PUSHes");
+ currinf.data = geom_current_frame->data;
+ geom_current_frame = geom_current_frame->prev;
+ break;
+
+#ifdef TEXXET
+ case SREFL:
+ if (geom_scan_frame == NULL) {
+ /* we're not scanning: save some info. */
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ if (!currinf.virtual)
+ file_pos = xtell(fp, currinf.pos);
+ geom_scan_frame = geom_current_frame; /* start scanning */
+ refl_count = 0;
+ break;
+ }
+ /* we are scanning */
+ if (geom_current_frame == geom_scan_frame)
+ ++refl_count;
+ break;
+
+ case EREFL:
+ if (geom_scan_frame != NULL) { /* if we're scanning */
+ if (geom_current_frame == geom_scan_frame
+ && --refl_count < 0) {
+ /* we've hit the end of our scan */
+ geom_scan_frame = NULL;
+ /* first: push */
+ if (geom_current_frame->next == NULL) {
+ struct frame *newp = xmalloc(sizeof *newp);
+
+ geom_current_frame->next = newp;
+ newp->prev = geom_current_frame;
+ newp->next = NULL;
+ }
+ geom_current_frame = geom_current_frame->next;
+ geom_current_frame->data = currinf.data;
+ /* next: restore old file position, XX, etc. */
+ if (!currinf.virtual) {
+ off_t bgn_pos = xtell(fp, G_dvi_buf_ptr);
+
+ if (file_pos >= bgn_pos) {
+ oldinfo.pos = dvi_buffer + (file_pos - bgn_pos);
+ oldinfo.end = currinf.end;
+ }
+ else {
+ (void)lseek(fileno(fp), file_pos,
+ SEEK_SET);
+ oldinfo.pos = oldinfo.end;
+ }
+ }
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+ /* and then: recover position info. */
+ DVI_H = geom_current_frame->data.dvi_h;
+ DVI_V = geom_current_frame->data.dvi_v;
+ PXL_V = geom_current_frame->data.pxl_v;
+ /* and finally, reverse direction */
+ currinf.dir = -currinf.dir;
+ }
+ break;
+ }
+ /* we're not scanning, */
+ /* so just reverse direction and then pop */
+ currinf.dir = -currinf.dir;
+ currinf.data = geom_current_frame->data;
+ geom_current_frame = geom_current_frame->prev;
+ break;
+#endif /* TEXXET */
+
+ case RIGHT1:
+ case RIGHT2:
+ case RIGHT3:
+ case RIGHT4:
+ DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1));
+ break;
+
+ case W1:
+ case W2:
+ case W3:
+ case W4:
+ WW = xspell_conv(xsnum(fp, ch - W0));
+ case W0:
+ DVI_H += DIR * WW;
+ break;
+
+ case X1:
+ case X2:
+ case X3:
+ case X4:
+ XX = xspell_conv(xsnum(fp, ch - X0));
+ case X0:
+ DVI_H += DIR * XX;
+ break;
+
+ case DOWN1:
+ case DOWN2:
+ case DOWN3:
+ case DOWN4:
+ DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1));
+ PXL_V = xpixel_conv(DVI_V);
+ break;
+
+ case Y1:
+ case Y2:
+ case Y3:
+ case Y4:
+ YY = xspell_conv(xsnum(fp, ch - Y0));
+ case Y0:
+ DVI_V += YY;
+ PXL_V = xpixel_conv(DVI_V);
+ break;
+
+ case Z1:
+ case Z2:
+ case Z3:
+ case Z4:
+ ZZ = xspell_conv(xsnum(fp, ch - Z0));
+ case Z0:
+ DVI_V += ZZ;
+ PXL_V = xpixel_conv(DVI_V);
+ break;
+
+ case FNT1:
+ case FNT2:
+ case FNT3:
+ case FNT4:
+ change_font(xnum(fp, ch - FNT1 + 1));
+ break;
+
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ a = xnum(fp, ch - XXX1 + 1);
+ if (a > 0) {
+ char *str = read_special(fp, a);
+
+ /* is this a geom scan? */
+ if (info->geom_special != NULL) {
+ /* process the bounding box */
+ geom_do_special(info, str, current_dimconv);
+ /* process the specials we're looking for */
+ info->geom_special(info, str, a);
+ }
+ }
+ break;
+
+ case FNTDEF1:
+ case FNTDEF2:
+ case FNTDEF3:
+ case FNTDEF4:
+ xskip(fp, (long)(12 + ch - FNTDEF1 + 1));
+ a = (long)xone(fp);
+ xskip(fp, a + (long)xone(fp));
+ break;
+
+#ifndef TEXXET
+ case SREFL:
+ case EREFL:
+#endif
+ case PRE:
+ case POST:
+ case POSTPOST:
+ case EOP:
+ default:
+ return;
+
+ } /* end switch */
+ } /* end else (ch not a SETCHAR or FNTNUM) */
+ } /* end for */
+}
+
+
+/*
+ * Main scanning routine.
+ */
+
+void
+geom_scan(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte),
+ FILE *fp, struct scan_info *info, int pageno)
+{
+ volatile off_t pos_save = 0;
+ struct drawinf currinf_save;
+ ubyte maxchar_save;
+
+#if PS
+ if (info->geom_special != NULL && scanned_page < current_page) {
+ fprintf(stderr, "shouldn't happen: %d >= %d!\n", scanned_page, current_page);
+ return; /* should not happen */
+ }
+#endif
+
+ if (dvi_pointer_frame != NULL)
+ pos_save = lseek(fileno(fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos);
+
+ (void) lseek(fileno(fp), pageinfo_get_offset(pageno), SEEK_SET);
+
+ currinf_save = currinf;
+ maxchar_save = maxchar;
+
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ if (!setjmp(info->done_env)) {
+ geom_scan_part(char_proc, fp, info, geom_current_frame = &geom_frame0, dimconv);
+ }
+
+ maxchar = maxchar_save;
+ currinf = currinf_save;
+
+ if (dvi_pointer_frame != NULL) {
+ (void)lseek(fileno(fp), pos_save, SEEK_SET);
+ dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer;
+ }
+}
+
+
+/*
+ * Routines for source special lookup
+ */
+
+struct src_spec_data {
+ long x, y; /* coordinates we're looking for */
+ unsigned long distance; /* best distance so far */
+ Boolean recent_in_best; /* most recent string == XXX->best */
+ struct src_parsed_special best; /* best special so far */
+ struct src_parsed_special recent; /* most recent special */
+};
+
+void
+src_parse(const char *str, int str_len, struct src_parsed_special *parsed)
+{
+ const char *p = str;
+
+ if (*p >= '0' && *p <= '9') {
+ parsed->line = atoi(p);
+ do {
+ ++p;
+ str_len--;
+ }
+ while (*p >= '0' && *p <= '9');
+ }
+
+ parsed->col = 0;
+ if (*p == ':') {
+ ++p;
+ str_len--;
+ parsed->col = atoi(p);
+ while (*p >= '0' && *p <= '9') {
+ ++p;
+ str_len--;
+ }
+ }
+
+ if (*p == ' ') {
+ ++p;
+ str_len--;
+ }
+
+ if (*p != '\0') {
+ size_t len = str_len + 1;
+
+ if (len > parsed->filename_len) {
+ if (parsed->filename_len != 0)
+ free(parsed->filename);
+ parsed->filename_len = (len & -8) + 64; /* rounding? */
+ parsed->filename = xmalloc(parsed->filename_len);
+ }
+ memcpy(parsed->filename, p, len);
+ }
+}
+
+static void
+src_spec_box(struct scan_info *info, long ulx, long uly, long lrx, long lry)
+{
+ struct geom_info *g_info = (struct geom_info *)info->data;
+ struct src_spec_data *data = g_info->geom_data;
+ unsigned long distance;
+
+ distance = 0;
+
+ if (data->x < ulx)
+ distance += (ulx - data->x) * (ulx - data->x);
+ else if (data->x > lrx)
+ distance += (data->x - lrx) * (data->x - lrx);
+
+ if (data->y < uly)
+ distance += (uly - data->y) * (uly - data->y);
+ else if (data->y > lry)
+ distance += (data->y - lry) * (data->y - lry);
+
+ if (distance < data->distance) {
+ data->distance = distance;
+
+ /* Copy it over */
+ if (!data->recent_in_best) {
+ data->best.line = data->recent.line;
+ data->best.col = data->recent.col;
+ if (data->recent.filename_len != 0) {
+ if (data->best.filename_len < data->recent.filename_len) {
+ if (data->best.filename_len != 0)
+ free(data->best.filename);
+ data->best.filename_len = data->recent.filename_len;
+ data->best.filename = xmalloc(data->best.filename_len);
+ }
+ memcpy(data->best.filename, data->recent.filename,
+ data->recent.filename_len);
+ }
+
+ data->recent_in_best = True;
+ }
+
+ /* Quit early if we've found our glyph. */
+ if (distance == 0 && data->best.filename_len != 0) {
+ longjmp(info->done_env, 1);
+ }
+ }
+}
+
+static void
+src_spec_special(struct scan_info *info, const char *str, int str_len)
+{
+ struct geom_info *g_info = (struct geom_info *)info->data;
+ struct src_spec_data *data = g_info->geom_data;
+
+ if (memcmp(str, "src:", 4) != 0)
+ return;
+
+ src_parse(str + 4, str_len - 4, &data->recent);
+
+ /*
+ * If this is the first special on the page, we may already have
+ * spotted the nearest box.
+ */
+
+ if (data->best.filename_len == 0) {
+ data->best.line = data->recent.line;
+ data->best.col = data->recent.col;
+ if (data->recent.filename_len != 0) {
+ if (data->best.filename_len < data->recent.filename_len) {
+ if (data->best.filename_len != 0)
+ free(data->best.filename);
+ data->best.filename_len = data->recent.filename_len;
+ data->best.filename = xmalloc(data->best.filename_len);
+ }
+ memcpy(data->best.filename, data->recent.filename,
+ data->recent.filename_len);
+
+ data->recent_in_best = True;
+ }
+
+ if (data->distance == 0) {
+ longjmp(info->done_env, 1);
+ }
+ }
+ else
+ data->recent_in_best = False;
+}
+
+/*
+ * Routines for reverse searches on other pages.
+ */
+
+static struct src_parsed_special found;
+/* static jmp_buf scan_env; */
+
+static Boolean
+scan_first_src_spcl(char *str, int str_len, void *data)
+{
+ UNUSED(data);
+ if (memcmp(str, "src:", 4) != 0)
+ return False;
+
+ src_parse(str + 4, str_len - 4, &found);
+
+ return True;
+}
+
+static Boolean
+scan_last_src_spcl(char *str, int str_len, void *data)
+{
+ UNUSED(data);
+ if (memcmp(str, "src:", 4) != 0)
+ return False;
+
+ src_parse(str + 4, str_len - 4, &found);
+
+ return True;
+}
+
+
+static void
+src_spawn_editor(const struct src_parsed_special *parsed)
+{
+ char *expanded_filename;
+ char **argv;
+ const char *p;
+ char *q;
+ int i;
+
+ struct stat buf;
+
+ /* first, determine the editor if necessary */
+ if (resource.editor == NULL || *resource.editor == '\0') {
+ p = getenv("XEDITOR");
+ if (p != NULL)
+ resource.editor = xstrdup(p);
+ else {
+
+ p = getenv("VISUAL");
+ if (p == NULL) {
+ p = getenv("EDITOR");
+ if (p == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ /* help text */
+ "Use the \"-editor\" command-line opion, the X resource "
+ "\"xdvi.editor\" or one of the following environment variables "
+ "to select the editor for source specials: "
+ "\"XEDITOR\", \"VISUAL\" or \"EDITOR\".\n"
+ "See the xdvi man page for more information on source specials "
+ "and the editor options.",
+ /* message */
+ "No custom editor set - using vi as default.");
+ p = "vi";
+ }
+ }
+ q = xmalloc(strlen(p) + 10);
+ memcpy(q, "xterm -e ", 9);
+ strcpy(q + 9, p);
+ resource.editor = q;
+ }
+ }
+
+ /* now try to open the file; find_file allocates space for expanded_filename */
+ if ((expanded_filename = find_file(parsed->filename, &buf, kpse_tex_format)) == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL,
+ "File \"%s\" not found, couldn't jump to special\n\"%s:%d\"\n",
+ parsed->filename, parsed->filename, parsed->line);
+ }
+ else {
+ TRACE_SRC((stderr, "source file \"%s\" expanded to \"%s\"\n", parsed->filename, expanded_filename));
+ if (buf.st_mtime > globals.dvi_file.time) {
+ statusline_info(STATUS_FOREVER,
+ "Warning: TeX file is newer than dvi file - "
+ "source special information might be wrong.");
+ }
+
+ /* this allocates argv */
+ argv = src_format_arguments(get_separated_list(resource.editor, " \t", True),
+ expanded_filename, parsed->line, parsed->col);
+
+ fork_process(argv[0], False, NULL, NULL, NULL, 0, argv);
+
+ free(expanded_filename);
+ for (i = 0; argv[i] != NULL; i++)
+ free(argv[i]);
+ free(argv);
+ }
+}
+
+off_t
+save_file_status(FILE *fp, struct drawinf *currinf_save, ubyte *maxchar_save)
+{
+ off_t pos_save = 0;
+ if (dvi_pointer_frame != NULL)
+ pos_save = lseek(fileno(fp), 0L, SEEK_CUR)
+ - (dvi_pointer_frame->end - dvi_pointer_frame->pos);
+
+ *currinf_save = currinf;
+ *maxchar_save = maxchar;
+ return pos_save;
+}
+
+void
+restore_file_status(FILE *fp, struct drawinf currinf_save, ubyte maxchar_save, off_t pos_save)
+{
+ maxchar = maxchar_save;
+ currinf = currinf_save;
+
+ if (dvi_pointer_frame != NULL) {
+ (void)lseek(fileno(fp), pos_save, SEEK_SET);
+ dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer;
+ }
+}
+
+
+
+/*
+ * The main routine for source specials (reverse search).
+ */
+void
+source_reverse_search(int x, int y, wide_bool call_editor)
+{
+ struct scan_info info;
+ struct geom_info g_info;
+ struct src_spec_data data;
+ struct src_parsed_special *foundp;
+
+ info.geom_special = src_spec_special;
+
+ g_info.geom_box = src_spec_box;
+ g_info.geom_data = &data;
+
+ info.data = &g_info;
+
+ data.x = x;
+ data.y = y;
+ data.distance = 0xffffffff;
+ data.recent_in_best = True;
+ data.best.filename_len = data.recent.filename_len = 0;
+ foundp = &data.best;
+
+ geom_scan(geom_do_char, globals.dvi_file.bak_fp, &info, current_page);
+
+ if (data.best.filename_len == 0) {
+ /*
+ * nothing found on current page;
+ * scan next and previous pages with increasing offset
+ */
+ volatile int upper, lower;
+ volatile off_t pos_save;
+ struct drawinf currinf_save;
+ ubyte maxchar_save;
+
+ /* Save file position */
+ pos_save = save_file_status(globals.dvi_file.bak_fp, &currinf_save, &maxchar_save);
+
+ upper = lower = current_page;
+ found.filename_len = 0; /* mark it as empty */
+ for (;;) {
+ if (++upper < total_pages) {
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(upper), SEEK_SET);
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ if (spcl_scan(scan_first_src_spcl, NULL, True, globals.dvi_file.bak_fp)) {
+ lower = upper;
+ break;
+ }
+ }
+ else if (lower < 0)
+ break;
+
+ if (--lower >= 0) {
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(lower), SEEK_SET);
+
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ (void)spcl_scan(scan_last_src_spcl, NULL, False, globals.dvi_file.bak_fp);
+ if (found.filename_len != 0)
+ break;
+ }
+ }
+
+ if (found.filename_len != 0)
+ statusline_info(STATUS_MEDIUM,
+ "No source specials on this page - nearest on page %d",
+ lower + globals.pageno_correct);
+ else {
+ /* nothing found at all; complain */
+ xdvi_bell();
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ /* helptext */
+ reverse_search_helptext,
+ /* popup */
+ "No source specials in this DVI file - couldn't do reverse search.");
+ }
+
+ /* Restore file status. */
+ restore_file_status(globals.dvi_file.bak_fp, currinf_save, maxchar_save, pos_save);
+
+ foundp = &found;
+ }
+
+ if (data.recent.filename_len != 0)
+ free(data.recent.filename);
+
+ if (foundp->filename_len != 0) {
+ if (call_editor) {
+ src_spawn_editor(foundp);
+ }
+ else {
+ statusline_info(STATUS_MEDIUM, "nearest special at (%d,%d): \"%s:%d\"",
+ x / currwin.shrinkfactor, y / currwin.shrinkfactor, foundp->filename, foundp->line);
+ }
+ free(foundp->filename);
+ }
+}
+
+
+/*
+ * Debug routines for source special display (highlight the first box
+ * after each source special, or highlight each box).
+ */
+
+struct src_spec_show_data {
+ Boolean do_this_one; /* flag set after source special */
+ Boolean do_them_all; /* flag to reset the above to */
+};
+
+static void
+src_spec_show_box(struct scan_info *info, long ulx, long uly, long lrx, long lry)
+{
+ struct geom_info *g_info = (struct geom_info *)info->data;
+ struct src_spec_show_data *data = g_info->geom_data;
+
+ if (data->do_this_one) {
+ long x = ulx / mane.shrinkfactor;
+ long y = uly / mane.shrinkfactor;
+
+ XDrawRectangle(DISP, mane.win, globals.gc.high,
+ x - mane_base_x, y - mane_base_y,
+ lrx / mane.shrinkfactor - x,
+ lry / mane.shrinkfactor - y);
+ data->do_this_one = data->do_them_all;
+ }
+}
+
+static void
+src_spec_show_special(struct scan_info *info, const char *str, int str_len)
+{
+ /* if (memcmp(str, "src:", 4) != 0) */
+ /* return; */
+ struct geom_info *g_info = (struct geom_info *)info->data;
+ UNUSED(str_len);
+ XDVI_INFO((stdout, "special: %s", str));
+ ((struct src_spec_show_data *)g_info->geom_data)->do_this_one = True;
+}
+
+void
+source_special_show(wide_bool do_them_all)
+{
+ struct scan_info info;
+ struct geom_info g_info;
+ struct src_spec_show_data src_data;
+
+ info.geom_special = src_spec_show_special;
+
+ g_info.geom_box = src_spec_show_box;
+ g_info.geom_data = &src_data;
+
+ info.data = &g_info;
+
+ src_data.do_this_one = src_data.do_them_all = do_them_all;
+
+ geom_scan(geom_do_char, globals.dvi_file.bak_fp, &info, current_page);
+}
+
+
+/*
+ * Routines for forward search (look up a source line).
+ *
+ * The general procedure is:
+ * (1) Use spcl_scan() to find the page containing the line (or at
+ * least the closest line). This could be optimized further.
+ * (2) Use geom_scan_part() to find the exact location of the source
+ * special, and the box to highlight.
+ */
+
+/* These variables are referenced by src_scan_special(). */
+
+static int src_this_line;
+static Boolean src_this_file_equal;
+static int src_line;
+static int src_col;
+static const char *src_file;
+static int src_page;
+/* static jmp_buf src_env; */
+static Boolean found_src;
+static unsigned long best_distance;
+static unsigned long best_col_dist;
+static int best_line;
+static int best_page;
+static off_t best_offset;
+static off_t max_offset;
+
+/* Some of the above, plus these below, are used by geom_scan_part(). */
+
+static Boolean src_fwd_active;
+
+#define BBOX_INFO_MAXIDX 8 /* maximum number of bounding boxes */
+
+/* list of bounding boxes */
+struct bbox_info {
+ long min_x, max_x, min_y, max_y;
+ long spcl_min_x, spcl_max_x, spcl_min_y, spcl_max_y;
+} g_bbox_info[BBOX_INFO_MAXIDX];
+
+/* current index in g_bbox_info[] */
+static size_t bbox_info_idx = 0;
+
+static Boolean
+src_scan_special(char *str, int str_len, void *data)
+{
+ char *p;
+ int col = 0;
+ unsigned long distance;
+ unsigned long col_dist;
+
+ UNUSED(data);
+ if (memcmp(str, "src:", 4) != 0)
+ return False;
+
+ found_src = True;
+
+ p = str + 4;
+ str_len -= 4;
+
+ if (*p >= '0' && *p <= '9') {
+ src_this_line = atoi(p);
+ do {
+ ++p;
+ str_len--;
+ }
+ while (*p >= '0' && *p <= '9');
+ }
+
+ if (*p == ':') {
+ ++p;
+ str_len--;
+ col = atoi(p);
+ while (*p >= '0' && *p <= '9') {
+ ++p;
+ str_len--;
+ }
+ }
+
+ if (*p == ' ') {
+ ++p;
+ str_len--;
+ }
+
+ /* src specials might omit the file name when it had already
+ been specified on the page; so skip the test when the
+ special ends right here:
+ */
+ if (*p != '\0') {
+ ASSERT(globals.dvi_file.dirname != NULL, "DVI name should be set here");
+ src_this_file_equal = src_compare(p, str_len, src_file, globals.dvi_file.dirname, globals.dvi_file.dirlen);
+ }
+
+ if (!src_this_file_equal)
+ return False;
+
+ distance = (src_line > src_this_line
+ ? src_line - src_this_line
+ : 2 * (src_this_line - src_line)); /* favor earlier lines */
+
+ if (distance < best_distance) { /* found a better line */
+ best_distance = distance;
+ best_line = src_this_line;
+ best_page = src_page;
+ max_offset = best_offset = xtell(globals.dvi_file.bak_fp, currinf.pos);
+ }
+ else if (distance == best_distance) { /* still on a good line, remember diff */
+ max_offset = xtell(globals.dvi_file.bak_fp, currinf.pos);
+ }
+
+ if (distance == 0 && best_distance == 0) { /* found a better col */
+ col_dist = (src_col > col ? src_col - col : 2 * (col - src_col));
+
+ if (col_dist < best_col_dist) {
+ best_col_dist = col_dist;
+ best_page = src_page;
+ max_offset = best_offset = xtell(globals.dvi_file.bak_fp, currinf.pos);
+ }
+ else if (col_dist == best_col_dist) {
+ max_offset = xtell(globals.dvi_file.bak_fp, currinf.pos);
+ }
+ }
+ return True;
+}
+
+static Boolean
+htex_scan_special(char *str, int str_len, void *data)
+{
+ UNUSED(data);
+
+ if (g_anchor_pos == NULL)
+ return False;
+
+ /* first, hypertex specials */
+ if (memicmp(str, "html:", strlen("html:")) == 0) {
+ size_t offset = strlen("html:");
+ str += offset;
+ str_len -= offset;
+
+ while (*str == ' ' || *str == '\t') {
+ str++;
+ str_len--;
+ }
+
+ if (memicmp(str, "<a name", strlen("<a name")) != 0)
+ return False;
+
+ offset = strlen("<a name");
+ str += offset;
+ str_len -= offset;
+ str_len--; /* for the closing > */
+
+ /* skip over spaces, = and open quotes */
+ while (*str == ' ' || *str == '=') {
+ str++;
+ str_len--;
+ }
+ if (*str == '"') {
+ str++;
+ str_len -= 2; /* don't compare closing quote */
+ }
+
+ /* fprintf(stderr, "comparing: |%s|%s|%d\n", str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)); */
+ if (memcmp(str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)) == 0)
+ return True;
+ else
+ return False;
+ }
+ /* then, hdvips specials */
+ else if (memicmp(str, "ps:", 3) == 0 && g_anchor_pos != NULL) {
+ str += 3;
+ if (memicmp(str, "sdict begin ", strlen("sdict begin ")) == 0) {
+ char *ptr = NULL, *pptr = NULL;
+ str += strlen("sdict begin ");
+ if ((ptr = strstr(str, "/View")) != NULL
+ && (ptr = strchr(ptr, '(')) != NULL
+ && (pptr = strchr(ptr + 1, ')')) != NULL) {
+ if (memcmp(ptr + 1, g_anchor_pos, pptr - ptr - 1) == 0
+ && g_anchor_pos[pptr - ptr - 1] == '\0') {
+ return True;
+ }
+ }
+ }
+ return False;
+ }
+ else {
+ return False;
+ }
+}
+
+static void
+htex_scan_special_noreturn(struct scan_info *info, const char *str, int str_len)
+{
+ struct geom_info *g_info = (struct geom_info *)info->data;
+
+ /* first, hypertex specials */
+ if (memcmp(str, "html:", strlen("html:")) == 0) {
+ size_t offset = strlen("html:");
+ str += offset;
+ str_len -= offset;
+
+ while (*str == ' ' || *str == '\t') {
+ str++;
+ str_len--;
+ }
+
+ if (memicmp(str, "<a name", strlen("<a name")) != 0)
+ return;
+
+ offset = strlen("<a name");
+ str += offset;
+ str_len -= offset;
+ str_len--; /* for the closing > */
+
+ /* skip over spaces, = and open quotes */
+ while (*str == ' ' || *str == '=') {
+ str++;
+ str_len--;
+ }
+ if (*str == '"') {
+ str++;
+ str_len -= 2; /* don't compare closing quote */
+ }
+
+ if (g_anchor_pos != NULL
+ && memcmp(str, g_anchor_pos, MAX((size_t)str_len, g_anchor_len)) == 0) {
+ *((int *)g_info->geom_data) = pixel_conv(DVI_V);
+ longjmp(info->done_env, 1);
+ }
+ }
+ /* then, hdvips specials */
+ else if (memicmp(str, "ps:", 3) == 0 && g_anchor_pos != NULL) {
+ str += 3;
+ if (memicmp(str, "sdict begin ", strlen("sdict begin ")) == 0) {
+ char *ptr = NULL, *pptr = NULL;
+ str += strlen("sdict begin ");
+ if ((ptr = strstr(str, "/View")) != NULL
+ && (ptr = strchr(ptr, '(')) != NULL
+ && (pptr = strchr(ptr + 1, ')')) != NULL) {
+ if (memcmp(ptr + 1, g_anchor_pos, pptr - ptr - 1) == 0
+ && g_anchor_pos[pptr - ptr - 1] == '\0') {
+ *((int *)g_info->geom_data) = pixel_conv(DVI_V);
+ longjmp(info->done_env, 1);
+ }
+ }
+ }
+ }
+}
+
+static void
+src_spec_fwd_box(struct scan_info *info, long ulx, long uly, long lrx, long lry)
+{
+ /* Heuristic value to detect column breaks: A negative vertical
+ offset to the next glyph larger than BBOX_OFF will create a new
+ bounding box. The amount is in unshrunken pixels, i.e. 120
+ \approx 1 Line of 12pt Text. */
+ static const int BBOX_OFF = 360;
+
+ UNUSED(info);
+ if (src_fwd_active) {
+ /* probably a column break, create new box */
+ if (lry < g_bbox_info[bbox_info_idx].max_y - BBOX_OFF
+ && lrx > g_bbox_info[bbox_info_idx].max_x + 50) {
+ if (bbox_info_idx < BBOX_INFO_MAXIDX - 1) {
+ bbox_info_idx++;
+
+ g_bbox_info[bbox_info_idx].min_y = g_bbox_info[bbox_info_idx].min_x = LONG_MAX;
+ g_bbox_info[bbox_info_idx].max_x = g_bbox_info[bbox_info_idx].max_y = 0;
+ }
+ }
+ if (ulx < g_bbox_info[bbox_info_idx].min_x) {
+ g_bbox_info[bbox_info_idx].min_x = ulx;
+ }
+ if (uly < g_bbox_info[bbox_info_idx].min_y) {
+ g_bbox_info[bbox_info_idx].min_y = uly;
+ }
+ if (lrx > g_bbox_info[bbox_info_idx].max_x)
+ g_bbox_info[bbox_info_idx].max_x = lrx;
+ if (lry > g_bbox_info[bbox_info_idx].max_y) {
+ g_bbox_info[bbox_info_idx].max_y = lry;
+ }
+ }
+}
+
+/* dummy procedure for hyperlinks; we don't need geometry info for these. */
+static void
+htex_dummy_box(struct scan_info *info, long ulx, long uly, long lrx, long lry)
+{
+ UNUSED(info);
+ UNUSED(ulx);
+ UNUSED(uly);
+ UNUSED(lrx);
+ UNUSED(lry);
+ return;
+}
+
+static void
+src_spec_fwd_special(struct scan_info *info, const char *str, int str_len)
+{
+ long pos;
+ UNUSED(str_len);
+
+ if (memcmp(str, "src:", 4) != 0) /* if no source special */
+ return;
+
+ pos = xtell(globals.dvi_file.bak_fp, currinf.pos);
+ if (pos >= best_offset)
+ src_fwd_active = True;
+
+ if (src_fwd_active) {
+ if (pos > max_offset)
+ longjmp(info->done_env, 1);
+
+ if (G_PXL_H < g_bbox_info[bbox_info_idx].spcl_min_x)
+ g_bbox_info[bbox_info_idx].spcl_min_x = G_PXL_H;
+ if (G_PXL_H > g_bbox_info[bbox_info_idx].spcl_max_x)
+ g_bbox_info[bbox_info_idx].spcl_max_x = G_PXL_H;
+ if (PXL_V < g_bbox_info[bbox_info_idx].spcl_min_y)
+ g_bbox_info[bbox_info_idx].spcl_min_y = PXL_V;
+ if (PXL_V > g_bbox_info[bbox_info_idx].spcl_max_y)
+ g_bbox_info[bbox_info_idx].spcl_max_y = PXL_V;
+
+ }
+}
+
+/*
+ * Routine to actually draw the box.
+ */
+
+static void
+source_fwd_draw_box(void)
+{
+ if (globals.src.fwd_box_page != current_page) {
+ globals.src.fwd_box_page = -1; /* different page---clear it */
+ }
+ else {
+ size_t i;
+ static const int padding = 15;
+
+ /* fix oversplitting by heuristics, by merging box n with box n+1 if they overlap */
+ for (i = 0; i < bbox_info_idx; i++) {
+ if (g_bbox_info[i].min_x == LONG_MAX)
+ continue;
+ if ((g_bbox_info[i+1].min_x < g_bbox_info[i].max_x
+ && g_bbox_info[i+1].min_y < g_bbox_info[i].max_y) ||
+ (g_bbox_info[i].min_x < g_bbox_info[i+1].max_x
+ && g_bbox_info[i].min_y < g_bbox_info[i+1].max_y)) { /* overlap */
+ g_bbox_info[i].min_x = MIN(g_bbox_info[i].min_x, g_bbox_info[i+1].min_x);
+ g_bbox_info[i].min_y = MIN(g_bbox_info[i].min_y, g_bbox_info[i+1].min_y);
+ g_bbox_info[i].max_x = MAX(g_bbox_info[i].max_x, g_bbox_info[i+1].max_x);
+ g_bbox_info[i].max_y = MAX(g_bbox_info[i].max_y, g_bbox_info[i+1].max_y);
+ bbox_info_idx--;
+ }
+ }
+
+ for (i = 0; i <= bbox_info_idx; i++) {
+ int min_x, min_y, max_x, max_y;
+
+ volatile XPoint ul, ur, ll, lr;
+
+ if (g_bbox_info[i].min_x == LONG_MAX) {
+ /* If no glyphs or rules, use hot point of special instead. */
+ g_bbox_info[i].min_x = g_bbox_info[i].spcl_min_x;
+ g_bbox_info[i].min_y = g_bbox_info[i].spcl_min_y;
+ g_bbox_info[i].max_x = g_bbox_info[i].spcl_max_x;
+ g_bbox_info[i].max_y = g_bbox_info[i].spcl_max_y;
+ }
+
+ min_x = (g_bbox_info[i].min_x - padding) / mane.shrinkfactor - mane_base_x;
+ min_y = (g_bbox_info[i].min_y - padding) / mane.shrinkfactor - mane_base_y;
+ max_x = (g_bbox_info[i].max_x + padding) / mane.shrinkfactor - mane_base_x;
+ max_y = (g_bbox_info[i].max_y + padding) / mane.shrinkfactor - mane_base_y;
+
+ ul.x = min_x;
+ ul.y = min_y;
+
+ ur.x = max_x;
+ ur.y = min_y;
+
+ ll.x = min_x;
+ ll.y = max_y;
+
+ lr.x = max_x;
+ lr.y = max_y;
+
+ if (i == 0 && bbox_info_idx == 0) { /* only 1 bounding box */
+ /* (2009-08-23) XDrawRectangle is broken in some X
+ implementations (see sourceforge bug #2841005),
+ so use XDrawLines instead
+ XDrawRectangle(DISP, mane.win, globals.gc.high,
+ min_x, min_y, max_x - min_x, max_y - min_y);
+ */
+ XPoint points[5];
+ points[0] = ll;
+ points[1] = ul;
+ points[2] = ur;
+ points[3] = lr;
+ points[4] = ll;
+ XDrawLines(DISP, mane.win, globals.gc.high, points, 5, CoordModeOrigin);
+ }
+ else if (i == 0) { /* draw first bbox with open bottom */
+ XPoint points[4];
+ points[0] = ll;
+ points[1] = ul;
+ points[2] = ur;
+ points[3] = lr;
+ XDrawLines(DISP, mane.win, globals.gc.high, points, 4, CoordModeOrigin);
+ }
+ else if (i > 0 && i < bbox_info_idx) { /* draw middle box with open top and open bottom */
+ XPoint points[2];
+ points[0] = ul;
+ points[1] = ll;
+ XDrawLines(DISP, mane.win, globals.gc.high, points, 2, CoordModeOrigin);
+ points[0] = ur;
+ points[1] = lr;
+ XDrawLines(DISP, mane.win, globals.gc.high, points, 2, CoordModeOrigin);
+ }
+ else { /* draw last box with open top */
+ XPoint points[4];
+ points[0] = ul;
+ points[1] = ll;
+ points[2] = lr;
+ points[3] = ur;
+ XDrawLines(DISP, mane.win, globals.gc.high, points, 4, CoordModeOrigin);
+ }
+ }
+ }
+}
+
+#if 0
+#include<asm/msr.h>
+unsigned long time_start=0, time_end=0;
+#endif
+
+void
+source_forward_search(const char *str)
+{
+ volatile off_t pos_save = 0;
+ struct drawinf currinf_save;
+ ubyte maxchar_save;
+ struct scan_info info;
+ struct geom_info g_info;
+
+ TRACE_CLIENT((stderr, "Entering source_forward_search(%s)", str));
+
+ max_offset = 0;
+ src_file = str;
+ while (*src_file == '0')
+ ++src_file;
+ if (*src_file < '1' || *src_file > '9') {
+ XDVI_WARNING((stderr, "Ignoring malformed source special \"%s\"", str));
+ return;
+ }
+ src_line = atoi(src_file);
+ while (*src_file >= '0' && *src_file <= '9')
+ ++src_file;
+
+ src_col = 0;
+ if (*src_file == ':') {
+ ++src_file;
+ src_col = atoi(src_file);
+ while (*src_file >= '0' && *src_file <= '9')
+ ++src_file;
+ }
+
+ if (*src_file == ' ')
+ ++src_file;
+
+ TRACE_CLIENT((stderr, "File = \"%s\", line = %d, col = %d", src_file, src_line, src_col));
+
+ /* Save status of dvi_file reading (in case we hit an error and resume
+ drawing). */
+
+ if (dvi_pointer_frame != NULL)
+ pos_save = lseek(fileno(globals.dvi_file.bak_fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos);
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(0), SEEK_SET);
+
+ currinf_save = currinf;
+ maxchar_save = maxchar;
+
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ /* Start search over pages */
+#if 0
+ rdtscl(time_start);
+#endif
+
+ found_src = False;
+ best_distance = best_col_dist = ULONG_MAX;
+ src_this_line = 0; /* initialize things that are kept as defaults */
+ src_this_file_equal = False;
+
+ /* These two lines do the actual scanning (first pass). */
+ for (src_page = 0; src_page < total_pages; ++src_page)
+ (void)spcl_scan(src_scan_special, NULL, False, globals.dvi_file.bak_fp);
+
+ if (best_distance == ULONG_MAX) {
+ if (!found_src) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ /* helptext */
+ reverse_search_helptext,
+ /* popup */
+ "No source specials in this DVI file - couldn't do reverse search.");
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ /* helptext */
+ "To enable reverse search, the TeX file has to be compiled with source specials. "
+ "See the xdvi man page (section SOURCE SPECIALS) for details.",
+ /* popup */
+ "No references to source file \"%s\" in DVI file.",
+ src_file);
+ }
+
+ /* Restore file position. */
+ maxchar = maxchar_save;
+ currinf = currinf_save;
+
+ if (dvi_pointer_frame != NULL) {
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pos_save, SEEK_SET);
+ dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer;
+ }
+
+ return;
+ }
+ TRACE_CLIENT((stderr, "Match: line %d on page %d, offset %lu",
+ best_line, best_page + globals.pageno_correct, (unsigned long)best_offset));
+
+ /*
+ * In this case we don't need to restore maxchar and currinf, since
+ * we won't resume drawing -- we'll jump to a new page instead.
+ */
+
+ /* Move to that page. */
+ goto_page(best_page, resource.keep_flag ? NULL : home, False);
+ page_history_insert(best_page);
+ globals.ev.flags |= EV_NEWPAGE; /* so that existing mark gets erased */
+ /* Now search that particular page. */
+
+ info.geom_special = src_spec_fwd_special;
+
+ g_info.geom_box = src_spec_fwd_box;
+ g_info.geom_data = NULL;
+
+ src_fwd_active = False;
+ bbox_info_idx = 0;
+
+ g_bbox_info[bbox_info_idx].min_x =
+ g_bbox_info[bbox_info_idx].min_y =
+ g_bbox_info[bbox_info_idx].spcl_min_x =
+ g_bbox_info[bbox_info_idx].spcl_min_y = LONG_MAX;
+ g_bbox_info[bbox_info_idx].max_x =
+ g_bbox_info[bbox_info_idx].max_y =
+ g_bbox_info[bbox_info_idx].spcl_max_x =
+ g_bbox_info[bbox_info_idx].spcl_max_y = 0;
+ globals.src.fwd_box_page = -1; /* in case of error, suppress box */
+
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(best_page), SEEK_SET);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ info.data = &g_info;
+
+ if (!setjmp(info.done_env))
+ geom_scan_part(geom_do_char, globals.dvi_file.bak_fp, &info, geom_current_frame = &geom_frame0, dimconv);
+
+ if (!src_fwd_active) {
+ XDVI_ERROR((stderr, "%s:%d: shouldn't happen: geom_scan_part() failed to re-find the special.", __FILE__, __LINE__));
+ }
+ else {
+ long x_min = g_bbox_info[bbox_info_idx].min_x;
+ long y_min = g_bbox_info[bbox_info_idx].min_y;
+ long x_max = g_bbox_info[bbox_info_idx].max_x;
+ long y_max = g_bbox_info[bbox_info_idx].max_y;
+ do_autoscroll = True;
+ globals.src.fwd_box_page = current_page;
+ if (x_min == LONG_MAX || x_max == LONG_MAX) {
+ /* If no glyphs or rules, use hot point of special instead. */
+ x_min = g_bbox_info[bbox_info_idx].spcl_min_x;
+ y_min = g_bbox_info[bbox_info_idx].spcl_min_y;
+ x_max = g_bbox_info[bbox_info_idx].spcl_max_x;
+ y_max = g_bbox_info[bbox_info_idx].spcl_max_y;
+ }
+ scroll_page_if_needed((int)(x_min / currwin.shrinkfactor) + 2, (int)(x_max / currwin.shrinkfactor) - 2,
+ (int)(y_min / currwin.shrinkfactor) + 10, (int)(y_max / currwin.shrinkfactor) - 10);
+ }
+#if 0
+ rdtscl(time_end);
+ printf("time search: %lu\n", time_end - time_start);
+#endif
+}
+
+
+void
+anchor_search(const char *str)
+{
+ off_t pos_save = 0;
+ struct drawinf currinf_save;
+ ubyte maxchar_save;
+ volatile int test_page = 0;
+ Boolean found_anchor = False;
+ int y_pos = -1;
+ struct scan_info info;
+ struct geom_info g_info;
+
+ ASSERT(str != NULL, "Argument to anchor_search() musn't be NULL");
+ TRACE_HTEX((stderr, "Entering anchor_search(%s)", str));
+
+ /* Save status of dvi_file reading (in case we hit an error and resume drawing). */
+ if (dvi_pointer_frame != NULL)
+ pos_save = lseek(fileno(globals.dvi_file.bak_fp), 0L, SEEK_CUR) - (dvi_pointer_frame->end - dvi_pointer_frame->pos);
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(0), SEEK_SET);
+
+ currinf_save = currinf;
+ maxchar_save = maxchar;
+
+ memset((char *)&currinf.data, '\0', sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ /* Start search over pages */
+ for (test_page = 0; test_page < total_pages; test_page++) {
+ if (spcl_scan(htex_scan_special, NULL, True, globals.dvi_file.bak_fp)) {
+ TRACE_HTEX((stderr, "Found anchor on page %d", test_page));
+ found_anchor = True;
+ break;
+ }
+ }
+
+ if (!found_anchor) {
+ TRACE_HTEX((stderr, "Anchor not found"));
+ /* Restore file position. */
+ maxchar = maxchar_save;
+ currinf = currinf_save;
+
+ if (dvi_pointer_frame != NULL) {
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pos_save, SEEK_SET);
+ dvi_pointer_frame->pos = dvi_pointer_frame->end = dvi_buffer;
+ }
+ xdvi_bell();
+ statusline_error(STATUS_MEDIUM, "Error: Anchor \"%s\" not found.", str);
+ return;
+ }
+
+ /*
+ * In this case we don't need to restore maxchar and currinf, since
+ * we won't resume drawing -- we'll jump to a new page instead.
+ */
+
+ /* Move to that page. */
+ (void)lseek(fileno(globals.dvi_file.bak_fp), pageinfo_get_offset(test_page), SEEK_SET);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+
+ info.geom_special = htex_scan_special_noreturn;
+
+ g_info.geom_box = htex_dummy_box;
+ g_info.geom_data = &y_pos;
+
+ info.data = &g_info;
+
+ if (!setjmp(info.done_env))
+ geom_scan_part(geom_do_char, globals.dvi_file.bak_fp, &info, geom_current_frame = &geom_frame0, dimconv);
+
+ if (y_pos == -1) { /* not found */
+ XDVI_ERROR((stderr, "%s:%d: shouldn't happen: geom_scan_part() failed to re-find the link.", __FILE__, __LINE__));
+ }
+ else {
+ goto_page(test_page, resource.keep_flag ? NULL : home, False);
+ page_history_insert(test_page);
+ do_autoscroll = True;
+ TRACE_HTEX((stderr, "Found anchor on position %d", y_pos));
+ htex_set_anchormarker(y_pos);
+ }
+ /* reset info */
+ free(g_anchor_pos);
+ g_anchor_pos = NULL;
+ g_anchor_len = 0;
+}
+
+
+#if GREY
+
+extern double pow();
+
+static void
+mask_shifts(Pixel mask, int *pshift1, int *pshift2)
+{
+ int k, l;
+
+ for (k = 0; (mask & 1) == 0; ++k)
+ mask >>= 1;
+ for (l = 0; (mask & 1) == 1; ++l)
+ mask >>= 1;
+ *pshift1 = sizeof(short) * 8 - l;
+ *pshift2 = k;
+}
+
+/*
+ * Try to allocate 4 color planes for 16 colors (for GXor drawing).
+ * Not called if the visual type is TrueColor.
+ * When color specials are active, this is called exactly once.
+ * It is used for the first foreground/background pair displayed in
+ * the document. For other documents, we act as if this call had failed.
+ */
+
+
+void
+init_plane_masks(void)
+{
+ Pixel pixel;
+
+ if (globals.gc.do_copy || plane_masks[0] != 0)
+ return;
+
+ if (XAllocColorCells(DISP, G_colormap, False, plane_masks, 4, &pixel, 1)) {
+ /* Make sure fore_Pixel and back_Pixel are a part of the palette */
+ resource.back_Pixel = pixel;
+ resource.fore_Pixel = pixel | plane_masks[0] | plane_masks[1]
+ | plane_masks[2] | plane_masks[3];
+ if (mane.win != (Window) 0)
+ XSetWindowBackground(DISP, mane.win, resource.back_Pixel);
+ }
+ else {
+ globals.gc.do_copy = True;
+ warn_overstrike();
+ }
+}
+
+#endif /* GREY */
+
+#if COLOR
+
+/*
+ * Insert into list of colors to be freed upon opening new document.
+ */
+
+static void
+color_list_insert(Pixel pixel)
+{
+ if (color_list_len >= color_list_max) {
+ if (color_list_max == 0)
+ color_list = xmalloc((color_list_max += 16) * sizeof *color_list);
+ else
+ color_list = xrealloc(color_list,
+ (color_list_max += 16) * sizeof *color_list);
+ }
+ color_list[color_list_len++] = pixel;
+}
+
+
+/*
+ * Warn about colors not being correct.
+ */
+
+static void
+color_warn(void)
+{
+ if (!color_warned) {
+ color_warned = True;
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ /* helptext */
+ "Either this document is using too many "
+ "colors, or some other application is. "
+ "In the latter case, try to close that "
+ "application and re-read the DVI file.",
+ /* msg */
+ "Cannot allocate colormap entry, "
+ "displayed colors will not be exact.");
+ }
+}
+
+
+/*
+ * Allocate a color and add it to our list of pixels to be returned
+ * upon opening a new document.
+ */
+
+#define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2))
+
+static int shift1_r, shift1_g, shift1_b;
+static int shift2_r, shift2_g, shift2_b;
+static Boolean shifts_good = False;
+
+Pixel
+alloc_color(const struct rgb *colorp, Pixel fallback_pixel)
+{
+ XColor xcol;
+
+ if (G_visual->class == TrueColor) {
+ if (!shifts_good) {
+ mask_shifts(G_visual->red_mask, &shift1_r, &shift2_r);
+ mask_shifts(G_visual->green_mask, &shift1_g, &shift2_g);
+ mask_shifts(G_visual->blue_mask, &shift1_b, &shift2_b);
+ shifts_good = True;
+ }
+ return SHIFTIFY(colorp->r, shift1_r, shift2_r)
+ | SHIFTIFY(colorp->g, shift1_g, shift2_g)
+ | SHIFTIFY(colorp->b, shift1_b, shift2_b);
+ }
+ else {
+ xcol.red = colorp->r;
+ xcol.green = colorp->g;
+ xcol.blue = colorp->b;
+ xcol.flags = DoRed | DoGreen | DoBlue;
+ if (XAllocColor(DISP, G_colormap, &xcol)) {
+ color_list_insert(xcol.pixel);
+ if (globals.debug & DBG_DVI)
+ printf("alloc_color%6d%6d%6d --> %ld\n",
+ xcol.red, xcol.green, xcol.blue, xcol.pixel);
+ return xcol.pixel;
+ }
+ else {
+ if (globals.debug & DBG_DVI)
+ printf("alloc_color%6d%6d%6d --> failed\n",
+ xcol.red, xcol.green, xcol.blue);
+ color_warn();
+ return fallback_pixel;
+ }
+ }
+}
+
+#undef SHIFTIFY
+
+
+/*
+ * Switch colors of GCs, etc. Called when we're about to use a GC.
+ */
+
+void
+do_color_change(void)
+{
+ static int shrink_allocated_for = 0;
+ Pixel set_bits;
+ Pixel clr_bits;
+
+ ASSERT(fg_current != NULL, "Current foreground mustn't be NULL");
+ ASSERT(bg_current != NULL, "Current background mustn't be NULL");
+#if GREY
+ if (resource.use_grey) {
+ if (G_visual->class == TrueColor) {
+ if (!fg_current->pixel_good) {
+ fg_current->pixel = alloc_color(&fg_current->color,
+ color_data[0].pixel);
+ fg_current->pixel_good = True;
+ }
+
+ set_bits = fg_current->pixel & ~bg_current->pixel;
+ clr_bits = bg_current->pixel & ~fg_current->pixel;
+
+ if (set_bits & G_visual->red_mask)
+ set_bits |= G_visual->red_mask;
+ if (clr_bits & G_visual->red_mask)
+ clr_bits |= G_visual->red_mask;
+ if (set_bits & G_visual->green_mask)
+ set_bits |= G_visual->green_mask;
+ if (clr_bits & G_visual->green_mask)
+ clr_bits |= G_visual->green_mask;
+ if (set_bits & G_visual->blue_mask)
+ set_bits |= G_visual->blue_mask;
+ if (clr_bits & G_visual->blue_mask)
+ clr_bits |= G_visual->blue_mask;
+
+ /*
+ * Make the GCs
+ */
+
+ globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->pixel, bg_current->pixel);
+ globals.gc.fore2 = NULL;
+
+ if (resource.copy
+ || (set_bits && clr_bits && !resource.thorough)) {
+ if (!resource.copy) {
+ warn_overstrike();
+ }
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->pixel, bg_current->pixel);
+ }
+ else {
+ if (set_bits) {
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, fg_current->pixel & set_bits, 0);
+ if (clr_bits) {
+ globals.gc.fore2 = globals.gc.fore2_bak = set_or_make_gc(globals.gc.fore2_bak, GXandInverted,
+ ~fg_current->pixel & clr_bits, 0);
+ }
+ }
+ else {
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXandInverted,
+ ~fg_current->pixel & clr_bits, 0);
+ }
+ }
+
+ if (globals.debug & DBG_DVI)
+ printf("do_color_change: fg = %lx, bg = %lx, with%s globals.gc.fore2\n",
+ fg_current->pixel, bg_current->pixel,
+ globals.gc.fore2 == NULL ? "out" : "");
+
+ if (mane.shrinkfactor > 1) {
+ unsigned int i;
+ unsigned int sf_squared;
+
+ sf_squared = mane.shrinkfactor * mane.shrinkfactor;
+
+ if (shrink_allocated_for < mane.shrinkfactor) {
+ if (pixeltbl != NULL) {
+ free((char *) pixeltbl);
+ if (pixeltbl_gc2 != NULL) {
+ free((char *) pixeltbl_gc2);
+ pixeltbl_gc2 = NULL;
+ }
+ }
+ pixeltbl = xmalloc((sf_squared + 1) * sizeof *pixeltbl);
+ shrink_allocated_for = mane.shrinkfactor;
+ }
+ if (globals.gc.fore2 != NULL && pixeltbl_gc2 == NULL) {
+ /* Can't use sf_squared (or mane.shrinkfactor) here */
+ pixeltbl_gc2 = xmalloc((shrink_allocated_for * shrink_allocated_for + 1) * sizeof *pixeltbl_gc2);
+ }
+
+ /*
+ * Initialize the pixel lookup table according to the gamma values.
+ */
+#define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2))
+
+ for (i = 0; i <= sf_squared; ++i) {
+ double frac = resource.gamma > 0
+ ? pow((double)i / sf_squared, 1 / resource.gamma)
+ : 1 - pow((double) (sf_squared - i) / sf_squared, -resource.gamma);
+ unsigned int red, green, blue;
+ Pixel pixel;
+ /* fprintf(stderr, "frac: %f\n", frac); */
+ /* fprintf(stderr, "fg_current: %d, bg_current: %d\n", fg_current->color.r, bg_current->color.r); */
+ red = frac
+ * ((double) fg_current->color.r - bg_current->color.r)
+ + bg_current->color.r;
+ green = frac
+ * ((double) fg_current->color.g - bg_current->color.g)
+ + bg_current->color.g;
+ blue = frac
+ * ((double) fg_current->color.b - bg_current->color.b)
+ + bg_current->color.b;
+
+ pixel = SHIFTIFY(red, shift1_r, shift2_r)
+ | SHIFTIFY(green, shift1_g, shift2_g)
+ | SHIFTIFY(blue, shift1_b, shift2_b);
+
+ if (globals.gc.fore2 != NULL) { /* if thorough */
+ /* fprintf(stderr, "++++++ pixeltable at %d: %ld\n", i, pixel & ~bg_current->pixel); */
+ pixeltbl[i] = pixel & ~bg_current->pixel;
+ pixeltbl_gc2[i] = ~pixel & bg_current->pixel;
+ }
+ else if (resource.copy || (set_bits && clr_bits)) {
+ /* fprintf(stderr, "++++++ pixeltable2 at %d: %ld\n", i, pixel); */
+ pixeltbl[i] = pixel;
+ }
+ else {
+ /* fprintf(stderr, "++++++ pixeltable3 at %d: 0x%lx\n", i, ~pixel & clr_bits); */
+ /* fprintf(stderr, "++++++ pixeltable3 at %d: %ld\n", i, pixel & set_bits); */
+ pixeltbl[i] = set_bits ? pixel & set_bits : ~pixel & clr_bits;
+ }
+ }
+#undef SHIFTIFY
+ }
+
+ }
+ else { /* not TrueColor */
+ int i;
+ Boolean using_planes;
+
+ using_planes = (fg_current == bg_head->fg_head && !globals.gc.do_copy);
+ if (!fg_current->palette_good) {
+ XColor color;
+
+ /*
+ * Initialize the pixel lookup table according to the gamma values.
+ */
+ for (i = 0; i < 16; ++i) {
+ double frac;
+
+ frac = resource.gamma > 0
+ ? pow((double) i / 15, 1 / resource.gamma)
+ : 1 - pow((double) (15 - i) / 15, -resource.gamma);
+ color.red = frac
+ * ((double) fg_current->color.r - bg_current->color.r)
+ + bg_current->color.r;
+ color.green = frac
+ * ((double) fg_current->color.g - bg_current->color.g)
+ + bg_current->color.g;
+ color.blue = frac
+ * ((double) fg_current->color.b - bg_current->color.b)
+ + bg_current->color.b;
+
+ color.flags = DoRed | DoGreen | DoBlue;
+
+ if (using_planes) {
+ color.pixel = resource.back_Pixel; /* start of block */
+ if (i & 1) color.pixel |= plane_masks[0];
+ if (i & 2) color.pixel |= plane_masks[1];
+ if (i & 4) color.pixel |= plane_masks[2];
+ if (i & 8) color.pixel |= plane_masks[3];
+ XStoreColor(DISP, G_colormap, &color);
+ fg_current->palette[i] = color.pixel;
+ }
+ else {
+ if (XAllocColor(DISP, G_colormap, &color)) {
+ fg_current->palette[i] = color.pixel;
+ color_list_insert(color.pixel);
+ }
+ else {
+ color_warn();
+ fg_current->palette[i] =
+ (i * 100 >= resource.density * 15)
+ ? resource.fore_Pixel : bg_current->pixel;
+ }
+ }
+ }
+
+ if (using_planes && bg_current->pixel != resource.back_Pixel) {
+ bg_current->pixel = resource.back_Pixel;
+ /* XSetWindowBackground(DISP, mane.win, bg_current->pixel); */
+#if MOTIF
+ fprintf(stderr, "setting window background!\n");
+ XSetWindowBackground(DISP, XtWindow(globals.widgets.main_window), bg_current->pixel);
+ XtVaSetValues(globals.widgets.main_window, XmNbackground, bg_current->pixel, NULL);
+#else
+ XSetWindowBackground(DISP, mane.win, bg_current->pixel);
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+
+ fg_current->palette_good = True;
+ }
+
+ if (globals.debug & DBG_DVI)
+ printf("do_color_change: fg = %ld, bg = %ld, using_planes = %d\n",
+ fg_current->palette[15], bg_current->pixel, using_planes);
+
+ if (using_planes) {
+ globals.gc.rule = set_or_make_gc(globals.gc.rule, GXor, fg_current->palette[15],
+ bg_current->pixel);
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, fg_current->palette[15],
+ bg_current->pixel);
+ }
+ else {
+ globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->palette[15],
+ bg_current->pixel);
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->palette[15],
+ bg_current->pixel);
+ }
+
+ globals.gc.fore2 = NULL;
+
+ if (mane.shrinkfactor > 1) {
+ if (shrink_allocated_for < mane.shrinkfactor) {
+ if (pixeltbl != NULL)
+ free((char *) pixeltbl);
+ pixeltbl = xmalloc((unsigned)(mane.shrinkfactor * mane.shrinkfactor + 1)
+ * sizeof *pixeltbl);
+ shrink_allocated_for = mane.shrinkfactor;
+ }
+
+ for (i = 0; i <= mane.shrinkfactor * mane.shrinkfactor; ++i) {
+ pixeltbl[i] = fg_current->palette[(i * 30 + mane.shrinkfactor * mane.shrinkfactor)
+ / (2 * mane.shrinkfactor * mane.shrinkfactor)];
+ }
+ }
+ }
+ } /* end if resource.use_grey */
+ else
+#endif /* GREY */
+ {
+ if (!fg_current->pixel_good) {
+ fg_current->pixel = alloc_color(&fg_current->color,
+ color_data[0].pixel);
+ fg_current->pixel_good = True;
+ }
+
+ if (globals.debug & DBG_DVI)
+ printf("do_color_change: fg = %lx, bg = %lx\n",
+ fg_current->pixel, bg_current->pixel);
+
+ globals.gc.rule = set_or_make_gc(globals.gc.rule, GXcopy, fg_current->pixel, bg_current->pixel);
+
+ set_bits = (Pixel) (fg_current->pixel & ~bg_current->pixel);
+ clr_bits = (Pixel) (bg_current->pixel & ~fg_current->pixel);
+ globals.gc.fore2 = NULL;
+
+ if (resource.copy
+ || (set_bits && clr_bits && !resource.thorough)) {
+ if (!resource.copy) {
+ /* I used to get a warning here which I didn't get for
+ xdvi-22.64/events.c, l.1330, but I can't reproduce
+ it any more ...
+ */
+ warn_overstrike();
+ }
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXcopy, fg_current->pixel, bg_current->pixel);
+ }
+ else {
+ if (set_bits) {
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXor, set_bits, 0);
+ if (clr_bits) {
+ globals.gc.fore2 = globals.gc.fore2_bak1 = set_or_make_gc(globals.gc.fore2_bak1, GXandInverted, clr_bits, 0);
+ }
+ }
+ else
+ globals.gc.fore = set_or_make_gc(globals.gc.fore, GXandInverted, clr_bits, 0);
+ }
+ }
+
+ fg_active = fg_current;
+}
+
+#elif GREY /* if COLOR */
+
+void
+init_pix(void)
+{
+ static int shrink_allocated_for = 0;
+ static float oldgamma = 0.0;
+ static Pixel palette[17];
+ int i;
+
+ if (G_visual->class == TrueColor) {
+ /* This mirrors the non-grey code in xdvi.c */
+ static int shift1_r, shift1_g, shift1_b;
+ static int shift2_r, shift2_g, shift2_b;
+ static Pixel set_bits;
+ static Pixel clr_bits;
+ unsigned int sf_squared;
+
+ if (oldgamma == 0.0) {
+ mask_shifts(G_visual->red_mask, &shift1_r, &shift2_r);
+ mask_shifts(G_visual->green_mask, &shift1_g, &shift2_g);
+ mask_shifts(G_visual->blue_mask, &shift1_b, &shift2_b);
+
+ set_bits = color_data[0].pixel & ~(color_data[1].pixel);
+ clr_bits = color_data[1].pixel & ~(color_data[0].pixel);
+
+ if (set_bits & G_visual->red_mask)
+ set_bits |= G_visual->red_mask;
+ if (clr_bits & G_visual->red_mask)
+ clr_bits |= G_visual->red_mask;
+ if (set_bits & G_visual->green_mask)
+ set_bits |= G_visual->green_mask;
+ if (clr_bits & G_visual->green_mask)
+ clr_bits |= G_visual->green_mask;
+ if (set_bits & G_visual->blue_mask)
+ set_bits |= G_visual->blue_mask;
+ if (clr_bits & G_visual->blue_mask)
+ clr_bits |= G_visual->blue_mask;
+
+ /*
+ * Make the GCs
+ */
+
+ globals.gc.fore = globals.gc.fore2 = globals.gc.rule = 0;
+ globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel);
+ if (globals.gc.do_copy || (set_bits && clr_bits)) {
+ globals.gc.rule = globals.gc.copy;
+ if (!resource.thorough)
+ globals.gc.do_copy = True;
+ }
+ if (globals.gc.do_copy) {
+ globals.gc.fore = globals.gc.rule;
+ if (!resource.copy) {
+ warn_overstrike();
+ }
+ }
+ else {
+ if (set_bits) {
+ globals.gc.fore = set_or_make_gc(NULL, GXor, set_bits & color_data[0].pixel, 0);
+ }
+ if (clr_bits || !set_bits) {
+ /* fprintf(stderr, "using GXandInverted!\n"); */
+ *(globals.gc.fore ? &globals.gc.fore2 : &globals.gc.fore) =
+ set_or_make_gc(NULL, GXandInverted, clr_bits & ~(color_data[0].pixel), 0);
+ }
+ if (!globals.gc.rule)
+ globals.gc.rule = globals.gc.fore;
+ }
+
+ oldgamma = resource.gamma;
+ }
+
+ if (mane.shrinkfactor == 1)
+ return;
+ sf_squared = mane.shrinkfactor * mane.shrinkfactor;
+
+ if (shrink_allocated_for < mane.shrinkfactor) {
+ if (pixeltbl != NULL) {
+ free((char *)pixeltbl);
+ if (pixeltbl_gc2 != NULL)
+ free((char *)pixeltbl_gc2);
+ }
+ pixeltbl = xmalloc((sf_squared + 1) * sizeof *pixeltbl);
+ shrink_allocated_for = mane.shrinkfactor;
+ if (globals.gc.fore2 != NULL) {
+ pixeltbl_gc2 = xmalloc((sf_squared + 1) * sizeof *pixeltbl_gc2);
+ }
+ }
+
+ /*
+ * Initialize the pixel lookup table according to the gamma values.
+ */
+#define SHIFTIFY(x, shift1, shift2) ((((Pixel)(x)) >> (shift1)) << (shift2))
+
+ for (i = 0; i <= sf_squared; ++i) {
+ double frac = resource.gamma > 0
+ ? pow((double)i / sf_squared, 1 / resource.gamma)
+ : 1 - pow((double)(sf_squared - i) / sf_squared, -resource.gamma);
+ unsigned int red, green, blue;
+ Pixel pixel;
+
+ red = frac * ((double)color_data[0].red - color_data[1].red)
+ + color_data[1].red;
+ green = frac
+ * ((double)color_data[0].green - color_data[1].green)
+ + color_data[1].green;
+ blue = frac * ((double)color_data[0].blue - color_data[1].blue)
+ + color_data[1].blue;
+
+ pixel = SHIFTIFY(red, shift1_r, shift2_r) |
+ SHIFTIFY(green, shift1_g, shift2_g) |
+ SHIFTIFY(blue, shift1_b, shift2_b);
+
+ if (globals.gc.do_copy) {
+ pixeltbl[i] = pixel;
+ }
+ else if (globals.gc.fore2 != NULL) { /* if thorough */
+ pixeltbl[i] = pixel & ~(color_data[1].pixel);
+ pixeltbl_gc2[i] = ~pixel & color_data[1].pixel;
+ }
+ else {
+ pixeltbl[i] = set_bits ? pixel & set_bits : ~pixel & clr_bits;
+ }
+ }
+
+#undef SHIFTIFY
+
+ return;
+ }
+
+ /* if not TrueColor ... */
+
+ if (resource.gamma != oldgamma) {
+ XColor color;
+
+ for (i = 0; i < 16; ++i) {
+ double frac = resource.gamma > 0
+ ? pow((double)i / 15, 1 / resource.gamma)
+ : 1 - pow((double)(15 - i) / 15, -resource.gamma);
+
+ color.red = frac
+ * ((double)color_data[0].red - color_data[1].red)
+ + color_data[1].red;
+ color.green = frac
+ * ((double)color_data[0].green - color_data[1].green)
+ + color_data[1].green;
+ color.blue = frac
+ * ((double)color_data[0].blue - color_data[1].blue)
+ + color_data[1].blue;
+
+ color.pixel = resource.back_Pixel;
+ color.flags = DoRed | DoGreen | DoBlue;
+
+ if (!globals.gc.do_copy) {
+ if (i & 1)
+ color.pixel |= plane_masks[0];
+ if (i & 2)
+ color.pixel |= plane_masks[1];
+ if (i & 4)
+ color.pixel |= plane_masks[2];
+ if (i & 8)
+ color.pixel |= plane_masks[3];
+ XStoreColor(DISP, G_colormap, &color);
+ palette[i] = color.pixel;
+ }
+ else {
+ if (XAllocColor(DISP, G_colormap, &color))
+ palette[i] = color.pixel;
+ else
+ palette[i] = (i * 100 >= resource.density * 15)
+ ? resource.fore_Pixel : resource.back_Pixel;
+ }
+ }
+
+ globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel);
+ globals.gc.rule = globals.gc.do_copy
+ ? globals.gc.copy
+ : set_or_make_gc(NULL, GXor, resource.fore_Pixel, resource.back_Pixel);
+ globals.gc.fore = globals.gc.rule;
+ globals.gc.fore2 = NULL;
+ oldgamma = resource.gamma;
+ }
+
+ if (mane.shrinkfactor == 1)
+ return;
+
+ if (shrink_allocated_for < mane.shrinkfactor) {
+ if (pixeltbl != NULL)
+ free((char *)pixeltbl);
+ pixeltbl = xmalloc((unsigned)
+ (mane.shrinkfactor * mane.shrinkfactor + 1) * sizeof *pixeltbl);
+ shrink_allocated_for = mane.shrinkfactor;
+ }
+
+ for (i = 0; i <= mane.shrinkfactor * mane.shrinkfactor; ++i) {
+ pixeltbl[i] = palette[(i * 30 + mane.shrinkfactor * mane.shrinkfactor)
+ / (2 * mane.shrinkfactor * mane.shrinkfactor)];
+ }
+}
+
+#endif /* COLOR */
diff --git a/Build/source/texk/xdvik/dvi-draw.h b/Build/source/texk/xdvik/dvi-draw.h
new file mode 100644
index 00000000000..c8e74e1f2a4
--- /dev/null
+++ b/Build/source/texk/xdvik/dvi-draw.h
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1990-2013 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef DVI_DRAW_H_
+#define DVI_DRAW_H_
+
+#include "xdvi.h"
+
+
+extern void prescan(FILE *fp);
+
+
+/* forward declarations */
+struct font;
+struct tn;
+
+/* this information is saved when using virtual fonts */
+struct drawinf {
+ struct framedata data;
+ struct font *fontp;
+ set_char_proc set_char_p;
+ unsigned long tn_table_len;
+ struct font **tn_table;
+ struct tn *tn_head;
+ ubyte *pos, *end; /* pointers to a scan buffer defined in dvi-draw.c */
+ struct font *virtual;
+#ifdef TEXXET
+ int dir;
+#endif
+};
+
+struct src_parsed_special {
+ int line;
+ int col;
+ char *filename;
+ size_t filename_len;
+};
+extern void src_parse(const char *str, int str_len, struct src_parsed_special *parsed);
+
+/*
+ * pixel_conv is currently used only for converting absolute positions
+ * to pixel values; although normally it should be
+ *
+ * ((int) ((x) / currwin.shrinkfactor + (1 << 15) >> 16)),
+ *
+ * the rounding is achieved instead by moving the constant 1 << 15 to
+ * PAGE_OFFSET in dvi-draw.c.
+ */
+
+#define pixel_conv(x) ((int) ((x) / currwin.shrinkfactor >> 16))
+#define pixel_round(x) ((int) ROUNDUP(x, currwin.shrinkfactor << 16))
+
+/* entries below with the characters 'dvi' in them are actually stored in
+ scaled pixel units */
+
+#define DVI_H currinf.data.dvi_h
+#define PXL_H pixel_conv(currinf.data.dvi_h)
+#define DVI_V currinf.data.dvi_v
+#define PXL_V currinf.data.pxl_v
+#define WW currinf.data.w
+#define XX currinf.data.x
+#define YY currinf.data.y
+#define ZZ currinf.data.z
+
+extern void draw_page(void);
+extern void source_reverse_search(int, int, wide_bool);
+extern void source_special_show(wide_bool);
+extern void source_forward_search(const char *);
+
+extern void anchor_search(const char *str);
+
+
+/*
+ this is needed by any program that wants to use spcl_scan,
+ since the buffer is supposed to be of that length.
+*/
+#ifndef DVI_BUFFER_LEN
+#define DVI_BUFFER_LEN 2048
+#endif
+
+extern void open_font_file(struct font *fontp);
+extern long text_do_char(FILE *fp, struct scan_info *info, wide_ubyte ch);
+extern Boolean spcl_scan(Boolean(*spcl_proc) (char *str, int str_len, void *data), void *data, Boolean return_if_found, FILE *fp);
+
+extern void geom_scan_part(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte),
+ FILE *fp, struct scan_info *info, struct frame *min_frame, double current_dimconv);
+
+extern void geom_scan(long(*char_proc)(FILE *, struct scan_info *, wide_ubyte),
+ FILE *fp, struct scan_info *info, int pageno);
+
+extern off_t save_file_status(FILE *fp, struct drawinf *currinf_save, ubyte *maxchar_save);
+extern void reinit_text_scan(void);
+extern void restore_file_status(FILE *fp, struct drawinf currinf_save, ubyte maxchar_save, off_t pos_save);
+
+void htex_do_special(const char *str, size_t len);
+
+extern setcharRetvalT set_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch);
+extern setcharRetvalT load_n_set_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch);
+extern setcharRetvalT set_vf_char(
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch);
+
+extern setcharRetvalT set_ft_char(
+#if TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch);
+
+#ifdef GREY
+void init_plane_masks(void);
+#endif
+
+#if COLOR
+struct rgb; /* forward declaration */
+
+Pixel alloc_color(const struct rgb *, Pixel);
+void do_color_change(void);
+#elif GREY
+void init_pix(void);
+#endif
+
+void dvi_fmt_error(const char *message, ...);
+
+#endif /* DVI_DRAW_H_ */
diff --git a/Build/source/texk/xdvik/dvi-init.c b/Build/source/texk/xdvik/dvi-init.c
new file mode 100644
index 00000000000..6126a08fe1b
--- /dev/null
+++ b/Build/source/texk/xdvik/dvi-init.c
@@ -0,0 +1,1892 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2013 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "dvi-init.h"
+#include "dvi-draw.h"
+#include "util.h"
+#include "x_util.h"
+#include "exit-handlers.h"
+#include "mime.h"
+#include "pagesel.h"
+#include "special.h"
+#include "hypertex.h"
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/magstep.h"
+#include "kpathsea/tex-glyph.h"
+#include "dvi.h"
+#include "string-utils.h"
+#include "browser.h"
+#include "sfSelFile.h"
+#include "xm_toolbar.h"
+#include "pagehist.h"
+#include "message-window.h"
+#include "search-internal.h"
+#include "statusline.h"
+#include "events.h"
+#include "font-open.h"
+
+#if FREETYPE
+# include FT_SIZES_H
+#endif
+
+#define PK_PRE 247
+#define PK_ID 89
+#define PK_MAGIC ((PK_PRE << 8) | PK_ID)
+#define GF_PRE 247
+#define GF_ID 131
+#define GF_MAGIC ((GF_PRE << 8) | GF_ID)
+#define VF_PRE 247
+#define VF_ID_BYTE 202
+#define VF_MAGIC ((VF_PRE << 8) | VF_ID_BYTE)
+
+/* font stuff */
+struct font *tn_table[TNTABLELEN];
+struct font *font_head = NULL;
+struct tn *tn_head = NULL;
+wide_ubyte maxchar;
+unsigned short current_timestamp = 0;
+
+
+unsigned long magnification;
+double dimconv;
+double tpic_conv;
+
+/* Curently processed page number (starting at 0). */
+int current_page = 0;
+int total_pages = 0;
+
+/* postamble offset is saved in this global variable */
+long g_postamble_offset;
+
+
+static struct stat fstatbuf;
+
+static FILE *m_dvi_fp = NULL; /* original user's file */
+
+
+static Boolean open_dvi_file(const char *filename, Boolean open_new_instance);
+
+/*
+ * DVI preamble and postamble information.
+ */
+static unsigned long numerator, denominator;
+static unsigned int dvi_unshrunk_page_w, dvi_unshrunk_page_h;
+static unsigned int m_paper_unshrunk_w, m_paper_unshrunk_h;
+
+
+/*
+ * Offset in DVI file of last page, set in read_postamble().
+ */
+static long m_last_page_offset;
+
+static const char *dvi_err_list[] = {
+ /* NO_ERROR */ "No Error",
+ /* WRONG_DVI_VERSION */ "Wrong version of DVI output for this program",
+ /* DVI_CORRUPTED */ "DVI file corrupted",
+ /* NOT_A_DVI_FILE */ "Not a DVI file",
+ /* POSTAMBLE_NO_POST */ "Postamble doesn't begin with POST",
+ /* POSTAMBLE_NO_MATCH */ "Postamble doesn't match preamble",
+ /* POSTAMBLE_NON_FNTDEF */ "Non-fntdef command found in postamble",
+ /* NOT_ALL_PIXEL_FILES_FOUND */ "Not all pixel files were found",
+ /* NO_BOP_AT_PAGEDESC */ "Page description doesn't begin with BOP",
+ /* FILE_HAS_ZERO_SIZE */ "File has zero size",
+ /* FILE_DOESNT_EXIST */ "No such file",
+ /* FILE_IS_DIRECTORY */ "Is a directory",
+ /* UNKNOWN_ERROR */ "An unknown error occurred"
+};
+
+/*
+ * access method for above list
+ */
+const char *
+get_dvi_error(dviErrFlagT flag) {
+ ASSERT(flag < XtNumber(dvi_err_list), "Flag out of range");
+ return dvi_err_list[flag];
+}
+
+
+/*
+ * Extract the unit used in paper size specification. This information is used
+ * to decide the initial grid separation.
+ */
+static int
+atopixunit(const char *arg)
+{
+ int len = strlen(arg);
+
+ /* check if the unit 'mm' or 'cm' occurs in the arg string */
+ return (len > 2 && (arg[len - 2] == 'c' || arg[len - 2] == 'm') && arg[len - 1] == 'm' ?
+ 1.0 / 2.54 : 1.0) * resource.pixels_per_inch + 0.5;
+}
+
+/*
+ * free_vf_chain frees the vf_chain structure.
+ */
+
+static void
+free_vf_chain(struct tn *tnp)
+{
+ while (tnp != NULL) {
+ struct tn *tnp1 = tnp->next;
+ free((char *)tnp);
+ tnp = tnp1;
+ }
+}
+
+/*
+ * delete glyph information in a font.
+ */
+
+static void
+delete_glyphs(struct font *fontp)
+{
+ struct glyph *g;
+
+ for (g = fontp->glyph; g <= fontp->glyph + fontp->maxchar; ++g) {
+ if (g->bitmap2.bits) {
+ free(g->bitmap2.bits);
+ g->bitmap2.bits = NULL;
+ }
+#ifdef GREY
+ if (g->pixmap2) {
+ XDestroyImage(g->image2);
+ g->pixmap2 = NULL;
+ if (g->pixmap2_gc2 != NULL) {
+ free(g->pixmap2_gc2);
+ g->pixmap2_gc2 = NULL;
+ }
+ }
+#if COLOR
+ g->fg = NULL;
+#endif
+#endif
+ }
+}
+
+/*
+ * Release all shrunken bitmaps for all fonts.
+ */
+
+void
+reset_fonts(void)
+{
+ struct font *f;
+
+ for (f = font_head; f != NULL; f = f->next) {
+ if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL)) {
+ delete_glyphs(f);
+ }
+ }
+}
+
+/*
+ * free up fonts no longer in use.
+ */
+static void
+free_unused_fonts(void)
+{
+ struct font *fontp;
+ struct font **fontpp;
+
+ fontpp = &font_head;
+ while ((fontp = *fontpp) != NULL) {
+ if (fontp->flags & FONT_IN_USE)
+ fontpp = &fontp->next;
+ else {
+ if (globals.debug & DBG_PK)
+ printf("xdvi: Discarding font \"%s\" at %d dpi\n",
+ fontp->fontname, (int)(fontp->fsize + 0.5));
+ *fontpp = fontp->next; /* remove from list */
+ free(fontp->fontname);
+ if (fontp->flags & FONT_LOADED) {
+#if FREETYPE
+ if (fontp->ft != NULL) { /* if FreeType font */
+ struct ftfont *ft;
+
+ ft = fontp->ft;
+ if (fontp->size != NULL)
+ FT_Done_Size(fontp->size);
+ if (fontp == ft->first_size) {
+ if (fontp->next_size == NULL) {
+ /* if this is the only size of this font face */
+ FT_Done_Face(ft->face);
+ ft->t1->ft = NULL;
+ free(ft);
+ }
+ else {
+ struct font *fp2;
+
+ ft->first_size = fp2 = fontp->next_size;
+ fp2->file = fontp->file;
+ fontp->file = NULL;
+ fp2->filename = fontp->filename;
+ fontp->filename = NULL;
+ fp2->timestamp = fontp->timestamp;
+ }
+ }
+ else {
+ struct font *fp2;
+
+ fp2 = ft->first_size;
+ while (fp2->next_size != fontp)
+ fp2 = fp2->next_size;
+ fp2->next_size = fontp->next_size;
+ }
+ }
+#endif
+ if (fontp->file != NULL) {
+ fclose(fontp->file);
+ }
+#if FREETYPE
+ if (fontp->filename != NULL)
+#endif
+ free((char *) fontp->filename);
+
+ if (fontp->flags & FONT_VIRTUAL) {
+ struct macro *m;
+
+ for (m = fontp->macro;
+ m <= fontp->macro + fontp->maxchar; ++m)
+ if (m->free_me) free((char *)m->pos);
+ free((char *)fontp->macro);
+ free((char *)fontp->vf_table);
+ free_vf_chain(fontp->vf_chain);
+ }
+ else {
+ delete_glyphs(fontp);
+ free((char *)fontp->glyph);
+ }
+ free((char *)fontp);
+ }
+ }
+ }
+}
+
+#if COLOR
+
+/*
+ * Release all allocated pixels, and (in greyscale mode) invalidate
+ * all shrunken glyphs.
+ */
+
+void
+reset_colors(void)
+{
+ if (color_list_len != 0) {
+ XFreeColors(DISP, G_colormap, color_list, color_list_len, 0);
+ color_list_len = 0;
+ }
+ while (bg_head != NULL) {
+ struct bgrec *bgp;
+ struct fgrec *fgp;
+
+ for (fgp = bg_head->fg_head; fgp != NULL;) {
+ struct fgrec *fgp1 = fgp->next;
+ free(fgp);
+ fgp = fgp1;
+ }
+ bgp = bg_head->next;
+ free(bg_head);
+ bg_head = bgp;
+ }
+#if GREY
+ if (resource.use_grey) {
+ struct font *f;
+ struct glyph *g;
+
+ for (f = font_head; f != NULL; f = f->next)
+ if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL))
+ for (g = f->glyph; g <= f->glyph + f->maxchar; ++g)
+ g->fg = NULL;
+ }
+#endif /* GREY */
+ bg_current = NULL;
+ fg_active = NULL;
+ color_warned = False;
+}
+
+/*
+ * All of the above, plus discard all scanned information.
+ */
+
+void
+full_reset_colors(void)
+{
+ if (page_colors.stack != NULL) {
+ size_t i;
+ struct rgb *last_freed = &fg_initial;
+
+ /* fprintf(stderr, "i: %d; last freed: %p\n", page_colors.size, &fg_initial); */
+ for (i = 0; i < page_colors.size; ++i) {
+ if (page_colors.stack[i].colorstack != last_freed) {
+ last_freed = page_colors.stack[i].colorstack;
+ /* BUG ALERT: don't free &fg_initial, else segfault with changing
+ foreground in xm_colorsel.c! */
+ if (last_freed != NULL && last_freed != &fg_initial) {
+ /* fprintf(stderr, "freeing %d: %p\n", i, last_freed); */
+ free(last_freed);
+ }
+ }
+ }
+ free(page_colors.stack);
+ page_colors.stack = NULL;
+ }
+ reset_colors();
+}
+
+#endif /* COLOR */
+
+
+
+/*
+ * realloc_font allocates the font structure to contain (newsize + 1)
+ * characters.
+ */
+
+void
+realloc_font(struct font *fontp, wide_ubyte newsize)
+{
+ struct glyph *glyph;
+
+ glyph = fontp->glyph = xrealloc(fontp->glyph,
+ (unsigned int)(newsize + 1) * sizeof(struct glyph));
+ if (newsize > fontp->maxchar)
+ memset((char *)(glyph + fontp->maxchar + 1), 0,
+ (int)(newsize - fontp->maxchar) * sizeof(struct glyph));
+ maxchar = fontp->maxchar = newsize;
+}
+
+
+/*
+ * realloc_virtual_font does the same thing for virtual fonts.
+ */
+
+void
+realloc_virtual_font(struct font *fontp, wide_ubyte newsize)
+{
+ struct macro *macro;
+
+ macro = fontp->macro = xrealloc(fontp->macro,
+ (unsigned int)(newsize + 1) * sizeof(struct macro));
+ if (newsize > fontp->maxchar)
+ memset((char *)(macro + fontp->maxchar + 1), 0,
+ (int)(newsize - fontp->maxchar) * sizeof(struct macro));
+ maxchar = fontp->maxchar = newsize;
+}
+
+
+/*
+ * load_font locates the t1 font or raster file and reads the index of
+ * characters, plus whatever other preprocessing is done (depending on
+ * the format).
+ *
+ * Returns True if sucessful, False if not.
+ */
+
+Boolean
+load_font(struct font *fontp
+#if DELAYED_MKTEXPK
+ , Boolean load_font_now
+#endif
+ )
+{
+ double fsize = fontp->fsize;
+ int dpi = fsize + 0.5;
+ char *font_found;
+ int size_found;
+ int magic;
+ Boolean hushcs = resource.hush_chk;
+
+ fontp->file = NULL;
+
+ /* BUG ALERT: This used to be:
+ *
+ * if (--globals.ev.ctr == 0) {
+ * read_events(EV_GE_IDLE);
+ * }
+ * force_statusline_update();
+ * XSync(DISP, False);
+ *
+ * The idea was to update the `loading fonts ...' popup. However,
+ * calling read_events() here may call dvi_file_changed() if the
+ * user clicks on the window, which calls file_exists_p(), and
+ * that changes m_dvi_fp while it's still being used to read the
+ * postamble (where load_font() is called from), which will cause
+ * xdvi to crash! (bug #968127).
+ *
+ * Sadly, without this update, the `loading fonts' popup doesn't
+ * appear before the main window comes up ...
+ */
+
+ fontp->file = font_open(
+#if DELAYED_MKTEXPK
+ load_font_now,
+#endif
+ fontp,
+ (const char **) &font_found,
+ &size_found);
+
+#if DELAYED_MKTEXPK
+ if (!load_font_now)
+ return True;
+#endif
+
+#if FREETYPE
+ if (fontp->ft != NULL) { /* if freetype font */
+ fontp->timestamp = ++current_timestamp;
+ fontp->maxchar = maxchar = 255;
+ fontp->set_char_p = set_ft_char;
+ fontp->glyph = xmalloc (256 * sizeof (struct glyph));
+ memset((char *) fontp->glyph, 0, 256 * sizeof (struct glyph));
+ fontp->flags |= FONT_LOADED;
+ if (font_found != NULL) {
+ statusline_error(STATUS_MEDIUM,
+ "Error: Can't find font %s; using %s instead. Expect ugly output.",
+ fontp->fontname, font_found);
+ force_statusline_update();
+ free(fontp->fontname);
+ fontp->fontname = font_found; /* this has been allocated by font_open */
+ }
+ return True;
+ }
+#endif /* FREETYPE */
+
+ /* when it's not a freetype font, fontp->file == NULL means total failure */
+ if (fontp->file == NULL) {
+ if (globals.ev.flags & EV_GE_NEWDOC)
+ return False;
+ fontp->flags |= FONT_LOADED; /* as loaded as it'll get */
+ XDVI_ERROR((stderr, "Can't find font %s.%dpk", fontp->fontname, dpi));
+ return False;
+ }
+ fontp->flags |= FONT_LOADED;
+
+ if (font_found != NULL && strcmp(fontp->fontname, font_found) != 0) {
+ /* some other font used - FIXME: is there a more efficient way than strcmp() for checking this? */
+ statusline_error(STATUS_MEDIUM,
+ "Can't find pixel font %s; using %s instead at %d dpi.",
+ fontp->fontname, font_found, dpi);
+ force_statusline_update();
+ free(fontp->fontname);
+ fontp->fontname = font_found; /* this has been allocated by font_open */
+ hushcs = True;
+ }
+ else if (!kpse_bitmap_tolerance((double)size_found, fsize)) { /* a different size used */
+ statusline_error(STATUS_MEDIUM,
+ "Can't find pixel font %s at %d dpi; using %d dpi instead.",
+ fontp->fontname, dpi, size_found);
+ force_statusline_update();
+ }
+
+ /* PK version of some font found */
+ fontp->fsize = size_found;
+ fontp->timestamp = ++current_timestamp;
+ fontp->maxchar = maxchar = 255;
+ fontp->set_char_p = set_char;
+ magic = get_bytes(fontp->file, 2);
+
+ switch(magic) {
+ case PK_MAGIC:
+ read_PK_index(fontp, (wide_bool)hushcs);
+ break;
+#ifdef USE_GF
+ case GF_MAGIC:
+ read_GF_index(fontp, (wide_bool)hushcs);
+ break;
+#endif
+ case VF_MAGIC:
+ if (resource.omega)
+ maxchar = read_VF_index(fontp, (wide_bool)hushcs);
+ else
+ (void)read_VF_index(fontp, (wide_bool)hushcs);
+ break;
+ default:
+ XDVI_FATAL((stderr, "Cannot recognize format for font file %s",
+ fontp->filename));
+ break;
+ }
+
+ if (fontp->flags & FONT_VIRTUAL) {
+ if (!resource.omega) {
+ while (maxchar > 0 && fontp->macro[maxchar].pos == NULL) {
+ --maxchar;
+ }
+ if (maxchar < 255) {
+ realloc_virtual_font(fontp, (wide_ubyte)maxchar);
+ }
+ }
+ }
+ else {
+ while (maxchar > 0 && fontp->glyph[maxchar].addr == 0)
+ --maxchar;
+ if (maxchar < 255) {
+ realloc_font(fontp, (wide_ubyte)maxchar);
+ }
+ }
+ return True;
+}
+
+
+/*
+ * MAGSTEPVALUE - If the given magnification is close to a \magstep
+ * or a \magstephalf, then return twice the number of \magsteps.
+ * Otherwise return NOMAGSTP.
+ */
+
+#define NOMAGSTP (-29999)
+#define NOBUILD 29999
+
+static int
+magstepvalue(float *mag)
+{
+ int m = 0;
+ double fmag = *mag;
+ double xmag = resource.pixels_per_inch;
+ float margin = fmag * 0.002;
+
+ if (fmag < resource.pixels_per_inch)
+ for (;;) {
+ if (xmag - fmag < margin && -(xmag - fmag) < margin) {
+ *mag = xmag;
+ return m;
+ }
+ if (xmag < fmag)
+ break;
+ xmag *= 0.9128709292;
+ --m;
+ }
+ else
+ for (;;) {
+ if (xmag - fmag < margin && -(xmag - fmag) < margin) {
+ *mag = xmag;
+ return m;
+ }
+ if (xmag > fmag)
+ break;
+ xmag *= 1.095445115;
+ ++m;
+ }
+ return NOMAGSTP;
+}
+
+/*
+ * reuse_font recursively sets the flags for font structures being reused.
+ */
+
+static void
+reuse_font(struct font *fontp)
+{
+ struct font **fp;
+ struct tn *tnp;
+
+ if (fontp->flags & FONT_IN_USE)
+ return;
+
+ fontp->flags |= FONT_IN_USE;
+ if (resource.list_fonts)
+ printf("xdvi: (reusing) %s at %d dpi\n", fontp->fontname,
+ (int)(fontp->fsize + 0.5));
+ if (fontp->flags & FONT_VIRTUAL) {
+ for (fp = fontp->vf_table; fp < fontp->vf_table + VFTABLELEN; ++fp)
+ if (*fp != NULL)
+ reuse_font(*fp);
+ for (tnp = fontp->vf_chain; tnp != NULL; tnp = tnp->next)
+ reuse_font(tnp->fontp);
+ }
+}
+
+
+/*
+ * define_font reads the rest of the fntdef command and then reads in
+ * the specified pixel file, adding it to the global linked-list holding
+ * all of the fonts used in the job.
+ */
+struct font *
+define_font(
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, /* reading font definitions */
+ Boolean initialize_fonts, /* also initializing internal data structures for fonts */
+#else
+ Boolean load_font_now, /* only scanning, or also loading the font? */
+#endif
+ FILE *file,
+ wide_ubyte cmnd,
+ struct font *vfparent, /* vf parent of this font, or NULL */
+ struct font **tntable, /* table for low TeXnumbers */
+ unsigned int tn_table_len, /* length of table for TeXnumbers */
+ struct tn **tn_headpp, /* addr of head of list of TeXnumbers */
+ Boolean *not_found_flag) /* signal that font hasn't been found */
+{
+ unsigned int TeXnumber;
+ struct font *fontp;
+ float fsize;
+ double scale_dimconv;
+ long checksum;
+ int scale;
+ int design;
+ int magstepval;
+ int len;
+ char *fontname;
+ int size;
+
+ TeXnumber = get_bytes(file, (int)cmnd - FNTDEF1 + 1);
+ checksum = get_bytes(file, 4);
+ scale = get_bytes(file, 4);
+ design = get_bytes(file, 4);
+ len = get_byte(file);
+ len += get_byte(file); /* sequence point in the middle */
+
+#if DELAYED_MKTEXPK
+ if (!read_fonts) {
+ get_bytes(file, len);
+ return NULL;
+ }
+#else
+ if (!load_font_now)
+ return NULL;
+#endif
+
+ fontname = xmalloc((unsigned)len + 1);
+ (void)fread(fontname, sizeof(char), len, file);
+ fontname[len] = '\0';
+
+ if (globals.debug & DBG_PK)
+ printf("xdvi: Define font \"%s\" scale=%d design=%d number=%d\n",
+ fontname, scale, design, TeXnumber);
+ if (vfparent == NULL) {
+ fsize = 0.001 * scale / design * magnification * resource.pixels_per_inch;
+ scale_dimconv = dimconv;
+ }
+ else {
+ /*
+ * The scaled size is given in units of vfparent->scale * 2 ** -20
+ * SPELL units, so we convert it into SPELL units by multiplying by
+ * vfparent->dimconv.
+ * The design size is given in units of 2 ** -20 pt, so we convert
+ * into SPELL units by multiplying by
+ * (resource.pixels_per_inch * 2**16) / (72.27 * 2**20).
+ */
+ fsize = (72.27 * (1 << 4)) * vfparent->dimconv * scale / design;
+ scale_dimconv = vfparent->dimconv;
+ }
+ magstepval = magstepvalue(&fsize);
+ size = fsize + 0.5;
+ /*
+ * reuse font if possible
+ */
+ for (fontp = font_head;; fontp = fontp->next) {
+ if (fontp == NULL) { /* if font doesn't exist yet */
+ if (resource.list_fonts)
+ printf("xdvi: %s at %d dpi\n", fontname, (int)(fsize + 0.5));
+ fontp = xmalloc((unsigned)sizeof(struct font));
+ fontp->fontname = fontname;
+ fontp->fsize = fsize;
+ fontp->magstepval = magstepval;
+ fontp->file = NULL; /* needed for virtual/freetype fonts */
+ fontp->filename = NULL; /* needed for freetype fonts */
+ fontp->checksum = checksum;
+ fontp->flags = FONT_IN_USE;
+ fontp->dimconv = scale * scale_dimconv / (1 << 20);
+ fontp->set_char_p = load_n_set_char;
+#if FREETYPE
+ fontp->ft = NULL;
+ /* pixsize = scaled size of the font in pixels,
+ * = scale * [vfparent->]dimconv / (1 << 16).
+ */
+ fontp->pixsize =
+ (vfparent != NULL ? vfparent->dimconv : dimconv) * scale
+ / (1 << 16);
+#endif
+ if (vfparent == NULL)
+ if (!load_font(fontp
+#if DELAYED_MKTEXPK
+ , initialize_fonts
+#endif
+ )) {
+ if (globals.ev.flags & EV_GE_NEWDOC) { /* if aborting */
+ free(fontname);
+ free(fontp);
+ return NULL;
+ }
+ *not_found_flag = True;
+ }
+ fontp->next = font_head;
+ font_head = fontp;
+ break;
+ }
+ if (strcmp(fontname, fontp->fontname) == 0
+ && size == (int)(fontp->fsize + 0.5)) {
+ /* if font already in use */
+ reuse_font(fontp);
+ free(fontname);
+ break;
+ }
+ }
+ if (TeXnumber < tn_table_len)
+ tntable[TeXnumber] = fontp;
+ else {
+ struct tn *tnp;
+ tnp = xmalloc((unsigned)sizeof(struct tn));
+ tnp->next = *tn_headpp;
+ *tn_headpp = tnp;
+ tnp->TeXnumber = TeXnumber;
+ tnp->fontp = fontp;
+ }
+ return fontp;
+}
+
+
+
+/*
+ * process_preamble reads the information in the preamble and stores
+ * it into global variables for later use.
+ */
+Boolean
+process_preamble(FILE *fp, dviErrFlagT *errflag)
+{
+ ubyte k;
+ static char job_id[300];
+
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d", (void *)fp, *errflag));
+
+ if (get_byte(fp) != PRE) {
+ *errflag = NOT_A_DVI_FILE;
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag));
+ return False;
+ }
+ if (get_byte(fp) != 2) {
+ *errflag = WRONG_DVI_VERSION;
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag));
+ return False;
+ }
+ numerator = get_bytes(fp, 4);
+ denominator = get_bytes(fp, 4);
+ magnification = get_bytes(fp, 4);
+ dimconv = (((double)numerator * magnification)
+ / ((double)denominator * 1000.));
+ dimconv = dimconv * (((long)resource.pixels_per_inch) << 16) / 254000;
+ tpic_conv = resource.pixels_per_inch * magnification / 1000000.0;
+ k = get_byte(fp);
+ (void)fread(job_id, sizeof(char), (int)k, fp);
+ job_id[k] = '\0';
+
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning True", (void *)fp, *errflag));
+
+ return True;
+}
+
+/*
+ * find_postamble locates the beginning of the postamble
+ * and leaves the file ready to start reading at that location.
+ */
+#define TMPSIZ 516 /* 4 trailer bytes + 512 junk bytes allowed */
+Boolean
+find_postamble(FILE *fp, dviErrFlagT *errflag)
+{
+ long pos;
+ ubyte temp[TMPSIZ];
+ ubyte *p;
+ ubyte *p1;
+ ubyte byte;
+
+ TRACE_FILES((stderr, "find_postamble on fp: %p", (void *)fp));
+
+ fseek(fp, 0L, SEEK_END);
+ pos = ftell(fp) - TMPSIZ;
+ if (pos < 0)
+ pos = 0;
+ fseek(fp, pos, SEEK_SET);
+ p = temp + fread((char *)temp, sizeof(char), TMPSIZ, fp);
+ for (;;) {
+ p1 = p;
+ while (p1 > temp && *(--p1) != TRAILER);
+ p = p1;
+ while (p > temp && *(--p) == TRAILER);
+ if (p <= p1 - 4)
+ break; /* found 4 TRAILER bytes */
+ if (p <= temp) {
+ *errflag = DVI_CORRUPTED;
+ TRACE_FILES((stderr, "find_postamble: returning FALSE"));
+ return False;
+ }
+ }
+ pos += p - temp;
+ byte = *p;
+ while (byte == TRAILER) {
+ fseek(fp, --pos, SEEK_SET);
+ byte = get_byte(fp);
+ }
+ if (byte != 2) {
+ *errflag = WRONG_DVI_VERSION;
+ TRACE_FILES((stderr, "find_postamble: returning FALSE"));
+ return False;
+ }
+ fseek(fp, pos - 4, SEEK_SET);
+ fseek(fp, get_lbytes(fp, 4), SEEK_SET);
+ TRACE_FILES((stderr, "find_postamble: returning TRUE"));
+ return True;
+}
+
+
+
+Boolean
+set_paper_type(const char *arg)
+{
+ const char *arg1;
+ char temp[21];
+ const char **p;
+ char *q;
+ const char **paper_types = get_paper_types();
+ size_t paper_types_size = get_paper_types_size();
+
+ if (*arg == '+') {
+ ++arg;
+ ignore_papersize_specials = True;
+ }
+ if (strlen(arg) > sizeof(temp) - 1)
+ return False;
+ q = temp;
+ for (;;) { /* convert to lower case */
+ char c = *arg++;
+ if (c >= 'A' && c <= 'Z')
+ c ^= ('a' ^ 'A');
+ *q++ = c;
+ if (c == '\0')
+ break;
+ }
+ arg = temp;
+ /* perform substitutions */
+ for (p = paper_types; p < paper_types + paper_types_size; p += 2) {
+ if (strcmp(temp, *p) == 0) {
+ arg = p[1];
+ break;
+ }
+ }
+ arg1 = strchr(arg, 'x');
+ if (arg1 == NULL)
+ return False;
+ m_paper_unshrunk_w = atopix(arg);
+ m_paper_unshrunk_h = atopix(arg1 + 1);
+
+ globals.grid_paper_unit = atopixunit(arg);
+
+ return (m_paper_unshrunk_w != 0 && m_paper_unshrunk_h != 0);
+}
+
+/*
+ * read_postamble reads the information in the postamble from fp,
+ * storing it into global variables.
+ * It also takes care of reading in all of the pixel files for the fonts
+ * used in the job.
+ *
+ * FIXME: Would be better (speed up initialization when needing to generate fonts,
+ * and allow to open window on first page) if the font loading was done on-demand later!
+ */
+Boolean
+read_postamble(FILE *fp, dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
+{
+ ubyte cmnd;
+ Boolean font_not_found = False;
+ struct font *fontp;
+
+#if DELAYED_MKTEXPK
+ int tmp_total_pages;
+ unsigned long tmp_numerator = numerator;
+ unsigned long tmp_denominator = denominator;
+ unsigned long tmp_magnification = magnification;
+ unsigned int tmp_dvi_unshrunk_page_w, tmp_dvi_unshrunk_page_h;
+ long tmp_last_page_offset;
+
+ TRACE_FILES((stderr, "read_postamble: reading %p (%d, %d)", (void *)fp, read_fonts, initialize_fonts));
+
+ if (read_fonts && initialize_fonts) {
+ /* clear existing font table */
+ memset((char *)tn_table, 0, (int)sizeof tn_table);
+ free_vf_chain(tn_head);
+ tn_head = NULL;
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next)
+ fontp->flags &= ~FONT_IN_USE;
+ }
+#else /* DELAYED_MKTEXPK */
+ TRACE_FILES((stderr, "read_postamble: reading %p (%d)", (void *)fp, load_fonts));
+
+ /* clear existing font table */
+ memset((char *)tn_table, 0, (int)sizeof tn_table);
+ free_vf_chain(tn_head);
+ tn_head = NULL;
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next)
+ fontp->flags &= ~FONT_IN_USE;
+#endif /* DELAYED_MKTEXPK */
+
+ if (get_byte(fp) != POST) {
+ *errflag = POSTAMBLE_NO_POST;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+#if DELAYED_MKTEXPK
+ tmp_last_page_offset = get_bytes(fp, 4);
+ if (read_fonts && initialize_fonts)
+ m_last_page_offset = tmp_last_page_offset;
+
+ if (tmp_numerator != get_bytes(fp, 4)
+ || tmp_denominator != get_bytes(fp, 4)
+ || tmp_magnification != get_bytes(fp, 4)) {
+ *errflag = POSTAMBLE_NO_MATCH;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+ else if (read_fonts && initialize_fonts) {
+ numerator = tmp_numerator;
+ denominator = tmp_denominator;
+ magnification = tmp_magnification;
+ }
+
+ /* read largest box height and width */
+ tmp_dvi_unshrunk_page_h = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.yoffset_int;
+ tmp_dvi_unshrunk_page_w = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.xoffset_int;
+ (void)get_bytes(fp, 2); /* max stack size */
+ tmp_total_pages = get_bytes(fp, 2);
+
+ if (read_fonts && initialize_fonts) {
+ dvi_unshrunk_page_h = tmp_dvi_unshrunk_page_h;
+ if (dvi_unshrunk_page_h < m_paper_unshrunk_h)
+ dvi_unshrunk_page_h = m_paper_unshrunk_h;
+ dvi_unshrunk_page_w = tmp_dvi_unshrunk_page_w;
+ if (dvi_unshrunk_page_w < m_paper_unshrunk_w)
+ dvi_unshrunk_page_w = m_paper_unshrunk_w;
+ total_pages = tmp_total_pages;
+ }
+#else /* DELAYED_MKTEXPK */
+ m_last_page_offset = get_bytes(fp, 4);
+ if (numerator != get_bytes(fp, 4)
+ || denominator != get_bytes(fp, 4)
+ || magnification != get_bytes(fp, 4)) {
+ *errflag = POSTAMBLE_NO_MATCH;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+
+ /* read largest box height and width */
+ dvi_unshrunk_page_h = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.yoffset_int;
+ if (dvi_unshrunk_page_h < m_paper_unshrunk_h)
+ dvi_unshrunk_page_h = m_paper_unshrunk_h;
+ dvi_unshrunk_page_w = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.xoffset_int;
+ if (dvi_unshrunk_page_w < m_paper_unshrunk_w)
+ dvi_unshrunk_page_w = m_paper_unshrunk_w;
+ (void)get_bytes(fp, 2); /* max stack size */
+ total_pages = get_bytes(fp, 2);
+#endif /* DELAYED_MKTEXPK */
+
+ /* read font definitions */
+ while ((cmnd = get_byte(fp)) >= FNTDEF1 && cmnd <= FNTDEF4) {
+ struct font *f = define_font(
+#if DELAYED_MKTEXPK
+ read_fonts, initialize_fonts,
+#else
+ load_fonts,
+#endif
+ fp, cmnd, (struct font *)NULL, tn_table,
+ TNTABLELEN, &tn_head, &font_not_found);
+ if (
+#if DELAYED_MKTEXPK
+ read_fonts && initialize_fonts
+#else
+ load_fonts
+#endif
+ && f == NULL) {
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+#if !DELAYED_MKTEXPK
+ else if (!load_fonts) { /* return early */
+ TRACE_FILES((stderr, "read_postamble: returning TRUE"));
+ return True;
+ }
+#endif
+ }
+
+ if (cmnd != POSTPOST) {
+ *errflag = POSTAMBLE_NON_FNTDEF;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+ if (
+#if DELAYED_MKTEXPK
+ read_fonts && initialize_fonts &&
+#endif
+ font_not_found) {
+ *errflag = NOT_ALL_PIXEL_FILES_FOUND;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+#if DELAYED_MKTEXPK
+ if (read_fonts && initialize_fonts)
+ free_unused_fonts();
+#else
+ free_unused_fonts();
+#endif
+
+ TRACE_FILES((stderr, "read_postamble: returning TRUE"));
+ return True;
+}
+
+
+static Boolean
+prepare_pages(dviErrFlagT *errflag)
+{
+ int i;
+ long offset;
+
+ TRACE_FILES((stderr, "calling pageinfo_deallocate"));
+ pageinfo_deallocate();
+
+ TRACE_FILES((stderr, "pageinfo_allocate for %d pages", total_pages + 1));
+ pageinfo_allocate(total_pages + 1);
+ pageinfo_set_page_width(total_pages, m_paper_unshrunk_w);
+ pageinfo_set_page_height(total_pages, m_paper_unshrunk_h);
+ pageinfo_set_window_width(total_pages, dvi_unshrunk_page_w);
+ pageinfo_set_window_height(total_pages, dvi_unshrunk_page_h);
+
+ pageinfo_set_offset(total_pages - 1, m_last_page_offset);
+ /*
+ * Follow back pointers through pages in the DVI file,
+ * storing the offsets in the pageinfo table.
+ */
+ for (offset = m_last_page_offset, i = total_pages; i > 0; i--) {
+ fseek(globals.dvi_file.bak_fp, offset, SEEK_SET);
+ if (get_byte(globals.dvi_file.bak_fp) != BOP) {
+ *errflag = NO_BOP_AT_PAGEDESC;
+ return False;
+ }
+ pageinfo_set_offset(i-1, offset);
+ /* from c_0, read count0, the TeX page number */
+ pageinfo_set_number(i-1, get_bytes(globals.dvi_file.bak_fp, 4));
+
+ /* skip c_1 to c_9 */
+ fseek(globals.dvi_file.bak_fp, 9*4L, SEEK_CUR);
+
+ /* next 4 byte contain offset to previous bop */
+ offset = get_bytes(globals.dvi_file.bak_fp, 4);
+ }
+ /* If not prescanning, initialize page sizes. */
+ if (!resource.prescan) {
+ for (i = 0; i < total_pages; ++i) {
+ pageinfo_set_page_width(i, m_paper_unshrunk_w);
+ pageinfo_set_page_height(i, m_paper_unshrunk_h);
+ pageinfo_set_window_width(i, dvi_unshrunk_page_w);
+ pageinfo_set_window_height(i, dvi_unshrunk_page_h);
+ }
+ }
+ return True;
+}
+
+void
+init_page(void)
+{
+ if (globals.dvi_file.bak_fp == NULL)
+ return;
+ globals.page.unshrunk_w = pageinfo_get_page_width(current_page);
+ globals.page.unshrunk_h = pageinfo_get_page_height(current_page);
+ globals.page.w = ROUNDUP(globals.page.unshrunk_w, mane.shrinkfactor) + 2;
+ globals.page.h = ROUNDUP(globals.page.unshrunk_h, mane.shrinkfactor) + 2;
+ TRACE_FILES((stderr, "init_page: setting globals.page.w = %d, globals.page.h = %d", globals.page.w, globals.page.h));
+}
+
+#ifndef S_ISDIR
+#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
+static char *m_tmp_dvi_name = NULL; /* name of backup file for useTempFp */
+
+/* access function for backup file name */
+char *get_tmp_dvi_name(void) {
+ return m_tmp_dvi_name;
+}
+
+static void
+remove_tmp_dvi_file(void *dummy)
+{
+ UNUSED(dummy);
+ if (m_tmp_dvi_name != NULL) {
+ unlink(m_tmp_dvi_name);
+ free(m_tmp_dvi_name);
+ }
+ m_tmp_dvi_name = NULL;
+}
+
+
+static FILE *
+make_backup_fp(FILE *source_fp, FILE *target_fp)
+{
+ static Boolean first_time = True;
+ static int tmp_fd = 0;
+
+#if !HAVE_FTRUNCATE
+ /* in this case, we can't use ftruncate() on the existing temp file -
+ just close the existing one, and set flag to open a new one */
+ remove_tmp_dvi_file(NULL);
+ if (target_fp != NULL)
+ fclose(target_fp);
+ /* make sure we use a new temp file, else we'd have a race condition
+ after closing it */
+ first_time = True;
+#endif
+
+ if (first_time) { /* doesn't exist yet, create it */
+ if ((tmp_fd = xdvi_temp_fd(&m_tmp_dvi_name)) == -1) {
+ XDVI_ERROR((stderr, "error creating temporary file - disabling `useTempFp'."));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
+ return NULL;
+ }
+ /* fprintf(stderr, "temporary file name: |%s|, %d\n", m_tmp_dvi_name, tmp_fd); */
+ TRACE_EVENTS((stderr, "Created temp file: |%s|\n", m_tmp_dvi_name));
+ if ((target_fp = try_fdopen(tmp_fd, "wb+")) == NULL) {
+ XDVI_ERROR((stderr, "error opening temporary file (%s) - disabling `useTempFp'.", strerror(errno)));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
+ return NULL;
+ }
+ first_time = False;
+ }
+ else { /* if not first time, truncate the existing file,
+ and position both files at beginning */
+ ASSERT(target_fp != NULL, "");
+ ASSERT(source_fp != NULL, "");
+
+#if HAVE_FTRUNCATE
+ if (ftruncate(tmp_fd, 0) < 0) {
+
+ XDVI_ERROR((stderr, "Couldn't truncate file %s: %s - disabling `useTempFp'; target_fp: %p.",
+ m_tmp_dvi_name, strerror(errno), target_fp));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
+ fclose(target_fp);
+ return NULL;
+ }
+#endif
+ fseek(target_fp, 0L, SEEK_SET);
+ fseek(source_fp, 0L, SEEK_SET);
+ }
+
+ /* copy the file */
+ if (!copy_fp(source_fp, target_fp)) {
+ XDVI_ERROR((stderr,
+ "Error creating temporary file: %s\n"
+ "- disabling `useTempFp'.",
+ strerror(errno)));
+ remove_tmp_dvi_file(NULL);
+ resource.use_temp_fp = False;
+ fclose(target_fp);
+ target_fp = NULL;
+ }
+
+ /* rewind both files, else DVI parsing will fail! */
+ if (target_fp != NULL) {
+ fflush(target_fp);
+ }
+ fseek(source_fp, 0L, SEEK_SET);
+ if (target_fp != NULL) {
+ fseek(target_fp, 0L, SEEK_SET);
+ }
+
+ return target_fp;
+}
+
+static Boolean
+file_exists_p(const char *path, dviErrFlagT *errflag)
+{
+ TRACE_FILES((stderr, "file_exists_p for |%s|", path));
+ *errflag = UNKNOWN_ERROR;
+ if ((m_dvi_fp = XFOPEN(path, OPEN_MODE)) == NULL) {
+ /* fprintf(stderr, "after internal_open_dvi1: xfopen\n"); */
+ *errflag = FILE_DOESNT_EXIST;
+ return False;
+ }
+ TRACE_FILES((stderr, "m_dvi_fp for |%s| = %p", path, (void *)m_dvi_fp));
+ /* fprintf(stderr, "after internal_open_dvi2: xfopen\n"); */
+
+ /* shouldn't happen */
+ if (fstat(fileno(m_dvi_fp), &fstatbuf) != 0 || S_ISDIR(fstatbuf.st_mode)) { /* if it's a directory */
+ *errflag = FILE_IS_DIRECTORY;
+ fclose(m_dvi_fp);
+ m_dvi_fp = NULL;
+ return False;
+ }
+ /* If file has zero size, something has gone wrong with downloading
+ it, and the user should already have been warned about that;
+ just return in this case.
+ TODO: can it still happen that we try to load such a file as .dvi
+ file? (Will exit with `draw_part: unknown op-code xyz' or some such).
+ In this case, it would be better to look at the preamble before
+ entering the drawing loop.
+ */
+ if (fstatbuf.st_size == 0) {
+ *errflag = FILE_HAS_ZERO_SIZE;
+ fclose(m_dvi_fp);
+ m_dvi_fp = NULL;
+ return False;
+ }
+ return True;
+}
+
+/*
+ * internal_init_dvi is the main subroutine for reading the startup
+ * information from the dvi file.
+ */
+
+static Boolean
+internal_init_dvi(dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
+{
+ char *icon_name = NULL, *title_name = NULL;
+
+ have_src_specials = False;
+
+ TRACE_FILES((stderr, "internal_init_dvi, globals.dvi_file.bak_fp = %p", (void *)globals.dvi_file.bak_fp));
+
+ if (!process_preamble(globals.dvi_file.bak_fp, errflag)
+ || !find_postamble(globals.dvi_file.bak_fp, errflag)
+#if DELAYED_MKTEXPK
+ || !read_postamble(globals.dvi_file.bak_fp, errflag, read_fonts, initialize_fonts)
+#else
+ || !read_postamble(globals.dvi_file.bak_fp, errflag, load_fonts)
+ || !prepare_pages(errflag)
+#endif
+ ) {
+ return False;
+ }
+#if DELAYED_MKTEXPK
+ if (!read_fonts || !initialize_fonts) /* return early */
+ return True;
+
+ if (!prepare_pages(errflag))
+ return False;
+#endif
+
+ if (current_page >= total_pages)
+ current_page = total_pages - 1;
+
+ globals.warn_spec_now = resource.warn_spec;
+ globals.src.fwd_box_page = -1;
+ search_reset_info();
+
+ if (globals.pausing.num_save != NULL) {
+ free(globals.pausing.num_save);
+ globals.pausing.num_save = NULL;
+ }
+ if (resource.pause && total_pages > 0) {
+ globals.pausing.num_save = xmalloc(total_pages * sizeof *globals.pausing.num_save);
+ memset(globals.pausing.num_save, 0, total_pages * sizeof *globals.pausing.num_save);
+ }
+
+ init_prescan();
+ /* this allocates icon_name and title_name */
+ get_icon_and_title(globals.dvi_name, &icon_name, &title_name);
+ set_icon_and_title(icon_name, title_name);
+ free(icon_name);
+ free(title_name);
+ icon_name = title_name = NULL;
+
+#if defined(MOTIF) && HAVE_XPM
+ tb_check_navigation_sensitivity(current_page);
+#endif
+ refresh_pagelist(total_pages, current_page);
+
+ return True;
+}
+
+/*
+ * internal_open_dvi does the real opening of the dvi file, and sets
+ * globals.dvi_file.time. It returns True on success, and sets m_dvi_fp and globals.dvi_file.bak_fp.
+ */
+
+Boolean
+internal_open_dvi(const char *path, dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
+{
+ /* FILE *tmp_fp = NULL; */
+ /* static FILE *bak_fp = NULL; /\* re-use the temporary backup fp *\/ */
+ /* fprintf(stderr, "------------ opening: |%s|\n", path); */
+
+#if DELAYED_MKTEXPK
+ TRACE_FILES((stderr, "internal_open_dvi for |%s|; loading fonts: %d, %d", path, read_fonts, initialize_fonts));
+#else
+ TRACE_FILES((stderr, "internal_open_dvi for |%s|", path));
+#endif
+ close_old_filep();
+
+ if (!file_exists_p(path, errflag)) { /* this should set fstatbuf.st_mtime */
+ return False;
+ }
+
+ if (!resource.use_temp_fp || (globals.dvi_file.bak_fp = make_backup_fp(m_dvi_fp, globals.dvi_file.bak_fp)) == NULL) {
+ globals.dvi_file.bak_fp = m_dvi_fp;
+ }
+
+ register_exit_handler(remove_tmp_dvi_file, NULL);
+
+ globals.dvi_file.time = fstatbuf.st_mtime;
+
+ if (!internal_init_dvi(errflag,
+#if DELAYED_MKTEXPK
+ read_fonts, initialize_fonts
+#else
+ load_fonts
+#endif
+ )) {
+ return False;
+ }
+
+#if COLOR
+ full_reset_colors();
+#endif /* COLOR */
+ reset_papersize_special();
+
+ TRACE_FILES((stderr, "internal_open_dvi: SUCCESS!"));
+
+ return True;
+}
+
+/*
+ check whether `filename' is a DVI file, by checking if it exists, and if so,
+ opening it and trying to read a DVI preamble from it:
+*/
+static char *
+is_dvi_file(const char *filename)
+{
+ FILE *fp;
+ struct stat statbuf;
+ char *full_pathname;
+ dviErrFlagT unused_error;
+
+ TRACE_FILES((stderr, "is_dvi_file %s", filename));
+ TRACE_HTEX((stderr, "filename: |%s|", filename));
+
+ /* used to append `.dvi' if not already present, but that was a
+ bad idea - if we have both foo.2 and foo.2.dvi, user will want
+ to open `foo.2' (with some appropriate application) if the link
+ points to that filename. This means that we need to have
+ different semantics for filenames on the command-line and
+ filenames in hyperlinks; the latter *must* specify an
+ extension, the former may omit the extension and default to DVI
+ files.
+ */
+ /* if ((full_filename = filename_append_dvi(filename)) == NULL) { */
+ /* free(full_filename); */
+ /* return NULL; */
+ /* } */
+ /* TRACE_HTEX((stderr, "full_filename: |%s|\n", full_filename)); */
+
+ if ((full_pathname = find_file(filename, &statbuf, kpse_program_text_format)) == NULL) {
+ return NULL;
+ }
+ else {
+ char *tmp = canonicalize_path(full_pathname);
+ free(full_pathname);
+ full_pathname = tmp;
+ }
+
+ TRACE_HTEX((stderr, "is_dvi_file: full_pathname: |%s|", full_pathname));
+
+ if ((fp = XFOPEN(full_pathname, OPEN_MODE)) == NULL) {
+ free(full_pathname);
+ return NULL;
+ }
+
+ if (!process_preamble(fp, &unused_error)) {
+ free(full_pathname);
+ fclose(fp);
+ return NULL;
+ }
+
+ fclose(fp);
+ return full_pathname;
+}
+
+static void
+report_open_error(const char *msg, const char *filename, dviErrFlagT errflag)
+{
+ const char *errmsg;
+ switch(errflag) {
+ case FILE_HAS_ZERO_SIZE:
+ errmsg = "File has zero size";
+ break;
+ case FILE_DOESNT_EXIST:
+ errmsg = "No such file";
+ break;
+ case FILE_IS_DIRECTORY:
+ errmsg = "Is a directory";
+ break;
+ default:
+ errmsg = "An unknown error occurred";
+ break;
+ }
+ XDVI_ERROR((stderr, "%s: %s: %s", msg, filename, errmsg));
+}
+
+/*
+ Implements the algorithm for opening a DVI file from the command line.
+ This is similar to `open_dvi_file()' in non-k xdvi.
+
+ If the file does not already have `.dvi' extension, append `.dvi'
+ and set tried_dvi_ext to True. Try to open this file. If the file
+ doesn't exist, try the original file name. If this file doesn't
+ exist either, exit with an error message `No such file or directory'.
+ If tried_dvi_ext == True, also report that file.dvi didn't exist
+ either.
+
+ (A later function will check if the file really is a DVI file, and
+ will use tried_dvi_ext for the same purpose).
+*/
+char *
+find_dvi_file(const char *filename, Boolean *tried_dvi_ext, Boolean from_file_history)
+{
+ char *new_filename;
+ size_t len;
+ dviErrFlagT errflag;
+
+ ASSERT(filename != NULL, "Filename argument in find_dvi_file() musn't be NULL");
+ len = strlen(filename);
+
+ if (len < sizeof(".dvi") || strcmp(filename + len - sizeof(".dvi") + 1, ".dvi") != 0) {
+ /* doesn't already have .dvi extension */
+ TRACE_HTEX((stderr, "|%s| doesn't have .dvi extension, appending ...", filename));
+ new_filename = xstrdup(filename);
+ new_filename = xstrcat(new_filename, ".dvi");
+ *tried_dvi_ext = True;
+
+ if (file_exists_p(new_filename, &errflag)) { /* file exists */
+ char *expanded_filename = expand_filename(new_filename, USE_CWD_PATH);
+ free(new_filename);
+ return expanded_filename;
+ }
+ else { /* don't report an error; will try verbatim filename next */
+ free(new_filename);
+ }
+ }
+
+ /* try verbatim filename (might be strange things like `foo.wdvi') */
+ if (file_exists_p(filename, &errflag)) {
+ char *expanded_filename = expand_filename(filename, USE_CWD_PATH);
+ return expanded_filename;
+ }
+ else {
+ if (*tried_dvi_ext) {
+ if (!from_file_history) {
+ XDVI_FATAL((stderr, "%s: %s, and %s.dvi doesn't exist either.",
+ filename, get_dvi_error(errflag), filename));
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Could not open \"%s\": %s.\n", filename, get_dvi_error(errflag));
+ }
+ }
+ else {
+ if (!from_file_history) {
+ XDVI_FATAL((stderr, "%s: %s.", filename, get_dvi_error(errflag)));
+ }
+ /* else: file is from history; this is at startup, where we may
+ loop through the history until we find a usable file. Don't report
+ an error in this case. */
+ }
+ }
+ return NULL;
+}
+
+
+
+/*
+ * A wrapper for open_dvi_file that can also deal with remote files/URLs, and other
+ * file types. Returns the (newly malloc'ed) new dvi file name if it succeeds, NULL else.
+ */
+char *
+open_dvi_file_wrapper(const char *filename,
+ Boolean from_command_line,
+ Boolean open_new_instance,
+ Boolean *tried_dvi_ext,
+ Boolean from_file_history)
+{
+ char *real_filename = NULL;
+ char *new_dvi_name = NULL;
+ char canonical_path[MAXPATHLEN + 1];
+
+ if (from_command_line) {
+ TRACE_HTEX((stderr, "filename IS from commandline"));
+ /*
+ if filename is from command-line, we want to treat the file as a DVI file
+ always (and NOT launch the browser or other programs; that'd just confuse
+ people, who meant to launch *xdvi*). `find_dvi_file' tries to locate the
+ file and does all error handling; on success, it returns a fully expanded
+ filename.
+ */
+ real_filename = find_dvi_file(filename, tried_dvi_ext, from_file_history); /* this allocates real_filename */
+ if (real_filename == NULL)
+ return False;
+
+ TRACE_HTEX((stderr, "filename |%s| %p from commandline;\ndvi_name: |%s|,\nfilename: |%s|%p",
+ real_filename, real_filename, globals.dvi_name, filename, (void *)filename));
+ new_dvi_name = xstrdup(REALPATH(real_filename, canonical_path));
+ free(real_filename);
+ TRACE_FILES((stderr, "new_dvi_name: |%s|", new_dvi_name));
+ return new_dvi_name;
+ }
+ else {
+ /*
+ if it's not from the command line (e.g. result of clicking Mouse-1 on a link);
+ in this case we might fall back to using the browser.
+ Check whether it's a local file:
+ */
+ const char *filename_no_prefix;
+ char *expanded_filename;
+ TRACE_HTEX((stderr, "filename NOT from commandline"));
+ if ((filename_no_prefix = is_local_file(filename)) != NULL) {
+ /* if it's a local file, check whether it's a DVI file: */
+ if ((expanded_filename = is_dvi_file(filename_no_prefix)) != NULL) {
+ /* yes, open it */
+ if (open_dvi_file(expanded_filename, open_new_instance)) {
+ TRACE_FILES((stderr, "success: %p |%s|", expanded_filename, expanded_filename));
+ if (!open_new_instance) {
+ new_dvi_name = expand_filename_append_dvi(expanded_filename, USE_DVI_PATH, True);
+ TRACE_FILES((stderr, "new_dvi_name: %p |%s|", (void*)new_dvi_name, new_dvi_name));
+ }
+ }
+ free(expanded_filename);
+ return new_dvi_name;
+ }
+ else {
+ /*
+ local file, but not a DVI file;
+ try other viewers for this MIME type:
+ */
+ TRACE_HTEX((stderr, "%s is NOT a DVI file", filename_no_prefix));
+ launch_program(filename);
+ return NULL;
+ }
+ }
+ else {
+ /* not a local file, retrieve it with the browser: */
+ launch_browser(filename);
+ return NULL;
+ }
+ }
+}
+
+
+static Boolean
+open_dvi_file(const char *filename, Boolean open_new_instance)
+{
+ Boolean retval = True;
+
+ char *anchor_name = resource.anchor_pos;
+
+ TRACE_HTEX((stderr, "open_dvi_file: |%s| + |%s|",
+ filename, anchor_name == NULL ? "<no anchor>" : anchor_name));
+
+ if (open_new_instance) {
+ launch_xdvi(filename, anchor_name);
+ }
+ else {
+ dviErrFlagT errflag = NO_ERROR;
+ TRACE_HTEX((stderr, "internal_open_dvi: |%s|", filename));
+ if (!internal_open_dvi(filename, &errflag, True
+#if DELAYED_MKTEXPK
+ , TRUE
+#endif
+ )) {
+ report_open_error("Cannot open DVI file", filename, errflag);
+ retval = False;
+ }
+ }
+ return retval;
+}
+
+/**
+ ** form_dvi_property forms the property used to exhibit the dvi file name
+ ** used as a window property (used for source specials).
+ **/
+
+void
+form_dvi_property(void)
+{
+#if 0
+ size_t len;
+ unsigned long ino;
+ int i;
+#endif
+
+ if (m_dvi_fp == NULL)
+ return;
+
+ if (dvi_property != NULL)
+ free(dvi_property);
+
+ dvi_property_length = strlen(globals.dvi_name) + 1; /* also copy the terminating 0 */
+ dvi_property = xmalloc(dvi_property_length);
+
+ /* NOTE: we don't use dvi_inode like non-k xdvi, since xdvik keeps closer
+ track of when the path points to a different inode. */
+ strcpy(dvi_property, globals.dvi_name);
+}
+
+
+/* access for m_dvi_fp */
+void
+close_old_filep(void)
+{
+ if (m_dvi_fp != NULL) {
+ fclose(m_dvi_fp);
+ m_dvi_fp = NULL;
+ if (!resource.use_temp_fp)
+ globals.dvi_file.bak_fp = NULL;
+ }
+}
+
+
+
+/**
+ ** Check for changes in dvi file.
+ ** Return True if file has changed, False else.
+ **/
+
+Boolean
+dvi_file_changed(void)
+{
+ TRACE_FILES((stderr, "dvi_file_changed: fp = %p?", (void *)m_dvi_fp));
+
+ /* fprintf(stderr, "m_dvi_fp3: %p (%s)\n", m_dvi_fp, globals.dvi_name); */
+ if (m_dvi_fp == NULL) {
+ TRACE_FILES((stderr, "m_dvi_fp == NULL"));
+ if (stat(globals.dvi_name, &fstatbuf) == 0 && fstatbuf.st_mtime != globals.dvi_file.time) {
+ TRACE_FILES((stderr, "file changed"));
+ if (resource.use_temp_fp) {
+ dviErrFlagT errflag = NO_ERROR;
+#if !DELAYED_MKTEXPK
+ if (resource.watch_file == 0.0)
+ statusline_info(STATUS_MEDIUM, "File changed ...");
+ TRACE_FILES((stderr, "returning FALSE"));
+#endif
+ if (file_exists_p(globals.dvi_name, &errflag)
+ && process_preamble(m_dvi_fp, &errflag)
+ && find_postamble(m_dvi_fp, &errflag)
+ && read_postamble(m_dvi_fp, &errflag, False
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
+ TRACE_FILES((stderr, "File OK, reloading ..."));
+
+ globals.ev.flags |= EV_RELOAD;
+ return True;
+ }
+ else {
+#if DELAYED_MKTEXPK
+ if (resource.watch_file == 0.0)
+ statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ...");
+ TRACE_FILES((stderr, "returning FALSE"));
+#endif
+ return False;
+ }
+ }
+ /* Bug alert: Don't set EV_RELOAD again here, else xdvi
+ can go into a stretch of time where it again and again
+ tries to reload a file even if the user doesn't click
+ on the canvas.
+ */
+ /*
+ else {
+ globals.ev.flags |= EV_RELOAD;
+ }
+ */
+ TRACE_FILES((stderr, "returning TRUE"));
+ return True;
+ }
+ else {
+ TRACE_FILES((stderr, "file not changed"));
+ }
+ }
+ /* BUG ALERT: Don't use fstat(fileno(m_dvi_fp) here; if file hase
+ disappeared, this won't report an error! */
+ else if (stat(globals.dvi_name, &fstatbuf) != 0 /* stat failed ... */
+ || fstatbuf.st_mtime != globals.dvi_file.time /* ... or different timestamp, reload: */) {
+ dviErrFlagT errflag = NO_ERROR;
+
+ TRACE_FILES((stderr, "Stat failed, or different timestamp ..."));
+ globals.dvi_file.time = 0; /* force reload next time also if stat failed */
+
+ if (resource.use_temp_fp) { /* in this case, reload only if file has been written completely */
+ if (resource.watch_file == 0.0) {
+ statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ...");
+ globals.cursor.flags |= CURSOR_CORRUPTED;
+ globals.ev.flags |= EV_CURSOR;
+ }
+ else {
+ statusline_info(STATUS_MEDIUM, "File corrupted (will try to reload) ...");
+ }
+ close_old_filep();
+ if (file_exists_p(globals.dvi_name, &errflag)
+ && process_preamble(m_dvi_fp, &errflag)
+ && find_postamble(m_dvi_fp, &errflag)
+ && read_postamble(m_dvi_fp, &errflag, False
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
+ TRACE_FILES((stderr, "File OK, reloading ..."));
+
+ globals.ev.flags |= EV_RELOAD;
+ return True;
+ }
+ else {
+ TRACE_FILES((stderr, "NO successful load: %s", get_dvi_error(errflag)));
+ /* fprintf(stderr, "=========== NO successful load: %s\n", get_dvi_error(errflag)); */
+ return False;
+ }
+ }
+ else {
+ TRACE_FILES((stderr, "Not using temp fp, reloading..."));
+ globals.ev.flags |= EV_RELOAD;
+ return True;
+ }
+ }
+ return False;
+}
+
+/**
+ ** Reload the dvi file (unconditionally). Return True on success, False else.
+ **/
+
+Boolean
+load_dvi_file(
+#if !DELAYED_MKTEXPK
+ Boolean load_fonts,
+#endif
+ dviErrFlagT *errflag)
+{
+ unsigned int old_page_w, old_page_h;
+ static ino_t dvi_inode = 0;
+
+ TRACE_FILES((stderr, "load_dvi_file: going to read %p", (void *)m_dvi_fp));
+
+ if (resource.use_temp_fp && m_dvi_fp != NULL) {
+ /* in this case, reload only if file has been written completely */
+ *errflag = NO_ERROR;
+ fseek(m_dvi_fp, 0L, SEEK_SET);
+ if (!process_preamble(m_dvi_fp, errflag)
+ || !find_postamble(m_dvi_fp, errflag)
+ || !read_postamble(m_dvi_fp, errflag,
+#if DELAYED_MKTEXPK
+ False, False
+#else
+ True
+#endif
+ )) {
+ TRACE_FILES((stderr, "reading of %p failed: %s!",
+ (void *)m_dvi_fp,
+ get_dvi_error(*errflag)));
+ return False;
+ }
+ }
+
+ old_page_w = globals.page.w;
+ old_page_h = globals.page.h;
+
+ *errflag = NO_ERROR;
+
+#if DELAYED_MKTEXPK
+ /* use same trick with reading postamble twice to first find names of PK fonts
+ that need to be created. */
+ reset_missing_font_count();
+ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile);
+#endif
+
+ if (!internal_open_dvi(globals.dvi_name, errflag,
+#if DELAYED_MKTEXPK
+ True, False
+#else
+ load_fonts
+#endif
+ )) {
+ XClearWindow(DISP, mane.win);
+ xdvi_bell();
+ statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag),
+ resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)");
+ close_old_filep();
+
+ return False;
+ }
+#if DELAYED_MKTEXPK
+ /* second time */
+ kpse_set_program_enabled(kpse_any_glyph_format, True, kpse_src_compile);
+
+ if (!internal_open_dvi(globals.dvi_name, errflag, True, True)) {
+ XClearWindow(DISP, mane.win);
+ xdvi_bell();
+ statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag),
+ resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)");
+ close_old_filep();
+ return False;
+ }
+#endif
+ else { /* success */
+ if (fstatbuf.st_ino != dvi_inode) {
+ dvi_inode = fstatbuf.st_ino;
+ form_dvi_property();
+ set_dvi_property();
+ }
+ if (globals.page.w != old_page_w || globals.page.h != old_page_h)
+ reconfig();
+
+ htex_reinit();
+
+ globals.cursor.flags &= ~CURSOR_CORRUPTED;
+ return True;
+ }
+}
diff --git a/Build/source/texk/xdvik/dvi-init.h b/Build/source/texk/xdvik/dvi-init.h
new file mode 100644
index 00000000000..ad478fa9cbd
--- /dev/null
+++ b/Build/source/texk/xdvik/dvi-init.h
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 1990-2013 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef DVI_INIT_H_
+#define DVI_INIT_H_
+
+#include "xdvi.h"
+
+#if FREETYPE
+# include <ft2build.h>
+# include FT_FREETYPE_H
+#endif
+
+typedef enum {
+ NO_ERROR = 0,
+ WRONG_DVI_VERSION,
+ DVI_CORRUPTED,
+ NOT_A_DVI_FILE,
+ POSTAMBLE_NO_POST,
+ POSTAMBLE_NO_MATCH,
+ POSTAMBLE_NON_FNTDEF,
+ NOT_ALL_PIXEL_FILES_FOUND,
+ NO_BOP_AT_PAGEDESC,
+ FILE_HAS_ZERO_SIZE,
+ FILE_DOESNT_EXIST,
+ FILE_IS_DIRECTORY,
+ PS_CONVERSION_FAILED,
+ PDF_CONVERSION_FAILED,
+ UNKNOWN_ERROR
+} dviErrFlagT;
+
+extern const char *get_dvi_error(dviErrFlagT flag);
+
+extern Boolean internal_open_dvi(const char *path, dviErrFlagT *errmsg,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ );
+extern char *open_dvi_file_wrapper(const char *filename,
+ Boolean from_command_line,
+ Boolean open_new_instance,
+ Boolean *tried_dvi_ext,
+ Boolean from_file_history);
+extern char *get_tmp_dvi_name(void);
+
+/* font stuff */
+
+/*
+ * Bitmap structure for raster ops.
+ */
+struct bitmap {
+ unsigned short w, h; /* width and height in pixels */
+ short bytes_wide; /* scan line width in bytes */
+ char *bits; /* pointer to the bits */
+};
+
+/*
+ * Per-character information.
+ * There is one of these for each character in a font (non-virtual fonts only).
+ * All fields are filled in at font definition time,
+ * except for the bitmap, which is "faulted in"
+ * when the character is first referenced.
+ */
+struct glyph {
+ long addr; /* address of bitmap in font file */
+ long dvi_adv; /* DVI units to move reference point */
+ short x, y; /* x and y offset in pixels */
+ struct bitmap bitmap; /* bitmap for character */
+ short x2, y2; /* x and y offset in pixels for shrunken bitmap */
+#if GREY
+# if COLOR
+ struct fgrec *fg; /* fgrec for which these pixmaps are valid */
+# endif
+ /* `2' means `shrunken' here */
+ XImage *image2; /* shrunken pixmap for antialiased character */
+ char *pixmap2; /* image data pointer for image2 */
+ char *pixmap2_gc2; /* separate image data for drawing image to globals.gc.fore2 */
+#endif /* GREY */
+ struct bitmap bitmap2; /* shrunken bitmap for character */
+};
+
+/*
+ * Per-character information for virtual fonts
+ */
+struct macro {
+ ubyte *pos; /* address of first byte of macro */
+ ubyte *end; /* address of last+1 byte */
+ long dvi_adv; /* DVI units to move reference point */
+ Boolean free_me; /* if free(pos) should be called when */
+ /* freeing space */
+};
+
+/*
+ * The layout of a font information block.
+ * There is one of these for every loaded font or magnification thereof.
+ * Duplicates are eliminated: this is necessary because of possible recursion
+ * in virtual fonts.
+ *
+ * Also note the strange units. The design size is in 1/2^20 point
+ * units (also called micro-points), and the individual character widths
+ * are in the TFM file in 1/2^20 ems units, i.e., relative to the design size.
+ *
+ * We then change the sizes to SPELL units (unshrunk pixel / 2^16).
+ */
+
+#define NOMAGSTP (-29999)
+
+#define FONT_IN_USE 1 /* used for housekeeping */
+#define FONT_LOADED 2 /* if font file has been read */
+#define FONT_VIRTUAL 4 /* if font is virtual */
+
+/* forward declarations */
+struct font;
+struct tn;
+
+typedef void (*read_char_proc) (struct font *, wide_ubyte);
+
+struct font {
+ struct font *next; /* link to next font info block */
+ char *fontname; /* name of font */
+ float fsize; /* size information (dots per inch) */
+ int magstepval; /* magstep number * two, or NOMAGSTP */
+ FILE *file; /* open font file or NULL */
+ const char *filename; /* name of font file */
+ long checksum; /* checksum */
+ unsigned short timestamp; /* for LRU management of fonts */
+ ubyte flags; /* flags byte (see values below) */
+ wide_ubyte maxchar; /* largest character code */
+ double dimconv; /* size conversion factor */
+ set_char_proc set_char_p; /* proc used to set char */
+ /* these fields are used by (loaded) non-virtual fonts */
+ read_char_proc read_char; /* function to read bitmap */
+ struct glyph *glyph;
+ /* these fields are used by (loaded) virtual fonts */
+ struct font **vf_table; /* list of fonts used by this vf */
+ struct tn *vf_chain; /* ditto, if TeXnumber >= VFTABLELEN */
+ struct font *first_font; /* first font defined */
+ struct macro *macro;
+#if FREETYPE
+ /* these fields are used by (loaded) FreeType fonts */
+ struct ftfont *ft; /* master record for font (all sizes) */
+ double pixsize; /* scaled size of the font in pixels */
+ FT_Size size;
+ struct font *next_size; /* next font from same face */
+#endif
+};
+
+struct tn {
+ struct tn *next; /* link to next TeXnumber info block */
+ unsigned long TeXnumber; /* font number (in DVI file) */
+ struct font *fontp; /* pointer to the rest of the info */
+};
+
+
+extern void reset_fonts(void);
+#if COLOR
+extern void reset_colors(void);
+extern void full_reset_colors(void);
+#endif
+extern void realloc_font(struct font *, wide_ubyte);
+extern void realloc_virtual_font(struct font *, wide_ubyte);
+extern Boolean load_font(struct font *
+#if DELAYED_MKTEXPK
+ , Boolean load_font_now
+#endif
+ );
+
+extern struct font *define_font(
+#if DELAYED_MKTEXPK
+ Boolean read_fonts,
+ Boolean initialize_fonts,
+#else
+ Boolean load_font_now,
+#endif
+ FILE *,
+ wide_ubyte,
+ struct font *,
+ struct font **,
+ unsigned int,
+ struct tn **,
+ Boolean *not_found_flag);
+extern void init_page(void);
+extern void form_dvi_property(void);
+extern Boolean dvi_file_changed(void);
+extern Boolean load_dvi_file(
+#if !DELAYED_MKTEXPK
+ Boolean load_fonts,
+#endif
+ dviErrFlagT *errflag);
+extern void read_PK_index(struct font *, wide_bool);
+extern void read_GF_index(struct font *, wide_bool);
+extern unsigned long read_VF_index(struct font *, wide_bool);
+
+#if FREETYPE
+extern Boolean load_ft_font(struct font *fontp);
+#endif
+
+extern Boolean set_paper_type(const char *arg);
+
+extern Boolean find_postamble(FILE *fp, dviErrFlagT *errflag);
+extern Boolean read_postamble(FILE *fp, dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ );
+extern void close_old_filep(void);
+extern Boolean process_preamble(FILE *fp, dviErrFlagT *errflag);
+
+extern FILE *file_exists(const char *path, dviErrFlagT *errflag);
+extern char *find_dvi_file(const char *filename, Boolean *tried_dvi_ext, Boolean from_file_history);
+#endif /* DVI_INIT_H_ */
diff --git a/Build/source/texk/xdvik/dvi.h b/Build/source/texk/xdvik/dvi.h
new file mode 100644
index 00000000000..392712138fa
--- /dev/null
+++ b/Build/source/texk/xdvik/dvi.h
@@ -0,0 +1,64 @@
+/*
+ * Mnemonics for bytes in dvi file.
+ */
+
+#define SETCHAR0 0
+#define SET1 128
+#define SET2 129
+#define SETRULE 132
+#define PUT1 133
+#define PUT2 134
+#define PUTRULE 137
+#define NOP 138
+#define BOP 139
+#define EOP 140
+#define PUSH 141
+#define POP 142
+#define RIGHT1 143
+#define RIGHT2 144
+#define RIGHT3 145
+#define RIGHT4 146
+#define W0 147
+#define W1 148
+#define W2 149
+#define W3 150
+#define W4 151
+#define X0 152
+#define X1 153
+#define X2 154
+#define X3 155
+#define X4 156
+#define DOWN1 157
+#define DOWN2 158
+#define DOWN3 159
+#define DOWN4 160
+#define Y0 161
+#define Y1 162
+#define Y2 163
+#define Y3 164
+#define Y4 165
+#define Z0 166
+#define Z1 167
+#define Z2 168
+#define Z3 169
+#define Z4 170
+#define FNTNUM0 171
+#define FNT1 235
+#define FNT2 236
+#define FNT3 237
+#define FNT4 238
+#define XXX1 239
+#define XXX2 240
+#define XXX3 241
+#define XXX4 242
+#define FNTDEF1 243
+#define FNTDEF2 244
+#define FNTDEF3 245
+#define FNTDEF4 246
+#define PRE 247
+#define POST 248
+#define POSTPOST 249
+#define SREFL 250
+#define EREFL 251
+
+#define TRAILER 223 /* Trailing bytes at end of file */
diff --git a/Build/source/texk/xdvik/dvisel.c b/Build/source/texk/xdvik/dvisel.c
new file mode 100644
index 00000000000..1e52dc5453d
--- /dev/null
+++ b/Build/source/texk/xdvik/dvisel.c
@@ -0,0 +1,762 @@
+/*
+ * select pages from a DVI file.
+ *
+ * Copyright (c) 1999
+ * WATANABE Takeshi watanabe@komadori.planet.sci.kobe-u.ac.jp
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL ANY AUTHO OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "xdvi-config.h"
+
+#include <string.h>
+#include <ctype.h>
+
+#include "dvi.h"
+#include "pagesel.h"
+#include "dvisel.h"
+#include "util.h"
+#include "dvi-init.h"
+#include "events.h"
+#include "dvi-draw.h"
+#include "message-window.h"
+#include "statusline.h"
+#include "print-dialog.h"
+
+/* stack for HTEX / Color stack */
+typedef enum { IS_A_HREF, IS_A_COLOR } stackElemT;
+
+/*
+ * Length of BOP command, without p[4] (previous BOP pointer):
+ * bop c_0[4] ... c_9[4]
+ */
+static const int BOP_PART_LEN = 1 + 10 * 4;
+/*
+ * Like above but with p[4]:
+ */
+static const int BOP_LEN = 1 + 10 * 4 + 4;
+/*
+ * Lenght of postamble:
+ * post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2]
+ */
+static const int POSTAMBLE_LEN = 1 + 4 * 6 + 2 + 2;
+/*
+ * Postamble without p[4] (final bop offset) and t[2] (total page number):
+ * num[4] den[4] mag[4] l[4] u[4] s[2]
+ */
+static const int POSTAMBLE_PART_LEN = 4 * 5 + 2;
+
+static char *dvips_papersize_special = NULL;
+
+/*
+ * Struct to save specials that need to be copied verbatim into the output file
+ * (things like `draftcopy'; see dvips manual, `Literal headers')
+ */
+struct literal_headers {
+ size_t size;
+ char **headers;
+};
+static struct literal_headers literal_headers = { 0, NULL };
+
+static struct specials_stack color_stack = { 0, NULL};
+static struct specials_stack href_stack = { 0, NULL};
+
+/*
+ stacks saved from the previous page (i.e. active at the
+ beginning of the page)
+*/
+static struct specials_stack color_save_stack = { 0, NULL };
+static struct specials_stack href_save_stack = { 0, NULL };
+
+static void
+push_stack(struct specials_stack *stack, const char *content)
+{
+ stack->items = xrealloc(stack->items, (stack->stack_len + 1) * sizeof *(stack->items));
+ stack->items[stack->stack_len].content = xstrdup(content);
+ stack->stack_len++;
+}
+
+static Boolean
+stack_contains_item(struct specials_stack *stack, const char *str)
+{
+ size_t i;
+ for (i = 0; i < stack->stack_len; i++) {
+ if (strcmp(str, stack->items[i].content) == 0) {
+ return True;
+ }
+ }
+ return False;
+}
+
+static void
+pop_stack(struct specials_stack *stack)
+{
+ ASSERT(stack->stack_len >= 1, "Attempt to pop empty stack");
+ free(stack->items[stack->stack_len - 1].content);
+ stack->stack_len--;
+}
+
+static void
+empty_stack(struct specials_stack *stack)
+{
+ while(stack->stack_len > 0) {
+ pop_stack(stack);
+ }
+}
+
+/*
+ This is used instead of struct tn, and struct font* from dvi-init.h,
+ since it appears that we don't need all the information from there.
+*/
+static struct fontinfo {
+ long TeXnumber;
+ unsigned char info[14];
+ char *fontname;
+ struct fontinfo *next;
+ Boolean used;
+} *fontinfo_head;
+
+#define PutFour(num, fp) { \
+ putc(((num) >> 24) & 0xff, (fp)); \
+ putc(((num) >> 16) & 0xff, (fp)); \
+ putc(((num) >> 8) & 0xff, (fp)); \
+ putc( (num) & 0xff, (fp)); \
+}
+
+#define CopyNum(fin, fout, num) { \
+ int m = num; \
+ while (--m >= 0) putc(getc(fin), fout); \
+}
+
+static void
+FontWrite(FILE *fout, struct fontinfo *fontp, long *fout_pos)
+{
+ if (fontp->TeXnumber > 0xff) {
+ if (fontp->TeXnumber > 0xffff) {
+ if (fontp->TeXnumber > 0xffffff) {
+ putc(FNTDEF4, fout);
+ putc((fontp->TeXnumber >> 24) & 0xff, fout);
+ (*fout_pos)++;
+ }
+ else {
+ putc(FNTDEF3, fout);
+ }
+ putc((fontp->TeXnumber >> 16) & 0xff, fout);
+ (*fout_pos)++;
+ }
+ else {
+ putc(FNTDEF2, fout);
+ }
+ putc((fontp->TeXnumber >> 8) & 0xff, fout);
+ (*fout_pos)++;
+ }
+ else {
+ putc(FNTDEF1, fout);
+ }
+ putc(fontp->TeXnumber & 0xff, fout);
+ (void)fwrite(fontp->info, sizeof(char), 14, fout);
+ (void)fwrite(fontp->fontname, sizeof(char), fontp->info[12] + fontp->info[13], fout);
+ (*fout_pos) += 2 + 14 + fontp->info[12] + fontp->info[13];
+}
+
+/*
+ Invoked by spcl_scan; saves file names referenced by special commands
+ into the `warn_files' field of `info'.
+*/
+static Boolean
+scan_for_included_files(char *special, int str_len, void *my_info)
+{
+ struct select_pages_info *info = (struct select_pages_info *)my_info;
+ UNUSED(str_len);
+ if (info->warn_files.items == NULL) /* no info needed, e.g. when printing */
+ return True;
+
+ while (*special == ' ' || *special == '\t')
+ ++special;
+
+ if (memicmp(special, "psfile=", strlen("psfile=")) == 0) {
+ char *b_ptr = special + strlen("psfile=");
+ char *e_ptr;
+
+ while (*b_ptr == '"')
+ b_ptr++;
+
+ if ((e_ptr = strchr(b_ptr, '"')) != NULL) {
+ size_t len = e_ptr - b_ptr;
+ char *tmp = xmalloc(len + 1);
+ memcpy(tmp, b_ptr, len);
+ tmp[len] = '\0';
+ if (!stack_contains_item(&(info->warn_files), tmp)) {
+ push_stack(&(info->warn_files), tmp);
+ }
+ free(tmp);
+ }
+ }
+
+ return True; /* dummy */
+}
+
+/*
+ Invoked by spcl_scan; saves hyperref and color commands
+ into the global stacks `color_stack' and `hyperref_stack'.
+ FIXME: In reality char *special is treated as const, but the declaration
+ of spcl_scan doesn't allow for this.
+*/
+static Boolean
+stack_save(char *special, int str_len, void *data)
+{
+ char *ptr;
+ size_t len;
+
+ UNUSED(data);
+ UNUSED(str_len);
+
+ while (isspace((int)*special))
+ ++special;
+
+ ptr = special;
+
+ if (memicmp(special, "color ", len = strlen("color ")) == 0) {
+ special += len;
+ while (*special == ' ' || *special == '\t')
+ ++special;
+ if (memicmp(special, "push ", 5) == 0) {
+ push_stack(&color_stack, ptr);
+ }
+ else if (memicmp(special, "pop", 3) == 0) {
+ pop_stack(&color_stack);
+ }
+ }
+ else if (memicmp(special, "html:", len = strlen("html:")) == 0) {
+ /* fprintf(stderr, "++++ special: %s; fd: %ld\n", special + 5, ftell(globals.dvi_file.bak_fp)); */
+ special += len;
+ if (memicmp(special, "<a href=", 8) == 0
+ || memicmp(special, "<a name=", 8) == 0) {
+ push_stack(&href_stack, ptr);
+ }
+ else if (memicmp(special, "</a>", 4) == 0) {
+ pop_stack(&href_stack);
+ }
+ }
+ else if (memicmp(special, "papersize", len = strlen("papersize")) == 0) {
+ free(dvips_papersize_special);
+ dvips_papersize_special = xstrdup(special);
+ }
+ else if (*special == '!'
+ || memcmp(special, "header", strlen("header")) == 0) {
+ size_t idx = literal_headers.size++;
+ if (globals.debug & DBG_GUI)
+ fprintf(stderr, "(literal) header %lu: |%s|\n", (unsigned long)idx, special);
+ literal_headers.headers = xrealloc(literal_headers.headers,
+ literal_headers.size * sizeof *(literal_headers.headers));
+ literal_headers.headers[idx] = xstrdup(special);
+ }
+ return True; /* dummy */
+}
+
+/* write a special to the FILE *fp, updating offset as appropriate. */
+static void
+write_special(const char *str, FILE *fp, long *offset)
+{
+ unsigned int len = strlen(str);
+ if (len < 256) {
+ unsigned char c = len;
+ putc(XXX1, fp);
+ putc(c, fp);
+ *offset += 2;
+ }
+ else { /* how about xxx2, xxx3? It seems that TeX doesn't use them either? */
+ putc(XXX4, fp);
+ PutFour(len, fp);
+ *offset += 5;
+ }
+ fputs(str, fp);
+ *offset += len;
+}
+
+/*
+ * Dump the headers in the global list `literal_headers',
+ * and free up resources
+ */
+static void
+dump_literal_headers(FILE *fp, long *pos)
+{
+ size_t i;
+ for (i = 0; i < literal_headers.size; i++) {
+ write_special(literal_headers.headers[i], fp, pos);
+ free(literal_headers.headers[i]);
+ }
+ free(literal_headers.headers);
+ literal_headers.headers = NULL;
+ literal_headers.size = 0;
+}
+
+
+static void
+scan_page_for_specials(FILE *fp, int page, Boolean save_stack,
+ Boolean (*special_proc)(char *str, int str_len, void *data),
+ struct select_pages_info *info)
+{
+ off_t pos_save;
+ static ubyte my_scan_buffer[DVI_BUFFER_LEN];
+
+ struct drawinf currinf_save;
+ ubyte maxchar_save;
+ size_t i;
+ TRACE_GUI((stderr, "parsing page: %d", page));
+ if (save_stack) {
+ /*
+ first, copy the current stacks (which reflect the state on the
+ preceding page) to color_save_stack and href_save_stack:
+ */
+ empty_stack(&color_save_stack);
+ empty_stack(&href_save_stack);
+ for (i = 0; i < color_stack.stack_len; i++) {
+ TRACE_GUI((stderr, "saving stack: |%s|", color_stack.items[i].content));
+ push_stack(&color_save_stack, color_stack.items[i].content);
+ }
+ for (i = 0; i < href_stack.stack_len; i++) {
+ TRACE_GUI((stderr, "saving stack: |%s|", href_stack.items[i].content));
+ push_stack(&href_save_stack, href_stack.items[i].content);
+ }
+ }
+
+ /* (void)fseek(fp, pageinfo_get_offset(page), SEEK_SET); */
+ /*
+ The datastructures in dvi-draw are rather weird in requiring
+ us to provide a buffer, and point the global currinf.pos and end
+ pointers to that buffer, for spcl_scan to be able to scan the file.
+ First save the contents of the exising currinf, pointing to the main file:
+ */
+ pos_save = save_file_status(fp, &currinf_save, &maxchar_save);
+
+ lseek(fileno(fp), pageinfo_get_offset(page), SEEK_SET);
+ memset((char *)&currinf.data, 0, sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+
+ /* then point currinf to our own buffer: */
+ G_dvi_buf_ptr = my_scan_buffer;
+ currinf.pos = currinf.end = G_dvi_buf_ptr;
+ lseek(fileno(fp), pageinfo_get_offset(page), SEEK_SET);
+ /*
+ finally we may invoke spcl_scan(). I hope we can do without
+ the
+ (!setjmp(some_env))
+ black magic since there shouldn't be any interruptions ...
+ */
+#if 1
+ spcl_scan(special_proc, info, False, fp);
+#else
+ /* this is an attempt at using setjmp(), but it's just too ugly ... */
+ for (;;) {
+ int page_bak;
+ if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE)
+ break;
+ page_bak = page;
+ if (!setjmp(globals.ev.canit)) {
+ fprintf(stderr, "current position: %lu; seeking to: %lu\n",
+ (unsigned long)pos_save,
+ (unsigned long)pageinfo_get_offset(page));
+ (void) fprintf(stderr, "seeking to offset %ld, page %d of file %d\n",
+ pageinfo_get_offset(page),
+ page, fileno(globals.dvi_file.bak_fp));
+ fseek(fp, pageinfo_get_offset(page), SEEK_SET);
+ spcl_scan(special_proc, info, False);
+ }
+ else { /* if interrupted */
+ fprintf(stderr, "========= interrupted!\n");
+ if (page >= page_bak)
+ page = page_bak;
+ break;
+ }
+ if (page >= current_page)
+ break;
+ page++;
+ }
+#endif
+ /* now we restore those pesky globals, hoping that nobody
+ has stamped upon them in the meantime. */
+ restore_file_status(fp, currinf_save, maxchar_save, pos_save);
+
+ /* reposition file pointer */
+ (void)fseek(fp, pageinfo_get_offset(page), SEEK_SET);
+}
+
+
+/* dump the `open' commands on the current stack to the FILE *fp */
+static void
+stack_dump_open_commands(FILE *fp, long *pos)
+{
+ size_t i;
+ TRACE_GUI((stderr, "length of stacks: %lu, %lu",
+ (unsigned long)color_save_stack.stack_len,
+ (unsigned long)href_save_stack.stack_len));
+ for (i = 0; i < color_save_stack.stack_len; i++) {
+ TRACE_GUI((stderr, "dumping: |%s|", color_save_stack.items[i].content));
+ write_special(color_save_stack.items[i].content, fp, pos);
+ }
+ for (i = 0; i < href_save_stack.stack_len; i++) {
+ TRACE_GUI((stderr, "dumping: |%s|", href_save_stack.items[i].content));
+ write_special(href_save_stack.items[i].content, fp, pos);
+ }
+ if (dvips_papersize_special != NULL)
+ write_special(dvips_papersize_special, fp, pos);
+ TRACE_GUI((stderr, "end of dumping open\n"));
+}
+
+/* dump `close' commands for all the `open' commands on the
+ current stack (not the saved one, but the one active at the end of the page)
+ to the FILE *fp (closing tags for hyperref anchors,
+ `pop' commands for color specials).
+*/
+static void
+stack_dump_close_commands(FILE *fp, long *pos)
+{
+ size_t i;
+
+ for (i = color_stack.stack_len; i > 0; i--) {
+ TRACE_GUI((stderr, "===== color pop"));
+ write_special("color pop", fp, pos);
+ }
+ for (i = href_stack.stack_len; i > 0; i--) {
+ TRACE_GUI((stderr, "===== html:</a>"));
+ write_special("html:</a>", fp, pos);
+ }
+}
+
+
+static void
+WriteDVI(FILE *fin, FILE *fout, long *fout_pos, int c)
+{
+ int i, n;
+ struct fontinfo *fontp;
+
+ if (c >= FNTNUM0 && c <= FNT4) {
+ if (c >= FNT1)
+ n = get_bytes(fin, c - FNT1 + 1);
+ else
+ n = c - FNTNUM0;
+ for (fontp = fontinfo_head; fontp; fontp = fontp->next)
+ if (n == fontp->TeXnumber)
+ break;
+ if (fontp && fontp->used == False) {
+ fontp->used = True;
+ FontWrite(fout, fontp, fout_pos);
+ }
+ putc(c, fout);
+ (*fout_pos)++;
+ switch (c) {
+ case FNT4:
+ putc((n >> 24) & 0xff, fout);
+ (*fout_pos)++;
+ case FNT3:
+ putc((n >> 16) & 0xff, fout);
+ (*fout_pos)++;
+ case FNT2:
+ putc((n >> 8) & 0xff, fout);
+ (*fout_pos)++;
+ case FNT1:
+ putc(n & 0xff, fout);
+ (*fout_pos)++;
+ default:
+ break;
+ }
+ }
+ else if (c >= FNTDEF1 && c <= FNTDEF4) {
+ n = get_bytes(fin, c - FNTDEF1 + 1);
+ for (fontp = fontinfo_head; fontp; fontp = fontp->next)
+ if (n == fontp->TeXnumber)
+ break;
+ if (fontp && fontp->used == False) {
+ fontp->used = True;
+ FontWrite(fout, fontp, fout_pos);
+ }
+ (void) get_bytes(fin, 12);
+ (void) get_bytes(fin, (int)(get_byte(fin) + get_byte(fin)));
+ }
+ else {
+ putc(c, fout);
+ (*fout_pos)++;
+ n = 0;
+ if (c <= XXX4) {
+ for (i = 0; i < c - XXX1 + 1; i++) {
+ int x = get_byte(fin);
+ putc(x, fout);
+ (*fout_pos)++;
+ n = (n << 8) | x;
+ }
+ }
+ switch (c) {
+ case SETRULE:
+ case PUTRULE:
+ n += 4;
+ /* fall through */
+
+ case RIGHT4:
+ case W4:
+ case X4:
+ case DOWN4:
+ case Y4:
+ case Z4:
+ n++;
+ /* fall through */
+
+ case RIGHT3:
+ case W3:
+ case X3:
+ case DOWN3:
+ case Y3:
+ case Z3:
+ n++;
+ /* fall through */
+
+ case SET2:
+ case PUT2:
+ if (!resource.omega) {
+ dvi_fmt_error("%s:%d: WriteDVI: op-code %d only works with the \"-omega\" option",
+ __FILE__, __LINE__, c);
+ }
+ case RIGHT2:
+ case W2:
+ case X2:
+ case DOWN2:
+ case Y2:
+ case Z2:
+ n++;
+ /* fall through */
+
+ case SET1:
+ case PUT1:
+ case RIGHT1:
+ case W1:
+ case X1:
+ case DOWN1:
+ case Y1:
+ case Z1:
+#ifdef PTEX
+ case TDIR:
+#endif
+ n++;
+ /* fall through */
+
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ CopyNum(fin, fout, n);
+ (*fout_pos) += n;
+ /* fall through */
+
+ default:
+ break;
+ }
+ }
+}
+
+/* public functions */
+
+
+/* callback functions for selecting pages */
+Boolean
+check_pagerange(struct save_or_print_info *info, int page)
+{
+ return (page >= info->pinfo->from && page <= info->pinfo->to);
+}
+
+Boolean
+check_marked(struct save_or_print_info *info, int page)
+{
+ UNUSED(info);
+ return pageinfo_is_marked(page);
+}
+
+void
+select_pages(struct save_or_print_info *info)
+{
+ struct select_pages_info *pinfo = info->pinfo;
+ int c, n, page, pagecnt;
+ long fout_pos = 0L;
+ unsigned long curr_page_offset = 0xffffffff; /* pattern to be overwritten later */
+ unsigned long post_cmd_offset = 0xffffffff; /* pattern to be overwritten later */
+ struct fontinfo *fontp;
+ FILE *in_fp = info->finfo->in_fp;
+ FILE *out_fp = info->finfo->tmp_dvi_fp;
+
+ Boolean headers_dumped = False;
+ free(dvips_papersize_special); /* re-initialize */
+ dvips_papersize_special = NULL;
+
+ ASSERT(in_fp != NULL, "input file mustn't be NULL in select_pages()!");
+ ASSERT(out_fp != NULL, "output file mustn't be NULL in select_pages()!");
+
+ pinfo->errflag = NO_ERROR; /* reset errflag, in case we're recovering from a previous error */
+
+ /* get font list from postamble; in_fp already has been positioned
+ at correct position (start of postamble) in caller. */
+ (void)fseek(in_fp, ftell(in_fp), SEEK_SET); /* paranoia */
+ (void)get_bytes(in_fp, POSTAMBLE_LEN);
+ fontinfo_head = NULL;
+ for (;;) {
+ if ((c = get_byte(in_fp)) < FNTDEF1 || c > FNTDEF4) /* maybe POSTPOST */
+ break;
+ fontp = (struct fontinfo *) xmalloc(sizeof(struct fontinfo));
+ fontp->TeXnumber = get_bytes(in_fp, c - FNTDEF1 + 1);
+ (void)fread(fontp->info, sizeof(char), 14, in_fp);
+ n = fontp->info[12] + fontp->info[13];
+ fontp->fontname = xmalloc(n);
+ (void)fread(fontp->fontname, sizeof(char), n, in_fp);
+ fontp->next = fontinfo_head;
+ fontinfo_head = fontp;
+ fontp->used = False;
+ }
+
+ /* preamble */
+ fseek(in_fp, 0L, SEEK_SET);
+ fout_pos = pageinfo_get_offset(0);
+ CopyNum(in_fp, out_fp, fout_pos);
+
+ /* each page */
+ pagecnt = 0;
+ for (page = 0; page < total_pages; page++) {
+ scan_page_for_specials(in_fp, page, True, stack_save, NULL);
+
+ /* should the current page be selected? */
+ if (pinfo->callback == NULL || pinfo->callback(info, page)) {
+ scan_page_for_specials(in_fp, page, False, scan_for_included_files, pinfo);
+
+ /* read BOP except for p[4] */
+ CopyNum(in_fp, out_fp, BOP_PART_LEN);
+ /* read p[4] (previous bop pointer */
+ (void)get_bytes(in_fp, 4);
+ /* write actual value of p[4] */
+ PutFour(curr_page_offset, out_fp);
+ /* remember offset of current page, for postamble */
+ curr_page_offset = fout_pos;
+ /* update fout_pos to current position */
+ fout_pos += BOP_LEN;
+
+ if (!headers_dumped) {
+ headers_dumped = True;
+ dump_literal_headers(out_fp, &fout_pos);
+ }
+
+ /* if (!written_pre_cmds) { */
+ stack_dump_open_commands(out_fp, &fout_pos);
+ /* written_pre_cmds = True; */
+ /* } */
+
+ while ((c = getc(in_fp)) != EOF) {
+ if ((c & 0x80) == 0) { /* ordinary character */
+ putc(c, out_fp);
+ fout_pos++;
+ }
+ else if (c == EOP) { /* End Of Page */
+ /* fprintf(stderr, "EOP at %ld\n", ftell(fin)); */
+
+ /* if (page == to) { */ /* print close stack for last page */
+ stack_dump_close_commands(out_fp, &fout_pos);
+ /* } */
+
+ putc(c, out_fp);
+ fout_pos++;
+ break;
+ }
+ else {
+ /* fprintf(stderr, "WRITE_DVI before: %ld, in_fp before: %ld\n", fout_pos, ftell(in_fp)); */
+ WriteDVI(in_fp, out_fp, &fout_pos, c);
+ /* fprintf(stderr, "WRITE_DVI after: %ld; in_fp after: %ld\n", fout_pos, ftell(in_fp)); */
+ }
+ /* HACK alert: force synchronization - why is this neccessary?
+ Seems to have something do with the fact that two FILE *'s on the same
+ file are open. POSIX.1,
+ `Interaction of File Descriptors and Standard I/O Streams' seems to
+ say the seek()s on one of them also affect the other, but I'm not sure
+ about this.
+ */
+ fseek(in_fp, 0L, SEEK_CUR);
+ }
+ pagecnt++;
+ }
+ }
+
+ /* postamble */
+ if (!find_postamble(in_fp, &(pinfo->errflag))) {
+ return;
+ }
+
+ /* read/write POST command */
+ putc(get_byte(in_fp), out_fp);
+ /* read over last page offset */
+ get_bytes(in_fp, 4);
+ /* write last page offset */
+ PutFour(curr_page_offset, out_fp);
+ /* remember start of POST */
+ post_cmd_offset = fout_pos;
+ /* copy part of postamble */
+ CopyNum(in_fp, out_fp, POSTAMBLE_PART_LEN);
+ /* read t[2], total number of pages */
+ get_bytes(in_fp, 2);
+ /* write t[2] (two calls) */
+ putc((pagecnt >> 8) & 0xff, out_fp);
+ putc(pagecnt & 0xff, out_fp);
+ /* update fout_pos to current pos */
+ fout_pos += POSTAMBLE_LEN;
+
+ /* output font list */
+ for (;;) {
+ if ((c = get_byte(in_fp)) < FNTDEF1 || c > FNTDEF4) /* maybe POSTPOST */
+ break;
+ n = get_bytes(in_fp, c - FNTDEF1 + 1);
+ for (fontp = fontinfo_head; fontp; fontp = fontp->next)
+ if (n == fontp->TeXnumber)
+ break;
+ if (fontp && fontp->used == True)
+ FontWrite(out_fp, fontp, &fout_pos);
+ (void) get_bytes(in_fp, 12);
+ (void) get_bytes(in_fp, (int)(get_byte(in_fp) + get_byte(in_fp)));
+ }
+
+ /* free list */
+ for (fontp = fontinfo_head; fontp;) {
+ struct fontinfo *nextp;
+ free(fontp->fontname);
+ nextp = fontp->next;
+ free(fontp);
+ fontp = nextp;
+ }
+
+ /* POSTPOST */
+ putc(c, out_fp);
+ get_bytes(in_fp, 4);
+ PutFour(post_cmd_offset, out_fp);
+ CopyNum(in_fp, out_fp, 1 + 4);
+ for (fout_pos += 1 + 4 + 1 + 4;
+ fout_pos & 3;
+ fout_pos++) {
+ putc(TRAILER, out_fp);
+ }
+
+ /* fclose(in_fp); */
+ fflush(out_fp);
+}
+
diff --git a/Build/source/texk/xdvik/dvisel.h b/Build/source/texk/xdvik/dvisel.h
new file mode 100644
index 00000000000..bf726b04ee3
--- /dev/null
+++ b/Build/source/texk/xdvik/dvisel.h
@@ -0,0 +1,42 @@
+/*
+ * select pages from a DVI file.
+ *
+ * The original version is:
+ * Copyright (c) 1999
+ * WATANABE Takeshi watanabe@komadori.planet.sci.kobe-u.ac.jp
+ *
+ * Heavily changed for xdvik:
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL ANY AUTHO OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef DVISEL_H_
+#define DVISEL_H_
+
+#include "dvi-init.h"
+#include "print-internal.h"
+
+/* callbacks */
+Boolean check_pagerange(struct save_or_print_info *info, int pageno);
+Boolean check_marked(struct save_or_print_info *info, int pageno);
+void select_pages(struct save_or_print_info *info);
+
+#endif /* DVISEL_H_ */
diff --git a/Build/source/texk/xdvik/encodings.c b/Build/source/texk/xdvik/encodings.c
new file mode 100644
index 00000000000..0ab172974ef
--- /dev/null
+++ b/Build/source/texk/xdvik/encodings.c
@@ -0,0 +1,4153 @@
+/* The unicode2adobe structure and the adobe2unicode_table mapping is taken
+ from the catdvi (v0.12) `adobetbl.h' source file; it has the following copyright:
+
+ catdvi - get text from DVI files
+ Copyright (C) 1999 Antti-Juhani Kaijanaho <gaia@iki.fi>
+ Copyright (C) 2001 Bjoern Brill <brill@fs.math.uni-frankfurt.de>
+
+ This program is free software; you can redistribute 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.
+*/
+
+/* Other parts are adapted from the GNU `iconv' library,
+ (search for `iconv'), which has the following copyright:
+
+ Copyright (C) 1999-2001 Free Software Foundation, Inc.
+
+ The GNU LIBICONV Library is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ The GNU LIBICONV Library is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU LIBICONV Library; see the file COPYING.LIB.
+ If not, write to the Free Software Foundation, Inc., 59 Temple Place -
+ Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+/* The rest of the file is Copyright (c) 2003-2013 the xdvik development team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#if HAVE_ICONV_H
+# include <iconv.h>
+static iconv_t m_iconv_gb_ucs4 = (iconv_t)(-1);
+#endif /* HAVE_ICONV_H */
+
+#include <ctype.h>
+
+#include "util.h"
+#include "encodings.h"
+#include "my-snprintf.h"
+#include "message-window.h"
+#include "exit-handlers.h"
+
+#define MY_DEBUG 0
+
+#define HAS_PREFIX(src,dst) (memcmp(src, dst, strlen(dst)) == 0)
+
+#if MY_DEBUG
+# define TRACE_FIND_VERBOSE(x) TRACE_FIND(x)
+#else
+# define TRACE_FIND_VERBOSE(x) /* as nothing */
+#endif
+
+/*
+ The following encoding vectors are copied from catdvi's enc/xyz.h files;
+ only the `.notdef' values have been replaced by 0 instead of 0x003f
+ (question mark) to make the mapping more flexible.
+*/
+
+/* from enc/texmsym.h */
+static uint32_t m_cm_symbol_encoding[256] = {
+ 0x2212, 0x00b7, 0x00d7, 0x2217, 0x00f7, 0x22c4, 0x00b1, 0x2213,
+ 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x25ef, 0x25e6, 0x2022,
+ /* 0x10 */
+ 0x224d, 0x2261, 0x2286, 0x2287, 0x2264, 0x2265, 0x227c, 0x227d,
+ 0x223c, 0x2248, 0x2282, 0x2283, 0x226a, 0x226b, 0x227a, 0x227b,
+ /* 0x20 */
+ 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2197, 0x2198, 0x2243,
+ 0x21d0, 0x21d2, 0x21d1, 0x21d3, 0x21d4, 0x2196, 0x2199, 0x221d,
+ /* 0x30 */
+ 0x2032, 0x221e, 0x2208, 0x220b, 0x25b3, 0x25bd, 0x10fffc, 0,
+ 0x2200, 0x2203, 0x00ac, 0x2205, 0x211c, 0x2111, 0x22a4, 0x22a5,
+ /* 0x40 */
+ 0x2135, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x222a, 0x2229, 0x228e, 0x2227, 0x2228,
+ /* 0x60 */
+ 0x22a2, 0x22a3, 0x230a, 0x230b, 0x2308, 0x2309, 0x007b, 0x007d,
+ 0x2329, 0x232a, 0x007c, 0x2225, 0x2195, 0x21d5, 0x005c, 0x2240,
+ /* 0x70 */
+ 0x221a, 0x2210, 0x2207, 0x222b, 0x2294, 0x2293, 0x2291, 0x2292,
+ 0x00a7, 0x2020, 0x2021, 0x00b6, 0x2663, 0x2666, 0x2665, 0x2660,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0b0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* cbgreek, greek encoding */
+static uint32_t m_cb_greek_encoding[256] = {
+ 0x2013, 0x20032f, 0x10144, 0x10145, 0x10146, 0x10147, 0x03db, 0x03db,
+ 0x1fbe, 0x1fbc, 0x1fcc, 0x1ffc, 0x0391, 0x03ab, 0x03b1, 0x03cb,
+ /* 0x10 */
+ 0x02cf, 0x02ce, 0x03df, 0x03d9, 0x20032e, 0x03d8, 0x03da, 0x03e0,
+ 0x20ac, 0x2030, 0x0259, 0x03e1, 0x2018, 0x2019, 0x02d8, 0x00af,
+ /* 0x20 */
+ 0x1fc1, 0x0021, 0x00a8, 0x0385, 0x1fed, 0x0025, 0x00b7, 0x0384,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x0387, 0x1ffe, 0x003d, 0x1fbf, 0x003b,
+ /* 0x40 */
+ 0x1fdf, 0x0391, 0x0392, 0x1fdd, 0x0394, 0x0395, 0x03a6, 0x0393,
+ 0x0397, 0x0399, 0x0398, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f,
+ /* 0x50 */
+ 0x03a0, 0x03a7, 0x03a1, 0x03a3, 0x03a4, 0x03d2, 0x1fde, 0x03a9,
+ 0x039e, 0x03a8, 0x0396, 0x005b, 0x1fcf, 0x005d, 0x1fce, 0x1fcd,
+ /* 0x60 */
+ 0x1fef, 0x03b1, 0x03b2, 0x03c2, 0x03b4, 0x03b5, 0x03c6, 0x03b3,
+ 0x03b7, 0x03b9, 0x03b8, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf,
+ /* 0x70 */
+ 0x03c0, 0x03c7, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0, 0x03c9,
+ 0x03be, 0x03c8, 0x03b6, 0x00ab, 0x037a, 0x00bb, 0x1fc0, 0x2014,
+ /* 0x80 */
+ 0x1f70, 0x1f01, 0x1f00, 0x1f03, 0x1fb2, 0x1f81, 0x1f80, 0x1f83,
+ 0x03ac, 0x1f05, 0x1f04, 0x1f02, 0x1fb4, 0x1f85, 0x1f84, 0x1f82,
+ /* 0x90 */
+ 0x1fb6, 0x1f07, 0x1f06, 0x03dd, 0x1fb7, 0x1f87, 0x1f86, 0,
+ 0x1f74, 0x1f21, 0x1f20, 0, 0x1fc2, 0x1f91, 0x1f90, 0,
+ /* 0xa0 */
+ 0x03ae, 0x1f25, 0x1f24, 0x1f23, 0x1fc4, 0x1f95, 0x1f94, 0x1f93,
+ 0x1fc6, 0x1f27, 0x1f26, 0x1f22, 0x1fc7, 0x1f97, 0x1f96, 0x1f92,
+ /* 0b0 */
+ 0x1f7c, 0x1f61, 0x1f60, 0x1f63, 0x1ff2, 0x1fa1, 0x1fa0, 0x1fa3,
+ 0x03ce, 0x1f65, 0x1f64, 0x1f62, 0x1ff4, 0x1fa5, 0x1fa4, 0x1fa2,
+ /* 0xc0 */
+ 0x1ff6, 0x1f67, 0x1f66, 0x03dc, 0x1ff7, 0x1fa7, 0x1fa6, 0,
+ 0x1f76, 0x1f31, 0x1f30, 0x1f33, 0x1f7a, 0x1f51, 0x1f50, 0x1f53,
+ /* 0xd0 */
+ 0x03af, 0x1f35, 0x1f34, 0x1f32, 0x03cd, 0x1f55, 0x1f54, 0x1f52,
+ 0x1fd6, 0x1f37, 0x1f36, 0x03aa, 0x1fe6, 0x1f57, 0x1f56, 0x03ab,
+ /* 0xe0 */
+ 0x1f72, 0x1f11, 0x1f10, 0x1f13, 0x1f78, 0x1f41, 0x1f40, 0x1f43,
+ 0x03ad, 0x1f15, 0x1f14, 0x1f12, 0x03cc, 0x1f45, 0x1f44, 0x1f42,
+ /* 0xf0 */
+ 0x03ca, 0x1fd2, 0x0390, 0x1fd7, 0x03cb, 0x1fe2, 0x03b0, 0x1fe7,
+ 0x1fb3, 0x1fc3, 0x1ff3, 0x1fe5, 0x1fe4, 0, 0x0374, 0x0375
+};
+
+/* from enc/texmital.h */
+static uint32_t m_cm_math_italics_encoding[256] = {
+ /* 0x00 */
+ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5,
+ 0x03a6, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03f5,
+ /* 0x10 */
+ 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd,
+ 0x03be, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d5, 0x03c7,
+ /* 0x20 */
+ 0x03c8, 0x03c9, 0x03b5, 0x03d1, 0x03d6, 0x03f1, 0x03c2, 0x03c6,
+ 0x21bc, 0x21bd, 0x21c0, 0x21c1, 0, 0, 0x22b3, 0x22b2,
+ /* 0x30 */
+ 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737,
+ 0xf738, 0xf739, 0x002e, 0x002c, 0x003c, 0x002f, 0x003e, 0x22c6,
+ /* 0x40 */
+ 0x2202, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x266d, 0x266e, 0x266f, 0x2323, 0x2322,
+ /* 0x60 */
+ 0x2113, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x0131, 0xf6be, 0x2118, 0x10fffb, 0x2040,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+
+static uint32_t m_bbold_encoding[256] = {
+ /* 0x00 */
+ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5,
+ 0x03a6, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03f5,
+ /* 0x10 */
+ 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd,
+ 0x03be, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d5, 0x03c7,
+ /* 0x20 */
+ 0x03c8, 0x0021, 0x201c, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x00a1, 0x003d, 0x00bf, 0x003f,
+ /* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x0028, 0x0029,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x002d, 0x007c, 0x2013, 0x201d, 0x03c9,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* from enc/texmext.h */
+static uint32_t m_cm_math_extended_encoding[256] = {
+ /* 0x00 */
+ 0x10ff00, 0x10ff01, 0x10ff02, 0x10ff03, 0x10ff04, 0x10ff05, 0x10ff06, 0x10ff07,
+ 0x10ff08, 0x10ff09, 0x10ff0a, 0x10ff0b, 0x10ff0c, 0x10ff0d, 0x10ff0e, 0x10ff0f,
+ /* 0x10 */
+ 0x10ff10, 0x10ff11, 0x10ff12, 0x10ff13, 0x10ff14, 0x10ff15, 0x10ff16, 0x10ff17,
+ 0x10ff18, 0x10ff19, 0x10ff1a, 0x10ff1b, 0x10ff1c, 0x10ff1d, 0x10ff1e, 0x10ff1f,
+ /* 0x20 */
+ 0x10ff20, 0x10ff21, 0x10ff22, 0x10ff23, 0x10ff24, 0x10ff25, 0x10ff26, 0x10ff27,
+ 0x10ff28, 0x10ff29, 0x10ff2a, 0x10ff2b, 0x10ff2c, 0x10ff2d, 0x10ff2e, 0x10ff2f,
+ /* 0x30 */
+ 0xf8eb, 0xf8f6, 0xf8ee, 0xf8f9, 0xf8f0, 0xf8fb, 0xf8ef, 0xf8fa,
+ 0xf8f1, 0xf8fc, 0xf8f3, 0xf8fe, 0xf8f2, 0xf8fd, 0xf8f4, 0xf8e6,
+ /* 0x40 */
+ 0xf8ed, 0xf8f8, 0xf8ec, 0xf8f7, 0x10ff44, 0x10ff45, 0x10ff46, 0x10ff47,
+ 0x10ff48, 0x10ff49, 0x10ff4a, 0x10ff4b, 0x10ff4c, 0x10ff4d, 0x10ff4e, 0x10ff4f,
+ /* 0x50 */
+ 0x10ff50, 0x10ff51, 0x10ff52, 0x10ff53, 0x10ff54, 0x10ff55, 0x10ff56, 0x10ff57,
+ 0x10ff58, 0x10ff59, 0x10ff5a, 0x10ff5b, 0x10ff5c, 0x10ff5d, 0x10ff5e, 0x10ff5f,
+ /* 0x60 */
+ 0x10ff60, 0x10ff61, 0x10ff62, 0x10ff63, 0x10ff64, 0x10ff65, 0x10ff66, 0x10ff67,
+ 0x10ff68, 0x10ff69, 0x10ff6a, 0x10ff6b, 0x10ff6c, 0x10ff6d, 0x10ff6e, 0x10ff6f,
+ /* 0x70 */
+ 0x10ff70, 0x10ff71, 0x10ff72, 0x10ff73, 0x10ff74, 0x10ff75, 0x10ff76, 0x10ff77,
+ 0x10ff78, 0x10ff79, 0x10ff7a, 0x10ff7b, 0x10ff7c, 0x10ff7d, 0x10ff7e, 0x10ff7f,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* from enc/textt.h */
+static uint32_t m_cm_typewriter_encoding[256] = {
+ /* 0x00 */
+ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5,
+ 0x03a6, 0x03a8, 0x03a9, 0x2191, 0x2193, 0x0027, 0x00a1, 0x00bf,
+ /* 0x10 */
+ 0x0131, 0xf6be, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da,
+ 0x00b8, 0x00df, 0x00e6, 0x0153, 0x00f8, 0x00c6, 0x0152, 0x00d8,
+ /* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ /* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x02dc, 0x00a8,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* from enc/ot1.h */
+static uint32_t m_ot1_encoding[256] = {
+ /* 0x00 */
+ 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a3, 0x03a5,
+ 0x03a6, 0x03a8, 0x03a9, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04,
+ /* 0x10 */
+ 0x0131, 0xf6be, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da,
+ 0x00b8, 0x00df, 0x00e6, 0x0153, 0x00f8, 0x00c6, 0x0152, 0x00d8,
+ /* 0x20 */
+ 0x0020, 0x0021, 0x201c, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x00a1, 0x003d, 0x00bf, 0x003f,
+ /* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x201d, 0x005d, 0x02c6, 0x02d9,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x2013, 0x2014, 0x0022, 0x02dc, 0x00a8,
+ /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* Cyrilic e.g. fro larm1000.mf; from
+ http://www.tug.org/tex-archive/macros/latex/contrib/t2/enc-maps/OT2uni.map */
+static uint32_t m_t2_encoding[256] = {
+ 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7,
+ 0x02d8, 0x00af, 0x02d9, 0x00b8, 0x02db, 0x04c0, 0x2329, 0x232a,
+ /* 0x10 */
+ 0x201c, 0x201d, 0xf6d5, 0xf6d6, 0xf6d4, 0x2013, 0x2014, 0xfeff,
+ 0x2080, 0x0131, 0xf6be, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04,
+ /* 0x20 */
+ 0x2420, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ /* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x002d,
+ /* 0x80 */
+ 0x0490, 0x0492, 0x0402, 0x040b, 0x04ba, 0x0496, 0x0498, 0x0409,
+ 0x0407, 0x049a, 0x04a0, 0x049c, 0x04d4, 0x04a2, 0x04a4, 0x0405,
+ /* 0x90 */
+ 0x04e8, 0x04aa, 0x040e, 0x04ae, 0x04b0, 0x04b2, 0x040f, 0x04b8,
+ 0x04b6, 0x0404, 0x04d8, 0x040a, 0x0401, 0x2116, 0x00a4, 0x00a7,
+ /* 0xa0 */
+ 0x0491, 0x0493, 0x0452, 0x045b, 0x04bb, 0x0497, 0x0499, 0x0459,
+ 0x0457, 0x049b, 0x04a1, 0x049d, 0x04d5, 0x04a3, 0x04a5, 0x0455,
+ /* 0xb0 */
+ 0x04e9, 0x04ab, 0x045e, 0x04af, 0x04b1, 0x04b3, 0x045f, 0x04b9,
+ 0x04b7, 0x0454, 0x04d9, 0x045a, 0x0451, 0x201e, 0x00ab, 0x00bb,
+ /* 0xc0 */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+ /* 0xd0 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+ /* 0xe0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+ /* 0xf0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+};
+
+/* from enc/cork.h */
+static uint32_t m_cork_encoding[256] = {
+ /* 0x00 */
+ 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7,
+ 0x02d8, 0x00af, 0x02d9, 0x00b8, 0x02db, 0x201a, 0x2039, 0x203a,
+ /* 0x10 */
+ 0x201c, 0x201d, 0x201e, 0x00ab, 0x00bb, 0x2013, 0x2014, 0x0020,
+ 0x0030, 0x0131, 0xf6be, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04,
+ /* 0x20 */
+ 0x2420, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ /* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x002d,
+ /* 0x80 */
+ 0x0102, 0x0104, 0x0106, 0x010c, 0x010e, 0x011a, 0x0118, 0x011e,
+ 0x0139, 0x013d, 0x0141, 0x0143, 0x0147, 0x10ffff, 0x0150, 0x0154,
+ /* 0x90 */
+ 0x0158, 0x015a, 0x0160, 0x015e, 0x0164, 0x0162, 0x0170, 0x016e,
+ 0x0178, 0x0179, 0x017d, 0x017b, 0x0132, 0x0130, 0x0111, 0x00a7,
+ /* 0xa0 */
+ 0x0103, 0x0105, 0x0107, 0x010d, 0x010f, 0x011b, 0x0119, 0x011f,
+ 0x013a, 0x013e, 0x0142, 0x0144, 0x0148, 0x10fffe, 0x0151, 0x0155,
+ /* 0xb0 */
+ 0x0159, 0x015b, 0x0161, 0x015f, 0x0165, 0x0163, 0x0171, 0x016f,
+ 0x00FF, 0x017a, 0x017e, 0x017c, 0x0133, 0x00a1, 0x00bf, 0x00a3,
+ /* 0xc0 */
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ /* 0xd0 */
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0152,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x10fffd,
+ /* 0xe0 */
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ /* 0xf0 */
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0153,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df
+};
+
+/* Newly created ts1-lm.h, which we use for TC (textcomp) fonts.
+ This only gets the accents and stuff from iso-latin1 right; lots of
+ the special characters aren't defined in the Adobe lookup list
+ used by catdvi's `pse2unic'.
+*/
+static uint32_t m_ts1_encoding[256] = {
+ /* 0x00 */
+ 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00a8, 0x02dd, 0x02da, 0x02c7,
+ 0x02d8, 0, 0x02d9, 0x00b8, 0x02db, 0, 0, 0,
+ /* 0x10 */
+ 0, 0, 0, 0, 0, 0x2013, 0xf6de, 0,
+ 0x2190, 0x2192, 0, 0, 0, 0, 0, 0,
+ /* 0x20 */
+ 0, 0, 0, 0, 0x0024, 0, 0, 0,
+ 0, 0, 0x2217, 0, 0x002c, 0, 0x002e, 0,
+ /* 0x30 */
+ 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737,
+ 0xf738, 0xf739, 0, 0, 0x2329, 0x2212, 0x232a, 0,
+ /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x2191, 0x2193,
+ /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x266a, 0,
+ /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x007e, 0x003d,
+ /* 0x80 */
+ 0, 0, 0, 0, 0x2020, 0x2021, 0, 0x2030,
+ 0x2022, 0, 0xf724, 0xf7a2, 0x0192, 0x20a1, 0, 0,
+ /* 0x90 */
+ 0, 0, 0x20a4, 0, 0, 0, 0x20ab, 0x2122,
+ 0, 0, 0, 0, 0, 0x212e, 0x25e6, 0,
+ /* 0xa0 */
+ 0, 0, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0, 0x00a9, 0x00aa, 0, 0x00ac, 0, 0x00ae, 0,
+ /* 0xb0 */
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0, 0, 0x00b6, 0x00b7,
+ 0, 0x00b9, 0x00ba, 0x221a, 0x00bc, 0x00bd, 0x00be, 0x20ac,
+ /* 0xc0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */
+ 0, 0, 0, 0, 0, 0, 0x00d7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */
+ 0, 0, 0, 0, 0, 0, 0x00f7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* blackletter fonts with funny encodings
+ */
+static uint32_t m_yfrak_encoding[176] = {
+ /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x10 */
+ 0x0131, 0xF6BE, 0x0060, 0x00b4, 0x02c7, 0x02d8, 0x00af, 0x02da,
+ 0x00b8, 0, 0x00df, 0, 0, 0, 0, 0,
+ /* 0x20 */
+ 0, 0x0021, 0x0022, 0x0023, 0, 0x0025, 0, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ /* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0, 0x003c, 0x003d, 0, 0x003f,
+ /* 0x40 */
+ 0, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ /* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x00ab, 0x005d, 0x005e, 0x02d9,
+ /* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ /* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x2013, 0x2014, 0x00a8, 0x02dd, 0,
+ /* 0x80 */ /* ch/ck ligatures treated as special cases */
+ 0, 0xfb00, 0xfb05, 0xfb00, 0xfb00, 0, 0, 0,
+ 0, 0x00e4, 0x00e4, 0, 0, 0x0073, 0, 0,
+ /* 0x90 */
+ 0x00eb, 0x00eb, 0, 0, 0, 0, 0, 0,
+ 0, 0x00f6, 0x00f6, 0, 0, 0, 0x00fc, 0x00fc,
+ /* 0xa0 */
+ 0, 0, 0, 0, 0x00B6, 0, 0, 0 /* sz */,
+ 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/*
+ Mapping table of adobe character names (from .enc files) to Unicode IDs.
+ Taken from catdvi's adobetbl.h; the original glyph list is available from:
+ http://partners.adobe.com/asn/tech/type/glyphlist.txt
+ All `private space' entries have been removed (I think they are of not
+ much use).
+
+ The names beginning with `$' have been added by the catdvi developers.
+
+ Changes:
+ - The macros DUP1/DUP2 have been #if 0'ed because I didn't understand them.
+ - `.notdef' has been replaced by 0 to remove ambiguity with the real question mark.
+
+ The list is sorted for strcmp() so that we can use bsearch() on it.
+*/
+static struct adobe2unicode adobe2unicode_table[] = {
+ { "$Delta" , 0x0394 }, /* GREEK CAPITAL LETTER DELTA; distinguish Adobe duplicates */
+ { "$Ohm" , 0x2126 }, /* OHM SIGN; distinguish Adobe duplicates */
+ { "$Omega" , 0x03A9 }, /* GREEK CAPITAL LETTER OMEGA; distinguish Adobe duplicates */
+ { "$Scedilla" , 0x015E }, /* LATIN CAPITAL LETTER S WITH CEDILLA; distinguish Adobe duplicates */
+ { "$Tcedilla", 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA; distinguish Adobe duplicates */
+ { "$Tcommaaccent", 0x021A }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */
+ { "$acutemodifier", 0x02CA }, /* MODIFIER LETTER ACUTE ACCENT */
+ { "$arrowdblupdn", 0x21D5 }, /* UP DOWN DOUBLE ARROW */
+ { "$arrownortheast", 0x2197 }, /* NORTH EAST ARROW */
+ { "$arrownorthwest", 0x2196 }, /* NORTH WEST ARROW */
+ { "$arrowsoutheast", 0x2198 }, /* SOUTH EAST ARROW */
+ { "$arrowsouthwest", 0x2199 }, /* SOUTH WEST ARROW */
+ { "$brevecomb", 0x0306 }, /* COMBINING BREVE */
+ { "$bulletmath" , 0x2219 }, /* BULLET OPERATOR; distinguish Adobe duplicates */
+ { "$caroncomb", 0x030C }, /* COMBINING CARON */
+ { "$cedillacomb", 0x0327 }, /* COMBINING CEDILLA */
+ { "$ceilingleft", 0x2308 }, /* LEFT CEILING */
+ { "$ceilingright", 0x2309 }, /* RIGHT CEILING */
+ { "$circlecomb", 0x20DD }, /* COMBINING ENCLOSING CIRCLE */
+ { "$circledivide", 0x2298 }, /* CIRCLED DIVISION SLASH */
+ { "$circledot", 0x2299 }, /* CIRCLED DOT OPERATOR */
+ { "$circlelarge", 0x25EF }, /* LARGE CIRCLE */
+ { "$circleminus", 0x2296 }, /* CIRCLED MINUS */
+ { "$circumflexcomb", 0x0302 }, /* COMBINING CIRCUMFLEX ACCENT */
+ { "$contintegral", 0x222E }, /* CONTOUR INTEGRAL */
+ { "$coproduct", 0x2210 }, /* N-ARY COPRODUCT */
+ { "$diamondmath", 0x22C4 }, /* DIAMOND OPERATOR */
+ { "$dieresiscomb", 0x0308 }, /* COMBINING DIAERESIS */
+ { "$divisionslash", 0x2215 }, /* DIVISION SLASH; distinguish Adobe duplicates */
+ { "$dotaccentcomb", 0x0307 }, /* COMBINING DOT ABOVE */
+ { "$epsilon1", 0x03F5 }, /* GREEK LUNATE EPSILON SYMBOL */
+ { "$equivasymptotic", 0x224D }, /* EQUIVALENT TO */
+ { "$flat", 0x266D }, /* MUSIC FLAT SIGN */
+ { "$floorleft", 0x230A }, /* LEFT FLOOR */
+ { "$floorright", 0x230B }, /* RIGHT FLOOR */
+ { "$follows", 0x227B }, /* SUCCEEDS */
+ { "$followsequal", 0x227D }, /* SUCCEEDS OR EQUAL TO */
+ { "$fractionslash", 0x2044 }, /* FRACTION SLASH; distinguish Adobe duplicates */
+ { "$frown", 0x2322 }, /* FROWN */
+ { "$gravemodifier", 0x02CB }, /* MODIFIER LETTER GRAVE ACCENT */
+ { "$greatermuch", 0x226B }, /* MUCH GREATER-THAN */
+ { "$harpoonleftbarbdown", 0x21BD }, /* LEFTWARDS HARPOON WITH BARB DOWNWARDS */
+ { "$harpoonleftbarbup", 0x21BC }, /* LEFTWARDS HARPOON WITH BARB UPWARDS */
+ { "$harpoonrightbarbdown", 0x21C1 }, /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
+ { "$harpoonrightbarbup", 0x21C0 }, /* RIGHTWARDS HARPOON WITH BARB UPWARDS */
+ { "$hyphen" , 0x002D }, /* HYPHEN-MINUS; distinguish Adobe duplicates */
+ { "$hyphensoft" , 0x00AD }, /* SOFT HYPHEN; distinguish Adobe duplicates */
+ { "$increment" , 0x2206 }, /* INCREMENT; distinguish Adobe duplicates */
+ { "$intersectionsq", 0x2293 }, /* SQUARE CAP */
+ { "$latticetop", 0x22A4 }, /* DOWN TACK */
+ { "$lessmuch", 0x226A }, /* MUCH-LESS THAN */
+ { "$longst", 0xFB05 }, /* LATIN SMALL LIGATURE LONG S T */
+ { "$lscript", 0x2113 }, /* SCRIPT SMALL L; Adobe has this as "afii61289" */
+ { "$macron", 0x00AF }, /* MACRON; distinguish Adobe duplicates */
+ { "$macroncomb", 0x0304 }, /* COMBINING MACRON */
+ { "$macronmodifier", 0x02C9 }, /* MODIFIER LETTER MACRON */
+ { "$micro", 0x00B5 }, /* MICRO SIGN; distinguish Adobe duplicates */
+ { "$minusplus", 0x2213 }, /* MINUS-OR-PLUS SIGN */
+ { "$mu", 0x03BC }, /* GREEK SMALL LETTER MU; distinguish Adobe duplicates */
+ { "$natural", 0x266E }, /* MUSIC NATURAL SIGN */
+ { "$normalin", 0x22B2 }, /* NORMAL SUBGROUP OF */
+ { "$normalizes", 0x22B3 }, /* CONTAINS AS NORMAL SUBGROUP */
+ { "$ogonekcomb", 0x0328 }, /* COMBINING OGONEK */
+ { "$overlinecomb", 0x0305 }, /* COMBINING OVERLINE */
+ { "$parallel", 0x2225 }, /* PARALLEL TO */
+ { "$periodcentered" , 0x00B7 }, /* MIDDLE DOT; distinguish Adobe duplicates */
+ { "$pi1", 0x03D6 }, /* GREEK PI SYMBOL; Adobe has this as "omega1" which is too confusing */
+ { "$precedes", 0x227A }, /* PRECEDES */
+ { "$precedesequal", 0x227C }, /* PRECEDES OR EQUAL TO */
+ { "$quotedblreversed", 0x201F }, /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */
+ { "$reflexnormalin", 0x22B4 }, /* NORMAL SUBGROUP OF OR EQUAL TO */
+ { "$reflexnormalizes", 0x22B5 }, /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
+ { "$reflexsubsetsq", 0x2291 }, /* SQUARE IMAGE OF OR EQUAL TO */
+ { "$reflexsupersetsq", 0x2292 }, /* SQUARE ORIGINAL OF OR EQUAL TO */
+ { "$rho1", 0x03F1 }, /* GREEK RHO SYMBOL */
+ { "$ringcomb", 0x030A }, /* COMBINING RING ABOVE */
+ { "$scedilla" , 0x015F }, /* LATIN SMALL LETTER S WITH CEDILLA; distinguish Adobe duplicates */
+ { "$sharp", 0x266F }, /* MUSIC SHARP SIGN */
+ { "$similarequal", 0x2243 }, /* ASYMPTOTICALLY EQUAL TO */
+ { "$slashlongcomb", 0x0338 }, /* COMBINING LONG SOLIDUS OVERLAY */
+ { "$smile", 0x2323 }, /* SMILE */
+ { "$space" , 0x0020 }, /* SPACE; distinguish Adobe duplicates */
+ { "$spacenobreak" , 0x00A0 }, /* NO-BREAK SPACE; distinguish Adobe duplicates */
+ { "$spacesymbol", 0x2420 }, /* SYMBOL FOR SPACE */
+ { "$st", 0xFB06 }, /* LATIN SMALL LIGATURE ST */
+ { "$starmath", 0x22C6 }, /* STAR OPERATOR */
+ { "$tcedilla", 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA; distinguish Adobe duplicates */
+ { "$tcommaaccent", 0x021B }, /* LATIN SMALL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */
+ { "$tie", 0x2040 }, /* CHARACTER TIE */
+ { "$triagwhitedn", 0x25BD }, /* WHITE DOWN-POINTING TRIANGLE */
+ { "$triagwhiteup", 0x25B3 }, /* WHITE UP-POINTING TRIANGLE */
+ { "$turnstileleft", 0x22A2 }, /* RIGHT TACK */
+ { "$turnstileright", 0x22A3 }, /* LEFT TACK */
+ { "$unionmulti", 0x228E }, /* MULTISET UNION */
+ { "$unionsq", 0x2294 }, /* SQUARE CUP */
+ { "$vectorcomb", 0x20D7 }, /* COMBINING RIGHT ARROW ABOVE */
+ { "$wreathproduct", 0x2240 }, /* WREATH PRODUCT */
+ { ".notdef", 0 }, /* was: QUESTION MARK; changed to 0 */
+ { "A", 0x0041 }, /* LATIN CAPITAL LETTER A */
+ { "AE", 0x00C6 }, /* LATIN CAPITAL LETTER AE */
+ { "AEacute", 0x01FC }, /* LATIN CAPITAL LETTER AE WITH ACUTE */
+ { "AEsmall", 0xF7E6 }, /* LATIN SMALL CAPITAL LETTER AE */
+ { "Aacute", 0x00C1 }, /* LATIN CAPITAL LETTER A WITH ACUTE */
+ { "Aacutesmall", 0xF7E1 }, /* LATIN SMALL CAPITAL LETTER A WITH ACUTE */
+ { "Abreve", 0x0102 }, /* LATIN CAPITAL LETTER A WITH BREVE */
+ { "Acircumflex", 0x00C2 }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ { "Acircumflexsmall", 0xF7E2 }, /* LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX */
+ { "Acute", 0xF6C9 }, /* CAPITAL ACUTE ACCENT */
+ { "Acutesmall", 0xF7B4 }, /* SMALL CAPITAL ACUTE ACCENT */
+ { "Adieresis", 0x00C4 }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ { "Adieresissmall", 0xF7E4 }, /* LATIN SMALL CAPITAL LETTER A WITH DIAERESIS */
+ { "Agrave", 0x00C0 }, /* LATIN CAPITAL LETTER A WITH GRAVE */
+ { "Agravesmall", 0xF7E0 }, /* LATIN SMALL CAPITAL LETTER A WITH GRAVE */
+ { "Alpha", 0x0391 }, /* GREEK CAPITAL LETTER ALPHA */
+ { "Alphatonos", 0x0386 }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+ { "Amacron", 0x0100 }, /* LATIN CAPITAL LETTER A WITH MACRON */
+ { "Aogonek", 0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */
+ { "Aring", 0x00C5 }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ { "Aringacute", 0x01FA }, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
+ { "Aringsmall", 0xF7E5 }, /* LATIN SMALL CAPITAL LETTER A WITH RING ABOVE */
+ { "Asmall", 0xF761 }, /* LATIN SMALL CAPITAL LETTER A */
+ { "Atilde", 0x00C3 }, /* LATIN CAPITAL LETTER A WITH TILDE */
+ { "Atildesmall", 0xF7E3 }, /* LATIN SMALL CAPITAL LETTER A WITH TILDE */
+ { "B", 0x0042 }, /* LATIN CAPITAL LETTER B */
+ { "Beta", 0x0392 }, /* GREEK CAPITAL LETTER BETA */
+ { "Brevesmall", 0xF6F4 }, /* SMALL CAPITAL BREVE */
+ { "Bsmall", 0xF762 }, /* LATIN SMALL CAPITAL LETTER B */
+ { "C", 0x0043 }, /* LATIN CAPITAL LETTER C */
+ { "Cacute", 0x0106 }, /* LATIN CAPITAL LETTER C WITH ACUTE */
+ { "Caron", 0xF6CA }, /* CAPITAL CARON */
+ { "Caronsmall", 0xF6F5 }, /* SMALL CAPITAL CARON */
+ { "Ccaron", 0x010C }, /* LATIN CAPITAL LETTER C WITH CARON */
+ { "Ccedilla", 0x00C7 }, /* LATIN CAPITAL LETTER C WITH CEDILLA */
+ { "Ccedillasmall", 0xF7E7 }, /* LATIN SMALL CAPITAL LETTER C WITH CEDILLA */
+ { "Ccircumflex", 0x0108 }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+ { "Cdotaccent", 0x010A }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
+ { "Cedillasmall", 0xF7B8 }, /* SMALL CAPITAL CEDILLA */
+ { "Chi", 0x03A7 }, /* GREEK CAPITAL LETTER CHI */
+ { "Circumflexsmall", 0xF6F6 }, /* SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT */
+ { "Csmall", 0xF763 }, /* LATIN SMALL CAPITAL LETTER C */
+ { "D", 0x0044 }, /* LATIN CAPITAL LETTER D */
+ { "Dcaron", 0x010E }, /* LATIN CAPITAL LETTER D WITH CARON */
+ { "Dcroat", 0x0110 }, /* LATIN CAPITAL LETTER D WITH STROKE */
+ { "Delta", 0x2206 }, /* INCREMENT */
+#if 0
+ { "Delta" DUP2, 0x0394 }, /* GREEK CAPITAL LETTER DELTA;Duplicate */
+#endif /* 0 */
+ { "Dieresis", 0xF6CB }, /* CAPITAL DIAERESIS */
+ { "DieresisAcute", 0xF6CC }, /* CAPITAL DIAERESIS ACUTE ACCENT */
+ { "DieresisGrave", 0xF6CD }, /* CAPITAL DIAERESIS GRAVE ACCENT */
+ { "Dieresissmall", 0xF7A8 }, /* SMALL CAPITAL DIAERESIS */
+ { "Dotaccentsmall", 0xF6F7 }, /* SMALL CAPITAL DOT ABOVE */
+ { "Dsmall", 0xF764 }, /* LATIN SMALL CAPITAL LETTER D */
+ { "E", 0x0045 }, /* LATIN CAPITAL LETTER E */
+ { "Eacute", 0x00C9 }, /* LATIN CAPITAL LETTER E WITH ACUTE */
+ { "Eacutesmall", 0xF7E9 }, /* LATIN SMALL CAPITAL LETTER E WITH ACUTE */
+ { "Ebreve", 0x0114 }, /* LATIN CAPITAL LETTER E WITH BREVE */
+ { "Ecaron", 0x011A }, /* LATIN CAPITAL LETTER E WITH CARON */
+ { "Ecircumflex", 0x00CA }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+ { "Ecircumflexsmall", 0xF7EA }, /* LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX */
+ { "Edieresis", 0x00CB }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ { "Edieresissmall", 0xF7EB }, /* LATIN SMALL CAPITAL LETTER E WITH DIAERESIS */
+ { "Edotaccent", 0x0116 }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ { "Egrave", 0x00C8 }, /* LATIN CAPITAL LETTER E WITH GRAVE */
+ { "Egravesmall", 0xF7E8 }, /* LATIN SMALL CAPITAL LETTER E WITH GRAVE */
+ { "Emacron", 0x0112 }, /* LATIN CAPITAL LETTER E WITH MACRON */
+ { "Eng", 0x014A }, /* LATIN CAPITAL LETTER ENG */
+ { "Eogonek", 0x0118 }, /* LATIN CAPITAL LETTER E WITH OGONEK */
+ { "Epsilon", 0x0395 }, /* GREEK CAPITAL LETTER EPSILON */
+ { "Epsilontonos", 0x0388 }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+ { "Esmall", 0xF765 }, /* LATIN SMALL CAPITAL LETTER E */
+ { "Eta", 0x0397 }, /* GREEK CAPITAL LETTER ETA */
+ { "Etatonos", 0x0389 }, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+ { "Eth", 0x00D0 }, /* LATIN CAPITAL LETTER ETH */
+ { "Ethsmall", 0xF7F0 }, /* LATIN SMALL CAPITAL LETTER ETH */
+ { "Euro", 0x20AC }, /* EURO SIGN */
+ { "F", 0x0046 }, /* LATIN CAPITAL LETTER F */
+ { "Fsmall", 0xF766 }, /* LATIN SMALL CAPITAL LETTER F */
+ { "G", 0x0047 }, /* LATIN CAPITAL LETTER G */
+ { "Gamma", 0x0393 }, /* GREEK CAPITAL LETTER GAMMA */
+ { "Gbreve", 0x011E }, /* LATIN CAPITAL LETTER G WITH BREVE */
+ { "Gcaron", 0x01E6 }, /* LATIN CAPITAL LETTER G WITH CARON */
+ { "Gcircumflex", 0x011C }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+ { "Gcommaaccent", 0x0122 }, /* LATIN CAPITAL LETTER G WITH CEDILLA */
+ { "Gdotaccent", 0x0120 }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
+ { "Grave", 0xF6CE }, /* CAPITAL GRAVE ACCENT */
+ { "Gravesmall", 0xF760 }, /* SMALL CAPITAL GRAVE ACCENT */
+ { "Gsmall", 0xF767 }, /* LATIN SMALL CAPITAL LETTER G */
+ { "H", 0x0048 }, /* LATIN CAPITAL LETTER H */
+ { "H18533", 0x25CF }, /* BLACK CIRCLE */
+ { "H18543", 0x25AA }, /* BLACK SMALL SQUARE */
+ { "H18551", 0x25AB }, /* WHITE SMALL SQUARE */
+ { "H22073", 0x25A1 }, /* WHITE SQUARE */
+ { "Hbar", 0x0126 }, /* LATIN CAPITAL LETTER H WITH STROKE */
+ { "Hcircumflex", 0x0124 }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+ { "Hsmall", 0xF768 }, /* LATIN SMALL CAPITAL LETTER H */
+ { "Hungarumlaut", 0xF6CF }, /* CAPITAL DOUBLE ACUTE ACCENT */
+ { "Hungarumlautsmall", 0xF6F8 }, /* SMALL CAPITAL DOUBLE ACUTE ACCENT */
+ { "I", 0x0049 }, /* LATIN CAPITAL LETTER I */
+ { "IJ", 0x0132 }, /* LATIN CAPITAL LIGATURE IJ */
+ { "Iacute", 0x00CD }, /* LATIN CAPITAL LETTER I WITH ACUTE */
+ { "Iacutesmall", 0xF7ED }, /* LATIN SMALL CAPITAL LETTER I WITH ACUTE */
+ { "Ibreve", 0x012C }, /* LATIN CAPITAL LETTER I WITH BREVE */
+ { "Icircumflex", 0x00CE }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ { "Icircumflexsmall", 0xF7EE }, /* LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX */
+ { "Idieresis", 0x00CF }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
+ { "Idieresissmall", 0xF7EF }, /* LATIN SMALL CAPITAL LETTER I WITH DIAERESIS */
+ { "Idotaccent", 0x0130 }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ { "Ifraktur", 0x2111 }, /* BLACK-LETTER CAPITAL I */
+ { "Igrave", 0x00CC }, /* LATIN CAPITAL LETTER I WITH GRAVE */
+ { "Igravesmall", 0xF7EC }, /* LATIN SMALL CAPITAL LETTER I WITH GRAVE */
+ { "Imacron", 0x012A }, /* LATIN CAPITAL LETTER I WITH MACRON */
+ { "Iogonek", 0x012E }, /* LATIN CAPITAL LETTER I WITH OGONEK */
+ { "Iota", 0x0399 }, /* GREEK CAPITAL LETTER IOTA */
+ { "Iotadieresis", 0x03AA }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+ { "Iotatonos", 0x038A }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+ { "Ismall", 0xF769 }, /* LATIN SMALL CAPITAL LETTER I */
+ { "Itilde", 0x0128 }, /* LATIN CAPITAL LETTER I WITH TILDE */
+ { "J", 0x004A }, /* LATIN CAPITAL LETTER J */
+ { "Jcircumflex", 0x0134 }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+ { "Jsmall", 0xF76A }, /* LATIN SMALL CAPITAL LETTER J */
+ { "K", 0x004B }, /* LATIN CAPITAL LETTER K */
+ { "Kappa", 0x039A }, /* GREEK CAPITAL LETTER KAPPA */
+ { "Kcommaaccent", 0x0136 }, /* LATIN CAPITAL LETTER K WITH CEDILLA */
+ { "Ksmall", 0xF76B }, /* LATIN SMALL CAPITAL LETTER K */
+ { "L", 0x004C }, /* LATIN CAPITAL LETTER L */
+ { "LL", 0xF6BF }, /* LATIN CAPITAL LETTER LL */
+ { "Lacute", 0x0139 }, /* LATIN CAPITAL LETTER L WITH ACUTE */
+ { "Lambda", 0x039B }, /* GREEK CAPITAL LETTER LAMDA */
+ { "Lcaron", 0x013D }, /* LATIN CAPITAL LETTER L WITH CARON */
+ { "Lcommaaccent", 0x013B }, /* LATIN CAPITAL LETTER L WITH CEDILLA */
+ { "Ldot", 0x013F }, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ { "Lslash", 0x0141 }, /* LATIN CAPITAL LETTER L WITH STROKE */
+ { "Lslashsmall", 0xF6F9 }, /* LATIN SMALL CAPITAL LETTER L WITH STROKE */
+ { "Lsmall", 0xF76C }, /* LATIN SMALL CAPITAL LETTER L */
+ { "M", 0x004D }, /* LATIN CAPITAL LETTER M */
+ { "Macron", 0xF6D0 }, /* CAPITAL MACRON */
+ { "Macronsmall", 0xF7AF }, /* SMALL CAPITAL MACRON */
+ { "Msmall", 0xF76D }, /* LATIN SMALL CAPITAL LETTER M */
+ { "Mu", 0x039C }, /* GREEK CAPITAL LETTER MU */
+ { "N", 0x004E }, /* LATIN CAPITAL LETTER N */
+ { "Nacute", 0x0143 }, /* LATIN CAPITAL LETTER N WITH ACUTE */
+ { "Ncaron", 0x0147 }, /* LATIN CAPITAL LETTER N WITH CARON */
+ { "Ncommaaccent", 0x0145 }, /* LATIN CAPITAL LETTER N WITH CEDILLA */
+ { "Nsmall", 0xF76E }, /* LATIN SMALL CAPITAL LETTER N */
+ { "Ntilde", 0x00D1 }, /* LATIN CAPITAL LETTER N WITH TILDE */
+ { "Ntildesmall", 0xF7F1 }, /* LATIN SMALL CAPITAL LETTER N WITH TILDE */
+ { "Nu", 0x039D }, /* GREEK CAPITAL LETTER NU */
+ { "O", 0x004F }, /* LATIN CAPITAL LETTER O */
+ { "OE", 0x0152 }, /* LATIN CAPITAL LIGATURE OE */
+ { "OEsmall", 0xF6FA }, /* LATIN SMALL CAPITAL LIGATURE OE */
+ { "Oacute", 0x00D3 }, /* LATIN CAPITAL LETTER O WITH ACUTE */
+ { "Oacutesmall", 0xF7F3 }, /* LATIN SMALL CAPITAL LETTER O WITH ACUTE */
+ { "Obreve", 0x014E }, /* LATIN CAPITAL LETTER O WITH BREVE */
+ { "Ocircumflex", 0x00D4 }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ { "Ocircumflexsmall", 0xF7F4 }, /* LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX */
+ { "Odieresis", 0x00D6 }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ { "Odieresissmall", 0xF7F6 }, /* LATIN SMALL CAPITAL LETTER O WITH DIAERESIS */
+ { "Ogoneksmall", 0xF6FB }, /* SMALL CAPITAL OGONEK */
+ { "Ograve", 0x00D2 }, /* LATIN CAPITAL LETTER O WITH GRAVE */
+ { "Ogravesmall", 0xF7F2 }, /* LATIN SMALL CAPITAL LETTER O WITH GRAVE */
+ { "Ohorn", 0x01A0 }, /* LATIN CAPITAL LETTER O WITH HORN */
+ { "Ohungarumlaut", 0x0150 }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ { "Omacron", 0x014C }, /* LATIN CAPITAL LETTER O WITH MACRON */
+ { "Omega", 0x2126 }, /* OHM SIGN */
+#if 0
+ { "Omega" DUP2, 0x03A9 }, /* GREEK CAPITAL LETTER OMEGA;Duplicate */
+#endif /* 0 */
+ { "Omegatonos", 0x038F }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+ { "Omicron", 0x039F }, /* GREEK CAPITAL LETTER OMICRON */
+ { "Omicrontonos", 0x038C }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+ { "Oslash", 0x00D8 }, /* LATIN CAPITAL LETTER O WITH STROKE */
+ { "Oslashacute", 0x01FE }, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
+ { "Oslashsmall", 0xF7F8 }, /* LATIN SMALL CAPITAL LETTER O WITH STROKE */
+ { "Osmall", 0xF76F }, /* LATIN SMALL CAPITAL LETTER O */
+ { "Otilde", 0x00D5 }, /* LATIN CAPITAL LETTER O WITH TILDE */
+ { "Otildesmall", 0xF7F5 }, /* LATIN SMALL CAPITAL LETTER O WITH TILDE */
+ { "P", 0x0050 }, /* LATIN CAPITAL LETTER P */
+ { "Phi", 0x03A6 }, /* GREEK CAPITAL LETTER PHI */
+ { "Pi", 0x03A0 }, /* GREEK CAPITAL LETTER PI */
+ { "Psi", 0x03A8 }, /* GREEK CAPITAL LETTER PSI */
+ { "Psmall", 0xF770 }, /* LATIN SMALL CAPITAL LETTER P */
+ { "Q", 0x0051 }, /* LATIN CAPITAL LETTER Q */
+ { "Qsmall", 0xF771 }, /* LATIN SMALL CAPITAL LETTER Q */
+ { "R", 0x0052 }, /* LATIN CAPITAL LETTER R */
+ { "Racute", 0x0154 }, /* LATIN CAPITAL LETTER R WITH ACUTE */
+ { "Rcaron", 0x0158 }, /* LATIN CAPITAL LETTER R WITH CARON */
+ { "Rcommaaccent", 0x0156 }, /* LATIN CAPITAL LETTER R WITH CEDILLA */
+ { "Rfraktur", 0x211C }, /* BLACK-LETTER CAPITAL R */
+ { "Rho", 0x03A1 }, /* GREEK CAPITAL LETTER RHO */
+ { "Ringsmall", 0xF6FC }, /* SMALL CAPITAL RING ABOVE */
+ { "Rsmall", 0xF772 }, /* LATIN SMALL CAPITAL LETTER R */
+ { "S", 0x0053 }, /* LATIN CAPITAL LETTER S */
+ { "SF010000", 0x250C }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ { "SF020000", 0x2514 }, /* BOX DRAWINGS LIGHT UP AND RIGHT */
+ { "SF030000", 0x2510 }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+ { "SF040000", 0x2518 }, /* BOX DRAWINGS LIGHT UP AND LEFT */
+ { "SF050000", 0x253C }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+ { "SF060000", 0x252C }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ { "SF070000", 0x2534 }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ { "SF080000", 0x251C }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ { "SF090000", 0x2524 }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ { "SF100000", 0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
+ { "SF110000", 0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */
+ { "SF190000", 0x2561 }, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
+ { "SF200000", 0x2562 }, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */
+ { "SF210000", 0x2556 }, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */
+ { "SF220000", 0x2555 }, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */
+ { "SF230000", 0x2563 }, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
+ { "SF240000", 0x2551 }, /* BOX DRAWINGS DOUBLE VERTICAL */
+ { "SF250000", 0x2557 }, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */
+ { "SF260000", 0x255D }, /* BOX DRAWINGS DOUBLE UP AND LEFT */
+ { "SF270000", 0x255C }, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */
+ { "SF280000", 0x255B }, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
+ { "SF360000", 0x255E }, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
+ { "SF370000", 0x255F }, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
+ { "SF380000", 0x255A }, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
+ { "SF390000", 0x2554 }, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
+ { "SF400000", 0x2569 }, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
+ { "SF410000", 0x2566 }, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
+ { "SF420000", 0x2560 }, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
+ { "SF430000", 0x2550 }, /* BOX DRAWINGS DOUBLE HORIZONTAL */
+ { "SF440000", 0x256C }, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
+ { "SF450000", 0x2567 }, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
+ { "SF460000", 0x2568 }, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
+ { "SF470000", 0x2564 }, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */
+ { "SF480000", 0x2565 }, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */
+ { "SF490000", 0x2559 }, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
+ { "SF500000", 0x2558 }, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
+ { "SF510000", 0x2552 }, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
+ { "SF520000", 0x2553 }, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */
+ { "SF530000", 0x256B }, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */
+ { "SF540000", 0x256A }, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */
+ { "Sacute", 0x015A }, /* LATIN CAPITAL LETTER S WITH ACUTE */
+ { "Scaron", 0x0160 }, /* LATIN CAPITAL LETTER S WITH CARON */
+ { "Scaronsmall", 0xF6FD }, /* LATIN SMALL CAPITAL LETTER S WITH CARON */
+ { "Scedilla", 0x015E }, /* LATIN CAPITAL LETTER S WITH CEDILLA */
+#if 0
+ { "Scedilla" DUP2, 0xF6C1 }, /* LATIN CAPITAL LETTER S WITH CEDILLA;Duplicate */
+#endif /* 0 */
+ { "Scircumflex", 0x015C }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+ { "Scommaaccent", 0x0218 }, /* LATIN CAPITAL LETTER S WITH COMMA BELOW */
+ { "Sigma", 0x03A3 }, /* GREEK CAPITAL LETTER SIGMA */
+ { "Ssmall", 0xF773 }, /* LATIN SMALL CAPITAL LETTER S */
+ { "T", 0x0054 }, /* LATIN CAPITAL LETTER T */
+ { "Tau", 0x03A4 }, /* GREEK CAPITAL LETTER TAU */
+ { "Tbar", 0x0166 }, /* LATIN CAPITAL LETTER T WITH STROKE */
+ { "Tcaron", 0x0164 }, /* LATIN CAPITAL LETTER T WITH CARON */
+ { "Tcommaaccent", 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA */
+#if 0
+ { "Tcommaaccent" DUP2, 0x021A }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW;Duplicate */
+#endif /* 0 */
+ { "Theta", 0x0398 }, /* GREEK CAPITAL LETTER THETA */
+ { "Thorn", 0x00DE }, /* LATIN CAPITAL LETTER THORN */
+ { "Thornsmall", 0xF7FE }, /* LATIN SMALL CAPITAL LETTER THORN */
+ { "Tildesmall", 0xF6FE }, /* SMALL CAPITAL SMALL TILDE */
+ { "Tsmall", 0xF774 }, /* LATIN SMALL CAPITAL LETTER T */
+ { "U", 0x0055 }, /* LATIN CAPITAL LETTER U */
+ { "Uacute", 0x00DA }, /* LATIN CAPITAL LETTER U WITH ACUTE */
+ { "Uacutesmall", 0xF7FA }, /* LATIN SMALL CAPITAL LETTER U WITH ACUTE */
+ { "Ubreve", 0x016C }, /* LATIN CAPITAL LETTER U WITH BREVE */
+ { "Ucircumflex", 0x00DB }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+ { "Ucircumflexsmall", 0xF7FB }, /* LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX */
+ { "Udieresis", 0x00DC }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ { "Udieresissmall", 0xF7FC }, /* LATIN SMALL CAPITAL LETTER U WITH DIAERESIS */
+ { "Ugrave", 0x00D9 }, /* LATIN CAPITAL LETTER U WITH GRAVE */
+ { "Ugravesmall", 0xF7F9 }, /* LATIN SMALL CAPITAL LETTER U WITH GRAVE */
+ { "Uhorn", 0x01AF }, /* LATIN CAPITAL LETTER U WITH HORN */
+ { "Uhungarumlaut", 0x0170 }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ { "Umacron", 0x016A }, /* LATIN CAPITAL LETTER U WITH MACRON */
+ { "Uogonek", 0x0172 }, /* LATIN CAPITAL LETTER U WITH OGONEK */
+ { "Upsilon", 0x03A5 }, /* GREEK CAPITAL LETTER UPSILON */
+ { "Upsilon1", 0x03D2 }, /* GREEK UPSILON WITH HOOK SYMBOL */
+ { "Upsilondieresis", 0x03AB }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+ { "Upsilontonos", 0x038E }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+ { "Uring", 0x016E }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+ { "Usmall", 0xF775 }, /* LATIN SMALL CAPITAL LETTER U */
+ { "Utilde", 0x0168 }, /* LATIN CAPITAL LETTER U WITH TILDE */
+ { "V", 0x0056 }, /* LATIN CAPITAL LETTER V */
+ { "Vsmall", 0xF776 }, /* LATIN SMALL CAPITAL LETTER V */
+ { "W", 0x0057 }, /* LATIN CAPITAL LETTER W */
+ { "Wacute", 0x1E82 }, /* LATIN CAPITAL LETTER W WITH ACUTE */
+ { "Wcircumflex", 0x0174 }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+ { "Wdieresis", 0x1E84 }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */
+ { "Wgrave", 0x1E80 }, /* LATIN CAPITAL LETTER W WITH GRAVE */
+ { "Wsmall", 0xF777 }, /* LATIN SMALL CAPITAL LETTER W */
+ { "X", 0x0058 }, /* LATIN CAPITAL LETTER X */
+ { "Xi", 0x039E }, /* GREEK CAPITAL LETTER XI */
+ { "Xsmall", 0xF778 }, /* LATIN SMALL CAPITAL LETTER X */
+ { "Y", 0x0059 }, /* LATIN CAPITAL LETTER Y */
+ { "Yacute", 0x00DD }, /* LATIN CAPITAL LETTER Y WITH ACUTE */
+ { "Yacutesmall", 0xF7FD }, /* LATIN SMALL CAPITAL LETTER Y WITH ACUTE */
+ { "Ycircumflex", 0x0176 }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+ { "Ydieresis", 0x0178 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
+ { "Ydieresissmall", 0xF7FF }, /* LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS */
+ { "Ygrave", 0x1EF2 }, /* LATIN CAPITAL LETTER Y WITH GRAVE */
+ { "Ysmall", 0xF779 }, /* LATIN SMALL CAPITAL LETTER Y */
+ { "Z", 0x005A }, /* LATIN CAPITAL LETTER Z */
+ { "Zacute", 0x0179 }, /* LATIN CAPITAL LETTER Z WITH ACUTE */
+ { "Zcaron", 0x017D }, /* LATIN CAPITAL LETTER Z WITH CARON */
+ { "Zcaronsmall", 0xF6FF }, /* LATIN SMALL CAPITAL LETTER Z WITH CARON */
+ { "Zdotaccent", 0x017B }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ { "Zeta", 0x0396 }, /* GREEK CAPITAL LETTER ZETA */
+ { "Zsmall", 0xF77A }, /* LATIN SMALL CAPITAL LETTER Z */
+ { "a", 0x0061 }, /* LATIN SMALL LETTER A */
+ { "aacute", 0x00E1 }, /* LATIN SMALL LETTER A WITH ACUTE */
+ { "abreve", 0x0103 }, /* LATIN SMALL LETTER A WITH BREVE */
+ { "acircumflex", 0x00E2 }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+ { "acute", 0x00B4 }, /* ACUTE ACCENT */
+ { "acutecomb", 0x0301 }, /* COMBINING ACUTE ACCENT */
+ { "adieresis", 0x00E4 }, /* LATIN SMALL LETTER A WITH DIAERESIS */
+ { "ae", 0x00E6 }, /* LATIN SMALL LETTER AE */
+ { "aeacute", 0x01FD }, /* LATIN SMALL LETTER AE WITH ACUTE */
+ { "afii00208", 0x2015 }, /* HORIZONTAL BAR */
+ { "afii10017", 0x0410 }, /* CYRILLIC CAPITAL LETTER A */
+ { "afii10018", 0x0411 }, /* CYRILLIC CAPITAL LETTER BE */
+ { "afii10019", 0x0412 }, /* CYRILLIC CAPITAL LETTER VE */
+ { "afii10020", 0x0413 }, /* CYRILLIC CAPITAL LETTER GHE */
+ { "afii10021", 0x0414 }, /* CYRILLIC CAPITAL LETTER DE */
+ { "afii10022", 0x0415 }, /* CYRILLIC CAPITAL LETTER IE */
+ { "afii10023", 0x0401 }, /* CYRILLIC CAPITAL LETTER IO */
+ { "afii10024", 0x0416 }, /* CYRILLIC CAPITAL LETTER ZHE */
+ { "afii10025", 0x0417 }, /* CYRILLIC CAPITAL LETTER ZE */
+ { "afii10026", 0x0418 }, /* CYRILLIC CAPITAL LETTER I */
+ { "afii10027", 0x0419 }, /* CYRILLIC CAPITAL LETTER SHORT I */
+ { "afii10028", 0x041A }, /* CYRILLIC CAPITAL LETTER KA */
+ { "afii10029", 0x041B }, /* CYRILLIC CAPITAL LETTER EL */
+ { "afii10030", 0x041C }, /* CYRILLIC CAPITAL LETTER EM */
+ { "afii10031", 0x041D }, /* CYRILLIC CAPITAL LETTER EN */
+ { "afii10032", 0x041E }, /* CYRILLIC CAPITAL LETTER O */
+ { "afii10033", 0x041F }, /* CYRILLIC CAPITAL LETTER PE */
+ { "afii10034", 0x0420 }, /* CYRILLIC CAPITAL LETTER ER */
+ { "afii10035", 0x0421 }, /* CYRILLIC CAPITAL LETTER ES */
+ { "afii10036", 0x0422 }, /* CYRILLIC CAPITAL LETTER TE */
+ { "afii10037", 0x0423 }, /* CYRILLIC CAPITAL LETTER U */
+ { "afii10038", 0x0424 }, /* CYRILLIC CAPITAL LETTER EF */
+ { "afii10039", 0x0425 }, /* CYRILLIC CAPITAL LETTER HA */
+ { "afii10040", 0x0426 }, /* CYRILLIC CAPITAL LETTER TSE */
+ { "afii10041", 0x0427 }, /* CYRILLIC CAPITAL LETTER CHE */
+ { "afii10042", 0x0428 }, /* CYRILLIC CAPITAL LETTER SHA */
+ { "afii10043", 0x0429 }, /* CYRILLIC CAPITAL LETTER SHCHA */
+ { "afii10044", 0x042A }, /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ { "afii10045", 0x042B }, /* CYRILLIC CAPITAL LETTER YERU */
+ { "afii10046", 0x042C }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ { "afii10047", 0x042D }, /* CYRILLIC CAPITAL LETTER E */
+ { "afii10048", 0x042E }, /* CYRILLIC CAPITAL LETTER YU */
+ { "afii10049", 0x042F }, /* CYRILLIC CAPITAL LETTER YA */
+ { "afii10050", 0x0490 }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
+ { "afii10051", 0x0402 }, /* CYRILLIC CAPITAL LETTER DJE */
+ { "afii10052", 0x0403 }, /* CYRILLIC CAPITAL LETTER GJE */
+ { "afii10053", 0x0404 }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+ { "afii10054", 0x0405 }, /* CYRILLIC CAPITAL LETTER DZE */
+ { "afii10055", 0x0406 }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { "afii10056", 0x0407 }, /* CYRILLIC CAPITAL LETTER YI */
+ { "afii10057", 0x0408 }, /* CYRILLIC CAPITAL LETTER JE */
+ { "afii10058", 0x0409 }, /* CYRILLIC CAPITAL LETTER LJE */
+ { "afii10059", 0x040A }, /* CYRILLIC CAPITAL LETTER NJE */
+ { "afii10060", 0x040B }, /* CYRILLIC CAPITAL LETTER TSHE */
+ { "afii10061", 0x040C }, /* CYRILLIC CAPITAL LETTER KJE */
+ { "afii10062", 0x040E }, /* CYRILLIC CAPITAL LETTER SHORT U */
+ { "afii10063", 0xF6C4 }, /* CYRILLIC SMALL LETTER GHE VARIANT */
+ { "afii10064", 0xF6C5 }, /* CYRILLIC SMALL LETTER BE VARIANT */
+ { "afii10065", 0x0430 }, /* CYRILLIC SMALL LETTER A */
+ { "afii10066", 0x0431 }, /* CYRILLIC SMALL LETTER BE */
+ { "afii10067", 0x0432 }, /* CYRILLIC SMALL LETTER VE */
+ { "afii10068", 0x0433 }, /* CYRILLIC SMALL LETTER GHE */
+ { "afii10069", 0x0434 }, /* CYRILLIC SMALL LETTER DE */
+ { "afii10070", 0x0435 }, /* CYRILLIC SMALL LETTER IE */
+ { "afii10071", 0x0451 }, /* CYRILLIC SMALL LETTER IO */
+ { "afii10072", 0x0436 }, /* CYRILLIC SMALL LETTER ZHE */
+ { "afii10073", 0x0437 }, /* CYRILLIC SMALL LETTER ZE */
+ { "afii10074", 0x0438 }, /* CYRILLIC SMALL LETTER I */
+ { "afii10075", 0x0439 }, /* CYRILLIC SMALL LETTER SHORT I */
+ { "afii10076", 0x043A }, /* CYRILLIC SMALL LETTER KA */
+ { "afii10077", 0x043B }, /* CYRILLIC SMALL LETTER EL */
+ { "afii10078", 0x043C }, /* CYRILLIC SMALL LETTER EM */
+ { "afii10079", 0x043D }, /* CYRILLIC SMALL LETTER EN */
+ { "afii10080", 0x043E }, /* CYRILLIC SMALL LETTER O */
+ { "afii10081", 0x043F }, /* CYRILLIC SMALL LETTER PE */
+ { "afii10082", 0x0440 }, /* CYRILLIC SMALL LETTER ER */
+ { "afii10083", 0x0441 }, /* CYRILLIC SMALL LETTER ES */
+ { "afii10084", 0x0442 }, /* CYRILLIC SMALL LETTER TE */
+ { "afii10085", 0x0443 }, /* CYRILLIC SMALL LETTER U */
+ { "afii10086", 0x0444 }, /* CYRILLIC SMALL LETTER EF */
+ { "afii10087", 0x0445 }, /* CYRILLIC SMALL LETTER HA */
+ { "afii10088", 0x0446 }, /* CYRILLIC SMALL LETTER TSE */
+ { "afii10089", 0x0447 }, /* CYRILLIC SMALL LETTER CHE */
+ { "afii10090", 0x0448 }, /* CYRILLIC SMALL LETTER SHA */
+ { "afii10091", 0x0449 }, /* CYRILLIC SMALL LETTER SHCHA */
+ { "afii10092", 0x044A }, /* CYRILLIC SMALL LETTER HARD SIGN */
+ { "afii10093", 0x044B }, /* CYRILLIC SMALL LETTER YERU */
+ { "afii10094", 0x044C }, /* CYRILLIC SMALL LETTER SOFT SIGN */
+ { "afii10095", 0x044D }, /* CYRILLIC SMALL LETTER E */
+ { "afii10096", 0x044E }, /* CYRILLIC SMALL LETTER YU */
+ { "afii10097", 0x044F }, /* CYRILLIC SMALL LETTER YA */
+ { "afii10098", 0x0491 }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
+ { "afii10099", 0x0452 }, /* CYRILLIC SMALL LETTER DJE */
+ { "afii10100", 0x0453 }, /* CYRILLIC SMALL LETTER GJE */
+ { "afii10101", 0x0454 }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
+ { "afii10102", 0x0455 }, /* CYRILLIC SMALL LETTER DZE */
+ { "afii10103", 0x0456 }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { "afii10104", 0x0457 }, /* CYRILLIC SMALL LETTER YI */
+ { "afii10105", 0x0458 }, /* CYRILLIC SMALL LETTER JE */
+ { "afii10106", 0x0459 }, /* CYRILLIC SMALL LETTER LJE */
+ { "afii10107", 0x045A }, /* CYRILLIC SMALL LETTER NJE */
+ { "afii10108", 0x045B }, /* CYRILLIC SMALL LETTER TSHE */
+ { "afii10109", 0x045C }, /* CYRILLIC SMALL LETTER KJE */
+ { "afii10110", 0x045E }, /* CYRILLIC SMALL LETTER SHORT U */
+ { "afii10145", 0x040F }, /* CYRILLIC CAPITAL LETTER DZHE */
+ { "afii10146", 0x0462 }, /* CYRILLIC CAPITAL LETTER YAT */
+ { "afii10147", 0x0472 }, /* CYRILLIC CAPITAL LETTER FITA */
+ { "afii10148", 0x0474 }, /* CYRILLIC CAPITAL LETTER IZHITSA */
+ { "afii10192", 0xF6C6 }, /* CYRILLIC SMALL LETTER DE VARIANT */
+ { "afii10193", 0x045F }, /* CYRILLIC SMALL LETTER DZHE */
+ { "afii10194", 0x0463 }, /* CYRILLIC SMALL LETTER YAT */
+ { "afii10195", 0x0473 }, /* CYRILLIC SMALL LETTER FITA */
+ { "afii10196", 0x0475 }, /* CYRILLIC SMALL LETTER IZHITSA */
+ { "afii10831", 0xF6C7 }, /* CYRILLIC SMALL LETTER PE VARIANT */
+ { "afii10832", 0xF6C8 }, /* CYRILLIC SMALL LETTER TE VARIANT */
+ { "afii10846", 0x04D9 }, /* CYRILLIC SMALL LETTER SCHWA */
+ { "afii299", 0x200E }, /* LEFT-TO-RIGHT MARK */
+ { "afii300", 0x200F }, /* RIGHT-TO-LEFT MARK */
+ { "afii301", 0x200D }, /* ZERO WIDTH JOINER */
+ { "afii57381", 0x066A }, /* ARABIC PERCENT SIGN */
+ { "afii57388", 0x060C }, /* ARABIC COMMA */
+ { "afii57392", 0x0660 }, /* ARABIC-INDIC DIGIT ZERO */
+ { "afii57393", 0x0661 }, /* ARABIC-INDIC DIGIT ONE */
+ { "afii57394", 0x0662 }, /* ARABIC-INDIC DIGIT TWO */
+ { "afii57395", 0x0663 }, /* ARABIC-INDIC DIGIT THREE */
+ { "afii57396", 0x0664 }, /* ARABIC-INDIC DIGIT FOUR */
+ { "afii57397", 0x0665 }, /* ARABIC-INDIC DIGIT FIVE */
+ { "afii57398", 0x0666 }, /* ARABIC-INDIC DIGIT SIX */
+ { "afii57399", 0x0667 }, /* ARABIC-INDIC DIGIT SEVEN */
+ { "afii57400", 0x0668 }, /* ARABIC-INDIC DIGIT EIGHT */
+ { "afii57401", 0x0669 }, /* ARABIC-INDIC DIGIT NINE */
+ { "afii57403", 0x061B }, /* ARABIC SEMICOLON */
+ { "afii57407", 0x061F }, /* ARABIC QUESTION MARK */
+ { "afii57409", 0x0621 }, /* ARABIC LETTER HAMZA */
+ { "afii57410", 0x0622 }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */
+ { "afii57411", 0x0623 }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */
+ { "afii57412", 0x0624 }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */
+ { "afii57413", 0x0625 }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */
+ { "afii57414", 0x0626 }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */
+ { "afii57415", 0x0627 }, /* ARABIC LETTER ALEF */
+ { "afii57416", 0x0628 }, /* ARABIC LETTER BEH */
+ { "afii57417", 0x0629 }, /* ARABIC LETTER TEH MARBUTA */
+ { "afii57418", 0x062A }, /* ARABIC LETTER TEH */
+ { "afii57419", 0x062B }, /* ARABIC LETTER THEH */
+ { "afii57420", 0x062C }, /* ARABIC LETTER JEEM */
+ { "afii57421", 0x062D }, /* ARABIC LETTER HAH */
+ { "afii57422", 0x062E }, /* ARABIC LETTER KHAH */
+ { "afii57423", 0x062F }, /* ARABIC LETTER DAL */
+ { "afii57424", 0x0630 }, /* ARABIC LETTER THAL */
+ { "afii57425", 0x0631 }, /* ARABIC LETTER REH */
+ { "afii57426", 0x0632 }, /* ARABIC LETTER ZAIN */
+ { "afii57427", 0x0633 }, /* ARABIC LETTER SEEN */
+ { "afii57428", 0x0634 }, /* ARABIC LETTER SHEEN */
+ { "afii57429", 0x0635 }, /* ARABIC LETTER SAD */
+ { "afii57430", 0x0636 }, /* ARABIC LETTER DAD */
+ { "afii57431", 0x0637 }, /* ARABIC LETTER TAH */
+ { "afii57432", 0x0638 }, /* ARABIC LETTER ZAH */
+ { "afii57433", 0x0639 }, /* ARABIC LETTER AIN */
+ { "afii57434", 0x063A }, /* ARABIC LETTER GHAIN */
+ { "afii57440", 0x0640 }, /* ARABIC TATWEEL */
+ { "afii57441", 0x0641 }, /* ARABIC LETTER FEH */
+ { "afii57442", 0x0642 }, /* ARABIC LETTER QAF */
+ { "afii57443", 0x0643 }, /* ARABIC LETTER KAF */
+ { "afii57444", 0x0644 }, /* ARABIC LETTER LAM */
+ { "afii57445", 0x0645 }, /* ARABIC LETTER MEEM */
+ { "afii57446", 0x0646 }, /* ARABIC LETTER NOON */
+ { "afii57448", 0x0648 }, /* ARABIC LETTER WAW */
+ { "afii57449", 0x0649 }, /* ARABIC LETTER ALEF MAKSURA */
+ { "afii57450", 0x064A }, /* ARABIC LETTER YEH */
+ { "afii57451", 0x064B }, /* ARABIC FATHATAN */
+ { "afii57452", 0x064C }, /* ARABIC DAMMATAN */
+ { "afii57453", 0x064D }, /* ARABIC KASRATAN */
+ { "afii57454", 0x064E }, /* ARABIC FATHA */
+ { "afii57455", 0x064F }, /* ARABIC DAMMA */
+ { "afii57456", 0x0650 }, /* ARABIC KASRA */
+ { "afii57457", 0x0651 }, /* ARABIC SHADDA */
+ { "afii57458", 0x0652 }, /* ARABIC SUKUN */
+ { "afii57470", 0x0647 }, /* ARABIC LETTER HEH */
+ { "afii57505", 0x06A4 }, /* ARABIC LETTER VEH */
+ { "afii57506", 0x067E }, /* ARABIC LETTER PEH */
+ { "afii57507", 0x0686 }, /* ARABIC LETTER TCHEH */
+ { "afii57508", 0x0698 }, /* ARABIC LETTER JEH */
+ { "afii57509", 0x06AF }, /* ARABIC LETTER GAF */
+ { "afii57511", 0x0679 }, /* ARABIC LETTER TTEH */
+ { "afii57512", 0x0688 }, /* ARABIC LETTER DDAL */
+ { "afii57513", 0x0691 }, /* ARABIC LETTER RREH */
+ { "afii57514", 0x06BA }, /* ARABIC LETTER NOON GHUNNA */
+ { "afii57519", 0x06D2 }, /* ARABIC LETTER YEH BARREE */
+ { "afii57534", 0x06D5 }, /* ARABIC LETTER AE */
+ { "afii57636", 0x20AA }, /* NEW SHEQEL SIGN */
+ { "afii57645", 0x05BE }, /* HEBREW PUNCTUATION MAQAF */
+ { "afii57658", 0x05C3 }, /* HEBREW PUNCTUATION SOF PASUQ */
+ { "afii57664", 0x05D0 }, /* HEBREW LETTER ALEF */
+ { "afii57665", 0x05D1 }, /* HEBREW LETTER BET */
+ { "afii57666", 0x05D2 }, /* HEBREW LETTER GIMEL */
+ { "afii57667", 0x05D3 }, /* HEBREW LETTER DALET */
+ { "afii57668", 0x05D4 }, /* HEBREW LETTER HE */
+ { "afii57669", 0x05D5 }, /* HEBREW LETTER VAV */
+ { "afii57670", 0x05D6 }, /* HEBREW LETTER ZAYIN */
+ { "afii57671", 0x05D7 }, /* HEBREW LETTER HET */
+ { "afii57672", 0x05D8 }, /* HEBREW LETTER TET */
+ { "afii57673", 0x05D9 }, /* HEBREW LETTER YOD */
+ { "afii57674", 0x05DA }, /* HEBREW LETTER FINAL KAF */
+ { "afii57675", 0x05DB }, /* HEBREW LETTER KAF */
+ { "afii57676", 0x05DC }, /* HEBREW LETTER LAMED */
+ { "afii57677", 0x05DD }, /* HEBREW LETTER FINAL MEM */
+ { "afii57678", 0x05DE }, /* HEBREW LETTER MEM */
+ { "afii57679", 0x05DF }, /* HEBREW LETTER FINAL NUN */
+ { "afii57680", 0x05E0 }, /* HEBREW LETTER NUN */
+ { "afii57681", 0x05E1 }, /* HEBREW LETTER SAMEKH */
+ { "afii57682", 0x05E2 }, /* HEBREW LETTER AYIN */
+ { "afii57683", 0x05E3 }, /* HEBREW LETTER FINAL PE */
+ { "afii57684", 0x05E4 }, /* HEBREW LETTER PE */
+ { "afii57685", 0x05E5 }, /* HEBREW LETTER FINAL TSADI */
+ { "afii57686", 0x05E6 }, /* HEBREW LETTER TSADI */
+ { "afii57687", 0x05E7 }, /* HEBREW LETTER QOF */
+ { "afii57688", 0x05E8 }, /* HEBREW LETTER RESH */
+ { "afii57689", 0x05E9 }, /* HEBREW LETTER SHIN */
+ { "afii57690", 0x05EA }, /* HEBREW LETTER TAV */
+ { "afii57694", 0xFB2A }, /* HEBREW LETTER SHIN WITH SHIN DOT */
+ { "afii57695", 0xFB2B }, /* HEBREW LETTER SHIN WITH SIN DOT */
+ { "afii57700", 0xFB4B }, /* HEBREW LETTER VAV WITH HOLAM */
+ { "afii57705", 0xFB1F }, /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */
+ { "afii57716", 0x05F0 }, /* HEBREW LIGATURE YIDDISH DOUBLE VAV */
+ { "afii57717", 0x05F1 }, /* HEBREW LIGATURE YIDDISH VAV YOD */
+ { "afii57718", 0x05F2 }, /* HEBREW LIGATURE YIDDISH DOUBLE YOD */
+ { "afii57723", 0xFB35 }, /* HEBREW LETTER VAV WITH DAGESH */
+ { "afii57793", 0x05B4 }, /* HEBREW POINT HIRIQ */
+ { "afii57794", 0x05B5 }, /* HEBREW POINT TSERE */
+ { "afii57795", 0x05B6 }, /* HEBREW POINT SEGOL */
+ { "afii57796", 0x05BB }, /* HEBREW POINT QUBUTS */
+ { "afii57797", 0x05B8 }, /* HEBREW POINT QAMATS */
+ { "afii57798", 0x05B7 }, /* HEBREW POINT PATAH */
+ { "afii57799", 0x05B0 }, /* HEBREW POINT SHEVA */
+ { "afii57800", 0x05B2 }, /* HEBREW POINT HATAF PATAH */
+ { "afii57801", 0x05B1 }, /* HEBREW POINT HATAF SEGOL */
+ { "afii57802", 0x05B3 }, /* HEBREW POINT HATAF QAMATS */
+ { "afii57803", 0x05C2 }, /* HEBREW POINT SIN DOT */
+ { "afii57804", 0x05C1 }, /* HEBREW POINT SHIN DOT */
+ { "afii57806", 0x05B9 }, /* HEBREW POINT HOLAM */
+ { "afii57807", 0x05BC }, /* HEBREW POINT DAGESH OR MAPIQ */
+ { "afii57839", 0x05BD }, /* HEBREW POINT METEG */
+ { "afii57841", 0x05BF }, /* HEBREW POINT RAFE */
+ { "afii57842", 0x05C0 }, /* HEBREW PUNCTUATION PASEQ */
+ { "afii57929", 0x02BC }, /* MODIFIER LETTER APOSTROPHE */
+ { "afii61248", 0x2105 }, /* CARE OF */
+ { "afii61289", 0x2113 }, /* SCRIPT SMALL L */
+ { "afii61352", 0x2116 }, /* NUMERO SIGN */
+ { "afii61573", 0x202C }, /* POP DIRECTIONAL FORMATTING */
+ { "afii61574", 0x202D }, /* LEFT-TO-RIGHT OVERRIDE */
+ { "afii61575", 0x202E }, /* RIGHT-TO-LEFT OVERRIDE */
+ { "afii61664", 0x200C }, /* ZERO WIDTH NON-JOINER */
+ { "afii63167", 0x066D }, /* ARABIC FIVE POINTED STAR */
+ { "afii64937", 0x02BD }, /* MODIFIER LETTER REVERSED COMMA */
+ { "agrave", 0x00E0 }, /* LATIN SMALL LETTER A WITH GRAVE */
+ { "aleph", 0x2135 }, /* ALEF SYMBOL */
+ { "alpha", 0x03B1 }, /* GREEK SMALL LETTER ALPHA */
+ { "alphatonos", 0x03AC }, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+ { "amacron", 0x0101 }, /* LATIN SMALL LETTER A WITH MACRON */
+ { "ampersand", 0x0026 }, /* AMPERSAND */
+ { "ampersandsmall", 0xF726 }, /* SMALL CAPITAL AMPERSAND */
+ { "angle", 0x2220 }, /* ANGLE */
+ { "angleleft", 0x2329 }, /* LEFT-POINTING ANGLE BRACKET */
+ { "angleright", 0x232A }, /* RIGHT-POINTING ANGLE BRACKET */
+ { "anoteleia", 0x0387 }, /* GREEK ANO TELEIA */
+ { "aogonek", 0x0105 }, /* LATIN SMALL LETTER A WITH OGONEK */
+ { "approxequal", 0x2248 }, /* ALMOST EQUAL TO */
+ { "aring", 0x00E5 }, /* LATIN SMALL LETTER A WITH RING ABOVE */
+ { "aringacute", 0x01FB }, /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */
+ { "arrowboth", 0x2194 }, /* LEFT RIGHT ARROW */
+ { "arrowdblboth", 0x21D4 }, /* LEFT RIGHT DOUBLE ARROW */
+ { "arrowdbldown", 0x21D3 }, /* DOWNWARDS DOUBLE ARROW */
+ { "arrowdblleft", 0x21D0 }, /* LEFTWARDS DOUBLE ARROW */
+ { "arrowdblright", 0x21D2 }, /* RIGHTWARDS DOUBLE ARROW */
+ { "arrowdblup", 0x21D1 }, /* UPWARDS DOUBLE ARROW */
+ { "arrowdown", 0x2193 }, /* DOWNWARDS ARROW */
+ { "arrowhorizex", 0xF8E7 }, /* HORIZONTAL ARROW EXTENDER */
+ { "arrowleft", 0x2190 }, /* LEFTWARDS ARROW */
+ { "arrowright", 0x2192 }, /* RIGHTWARDS ARROW */
+ { "arrowup", 0x2191 }, /* UPWARDS ARROW */
+ { "arrowupdn", 0x2195 }, /* UP DOWN ARROW */
+ { "arrowupdnbse", 0x21A8 }, /* UP DOWN ARROW WITH BASE */
+ { "arrowvertex", 0xF8E6 }, /* VERTICAL ARROW EXTENDER */
+ { "asciicircum", 0x005E }, /* CIRCUMFLEX ACCENT */
+ { "asciitilde", 0x007E }, /* TILDE */
+ { "asterisk", 0x002A }, /* ASTERISK */
+ { "asteriskmath", 0x2217 }, /* ASTERISK OPERATOR */
+ { "asuperior", 0xF6E9 }, /* SUPERSCRIPT LATIN SMALL LETTER A */
+ { "at", 0x0040 }, /* COMMERCIAL AT */
+ { "atilde", 0x00E3 }, /* LATIN SMALL LETTER A WITH TILDE */
+ { "b", 0x0062 }, /* LATIN SMALL LETTER B */
+ { "backslash", 0x005C }, /* REVERSE SOLIDUS */
+ { "bar", 0x007C }, /* VERTICAL LINE */
+ { "beta", 0x03B2 }, /* GREEK SMALL LETTER BETA */
+ { "block", 0x2588 }, /* FULL BLOCK */
+ { "braceex", 0xF8F4 }, /* CURLY BRACKET EXTENDER */
+ { "braceleft", 0x007B }, /* LEFT CURLY BRACKET */
+ { "braceleftbt", 0xF8F3 }, /* LEFT CURLY BRACKET BOTTOM */
+ { "braceleftmid", 0xF8F2 }, /* LEFT CURLY BRACKET MID */
+ { "bracelefttp", 0xF8F1 }, /* LEFT CURLY BRACKET TOP */
+ { "braceright", 0x007D }, /* RIGHT CURLY BRACKET */
+ { "bracerightbt", 0xF8FE }, /* RIGHT CURLY BRACKET BOTTOM */
+ { "bracerightmid", 0xF8FD }, /* RIGHT CURLY BRACKET MID */
+ { "bracerighttp", 0xF8FC }, /* RIGHT CURLY BRACKET TOP */
+ { "bracketleft", 0x005B }, /* LEFT SQUARE BRACKET */
+ { "bracketleftbt", 0xF8F0 }, /* LEFT SQUARE BRACKET BOTTOM */
+ { "bracketleftex", 0xF8EF }, /* LEFT SQUARE BRACKET EXTENDER */
+ { "bracketlefttp", 0xF8EE }, /* LEFT SQUARE BRACKET TOP */
+ { "bracketright", 0x005D }, /* RIGHT SQUARE BRACKET */
+ { "bracketrightbt", 0xF8FB }, /* RIGHT SQUARE BRACKET BOTTOM */
+ { "bracketrightex", 0xF8FA }, /* RIGHT SQUARE BRACKET EXTENDER */
+ { "bracketrighttp", 0xF8F9 }, /* RIGHT SQUARE BRACKET TOP */
+ { "breve", 0x02D8 }, /* BREVE */
+ { "brokenbar", 0x00A6 }, /* BROKEN BAR */
+ { "bsuperior", 0xF6EA }, /* SUPERSCRIPT LATIN SMALL LETTER B */
+ { "bullet", 0x2022 }, /* BULLET */
+ { "c", 0x0063 }, /* LATIN SMALL LETTER C */
+ { "cacute", 0x0107 }, /* LATIN SMALL LETTER C WITH ACUTE */
+ { "caron", 0x02C7 }, /* CARON */
+ { "carriagereturn", 0x21B5 }, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS */
+ { "ccaron", 0x010D }, /* LATIN SMALL LETTER C WITH CARON */
+ { "ccedilla", 0x00E7 }, /* LATIN SMALL LETTER C WITH CEDILLA */
+ { "ccircumflex", 0x0109 }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
+ { "cdotaccent", 0x010B }, /* LATIN SMALL LETTER C WITH DOT ABOVE */
+ { "cedilla", 0x00B8 }, /* CEDILLA */
+ { "cent", 0x00A2 }, /* CENT SIGN */
+ { "centinferior", 0xF6DF }, /* SUBSCRIPT CENT SIGN */
+ { "centoldstyle", 0xF7A2 }, /* OLDSTYLE CENT SIGN */
+ { "centsuperior", 0xF6E0 }, /* SUPERSCRIPT CENT SIGN */
+ { "chi", 0x03C7 }, /* GREEK SMALL LETTER CHI */
+ { "circle", 0x25CB }, /* WHITE CIRCLE */
+ { "circlemultiply", 0x2297 }, /* CIRCLED TIMES */
+ { "circleplus", 0x2295 }, /* CIRCLED PLUS */
+ /* { "circumflex", 0x02C6 }, /\* MODIFIER LETTER CIRCUMFLEX ACCENT *\/ */
+ { "circumflex", 0x005E }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
+ { "club", 0x2663 }, /* BLACK CLUB SUIT */
+ { "colon", 0x003A }, /* COLON */
+ { "colonmonetary", 0x20A1 }, /* COLON SIGN */
+ { "comma", 0x002C }, /* COMMA */
+ { "commaaccent", 0xF6C3 }, /* COMMA BELOW */
+ { "commainferior", 0xF6E1 }, /* SUBSCRIPT COMMA */
+ { "commasuperior", 0xF6E2 }, /* SUPERSCRIPT COMMA */
+ { "congruent", 0x2245 }, /* APPROXIMATELY EQUAL TO */
+ { "copyright", 0x00A9 }, /* COPYRIGHT SIGN */
+ { "copyrightsans", 0xF8E9 }, /* COPYRIGHT SIGN SANS SERIF */
+ { "copyrightserif", 0xF6D9 }, /* COPYRIGHT SIGN SERIF */
+ { "currency", 0x00A4 }, /* CURRENCY SIGN */
+ { "cyrBreve", 0xF6D1 }, /* CAPITAL CYRILLIC BREVE */
+ { "cyrFlex", 0xF6D2 }, /* CAPITAL CYRILLIC CIRCUMFLEX */
+ { "cyrbreve", 0xF6D4 }, /* CYRILLIC BREVE */
+ { "cyrflex", 0xF6D5 }, /* CYRILLIC CIRCUMFLEX */
+ { "d", 0x0064 }, /* LATIN SMALL LETTER D */
+ { "dagger", 0x2020 }, /* DAGGER */
+ { "daggerdbl", 0x2021 }, /* DOUBLE DAGGER */
+ { "dblGrave", 0xF6D3 }, /* CAPITAL DOUBLE GRAVE ACCENT */
+ { "dblgrave", 0xF6D6 }, /* DOUBLE GRAVE ACCENT */
+ { "dcaron", 0x010F }, /* LATIN SMALL LETTER D WITH CARON */
+ { "dcroat", 0x0111 }, /* LATIN SMALL LETTER D WITH STROKE */
+ { "degree", 0x00B0 }, /* DEGREE SIGN */
+ { "delta", 0x03B4 }, /* GREEK SMALL LETTER DELTA */
+ { "diamond", 0x2666 }, /* BLACK DIAMOND SUIT */
+ { "dieresis", 0x00A8 }, /* DIAERESIS */
+ { "dieresisacute", 0xF6D7 }, /* DIAERESIS ACUTE ACCENT */
+ { "dieresisgrave", 0xF6D8 }, /* DIAERESIS GRAVE ACCENT */
+ { "dieresistonos", 0x0385 }, /* GREEK DIALYTIKA TONOS */
+ { "divide", 0x00F7 }, /* DIVISION SIGN */
+ { "dkshade", 0x2593 }, /* DARK SHADE */
+ { "dnblock", 0x2584 }, /* LOWER HALF BLOCK */
+ { "dollar", 0x0024 }, /* DOLLAR SIGN */
+ { "dollarinferior", 0xF6E3 }, /* SUBSCRIPT DOLLAR SIGN */
+ { "dollaroldstyle", 0xF724 }, /* OLDSTYLE DOLLAR SIGN */
+ { "dollarsuperior", 0xF6E4 }, /* SUPERSCRIPT DOLLAR SIGN */
+ { "dong", 0x20AB }, /* DONG SIGN */
+ { "dotaccent", 0x02D9 }, /* DOT ABOVE */
+ { "dotbelowcomb", 0x0323 }, /* COMBINING DOT BELOW */
+ { "dotlessi", 0x0131 }, /* LATIN SMALL LETTER DOTLESS I */
+ { "dotlessj", 0xF6BE }, /* LATIN SMALL LETTER DOTLESS J */
+ { "dotmath", 0x22C5 }, /* DOT OPERATOR */
+ { "dsuperior", 0xF6EB }, /* SUPERSCRIPT LATIN SMALL LETTER D */
+ { "e", 0x0065 }, /* LATIN SMALL LETTER E */
+ { "eacute", 0x00E9 }, /* LATIN SMALL LETTER E WITH ACUTE */
+ { "ebreve", 0x0115 }, /* LATIN SMALL LETTER E WITH BREVE */
+ { "ecaron", 0x011B }, /* LATIN SMALL LETTER E WITH CARON */
+ { "ecircumflex", 0x00EA }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */
+ { "edieresis", 0x00EB }, /* LATIN SMALL LETTER E WITH DIAERESIS */
+ { "edotaccent", 0x0117 }, /* LATIN SMALL LETTER E WITH DOT ABOVE */
+ { "egrave", 0x00E8 }, /* LATIN SMALL LETTER E WITH GRAVE */
+ { "eight", 0x0038 }, /* DIGIT EIGHT */
+ { "eightinferior", 0x2088 }, /* SUBSCRIPT EIGHT */
+ { "eightoldstyle", 0xF738 }, /* OLDSTYLE DIGIT EIGHT */
+ { "eightsuperior", 0x2078 }, /* SUPERSCRIPT EIGHT */
+ { "element", 0x2208 }, /* ELEMENT OF */
+ { "ellipsis", 0x2026 }, /* HORIZONTAL ELLIPSIS */
+ { "emacron", 0x0113 }, /* LATIN SMALL LETTER E WITH MACRON */
+ { "emdash", 0x2014 }, /* EM DASH */
+ { "emptyset", 0x2205 }, /* EMPTY SET */
+ { "endash", 0x2013 }, /* EN DASH */
+ { "eng", 0x014B }, /* LATIN SMALL LETTER ENG */
+ { "eogonek", 0x0119 }, /* LATIN SMALL LETTER E WITH OGONEK */
+ { "epsilon", 0x03B5 }, /* GREEK SMALL LETTER EPSILON */
+ { "epsilontonos", 0x03AD }, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+ { "equal", 0x003D }, /* EQUALS SIGN */
+ { "equivalence", 0x2261 }, /* IDENTICAL TO */
+ { "estimated", 0x212E }, /* ESTIMATED SYMBOL */
+ { "esuperior", 0xF6EC }, /* SUPERSCRIPT LATIN SMALL LETTER E */
+ { "eta", 0x03B7 }, /* GREEK SMALL LETTER ETA */
+ { "etatonos", 0x03AE }, /* GREEK SMALL LETTER ETA WITH TONOS */
+ { "eth", 0x00F0 }, /* LATIN SMALL LETTER ETH */
+ { "exclam", 0x0021 }, /* EXCLAMATION MARK */
+ { "exclamdbl", 0x203C }, /* DOUBLE EXCLAMATION MARK */
+ { "exclamdown", 0x00A1 }, /* INVERTED EXCLAMATION MARK */
+ { "exclamdownsmall", 0xF7A1 }, /* SMALL CAPITAL INVERTED EXCLAMATION MARK */
+ { "exclamsmall", 0xF721 }, /* SMALL CAPITAL EXCLAMATION MARK */
+ { "existential", 0x2203 }, /* THERE EXISTS */
+ { "f", 0x0066 }, /* LATIN SMALL LETTER F */
+ { "female", 0x2640 }, /* FEMALE SIGN */
+ { "ff", 0xFB00 }, /* LATIN SMALL LIGATURE FF */
+ { "ffi", 0xFB03 }, /* LATIN SMALL LIGATURE FFI */
+ { "ffl", 0xFB04 }, /* LATIN SMALL LIGATURE FFL */
+ { "fi", 0xFB01 }, /* LATIN SMALL LIGATURE FI */
+ { "figuredash", 0x2012 }, /* FIGURE DASH */
+ { "filledbox", 0x25A0 }, /* BLACK SQUARE */
+ { "filledrect", 0x25AC }, /* BLACK RECTANGLE */
+ { "five", 0x0035 }, /* DIGIT FIVE */
+ { "fiveeighths", 0x215D }, /* VULGAR FRACTION FIVE EIGHTHS */
+ { "fiveinferior", 0x2085 }, /* SUBSCRIPT FIVE */
+ { "fiveoldstyle", 0xF735 }, /* OLDSTYLE DIGIT FIVE */
+ { "fivesuperior", 0x2075 }, /* SUPERSCRIPT FIVE */
+ { "fl", 0xFB02 }, /* LATIN SMALL LIGATURE FL */
+ { "florin", 0x0192 }, /* LATIN SMALL LETTER F WITH HOOK */
+ { "four", 0x0034 }, /* DIGIT FOUR */
+ { "fourinferior", 0x2084 }, /* SUBSCRIPT FOUR */
+ { "fouroldstyle", 0xF734 }, /* OLDSTYLE DIGIT FOUR */
+ { "foursuperior", 0x2074 }, /* SUPERSCRIPT FOUR */
+ { "fraction", 0x2044 }, /* FRACTION SLASH */
+#if 0
+ { "fraction" DUP2, 0x2215 }, /* DIVISION SLASH;Duplicate */
+#endif /* 0 */
+ { "franc", 0x20A3 }, /* FRENCH FRANC SIGN */
+ { "ft", 0xFB05 }, /* LATIN SMALL LIGATURE FT */
+ { "g", 0x0067 }, /* LATIN SMALL LETTER G */
+ { "gamma", 0x03B3 }, /* GREEK SMALL LETTER GAMMA */
+ { "gbreve", 0x011F }, /* LATIN SMALL LETTER G WITH BREVE */
+ { "gcaron", 0x01E7 }, /* LATIN SMALL LETTER G WITH CARON */
+ { "gcircumflex", 0x011D }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
+ { "gcommaaccent", 0x0123 }, /* LATIN SMALL LETTER G WITH CEDILLA */
+ { "gdotaccent", 0x0121 }, /* LATIN SMALL LETTER G WITH DOT ABOVE */
+ { "germandbls", 0x00DF }, /* LATIN SMALL LETTER SHARP S */
+ { "gradient", 0x2207 }, /* NABLA */
+ { "grave", 0x0060 }, /* GRAVE ACCENT */
+ { "gravecomb", 0x0300 }, /* COMBINING GRAVE ACCENT */
+ { "greater", 0x003E }, /* GREATER-THAN SIGN */
+ { "greaterequal", 0x2265 }, /* GREATER-THAN OR EQUAL TO */
+ { "guillemotleft", 0x00AB }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ { "guillemotright", 0x00BB }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ { "guilsinglleft", 0x2039 }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
+ { "guilsinglright", 0x203A }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
+ { "h", 0x0068 }, /* LATIN SMALL LETTER H */
+ { "hbar", 0x0127 }, /* LATIN SMALL LETTER H WITH STROKE */
+ { "hcircumflex", 0x0125 }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
+ { "heart", 0x2665 }, /* BLACK HEART SUIT */
+ { "hookabovecomb", 0x0309 }, /* COMBINING HOOK ABOVE */
+ { "house", 0x2302 }, /* HOUSE */
+ { "hungarumlaut", 0x02DD }, /* DOUBLE ACUTE ACCENT */
+ { "hyphen", 0x002D }, /* HYPHEN-MINUS */
+#if 0
+ { "hyphen" DUP2, 0x00AD }, /* SOFT HYPHEN;Duplicate */
+#endif /* 0 */
+ { "hypheninferior", 0xF6E5 }, /* SUBSCRIPT HYPHEN-MINUS */
+ { "hyphensuperior", 0xF6E6 }, /* SUPERSCRIPT HYPHEN-MINUS */
+ { "i", 0x0069 }, /* LATIN SMALL LETTER I */
+ { "iacute", 0x00ED }, /* LATIN SMALL LETTER I WITH ACUTE */
+ { "ibreve", 0x012D }, /* LATIN SMALL LETTER I WITH BREVE */
+ { "icircumflex", 0x00EE }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+ { "idieresis", 0x00EF }, /* LATIN SMALL LETTER I WITH DIAERESIS */
+ { "igrave", 0x00EC }, /* LATIN SMALL LETTER I WITH GRAVE */
+ { "ij", 0x0133 }, /* LATIN SMALL LIGATURE IJ */
+ { "imacron", 0x012B }, /* LATIN SMALL LETTER I WITH MACRON */
+ { "infinity", 0x221E }, /* INFINITY */
+ { "integral", 0x222B }, /* INTEGRAL */
+ { "integralbt", 0x2321 }, /* BOTTOM HALF INTEGRAL */
+ { "integralex", 0xF8F5 }, /* INTEGRAL EXTENDER */
+ { "integraltp", 0x2320 }, /* TOP HALF INTEGRAL */
+ { "intersection", 0x2229 }, /* INTERSECTION */
+ { "invbullet", 0x25D8 }, /* INVERSE BULLET */
+ { "invcircle", 0x25D9 }, /* INVERSE WHITE CIRCLE */
+ { "invsmileface", 0x263B }, /* BLACK SMILING FACE */
+ { "iogonek", 0x012F }, /* LATIN SMALL LETTER I WITH OGONEK */
+ { "iota", 0x03B9 }, /* GREEK SMALL LETTER IOTA */
+ { "iotadieresis", 0x03CA }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+ { "iotadieresistonos", 0x0390 }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ { "iotatonos", 0x03AF }, /* GREEK SMALL LETTER IOTA WITH TONOS */
+ { "isuperior", 0xF6ED }, /* SUPERSCRIPT LATIN SMALL LETTER I */
+ { "itilde", 0x0129 }, /* LATIN SMALL LETTER I WITH TILDE */
+ { "j", 0x006A }, /* LATIN SMALL LETTER J */
+ { "jcircumflex", 0x0135 }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
+ { "k", 0x006B }, /* LATIN SMALL LETTER K */
+ { "kappa", 0x03BA }, /* GREEK SMALL LETTER KAPPA */
+ { "kcommaaccent", 0x0137 }, /* LATIN SMALL LETTER K WITH CEDILLA */
+ { "kgreenlandic", 0x0138 }, /* LATIN SMALL LETTER KRA */
+ { "l", 0x006C }, /* LATIN SMALL LETTER L */
+ { "lacute", 0x013A }, /* LATIN SMALL LETTER L WITH ACUTE */
+ { "lambda", 0x03BB }, /* GREEK SMALL LETTER LAMDA */
+ { "lcaron", 0x013E }, /* LATIN SMALL LETTER L WITH CARON */
+ { "lcommaaccent", 0x013C }, /* LATIN SMALL LETTER L WITH CEDILLA */
+ { "ldot", 0x0140 }, /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+ { "less", 0x003C }, /* LESS-THAN SIGN */
+ { "lessequal", 0x2264 }, /* LESS-THAN OR EQUAL TO */
+ { "lfblock", 0x258C }, /* LEFT HALF BLOCK */
+ { "lira", 0x20A4 }, /* LIRA SIGN */
+ { "ll", 0xF6C0 }, /* LATIN SMALL LETTER LL */
+ { "logicaland", 0x2227 }, /* LOGICAL AND */
+ { "logicalnot", 0x00AC }, /* NOT SIGN */
+ { "logicalor", 0x2228 }, /* LOGICAL OR */
+ { "longs", 0x017F }, /* LATIN SMALL LETTER LONG S */
+ { "lozenge", 0x25CA }, /* LOZENGE */
+ { "lslash", 0x0142 }, /* LATIN SMALL LETTER L WITH STROKE */
+ { "lsuperior", 0xF6EE }, /* SUPERSCRIPT LATIN SMALL LETTER L */
+ { "ltshade", 0x2591 }, /* LIGHT SHADE */
+ { "m", 0x006D }, /* LATIN SMALL LETTER M */
+ { "macron", 0x00AF }, /* MACRON */
+#if 0
+ { "macron" DUP2, 0x02C9 }, /* MODIFIER LETTER MACRON;Duplicate */
+#endif /* 0 */
+ { "male", 0x2642 }, /* MALE SIGN */
+ { "minus", 0x2212 }, /* MINUS SIGN */
+ { "minute", 0x2032 }, /* PRIME */
+ { "msuperior", 0xF6EF }, /* SUPERSCRIPT LATIN SMALL LETTER M */
+ { "mu", 0x00B5 }, /* MICRO SIGN */
+#if 0
+ { "mu" DUP2, 0x03BC }, /* GREEK SMALL LETTER MU;Duplicate */
+#endif /* 0 */
+ { "multiply", 0x00D7 }, /* MULTIPLICATION SIGN */
+ { "musicalnote", 0x266A }, /* EIGHTH NOTE */
+ { "musicalnotedbl", 0x266B }, /* BEAMED EIGHTH NOTES */
+ { "n", 0x006E }, /* LATIN SMALL LETTER N */
+ { "nacute", 0x0144 }, /* LATIN SMALL LETTER N WITH ACUTE */
+ { "napostrophe", 0x0149 }, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ { "ncaron", 0x0148 }, /* LATIN SMALL LETTER N WITH CARON */
+ { "ncommaaccent", 0x0146 }, /* LATIN SMALL LETTER N WITH CEDILLA */
+ { "nine", 0x0039 }, /* DIGIT NINE */
+ { "nineinferior", 0x2089 }, /* SUBSCRIPT NINE */
+ { "nineoldstyle", 0xF739 }, /* OLDSTYLE DIGIT NINE */
+ { "ninesuperior", 0x2079 }, /* SUPERSCRIPT NINE */
+ { "notelement", 0x2209 }, /* NOT AN ELEMENT OF */
+ { "notequal", 0x2260 }, /* NOT EQUAL TO */
+ { "notsubset", 0x2284 }, /* NOT A SUBSET OF */
+ { "nsuperior", 0x207F }, /* SUPERSCRIPT LATIN SMALL LETTER N */
+ { "ntilde", 0x00F1 }, /* LATIN SMALL LETTER N WITH TILDE */
+ { "nu", 0x03BD }, /* GREEK SMALL LETTER NU */
+ { "numbersign", 0x0023 }, /* NUMBER SIGN */
+ { "o", 0x006F }, /* LATIN SMALL LETTER O */
+ { "oacute", 0x00F3 }, /* LATIN SMALL LETTER O WITH ACUTE */
+ { "obreve", 0x014F }, /* LATIN SMALL LETTER O WITH BREVE */
+ { "ocircumflex", 0x00F4 }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+ { "odieresis", 0x00F6 }, /* LATIN SMALL LETTER O WITH DIAERESIS */
+ { "oe", 0x0153 }, /* LATIN SMALL LIGATURE OE */
+ { "ogonek", 0x02DB }, /* OGONEK */
+ { "ograve", 0x00F2 }, /* LATIN SMALL LETTER O WITH GRAVE */
+ { "ohorn", 0x01A1 }, /* LATIN SMALL LETTER O WITH HORN */
+ { "ohungarumlaut", 0x0151 }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+ { "omacron", 0x014D }, /* LATIN SMALL LETTER O WITH MACRON */
+ { "omega", 0x03C9 }, /* GREEK SMALL LETTER OMEGA */
+ { "omega1", 0x03D6 }, /* GREEK PI SYMBOL */
+ { "omegatonos", 0x03CE }, /* GREEK SMALL LETTER OMEGA WITH TONOS */
+ { "omicron", 0x03BF }, /* GREEK SMALL LETTER OMICRON */
+ { "omicrontonos", 0x03CC }, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+ { "one", 0x0031 }, /* DIGIT ONE */
+ { "onedotenleader", 0x2024 }, /* ONE DOT LEADER */
+ { "oneeighth", 0x215B }, /* VULGAR FRACTION ONE EIGHTH */
+ { "onefitted", 0xF6DC }, /* PROPORTIONAL DIGIT ONE */
+ { "onehalf", 0x00BD }, /* VULGAR FRACTION ONE HALF */
+ { "oneinferior", 0x2081 }, /* SUBSCRIPT ONE */
+ { "oneoldstyle", 0xF731 }, /* OLDSTYLE DIGIT ONE */
+ { "onequarter", 0x00BC }, /* VULGAR FRACTION ONE QUARTER */
+ { "onesuperior", 0x00B9 }, /* SUPERSCRIPT ONE */
+ { "onethird", 0x2153 }, /* VULGAR FRACTION ONE THIRD */
+ { "openbullet", 0x25E6 }, /* WHITE BULLET */
+ { "ordfeminine", 0x00AA }, /* FEMININE ORDINAL INDICATOR */
+ { "ordmasculine", 0x00BA }, /* MASCULINE ORDINAL INDICATOR */
+ { "orthogonal", 0x221F }, /* RIGHT ANGLE */
+ { "oslash", 0x00F8 }, /* LATIN SMALL LETTER O WITH STROKE */
+ { "oslashacute", 0x01FF }, /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */
+ { "osuperior", 0xF6F0 }, /* SUPERSCRIPT LATIN SMALL LETTER O */
+ { "otilde", 0x00F5 }, /* LATIN SMALL LETTER O WITH TILDE */
+ { "p", 0x0070 }, /* LATIN SMALL LETTER P */
+ { "paragraph", 0x00B6 }, /* PILCROW SIGN */
+ { "parenleft", 0x0028 }, /* LEFT PARENTHESIS */
+ { "parenleftbt", 0xF8ED }, /* LEFT PAREN BOTTOM */
+ { "parenleftex", 0xF8EC }, /* LEFT PAREN EXTENDER */
+ { "parenleftinferior", 0x208D }, /* SUBSCRIPT LEFT PARENTHESIS */
+ { "parenleftsuperior", 0x207D }, /* SUPERSCRIPT LEFT PARENTHESIS */
+ { "parenlefttp", 0xF8EB }, /* LEFT PAREN TOP */
+ { "parenright", 0x0029 }, /* RIGHT PARENTHESIS */
+ { "parenrightbt", 0xF8F8 }, /* RIGHT PAREN BOTTOM */
+ { "parenrightex", 0xF8F7 }, /* RIGHT PAREN EXTENDER */
+ { "parenrightinferior", 0x208E }, /* SUBSCRIPT RIGHT PARENTHESIS */
+ { "parenrightsuperior", 0x207E }, /* SUPERSCRIPT RIGHT PARENTHESIS */
+ { "parenrighttp", 0xF8F6 }, /* RIGHT PAREN TOP */
+ { "partialdiff", 0x2202 }, /* PARTIAL DIFFERENTIAL */
+ { "percent", 0x0025 }, /* PERCENT SIGN */
+ { "period", 0x002E }, /* FULL STOP */
+ { "periodcentered", 0x00B7 }, /* MIDDLE DOT */
+#if 0
+ { "periodcentered" DUP2, 0x2219 }, /* BULLET OPERATOR;Duplicate */
+#endif /* 0 */
+ { "periodinferior", 0xF6E7 }, /* SUBSCRIPT FULL STOP */
+ { "periodsuperior", 0xF6E8 }, /* SUPERSCRIPT FULL STOP */
+ { "perpendicular", 0x22A5 }, /* UP TACK */
+ { "perthousand", 0x2030 }, /* PER MILLE SIGN */
+ { "peseta", 0x20A7 }, /* PESETA SIGN */
+ { "phi", 0x03C6 }, /* GREEK SMALL LETTER PHI */
+ { "phi1", 0x03D5 }, /* GREEK PHI SYMBOL */
+ { "pi", 0x03C0 }, /* GREEK SMALL LETTER PI */
+ { "plus", 0x002B }, /* PLUS SIGN */
+ { "plusminus", 0x00B1 }, /* PLUS-MINUS SIGN */
+ { "prescription", 0x211E }, /* PRESCRIPTION TAKE */
+ { "product", 0x220F }, /* N-ARY PRODUCT */
+ { "propersubset", 0x2282 }, /* SUBSET OF */
+ { "propersuperset", 0x2283 }, /* SUPERSET OF */
+ { "proportional", 0x221D }, /* PROPORTIONAL TO */
+ { "psi", 0x03C8 }, /* GREEK SMALL LETTER PSI */
+ { "q", 0x0071 }, /* LATIN SMALL LETTER Q */
+ { "question", 0x003F }, /* QUESTION MARK */
+ { "questiondown", 0x00BF }, /* INVERTED QUESTION MARK */
+ { "questiondownsmall", 0xF7BF }, /* SMALL CAPITAL INVERTED QUESTION MARK */
+ { "questionsmall", 0xF73F }, /* SMALL CAPITAL QUESTION MARK */
+ { "quotedbl", 0x0022 }, /* QUOTATION MARK */
+ { "quotedblbase", 0x201E }, /* DOUBLE LOW-9 QUOTATION MARK */
+ { "quotedblleft", 0x201C }, /* LEFT DOUBLE QUOTATION MARK */
+ { "quotedblright", 0x201D }, /* RIGHT DOUBLE QUOTATION MARK */
+ { "quoteleft", 0x2018 }, /* LEFT SINGLE QUOTATION MARK */
+ { "quotereversed", 0x201B }, /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */
+ { "quoteright", 0x2019 }, /* RIGHT SINGLE QUOTATION MARK */
+ { "quotesinglbase", 0x201A }, /* SINGLE LOW-9 QUOTATION MARK */
+ { "quotesingle", 0x0027 }, /* APOSTROPHE */
+ { "r", 0x0072 }, /* LATIN SMALL LETTER R */
+ { "racute", 0x0155 }, /* LATIN SMALL LETTER R WITH ACUTE */
+ { "radical", 0x221A }, /* SQUARE ROOT */
+ { "radicalex", 0xF8E5 }, /* RADICAL EXTENDER */
+ { "rcaron", 0x0159 }, /* LATIN SMALL LETTER R WITH CARON */
+ { "rcommaaccent", 0x0157 }, /* LATIN SMALL LETTER R WITH CEDILLA */
+ { "reflexsubset", 0x2286 }, /* SUBSET OF OR EQUAL TO */
+ { "reflexsuperset", 0x2287 }, /* SUPERSET OF OR EQUAL TO */
+ { "registered", 0x00AE }, /* REGISTERED SIGN */
+ { "registersans", 0xF8E8 }, /* REGISTERED SIGN SANS SERIF */
+ { "registerserif", 0xF6DA }, /* REGISTERED SIGN SERIF */
+ { "revlogicalnot", 0x2310 }, /* REVERSED NOT SIGN */
+ { "rho", 0x03C1 }, /* GREEK SMALL LETTER RHO */
+ { "ring", 0x02DA }, /* RING ABOVE */
+ { "rsuperior", 0xF6F1 }, /* SUPERSCRIPT LATIN SMALL LETTER R */
+ { "rtblock", 0x2590 }, /* RIGHT HALF BLOCK */
+ { "rupiah", 0xF6DD }, /* RUPIAH SIGN */
+ { "s", 0x0073 }, /* LATIN SMALL LETTER S */
+ { "sacute", 0x015B }, /* LATIN SMALL LETTER S WITH ACUTE */
+ { "scaron", 0x0161 }, /* LATIN SMALL LETTER S WITH CARON */
+ { "scedilla", 0x015F }, /* LATIN SMALL LETTER S WITH CEDILLA */
+#if 0
+ { "scedilla" DUP2, 0xF6C2 }, /* LATIN SMALL LETTER S WITH CEDILLA;Duplicate */
+#endif /* 0 */
+ { "scircumflex", 0x015D }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
+ { "scommaaccent", 0x0219 }, /* LATIN SMALL LETTER S WITH COMMA BELOW */
+ { "second", 0x2033 }, /* DOUBLE PRIME */
+ { "section", 0x00A7 }, /* SECTION SIGN */
+ { "semicolon", 0x003B }, /* SEMICOLON */
+ { "seven", 0x0037 }, /* DIGIT SEVEN */
+ { "seveneighths", 0x215E }, /* VULGAR FRACTION SEVEN EIGHTHS */
+ { "seveninferior", 0x2087 }, /* SUBSCRIPT SEVEN */
+ { "sevenoldstyle", 0xF737 }, /* OLDSTYLE DIGIT SEVEN */
+ { "sevensuperior", 0x2077 }, /* SUPERSCRIPT SEVEN */
+ { "shade", 0x2592 }, /* MEDIUM SHADE */
+ { "sigma", 0x03C3 }, /* GREEK SMALL LETTER SIGMA */
+ { "sigma1", 0x03C2 }, /* GREEK SMALL LETTER FINAL SIGMA */
+ { "similar", 0x223C }, /* TILDE OPERATOR */
+ { "six", 0x0036 }, /* DIGIT SIX */
+ { "sixinferior", 0x2086 }, /* SUBSCRIPT SIX */
+ { "sixoldstyle", 0xF736 }, /* OLDSTYLE DIGIT SIX */
+ { "sixsuperior", 0x2076 }, /* SUPERSCRIPT SIX */
+ { "slash", 0x002F }, /* SOLIDUS */
+ { "smileface", 0x263A }, /* WHITE SMILING FACE */
+ { "space", 0x0020 }, /* SPACE */
+#if 0
+ { "space" DUP2, 0x00A0 }, /* NO-BREAK SPACE;Duplicate */
+#endif /* 0 */
+ { "spade", 0x2660 }, /* BLACK SPADE SUIT */
+ { "ssuperior", 0xF6F2 }, /* SUPERSCRIPT LATIN SMALL LETTER S */
+ { "st", 0xFB06 }, /* LATIN SMALL LIGATURE ST */
+ { "sterling", 0x00A3 }, /* POUND SIGN */
+ { "suchthat", 0x220B }, /* CONTAINS AS MEMBER */
+ { "summation", 0x2211 }, /* N-ARY SUMMATION */
+ { "summationtext", 0x2211 }, /* N-ARY SUMMATION - apparently this is the name used in cmex? */
+ { "sun", 0x263C }, /* WHITE SUN WITH RAYS */
+ { "t", 0x0074 }, /* LATIN SMALL LETTER T */
+ { "tau", 0x03C4 }, /* GREEK SMALL LETTER TAU */
+ { "tbar", 0x0167 }, /* LATIN SMALL LETTER T WITH STROKE */
+ { "tcaron", 0x0165 }, /* LATIN SMALL LETTER T WITH CARON */
+ { "tcommaaccent", 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA */
+#if 0
+ { "tcommaaccent" DUP2, 0x021B }, /* LATIN SMALL LETTER T WITH COMMA BELOW;Duplicate */
+#endif /* 0 */
+ { "therefore", 0x2234 }, /* THEREFORE */
+ { "theta", 0x03B8 }, /* GREEK SMALL LETTER THETA */
+ { "theta1", 0x03D1 }, /* GREEK THETA SYMBOL */
+ { "thorn", 0x00FE }, /* LATIN SMALL LETTER THORN */
+ { "three", 0x0033 }, /* DIGIT THREE */
+ { "threeeighths", 0x215C }, /* VULGAR FRACTION THREE EIGHTHS */
+ { "threeinferior", 0x2083 }, /* SUBSCRIPT THREE */
+ { "threeoldstyle", 0xF733 }, /* OLDSTYLE DIGIT THREE */
+ { "threequarters", 0x00BE }, /* VULGAR FRACTION THREE QUARTERS */
+ { "threequartersemdash", 0xF6DE }, /* THREE QUARTERS EM DASH */
+ { "threesuperior", 0x00B3 }, /* SUPERSCRIPT THREE */
+ /* { "tilde", 0x02DC }, /\* SMALL TILDE *\/ */
+ { "tilde", 0x007E }, /* ASCII TILDE */
+ { "tildecomb", 0x0303 }, /* COMBINING TILDE */
+ { "tonos", 0x0384 }, /* GREEK TONOS */
+ { "trademark", 0x2122 }, /* TRADE MARK SIGN */
+ { "trademarksans", 0xF8EA }, /* TRADE MARK SIGN SANS SERIF */
+ { "trademarkserif", 0xF6DB }, /* TRADE MARK SIGN SERIF */
+ { "triagdn", 0x25BC }, /* BLACK DOWN-POINTING TRIANGLE */
+ { "triaglf", 0x25C4 }, /* BLACK LEFT-POINTING POINTER */
+ { "triagrt", 0x25BA }, /* BLACK RIGHT-POINTING POINTER */
+ { "triagup", 0x25B2 }, /* BLACK UP-POINTING TRIANGLE */
+ { "tsuperior", 0xF6F3 }, /* SUPERSCRIPT LATIN SMALL LETTER T */
+ { "two", 0x0032 }, /* DIGIT TWO */
+ { "twodotenleader", 0x2025 }, /* TWO DOT LEADER */
+ { "twoinferior", 0x2082 }, /* SUBSCRIPT TWO */
+ { "twooldstyle", 0xF732 }, /* OLDSTYLE DIGIT TWO */
+ { "twosuperior", 0x00B2 }, /* SUPERSCRIPT TWO */
+ { "twothirds", 0x2154 }, /* VULGAR FRACTION TWO THIRDS */
+ { "u", 0x0075 }, /* LATIN SMALL LETTER U */
+ { "uacute", 0x00FA }, /* LATIN SMALL LETTER U WITH ACUTE */
+ { "ubreve", 0x016D }, /* LATIN SMALL LETTER U WITH BREVE */
+ { "ucircumflex", 0x00FB }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
+ { "udieresis", 0x00FC }, /* LATIN SMALL LETTER U WITH DIAERESIS */
+ { "ugrave", 0x00F9 }, /* LATIN SMALL LETTER U WITH GRAVE */
+ { "uhorn", 0x01B0 }, /* LATIN SMALL LETTER U WITH HORN */
+ { "uhungarumlaut", 0x0171 }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+ { "umacron", 0x016B }, /* LATIN SMALL LETTER U WITH MACRON */
+ { "underscore", 0x005F }, /* LOW LINE */
+ { "underscoredbl", 0x2017 }, /* DOUBLE LOW LINE */
+ { "union", 0x222A }, /* UNION */
+ { "universal", 0x2200 }, /* FOR ALL */
+ { "uogonek", 0x0173 }, /* LATIN SMALL LETTER U WITH OGONEK */
+ { "upblock", 0x2580 }, /* UPPER HALF BLOCK */
+ { "upsilon", 0x03C5 }, /* GREEK SMALL LETTER UPSILON */
+ { "upsilondieresis", 0x03CB }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+ { "upsilondieresistonos", 0x03B0 }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+ { "upsilontonos", 0x03CD }, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+ { "uring", 0x016F }, /* LATIN SMALL LETTER U WITH RING ABOVE */
+ { "utilde", 0x0169 }, /* LATIN SMALL LETTER U WITH TILDE */
+ { "v", 0x0076 }, /* LATIN SMALL LETTER V */
+ { "w", 0x0077 }, /* LATIN SMALL LETTER W */
+ { "wacute", 0x1E83 }, /* LATIN SMALL LETTER W WITH ACUTE */
+ { "wcircumflex", 0x0175 }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
+ { "wdieresis", 0x1E85 }, /* LATIN SMALL LETTER W WITH DIAERESIS */
+ { "weierstrass", 0x2118 }, /* SCRIPT CAPITAL P */
+ { "wgrave", 0x1E81 }, /* LATIN SMALL LETTER W WITH GRAVE */
+ { "x", 0x0078 }, /* LATIN SMALL LETTER X */
+ { "xi", 0x03BE }, /* GREEK SMALL LETTER XI */
+ { "y", 0x0079 }, /* LATIN SMALL LETTER Y */
+ { "yacute", 0x00FD }, /* LATIN SMALL LETTER Y WITH ACUTE */
+ { "ycircumflex", 0x0177 }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+ { "ydieresis", 0x00FF }, /* LATIN SMALL LETTER Y WITH DIAERESIS */
+ { "yen", 0x00A5 }, /* YEN SIGN */
+ { "ygrave", 0x1EF3 }, /* LATIN SMALL LETTER Y WITH GRAVE */
+ { "z", 0x007A }, /* LATIN SMALL LETTER Z */
+ { "zacute", 0x017A }, /* LATIN SMALL LETTER Z WITH ACUTE */
+ { "zcaron", 0x017E }, /* LATIN SMALL LETTER Z WITH CARON */
+ { "zdotaccent", 0x017C }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+ { "zero", 0x0030 }, /* DIGIT ZERO */
+ { "zeroinferior", 0x2080 }, /* SUBSCRIPT ZERO */
+ { "zerooldstyle", 0xF730 }, /* OLDSTYLE DIGIT ZERO */
+ { "zerosuperior", 0x2070 }, /* SUPERSCRIPT ZERO */
+ { "zeta", 0x03B6 } /* GREEK SMALL LETTER ZETA */
+};
+
+#if 0
+static struct unicode2adobe unicode2adobe_table[] = {
+ { 0, ".notdef" }, /* was: QUESTION MARK; changed to 0 */
+ { 0x0020, "space" }, /* SPACE */
+ { 0x0021, "exclam" }, /* EXCLAMATION MARK */
+ { 0x0022, "quotedbl" }, /* QUOTATION MARK */
+ { 0x0023, "numbersign" }, /* NUMBER SIGN */
+ { 0x0024, "dollar" }, /* DOLLAR SIGN */
+ { 0x0025, "percent" }, /* PERCENT SIGN */
+ { 0x0026, "ampersand" }, /* AMPERSAND */
+ { 0x0027, "quotesingle" }, /* APOSTROPHE */
+ { 0x0028, "parenleft" }, /* LEFT PARENTHESIS */
+ { 0x0029, "parenright" }, /* RIGHT PARENTHESIS */
+ { 0x002A, "asterisk" }, /* ASTERISK */
+ { 0x002B, "plus" }, /* PLUS SIGN */
+ { 0x002C, "comma" }, /* COMMA */
+ { 0x002D, "hyphen" }, /* HYPHEN-MINUS */
+ { 0x002D, "$hyphen" }, /* HYPHEN-MINUS; distinguish Adobe duplicates */
+ { 0x002E, "period" }, /* FULL STOP */
+ { 0x002F, "slash" }, /* SOLIDUS */
+ { 0x0030, "zero" }, /* DIGIT ZERO */
+ { 0x0031, "one" }, /* DIGIT ONE */
+ { 0x0032, "two" }, /* DIGIT TWO */
+ { 0x0033, "three" }, /* DIGIT THREE */
+ { 0x0034, "four" }, /* DIGIT FOUR */
+ { 0x0035, "five" }, /* DIGIT FIVE */
+ { 0x0036, "six" }, /* DIGIT SIX */
+ { 0x0037, "seven" }, /* DIGIT SEVEN */
+ { 0x0038, "eight" }, /* DIGIT EIGHT */
+ { 0x0039, "nine" }, /* DIGIT NINE */
+ { 0x003A, "colon" }, /* COLON */
+ { 0x003B, "semicolon" }, /* SEMICOLON */
+ { 0x003C, "less" }, /* LESS-THAN SIGN */
+ { 0x003D, "equal" }, /* EQUALS SIGN */
+ { 0x003E, "greater" }, /* GREATER-THAN SIGN */
+ { 0x003F, "question" }, /* QUESTION MARK */
+ { 0x0040, "at" }, /* COMMERCIAL AT */
+ { 0x0041, "A" }, /* LATIN CAPITAL LETTER A */
+ { 0x0042, "B" }, /* LATIN CAPITAL LETTER B */
+ { 0x0043, "C" }, /* LATIN CAPITAL LETTER C */
+ { 0x0044, "D" }, /* LATIN CAPITAL LETTER D */
+ { 0x0045, "E" }, /* LATIN CAPITAL LETTER E */
+ { 0x0046, "F" }, /* LATIN CAPITAL LETTER F */
+ { 0x0047, "G" }, /* LATIN CAPITAL LETTER G */
+ { 0x0048, "H" }, /* LATIN CAPITAL LETTER H */
+ { 0x0049, "I" }, /* LATIN CAPITAL LETTER I */
+ { 0x004A, "J" }, /* LATIN CAPITAL LETTER J */
+ { 0x004B, "K" }, /* LATIN CAPITAL LETTER K */
+ { 0x004C, "L" }, /* LATIN CAPITAL LETTER L */
+ { 0x004D, "M" }, /* LATIN CAPITAL LETTER M */
+ { 0x004E, "N" }, /* LATIN CAPITAL LETTER N */
+ { 0x004F, "O" }, /* LATIN CAPITAL LETTER O */
+ { 0x0050, "P" }, /* LATIN CAPITAL LETTER P */
+ { 0x0051, "Q" }, /* LATIN CAPITAL LETTER Q */
+ { 0x0052, "R" }, /* LATIN CAPITAL LETTER R */
+ { 0x0053, "S" }, /* LATIN CAPITAL LETTER S */
+ { 0x0054, "T" }, /* LATIN CAPITAL LETTER T */
+ { 0x0055, "U" }, /* LATIN CAPITAL LETTER U */
+ { 0x0056, "V" }, /* LATIN CAPITAL LETTER V */
+ { 0x0057, "W" }, /* LATIN CAPITAL LETTER W */
+ { 0x0058, "X" }, /* LATIN CAPITAL LETTER X */
+ { 0x0059, "Y" }, /* LATIN CAPITAL LETTER Y */
+ { 0x005A, "Z" }, /* LATIN CAPITAL LETTER Z */
+ { 0x005B, "bracketleft" }, /* LEFT SQUARE BRACKET */
+ { 0x005C, "backslash" }, /* REVERSE SOLIDUS */
+ { 0x005D, "bracketright" }, /* RIGHT SQUARE BRACKET */
+ { 0x005E, "circumflex" }, /* CIRCUMFLEX ACCENT */ /* SU: renamed from asciicircum */
+ { 0x005F, "underscore" }, /* LOW LINE */
+ { 0x0060, "grave" }, /* GRAVE ACCENT */
+ { 0x0061, "a" }, /* LATIN SMALL LETTER A */
+ { 0x0062, "b" }, /* LATIN SMALL LETTER B */
+ { 0x0063, "c" }, /* LATIN SMALL LETTER C */
+ { 0x0064, "d" }, /* LATIN SMALL LETTER D */
+ { 0x0065, "e" }, /* LATIN SMALL LETTER E */
+ { 0x0066, "f" }, /* LATIN SMALL LETTER F */
+ { 0x0067, "g" }, /* LATIN SMALL LETTER G */
+ { 0x0068, "h" }, /* LATIN SMALL LETTER H */
+ { 0x0069, "i" }, /* LATIN SMALL LETTER I */
+ { 0x006A, "j" }, /* LATIN SMALL LETTER J */
+ { 0x006B, "k" }, /* LATIN SMALL LETTER K */
+ { 0x006C, "l" }, /* LATIN SMALL LETTER L */
+ { 0x006D, "m" }, /* LATIN SMALL LETTER M */
+ { 0x006E, "n" }, /* LATIN SMALL LETTER N */
+ { 0x006F, "o" }, /* LATIN SMALL LETTER O */
+ { 0x0070, "p" }, /* LATIN SMALL LETTER P */
+ { 0x0071, "q" }, /* LATIN SMALL LETTER Q */
+ { 0x0072, "r" }, /* LATIN SMALL LETTER R */
+ { 0x0073, "s" }, /* LATIN SMALL LETTER S */
+ { 0x0074, "t" }, /* LATIN SMALL LETTER T */
+ { 0x0075, "u" }, /* LATIN SMALL LETTER U */
+ { 0x0076, "v" }, /* LATIN SMALL LETTER V */
+ { 0x0077, "w" }, /* LATIN SMALL LETTER W */
+ { 0x0078, "x" }, /* LATIN SMALL LETTER X */
+ { 0x0079, "y" }, /* LATIN SMALL LETTER Y */
+ { 0x007A, "z" }, /* LATIN SMALL LETTER Z */
+ { 0x007B, "braceleft" }, /* LEFT CURLY BRACKET */
+ { 0x007C, "bar" }, /* VERTICAL LINE */
+ { 0x007D, "braceright" }, /* RIGHT CURLY BRACKET */
+ { 0x007E, "tilde" }, /* TILDE */ /* SU: renamed from asciitilde */
+ { 0x00A0, "$spacenobreak" }, /* NO-BREAK SPACE; distinguish Adobe duplicates */
+ { 0x00A1, "exclamdown" }, /* INVERTED EXCLAMATION MARK */
+ { 0x00A2, "cent" }, /* CENT SIGN */
+ { 0x00A3, "sterling" }, /* POUND SIGN */
+ { 0x00A4, "currency" }, /* CURRENCY SIGN */
+ { 0x00A5, "yen" }, /* YEN SIGN */
+ { 0x00A6, "brokenbar" }, /* BROKEN BAR */
+ { 0x00A7, "section" }, /* SECTION SIGN */
+ { 0x00A8, "dieresis" }, /* DIAERESIS */
+ { 0x00A9, "copyright" }, /* COPYRIGHT SIGN */
+ { 0x00AA, "ordfeminine" }, /* FEMININE ORDINAL INDICATOR */
+ { 0x00AB, "guillemotleft" }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ { 0x00AC, "logicalnot" }, /* NOT SIGN */
+ { 0x00AD, "$hyphensoft" }, /* SOFT HYPHEN; distinguish Adobe duplicates */
+ { 0x00AE, "registered" }, /* REGISTERED SIGN */
+ { 0x00AF, "macron" }, /* MACRON */
+ { 0x00AF, "$macron" }, /* MACRON; distinguish Adobe duplicates */
+ { 0x00B0, "degree" }, /* DEGREE SIGN */
+ { 0x00B1, "plusminus" }, /* PLUS-MINUS SIGN */
+ { 0x00B2, "twosuperior" }, /* SUPERSCRIPT TWO */
+ { 0x00B3, "threesuperior" }, /* SUPERSCRIPT THREE */
+ { 0x00B4, "acute" }, /* ACUTE ACCENT */
+ { 0x00B5, "$micro" }, /* MICRO SIGN; distinguish Adobe duplicates */
+ { 0x00B5, "mu" }, /* MICRO SIGN */
+ { 0x00B6, "paragraph" }, /* PILCROW SIGN */
+ { 0x00B7, "periodcentered" }, /* MIDDLE DOT */
+ { 0x00B7, "$periodcentered" }, /* MIDDLE DOT; distinguish Adobe duplicates */
+ { 0x00B8, "cedilla" }, /* CEDILLA */
+ { 0x00B9, "onesuperior" }, /* SUPERSCRIPT ONE */
+ { 0x00BA, "ordmasculine" }, /* MASCULINE ORDINAL INDICATOR */
+ { 0x00BB, "guillemotright" }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
+ { 0x00BC, "onequarter" }, /* VULGAR FRACTION ONE QUARTER */
+ { 0x00BD, "onehalf" }, /* VULGAR FRACTION ONE HALF */
+ { 0x00BE, "threequarters" }, /* VULGAR FRACTION THREE QUARTERS */
+ { 0x00BF, "questiondown" }, /* INVERTED QUESTION MARK */
+ { 0x00C0, "Agrave" }, /* LATIN CAPITAL LETTER A WITH GRAVE */
+ { 0x00C1, "Aacute" }, /* LATIN CAPITAL LETTER A WITH ACUTE */
+ { 0x00C2, "Acircumflex" }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+ { 0x00C3, "Atilde" }, /* LATIN CAPITAL LETTER A WITH TILDE */
+ { 0x00C4, "Adieresis" }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+ { 0x00C5, "Aring" }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+ { 0x00C6, "AE" }, /* LATIN CAPITAL LETTER AE */
+ { 0x00C7, "Ccedilla" }, /* LATIN CAPITAL LETTER C WITH CEDILLA */
+ { 0x00C8, "Egrave" }, /* LATIN CAPITAL LETTER E WITH GRAVE */
+ { 0x00C9, "Eacute" }, /* LATIN CAPITAL LETTER E WITH ACUTE */
+ { 0x00CA, "Ecircumflex" }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+ { 0x00CB, "Edieresis" }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+ { 0x00CC, "Igrave" }, /* LATIN CAPITAL LETTER I WITH GRAVE */
+ { 0x00CD, "Iacute" }, /* LATIN CAPITAL LETTER I WITH ACUTE */
+ { 0x00CE, "Icircumflex" }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+ { 0x00CF, "Idieresis" }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
+ { 0x00D0, "Eth" }, /* LATIN CAPITAL LETTER ETH */
+ { 0x00D1, "Ntilde" }, /* LATIN CAPITAL LETTER N WITH TILDE */
+ { 0x00D2, "Ograve" }, /* LATIN CAPITAL LETTER O WITH GRAVE */
+ { 0x00D3, "Oacute" }, /* LATIN CAPITAL LETTER O WITH ACUTE */
+ { 0x00D4, "Ocircumflex" }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+ { 0x00D5, "Otilde" }, /* LATIN CAPITAL LETTER O WITH TILDE */
+ { 0x00D6, "Odieresis" }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+ { 0x00D7, "multiply" }, /* MULTIPLICATION SIGN */
+ { 0x00D8, "Oslash" }, /* LATIN CAPITAL LETTER O WITH STROKE */
+ { 0x00D9, "Ugrave" }, /* LATIN CAPITAL LETTER U WITH GRAVE */
+ { 0x00DA, "Uacute" }, /* LATIN CAPITAL LETTER U WITH ACUTE */
+ { 0x00DB, "Ucircumflex" }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+ { 0x00DC, "Udieresis" }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+ { 0x00DD, "Yacute" }, /* LATIN CAPITAL LETTER Y WITH ACUTE */
+ { 0x00DE, "Thorn" }, /* LATIN CAPITAL LETTER THORN */
+ { 0x00DF, "germandbls" }, /* LATIN SMALL LETTER SHARP S */
+ { 0x00E0, "agrave" }, /* LATIN SMALL LETTER A WITH GRAVE */
+ { 0x00E1, "aacute" }, /* LATIN SMALL LETTER A WITH ACUTE */
+ { 0x00E2, "acircumflex" }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+ { 0x00E3, "atilde" }, /* LATIN SMALL LETTER A WITH TILDE */
+ { 0x00E4, "adieresis" }, /* LATIN SMALL LETTER A WITH DIAERESIS */
+ { 0x00E5, "aring" }, /* LATIN SMALL LETTER A WITH RING ABOVE */
+ { 0x00E6, "ae" }, /* LATIN SMALL LETTER AE */
+ { 0x00E7, "ccedilla" }, /* LATIN SMALL LETTER C WITH CEDILLA */
+ { 0x00E8, "egrave" }, /* LATIN SMALL LETTER E WITH GRAVE */
+ { 0x00E9, "eacute" }, /* LATIN SMALL LETTER E WITH ACUTE */
+ { 0x00EA, "ecircumflex" }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */
+ { 0x00EB, "edieresis" }, /* LATIN SMALL LETTER E WITH DIAERESIS */
+ { 0x00EC, "igrave" }, /* LATIN SMALL LETTER I WITH GRAVE */
+ { 0x00ED, "iacute" }, /* LATIN SMALL LETTER I WITH ACUTE */
+ { 0x00EE, "icircumflex" }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+ { 0x00EF, "idieresis" }, /* LATIN SMALL LETTER I WITH DIAERESIS */
+ { 0x00F0, "eth" }, /* LATIN SMALL LETTER ETH */
+ { 0x00F1, "ntilde" }, /* LATIN SMALL LETTER N WITH TILDE */
+ { 0x00F2, "ograve" }, /* LATIN SMALL LETTER O WITH GRAVE */
+ { 0x00F3, "oacute" }, /* LATIN SMALL LETTER O WITH ACUTE */
+ { 0x00F4, "ocircumflex" }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+ { 0x00F5, "otilde" }, /* LATIN SMALL LETTER O WITH TILDE */
+ { 0x00F6, "odieresis" }, /* LATIN SMALL LETTER O WITH DIAERESIS */
+ { 0x00F7, "divide" }, /* DIVISION SIGN */
+ { 0x00F8, "oslash" }, /* LATIN SMALL LETTER O WITH STROKE */
+ { 0x00F9, "ugrave" }, /* LATIN SMALL LETTER U WITH GRAVE */
+ { 0x00FA, "uacute" }, /* LATIN SMALL LETTER U WITH ACUTE */
+ { 0x00FB, "ucircumflex" }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
+ { 0x00FC, "udieresis" }, /* LATIN SMALL LETTER U WITH DIAERESIS */
+ { 0x00FD, "yacute" }, /* LATIN SMALL LETTER Y WITH ACUTE */
+ { 0x00FE, "thorn" }, /* LATIN SMALL LETTER THORN */
+ { 0x00FF, "ydieresis" }, /* LATIN SMALL LETTER Y WITH DIAERESIS */
+ { 0x0100, "Amacron" }, /* LATIN CAPITAL LETTER A WITH MACRON */
+ { 0x0101, "amacron" }, /* LATIN SMALL LETTER A WITH MACRON */
+ { 0x0102, "Abreve" }, /* LATIN CAPITAL LETTER A WITH BREVE */
+ { 0x0103, "abreve" }, /* LATIN SMALL LETTER A WITH BREVE */
+ { 0x0104, "Aogonek" }, /* LATIN CAPITAL LETTER A WITH OGONEK */
+ { 0x0105, "aogonek" }, /* LATIN SMALL LETTER A WITH OGONEK */
+ { 0x0106, "Cacute" }, /* LATIN CAPITAL LETTER C WITH ACUTE */
+ { 0x0107, "cacute" }, /* LATIN SMALL LETTER C WITH ACUTE */
+ { 0x0108, "Ccircumflex" }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+ { 0x0109, "ccircumflex" }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
+ { 0x010A, "Cdotaccent" }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
+ { 0x010B, "cdotaccent" }, /* LATIN SMALL LETTER C WITH DOT ABOVE */
+ { 0x010C, "Ccaron" }, /* LATIN CAPITAL LETTER C WITH CARON */
+ { 0x010D, "ccaron" }, /* LATIN SMALL LETTER C WITH CARON */
+ { 0x010E, "Dcaron" }, /* LATIN CAPITAL LETTER D WITH CARON */
+ { 0x010F, "dcaron" }, /* LATIN SMALL LETTER D WITH CARON */
+ { 0x0110, "Dcroat" }, /* LATIN CAPITAL LETTER D WITH STROKE */
+ { 0x0111, "dcroat" }, /* LATIN SMALL LETTER D WITH STROKE */
+ { 0x0112, "Emacron" }, /* LATIN CAPITAL LETTER E WITH MACRON */
+ { 0x0113, "emacron" }, /* LATIN SMALL LETTER E WITH MACRON */
+ { 0x0114, "Ebreve" }, /* LATIN CAPITAL LETTER E WITH BREVE */
+ { 0x0115, "ebreve" }, /* LATIN SMALL LETTER E WITH BREVE */
+ { 0x0116, "Edotaccent" }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+ { 0x0117, "edotaccent" }, /* LATIN SMALL LETTER E WITH DOT ABOVE */
+ { 0x0118, "Eogonek" }, /* LATIN CAPITAL LETTER E WITH OGONEK */
+ { 0x0119, "eogonek" }, /* LATIN SMALL LETTER E WITH OGONEK */
+ { 0x011A, "Ecaron" }, /* LATIN CAPITAL LETTER E WITH CARON */
+ { 0x011B, "ecaron" }, /* LATIN SMALL LETTER E WITH CARON */
+ { 0x011C, "Gcircumflex" }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+ { 0x011D, "gcircumflex" }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
+ { 0x011E, "Gbreve" }, /* LATIN CAPITAL LETTER G WITH BREVE */
+ { 0x011F, "gbreve" }, /* LATIN SMALL LETTER G WITH BREVE */
+ { 0x0120, "Gdotaccent" }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
+ { 0x0121, "gdotaccent" }, /* LATIN SMALL LETTER G WITH DOT ABOVE */
+ { 0x0122, "Gcommaaccent" }, /* LATIN CAPITAL LETTER G WITH CEDILLA */
+ { 0x0123, "gcommaaccent" }, /* LATIN SMALL LETTER G WITH CEDILLA */
+ { 0x0124, "Hcircumflex" }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+ { 0x0125, "hcircumflex" }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
+ { 0x0126, "Hbar" }, /* LATIN CAPITAL LETTER H WITH STROKE */
+ { 0x0127, "hbar" }, /* LATIN SMALL LETTER H WITH STROKE */
+ { 0x0128, "Itilde" }, /* LATIN CAPITAL LETTER I WITH TILDE */
+ { 0x0129, "itilde" }, /* LATIN SMALL LETTER I WITH TILDE */
+ { 0x012A, "Imacron" }, /* LATIN CAPITAL LETTER I WITH MACRON */
+ { 0x012B, "imacron" }, /* LATIN SMALL LETTER I WITH MACRON */
+ { 0x012C, "Ibreve" }, /* LATIN CAPITAL LETTER I WITH BREVE */
+ { 0x012D, "ibreve" }, /* LATIN SMALL LETTER I WITH BREVE */
+ { 0x012E, "Iogonek" }, /* LATIN CAPITAL LETTER I WITH OGONEK */
+ { 0x012F, "iogonek" }, /* LATIN SMALL LETTER I WITH OGONEK */
+ { 0x0130, "Idotaccent" }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+ { 0x0131, "dotlessi" }, /* LATIN SMALL LETTER DOTLESS I */
+ { 0x0132, "IJ" }, /* LATIN CAPITAL LIGATURE IJ */
+ { 0x0133, "ij" }, /* LATIN SMALL LIGATURE IJ */
+ { 0x0134, "Jcircumflex" }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+ { 0x0135, "jcircumflex" }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
+ { 0x0136, "Kcommaaccent" }, /* LATIN CAPITAL LETTER K WITH CEDILLA */
+ { 0x0137, "kcommaaccent" }, /* LATIN SMALL LETTER K WITH CEDILLA */
+ { 0x0138, "kgreenlandic" }, /* LATIN SMALL LETTER KRA */
+ { 0x0139, "Lacute" }, /* LATIN CAPITAL LETTER L WITH ACUTE */
+ { 0x013A, "lacute" }, /* LATIN SMALL LETTER L WITH ACUTE */
+ { 0x013B, "Lcommaaccent" }, /* LATIN CAPITAL LETTER L WITH CEDILLA */
+ { 0x013C, "lcommaaccent" }, /* LATIN SMALL LETTER L WITH CEDILLA */
+ { 0x013D, "Lcaron" }, /* LATIN CAPITAL LETTER L WITH CARON */
+ { 0x013E, "lcaron" }, /* LATIN SMALL LETTER L WITH CARON */
+ { 0x013F, "Ldot" }, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+ { 0x0140, "ldot" }, /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+ { 0x0141, "Lslash" }, /* LATIN CAPITAL LETTER L WITH STROKE */
+ { 0x0142, "lslash" }, /* LATIN SMALL LETTER L WITH STROKE */
+ { 0x0143, "Nacute" }, /* LATIN CAPITAL LETTER N WITH ACUTE */
+ { 0x0144, "nacute" }, /* LATIN SMALL LETTER N WITH ACUTE */
+ { 0x0145, "Ncommaaccent" }, /* LATIN CAPITAL LETTER N WITH CEDILLA */
+ { 0x0146, "ncommaaccent" }, /* LATIN SMALL LETTER N WITH CEDILLA */
+ { 0x0147, "Ncaron" }, /* LATIN CAPITAL LETTER N WITH CARON */
+ { 0x0148, "ncaron" }, /* LATIN SMALL LETTER N WITH CARON */
+ { 0x0149, "napostrophe" }, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+ { 0x014A, "Eng" }, /* LATIN CAPITAL LETTER ENG */
+ { 0x014B, "eng" }, /* LATIN SMALL LETTER ENG */
+ { 0x014C, "Omacron" }, /* LATIN CAPITAL LETTER O WITH MACRON */
+ { 0x014D, "omacron" }, /* LATIN SMALL LETTER O WITH MACRON */
+ { 0x014E, "Obreve" }, /* LATIN CAPITAL LETTER O WITH BREVE */
+ { 0x014F, "obreve" }, /* LATIN SMALL LETTER O WITH BREVE */
+ { 0x0150, "Ohungarumlaut" }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+ { 0x0151, "ohungarumlaut" }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+ { 0x0152, "OE" }, /* LATIN CAPITAL LIGATURE OE */
+ { 0x0153, "oe" }, /* LATIN SMALL LIGATURE OE */
+ { 0x0154, "Racute" }, /* LATIN CAPITAL LETTER R WITH ACUTE */
+ { 0x0155, "racute" }, /* LATIN SMALL LETTER R WITH ACUTE */
+ { 0x0156, "Rcommaaccent" }, /* LATIN CAPITAL LETTER R WITH CEDILLA */
+ { 0x0157, "rcommaaccent" }, /* LATIN SMALL LETTER R WITH CEDILLA */
+ { 0x0158, "Rcaron" }, /* LATIN CAPITAL LETTER R WITH CARON */
+ { 0x0159, "rcaron" }, /* LATIN SMALL LETTER R WITH CARON */
+ { 0x015A, "Sacute" }, /* LATIN CAPITAL LETTER S WITH ACUTE */
+ { 0x015B, "sacute" }, /* LATIN SMALL LETTER S WITH ACUTE */
+ { 0x015C, "Scircumflex" }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+ { 0x015D, "scircumflex" }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
+ { 0x015E, "Scedilla" }, /* LATIN CAPITAL LETTER S WITH CEDILLA */
+ { 0x015E, "$Scedilla" }, /* LATIN CAPITAL LETTER S WITH CEDILLA; distinguish Adobe duplicates */
+ { 0x015F, "scedilla" }, /* LATIN SMALL LETTER S WITH CEDILLA */
+ { 0x015F, "$scedilla" }, /* LATIN SMALL LETTER S WITH CEDILLA; distinguish Adobe duplicates */
+ { 0x0160, "Scaron" }, /* LATIN CAPITAL LETTER S WITH CARON */
+ { 0x0161, "scaron" }, /* LATIN SMALL LETTER S WITH CARON */
+ { 0x0162, "$Tcedilla" }, /* LATIN CAPITAL LETTER T WITH CEDILLA; distinguish Adobe duplicates */
+ { 0x0162, "Tcommaaccent" }, /* LATIN CAPITAL LETTER T WITH CEDILLA */
+ { 0x0163, "$tcedilla" }, /* LATIN SMALL LETTER T WITH CEDILLA; distinguish Adobe duplicates */
+ { 0x0163, "tcommaaccent" }, /* LATIN SMALL LETTER T WITH CEDILLA */
+ { 0x0164, "Tcaron" }, /* LATIN CAPITAL LETTER T WITH CARON */
+ { 0x0165, "tcaron" }, /* LATIN SMALL LETTER T WITH CARON */
+ { 0x0166, "Tbar" }, /* LATIN CAPITAL LETTER T WITH STROKE */
+ { 0x0167, "tbar" }, /* LATIN SMALL LETTER T WITH STROKE */
+ { 0x0168, "Utilde" }, /* LATIN CAPITAL LETTER U WITH TILDE */
+ { 0x0169, "utilde" }, /* LATIN SMALL LETTER U WITH TILDE */
+ { 0x016A, "Umacron" }, /* LATIN CAPITAL LETTER U WITH MACRON */
+ { 0x016B, "umacron" }, /* LATIN SMALL LETTER U WITH MACRON */
+ { 0x016C, "Ubreve" }, /* LATIN CAPITAL LETTER U WITH BREVE */
+ { 0x016D, "ubreve" }, /* LATIN SMALL LETTER U WITH BREVE */
+ { 0x016E, "Uring" }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+ { 0x016F, "uring" }, /* LATIN SMALL LETTER U WITH RING ABOVE */
+ { 0x0170, "Uhungarumlaut" }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+ { 0x0171, "uhungarumlaut" }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+ { 0x0172, "Uogonek" }, /* LATIN CAPITAL LETTER U WITH OGONEK */
+ { 0x0173, "uogonek" }, /* LATIN SMALL LETTER U WITH OGONEK */
+ { 0x0174, "Wcircumflex" }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+ { 0x0175, "wcircumflex" }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
+ { 0x0176, "Ycircumflex" }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+ { 0x0177, "ycircumflex" }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+ { 0x0178, "Ydieresis" }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
+ { 0x0179, "Zacute" }, /* LATIN CAPITAL LETTER Z WITH ACUTE */
+ { 0x017A, "zacute" }, /* LATIN SMALL LETTER Z WITH ACUTE */
+ { 0x017B, "Zdotaccent" }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+ { 0x017C, "zdotaccent" }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+ { 0x017D, "Zcaron" }, /* LATIN CAPITAL LETTER Z WITH CARON */
+ { 0x017E, "zcaron" }, /* LATIN SMALL LETTER Z WITH CARON */
+ { 0x017F, "longs" }, /* LATIN SMALL LETTER LONG S */
+ { 0x0192, "florin" }, /* LATIN SMALL LETTER F WITH HOOK */
+ { 0x01A0, "Ohorn" }, /* LATIN CAPITAL LETTER O WITH HORN */
+ { 0x01A1, "ohorn" }, /* LATIN SMALL LETTER O WITH HORN */
+ { 0x01AF, "Uhorn" }, /* LATIN CAPITAL LETTER U WITH HORN */
+ { 0x01B0, "uhorn" }, /* LATIN SMALL LETTER U WITH HORN */
+ { 0x01E6, "Gcaron" }, /* LATIN CAPITAL LETTER G WITH CARON */
+ { 0x01E7, "gcaron" }, /* LATIN SMALL LETTER G WITH CARON */
+ { 0x01FA, "Aringacute" }, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */
+ { 0x01FB, "aringacute" }, /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */
+ { 0x01FC, "AEacute" }, /* LATIN CAPITAL LETTER AE WITH ACUTE */
+ { 0x01FD, "aeacute" }, /* LATIN SMALL LETTER AE WITH ACUTE */
+ { 0x01FE, "Oslashacute" }, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */
+ { 0x01FF, "oslashacute" }, /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */
+ { 0x0218, "Scommaaccent" }, /* LATIN CAPITAL LETTER S WITH COMMA BELOW */
+ { 0x0219, "scommaaccent" }, /* LATIN SMALL LETTER S WITH COMMA BELOW */
+ { 0x021A, "$Tcommaaccent" }, /* LATIN CAPITAL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */
+ { 0x021B, "$tcommaaccent" }, /* LATIN SMALL LETTER T WITH COMMA BELOW; distinguish Adobe duplicates */
+ { 0x02BC, "afii57929" }, /* MODIFIER LETTER APOSTROPHE */
+ { 0x02BD, "afii64937" }, /* MODIFIER LETTER REVERSED COMMA */
+ { 0x02C6, "circumflex" }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */
+ { 0x02C7, "caron" }, /* CARON */
+ { 0x02C9, "$macronmodifier" }, /* MODIFIER LETTER MACRON */
+ { 0x02CA, "$acutemodifier" }, /* MODIFIER LETTER ACUTE ACCENT */
+ { 0x02CB, "$gravemodifier" }, /* MODIFIER LETTER GRAVE ACCENT */
+ { 0x02D8, "breve" }, /* BREVE */
+ { 0x02D9, "dotaccent" }, /* DOT ABOVE */
+ { 0x02DA, "ring" }, /* RING ABOVE */
+ { 0x02DB, "ogonek" }, /* OGONEK */
+ { 0x02DC, "tilde" }, /* SMALL TILDE */
+ { 0x02DD, "hungarumlaut" }, /* DOUBLE ACUTE ACCENT */
+ { 0x0300, "gravecomb" }, /* COMBINING GRAVE ACCENT */
+ { 0x0301, "acutecomb" }, /* COMBINING ACUTE ACCENT */
+ { 0x0302, "$circumflexcomb" }, /* COMBINING CIRCUMFLEX ACCENT */
+ { 0x0303, "tildecomb" }, /* COMBINING TILDE */
+ { 0x0304, "$macroncomb" }, /* COMBINING MACRON */
+ { 0x0305, "$overlinecomb" }, /* COMBINING OVERLINE */
+ { 0x0306, "$brevecomb" }, /* COMBINING BREVE */
+ { 0x0307, "$dotaccentcomb" }, /* COMBINING DOT ABOVE */
+ { 0x0308, "$dieresiscomb" }, /* COMBINING DIAERESIS */
+ { 0x0309, "hookabovecomb" }, /* COMBINING HOOK ABOVE */
+ { 0x030A, "$ringcomb" }, /* COMBINING RING ABOVE */
+ { 0x030C, "$caroncomb" }, /* COMBINING CARON */
+ { 0x0323, "dotbelowcomb" }, /* COMBINING DOT BELOW */
+ { 0x0327, "$cedillacomb" }, /* COMBINING CEDILLA */
+ { 0x0328, "$ogonekcomb" }, /* COMBINING OGONEK */
+ { 0x0338, "$slashlongcomb" }, /* COMBINING LONG SOLIDUS OVERLAY */
+ { 0x0384, "tonos" }, /* GREEK TONOS */
+ { 0x0385, "dieresistonos" }, /* GREEK DIALYTIKA TONOS */
+ { 0x0386, "Alphatonos" }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+ { 0x0387, "anoteleia" }, /* GREEK ANO TELEIA */
+ { 0x0388, "Epsilontonos" }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+ { 0x0389, "Etatonos" }, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+ { 0x038A, "Iotatonos" }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+ { 0x038C, "Omicrontonos" }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+ { 0x038E, "Upsilontonos" }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+ { 0x038F, "Omegatonos" }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+ { 0x0390, "iotadieresistonos" }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+ { 0x0391, "Alpha" }, /* GREEK CAPITAL LETTER ALPHA */
+ { 0x0392, "Beta" }, /* GREEK CAPITAL LETTER BETA */
+ { 0x0393, "Gamma" }, /* GREEK CAPITAL LETTER GAMMA */
+ { 0x0394, "$Delta" }, /* GREEK CAPITAL LETTER DELTA; distinguish Adobe duplicates */
+ { 0x0395, "Epsilon" }, /* GREEK CAPITAL LETTER EPSILON */
+ { 0x0396, "Zeta" }, /* GREEK CAPITAL LETTER ZETA */
+ { 0x0397, "Eta" }, /* GREEK CAPITAL LETTER ETA */
+ { 0x0398, "Theta" }, /* GREEK CAPITAL LETTER THETA */
+ { 0x0399, "Iota" }, /* GREEK CAPITAL LETTER IOTA */
+ { 0x039A, "Kappa" }, /* GREEK CAPITAL LETTER KAPPA */
+ { 0x039B, "Lambda" }, /* GREEK CAPITAL LETTER LAMDA */
+ { 0x039C, "Mu" }, /* GREEK CAPITAL LETTER MU */
+ { 0x039D, "Nu" }, /* GREEK CAPITAL LETTER NU */
+ { 0x039E, "Xi" }, /* GREEK CAPITAL LETTER XI */
+ { 0x039F, "Omicron" }, /* GREEK CAPITAL LETTER OMICRON */
+ { 0x03A0, "Pi" }, /* GREEK CAPITAL LETTER PI */
+ { 0x03A1, "Rho" }, /* GREEK CAPITAL LETTER RHO */
+ { 0x03A3, "Sigma" }, /* GREEK CAPITAL LETTER SIGMA */
+ { 0x03A4, "Tau" }, /* GREEK CAPITAL LETTER TAU */
+ { 0x03A5, "Upsilon" }, /* GREEK CAPITAL LETTER UPSILON */
+ { 0x03A6, "Phi" }, /* GREEK CAPITAL LETTER PHI */
+ { 0x03A7, "Chi" }, /* GREEK CAPITAL LETTER CHI */
+ { 0x03A8, "Psi" }, /* GREEK CAPITAL LETTER PSI */
+ { 0x03A9, "$Omega" }, /* GREEK CAPITAL LETTER OMEGA; distinguish Adobe duplicates */
+ { 0x03AA, "Iotadieresis" }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+ { 0x03AB, "Upsilondieresis" }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+ { 0x03AC, "alphatonos" }, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+ { 0x03AD, "epsilontonos" }, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+ { 0x03AE, "etatonos" }, /* GREEK SMALL LETTER ETA WITH TONOS */
+ { 0x03AF, "iotatonos" }, /* GREEK SMALL LETTER IOTA WITH TONOS */
+ { 0x03B0, "upsilondieresistonos" }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+ { 0x03B1, "alpha" }, /* GREEK SMALL LETTER ALPHA */
+ { 0x03B2, "beta" }, /* GREEK SMALL LETTER BETA */
+ { 0x03B3, "gamma" }, /* GREEK SMALL LETTER GAMMA */
+ { 0x03B4, "delta" }, /* GREEK SMALL LETTER DELTA */
+ { 0x03B5, "epsilon" }, /* GREEK SMALL LETTER EPSILON */
+ { 0x03B6, "zeta" }, /* GREEK SMALL LETTER ZETA */
+ { 0x03B7, "eta" }, /* GREEK SMALL LETTER ETA */
+ { 0x03B8, "theta" }, /* GREEK SMALL LETTER THETA */
+ { 0x03B9, "iota" }, /* GREEK SMALL LETTER IOTA */
+ { 0x03BA, "kappa" }, /* GREEK SMALL LETTER KAPPA */
+ { 0x03BB, "lambda" }, /* GREEK SMALL LETTER LAMDA */
+ { 0x03BC, "$mu" }, /* GREEK SMALL LETTER MU; distinguish Adobe duplicates */
+ { 0x03BD, "nu" }, /* GREEK SMALL LETTER NU */
+ { 0x03BE, "xi" }, /* GREEK SMALL LETTER XI */
+ { 0x03BF, "omicron" }, /* GREEK SMALL LETTER OMICRON */
+ { 0x03C0, "pi" }, /* GREEK SMALL LETTER PI */
+ { 0x03C1, "rho" }, /* GREEK SMALL LETTER RHO */
+ { 0x03C2, "sigma1" }, /* GREEK SMALL LETTER FINAL SIGMA */
+ { 0x03C3, "sigma" }, /* GREEK SMALL LETTER SIGMA */
+ { 0x03C4, "tau" }, /* GREEK SMALL LETTER TAU */
+ { 0x03C5, "upsilon" }, /* GREEK SMALL LETTER UPSILON */
+ { 0x03C6, "phi" }, /* GREEK SMALL LETTER PHI */
+ { 0x03C7, "chi" }, /* GREEK SMALL LETTER CHI */
+ { 0x03C8, "psi" }, /* GREEK SMALL LETTER PSI */
+ { 0x03C9, "omega" }, /* GREEK SMALL LETTER OMEGA */
+ { 0x03CA, "iotadieresis" }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+ { 0x03CB, "upsilondieresis" }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+ { 0x03CC, "omicrontonos" }, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+ { 0x03CD, "upsilontonos" }, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+ { 0x03CE, "omegatonos" }, /* GREEK SMALL LETTER OMEGA WITH TONOS */
+ { 0x03D1, "theta1" }, /* GREEK THETA SYMBOL */
+ { 0x03D2, "Upsilon1" }, /* GREEK UPSILON WITH HOOK SYMBOL */
+ { 0x03D5, "phi1" }, /* GREEK PHI SYMBOL */
+ { 0x03D6, "omega1" }, /* GREEK PI SYMBOL */
+ { 0x03D6, "$pi1" }, /* GREEK PI SYMBOL; Adobe has this as "omega1" which is too confusing */
+ { 0x03F1, "$rho1" }, /* GREEK RHO SYMBOL */
+ { 0x03F5, "$epsilon1" }, /* GREEK LUNATE EPSILON SYMBOL */
+ { 0x0401, "afii10023" }, /* CYRILLIC CAPITAL LETTER IO */
+ { 0x0402, "afii10051" }, /* CYRILLIC CAPITAL LETTER DJE */
+ { 0x0403, "afii10052" }, /* CYRILLIC CAPITAL LETTER GJE */
+ { 0x0404, "afii10053" }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+ { 0x0405, "afii10054" }, /* CYRILLIC CAPITAL LETTER DZE */
+ { 0x0406, "afii10055" }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { 0x0407, "afii10056" }, /* CYRILLIC CAPITAL LETTER YI */
+ { 0x0408, "afii10057" }, /* CYRILLIC CAPITAL LETTER JE */
+ { 0x0409, "afii10058" }, /* CYRILLIC CAPITAL LETTER LJE */
+ { 0x040A, "afii10059" }, /* CYRILLIC CAPITAL LETTER NJE */
+ { 0x040B, "afii10060" }, /* CYRILLIC CAPITAL LETTER TSHE */
+ { 0x040C, "afii10061" }, /* CYRILLIC CAPITAL LETTER KJE */
+ { 0x040E, "afii10062" }, /* CYRILLIC CAPITAL LETTER SHORT U */
+ { 0x040F, "afii10145" }, /* CYRILLIC CAPITAL LETTER DZHE */
+ { 0x0410, "afii10017" }, /* CYRILLIC CAPITAL LETTER A */
+ { 0x0411, "afii10018" }, /* CYRILLIC CAPITAL LETTER BE */
+ { 0x0412, "afii10019" }, /* CYRILLIC CAPITAL LETTER VE */
+ { 0x0413, "afii10020" }, /* CYRILLIC CAPITAL LETTER GHE */
+ { 0x0414, "afii10021" }, /* CYRILLIC CAPITAL LETTER DE */
+ { 0x0415, "afii10022" }, /* CYRILLIC CAPITAL LETTER IE */
+ { 0x0416, "afii10024" }, /* CYRILLIC CAPITAL LETTER ZHE */
+ { 0x0417, "afii10025" }, /* CYRILLIC CAPITAL LETTER ZE */
+ { 0x0418, "afii10026" }, /* CYRILLIC CAPITAL LETTER I */
+ { 0x0419, "afii10027" }, /* CYRILLIC CAPITAL LETTER SHORT I */
+ { 0x041A, "afii10028" }, /* CYRILLIC CAPITAL LETTER KA */
+ { 0x041B, "afii10029" }, /* CYRILLIC CAPITAL LETTER EL */
+ { 0x041C, "afii10030" }, /* CYRILLIC CAPITAL LETTER EM */
+ { 0x041D, "afii10031" }, /* CYRILLIC CAPITAL LETTER EN */
+ { 0x041E, "afii10032" }, /* CYRILLIC CAPITAL LETTER O */
+ { 0x041F, "afii10033" }, /* CYRILLIC CAPITAL LETTER PE */
+ { 0x0420, "afii10034" }, /* CYRILLIC CAPITAL LETTER ER */
+ { 0x0421, "afii10035" }, /* CYRILLIC CAPITAL LETTER ES */
+ { 0x0422, "afii10036" }, /* CYRILLIC CAPITAL LETTER TE */
+ { 0x0423, "afii10037" }, /* CYRILLIC CAPITAL LETTER U */
+ { 0x0424, "afii10038" }, /* CYRILLIC CAPITAL LETTER EF */
+ { 0x0425, "afii10039" }, /* CYRILLIC CAPITAL LETTER HA */
+ { 0x0426, "afii10040" }, /* CYRILLIC CAPITAL LETTER TSE */
+ { 0x0427, "afii10041" }, /* CYRILLIC CAPITAL LETTER CHE */
+ { 0x0428, "afii10042" }, /* CYRILLIC CAPITAL LETTER SHA */
+ { 0x0429, "afii10043" }, /* CYRILLIC CAPITAL LETTER SHCHA */
+ { 0x042A, "afii10044" }, /* CYRILLIC CAPITAL LETTER HARD SIGN */
+ { 0x042B, "afii10045" }, /* CYRILLIC CAPITAL LETTER YERU */
+ { 0x042C, "afii10046" }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+ { 0x042D, "afii10047" }, /* CYRILLIC CAPITAL LETTER E */
+ { 0x042E, "afii10048" }, /* CYRILLIC CAPITAL LETTER YU */
+ { 0x042F, "afii10049" }, /* CYRILLIC CAPITAL LETTER YA */
+ { 0x0430, "afii10065" }, /* CYRILLIC SMALL LETTER A */
+ { 0x0431, "afii10066" }, /* CYRILLIC SMALL LETTER BE */
+ { 0x0432, "afii10067" }, /* CYRILLIC SMALL LETTER VE */
+ { 0x0433, "afii10068" }, /* CYRILLIC SMALL LETTER GHE */
+ { 0x0434, "afii10069" }, /* CYRILLIC SMALL LETTER DE */
+ { 0x0435, "afii10070" }, /* CYRILLIC SMALL LETTER IE */
+ { 0x0436, "afii10072" }, /* CYRILLIC SMALL LETTER ZHE */
+ { 0x0437, "afii10073" }, /* CYRILLIC SMALL LETTER ZE */
+ { 0x0438, "afii10074" }, /* CYRILLIC SMALL LETTER I */
+ { 0x0439, "afii10075" }, /* CYRILLIC SMALL LETTER SHORT I */
+ { 0x043A, "afii10076" }, /* CYRILLIC SMALL LETTER KA */
+ { 0x043B, "afii10077" }, /* CYRILLIC SMALL LETTER EL */
+ { 0x043C, "afii10078" }, /* CYRILLIC SMALL LETTER EM */
+ { 0x043D, "afii10079" }, /* CYRILLIC SMALL LETTER EN */
+ { 0x043E, "afii10080" }, /* CYRILLIC SMALL LETTER O */
+ { 0x043F, "afii10081" }, /* CYRILLIC SMALL LETTER PE */
+ { 0x0440, "afii10082" }, /* CYRILLIC SMALL LETTER ER */
+ { 0x0441, "afii10083" }, /* CYRILLIC SMALL LETTER ES */
+ { 0x0442, "afii10084" }, /* CYRILLIC SMALL LETTER TE */
+ { 0x0443, "afii10085" }, /* CYRILLIC SMALL LETTER U */
+ { 0x0444, "afii10086" }, /* CYRILLIC SMALL LETTER EF */
+ { 0x0445, "afii10087" }, /* CYRILLIC SMALL LETTER HA */
+ { 0x0446, "afii10088" }, /* CYRILLIC SMALL LETTER TSE */
+ { 0x0447, "afii10089" }, /* CYRILLIC SMALL LETTER CHE */
+ { 0x0448, "afii10090" }, /* CYRILLIC SMALL LETTER SHA */
+ { 0x0449, "afii10091" }, /* CYRILLIC SMALL LETTER SHCHA */
+ { 0x044A, "afii10092" }, /* CYRILLIC SMALL LETTER HARD SIGN */
+ { 0x044B, "afii10093" }, /* CYRILLIC SMALL LETTER YERU */
+ { 0x044C, "afii10094" }, /* CYRILLIC SMALL LETTER SOFT SIGN */
+ { 0x044D, "afii10095" }, /* CYRILLIC SMALL LETTER E */
+ { 0x044E, "afii10096" }, /* CYRILLIC SMALL LETTER YU */
+ { 0x044F, "afii10097" }, /* CYRILLIC SMALL LETTER YA */
+ { 0x0451, "afii10071" }, /* CYRILLIC SMALL LETTER IO */
+ { 0x0452, "afii10099" }, /* CYRILLIC SMALL LETTER DJE */
+ { 0x0453, "afii10100" }, /* CYRILLIC SMALL LETTER GJE */
+ { 0x0454, "afii10101" }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
+ { 0x0455, "afii10102" }, /* CYRILLIC SMALL LETTER DZE */
+ { 0x0456, "afii10103" }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+ { 0x0457, "afii10104" }, /* CYRILLIC SMALL LETTER YI */
+ { 0x0458, "afii10105" }, /* CYRILLIC SMALL LETTER JE */
+ { 0x0459, "afii10106" }, /* CYRILLIC SMALL LETTER LJE */
+ { 0x045A, "afii10107" }, /* CYRILLIC SMALL LETTER NJE */
+ { 0x045B, "afii10108" }, /* CYRILLIC SMALL LETTER TSHE */
+ { 0x045C, "afii10109" }, /* CYRILLIC SMALL LETTER KJE */
+ { 0x045E, "afii10110" }, /* CYRILLIC SMALL LETTER SHORT U */
+ { 0x045F, "afii10193" }, /* CYRILLIC SMALL LETTER DZHE */
+ { 0x0462, "afii10146" }, /* CYRILLIC CAPITAL LETTER YAT */
+ { 0x0463, "afii10194" }, /* CYRILLIC SMALL LETTER YAT */
+ { 0x0472, "afii10147" }, /* CYRILLIC CAPITAL LETTER FITA */
+ { 0x0473, "afii10195" }, /* CYRILLIC SMALL LETTER FITA */
+ { 0x0474, "afii10148" }, /* CYRILLIC CAPITAL LETTER IZHITSA */
+ { 0x0475, "afii10196" }, /* CYRILLIC SMALL LETTER IZHITSA */
+ { 0x0490, "afii10050" }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
+ { 0x0491, "afii10098" }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
+ { 0x04D9, "afii10846" }, /* CYRILLIC SMALL LETTER SCHWA */
+ { 0x05B0, "afii57799" }, /* HEBREW POINT SHEVA */
+ { 0x05B1, "afii57801" }, /* HEBREW POINT HATAF SEGOL */
+ { 0x05B2, "afii57800" }, /* HEBREW POINT HATAF PATAH */
+ { 0x05B3, "afii57802" }, /* HEBREW POINT HATAF QAMATS */
+ { 0x05B4, "afii57793" }, /* HEBREW POINT HIRIQ */
+ { 0x05B5, "afii57794" }, /* HEBREW POINT TSERE */
+ { 0x05B6, "afii57795" }, /* HEBREW POINT SEGOL */
+ { 0x05B7, "afii57798" }, /* HEBREW POINT PATAH */
+ { 0x05B8, "afii57797" }, /* HEBREW POINT QAMATS */
+ { 0x05B9, "afii57806" }, /* HEBREW POINT HOLAM */
+ { 0x05BB, "afii57796" }, /* HEBREW POINT QUBUTS */
+ { 0x05BC, "afii57807" }, /* HEBREW POINT DAGESH OR MAPIQ */
+ { 0x05BD, "afii57839" }, /* HEBREW POINT METEG */
+ { 0x05BE, "afii57645" }, /* HEBREW PUNCTUATION MAQAF */
+ { 0x05BF, "afii57841" }, /* HEBREW POINT RAFE */
+ { 0x05C0, "afii57842" }, /* HEBREW PUNCTUATION PASEQ */
+ { 0x05C1, "afii57804" }, /* HEBREW POINT SHIN DOT */
+ { 0x05C2, "afii57803" }, /* HEBREW POINT SIN DOT */
+ { 0x05C3, "afii57658" }, /* HEBREW PUNCTUATION SOF PASUQ */
+ { 0x05D0, "afii57664" }, /* HEBREW LETTER ALEF */
+ { 0x05D1, "afii57665" }, /* HEBREW LETTER BET */
+ { 0x05D2, "afii57666" }, /* HEBREW LETTER GIMEL */
+ { 0x05D3, "afii57667" }, /* HEBREW LETTER DALET */
+ { 0x05D4, "afii57668" }, /* HEBREW LETTER HE */
+ { 0x05D5, "afii57669" }, /* HEBREW LETTER VAV */
+ { 0x05D6, "afii57670" }, /* HEBREW LETTER ZAYIN */
+ { 0x05D7, "afii57671" }, /* HEBREW LETTER HET */
+ { 0x05D8, "afii57672" }, /* HEBREW LETTER TET */
+ { 0x05D9, "afii57673" }, /* HEBREW LETTER YOD */
+ { 0x05DA, "afii57674" }, /* HEBREW LETTER FINAL KAF */
+ { 0x05DB, "afii57675" }, /* HEBREW LETTER KAF */
+ { 0x05DC, "afii57676" }, /* HEBREW LETTER LAMED */
+ { 0x05DD, "afii57677" }, /* HEBREW LETTER FINAL MEM */
+ { 0x05DE, "afii57678" }, /* HEBREW LETTER MEM */
+ { 0x05DF, "afii57679" }, /* HEBREW LETTER FINAL NUN */
+ { 0x05E0, "afii57680" }, /* HEBREW LETTER NUN */
+ { 0x05E1, "afii57681" }, /* HEBREW LETTER SAMEKH */
+ { 0x05E2, "afii57682" }, /* HEBREW LETTER AYIN */
+ { 0x05E3, "afii57683" }, /* HEBREW LETTER FINAL PE */
+ { 0x05E4, "afii57684" }, /* HEBREW LETTER PE */
+ { 0x05E5, "afii57685" }, /* HEBREW LETTER FINAL TSADI */
+ { 0x05E6, "afii57686" }, /* HEBREW LETTER TSADI */
+ { 0x05E7, "afii57687" }, /* HEBREW LETTER QOF */
+ { 0x05E8, "afii57688" }, /* HEBREW LETTER RESH */
+ { 0x05E9, "afii57689" }, /* HEBREW LETTER SHIN */
+ { 0x05EA, "afii57690" }, /* HEBREW LETTER TAV */
+ { 0x05F0, "afii57716" }, /* HEBREW LIGATURE YIDDISH DOUBLE VAV */
+ { 0x05F1, "afii57717" }, /* HEBREW LIGATURE YIDDISH VAV YOD */
+ { 0x05F2, "afii57718" }, /* HEBREW LIGATURE YIDDISH DOUBLE YOD */
+ { 0x060C, "afii57388" }, /* ARABIC COMMA */
+ { 0x061B, "afii57403" }, /* ARABIC SEMICOLON */
+ { 0x061F, "afii57407" }, /* ARABIC QUESTION MARK */
+ { 0x0621, "afii57409" }, /* ARABIC LETTER HAMZA */
+ { 0x0622, "afii57410" }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */
+ { 0x0623, "afii57411" }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */
+ { 0x0624, "afii57412" }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */
+ { 0x0625, "afii57413" }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */
+ { 0x0626, "afii57414" }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */
+ { 0x0627, "afii57415" }, /* ARABIC LETTER ALEF */
+ { 0x0628, "afii57416" }, /* ARABIC LETTER BEH */
+ { 0x0629, "afii57417" }, /* ARABIC LETTER TEH MARBUTA */
+ { 0x062A, "afii57418" }, /* ARABIC LETTER TEH */
+ { 0x062B, "afii57419" }, /* ARABIC LETTER THEH */
+ { 0x062C, "afii57420" }, /* ARABIC LETTER JEEM */
+ { 0x062D, "afii57421" }, /* ARABIC LETTER HAH */
+ { 0x062E, "afii57422" }, /* ARABIC LETTER KHAH */
+ { 0x062F, "afii57423" }, /* ARABIC LETTER DAL */
+ { 0x0630, "afii57424" }, /* ARABIC LETTER THAL */
+ { 0x0631, "afii57425" }, /* ARABIC LETTER REH */
+ { 0x0632, "afii57426" }, /* ARABIC LETTER ZAIN */
+ { 0x0633, "afii57427" }, /* ARABIC LETTER SEEN */
+ { 0x0634, "afii57428" }, /* ARABIC LETTER SHEEN */
+ { 0x0635, "afii57429" }, /* ARABIC LETTER SAD */
+ { 0x0636, "afii57430" }, /* ARABIC LETTER DAD */
+ { 0x0637, "afii57431" }, /* ARABIC LETTER TAH */
+ { 0x0638, "afii57432" }, /* ARABIC LETTER ZAH */
+ { 0x0639, "afii57433" }, /* ARABIC LETTER AIN */
+ { 0x063A, "afii57434" }, /* ARABIC LETTER GHAIN */
+ { 0x0640, "afii57440" }, /* ARABIC TATWEEL */
+ { 0x0641, "afii57441" }, /* ARABIC LETTER FEH */
+ { 0x0642, "afii57442" }, /* ARABIC LETTER QAF */
+ { 0x0643, "afii57443" }, /* ARABIC LETTER KAF */
+ { 0x0644, "afii57444" }, /* ARABIC LETTER LAM */
+ { 0x0645, "afii57445" }, /* ARABIC LETTER MEEM */
+ { 0x0646, "afii57446" }, /* ARABIC LETTER NOON */
+ { 0x0647, "afii57470" }, /* ARABIC LETTER HEH */
+ { 0x0648, "afii57448" }, /* ARABIC LETTER WAW */
+ { 0x0649, "afii57449" }, /* ARABIC LETTER ALEF MAKSURA */
+ { 0x064A, "afii57450" }, /* ARABIC LETTER YEH */
+ { 0x064B, "afii57451" }, /* ARABIC FATHATAN */
+ { 0x064C, "afii57452" }, /* ARABIC DAMMATAN */
+ { 0x064D, "afii57453" }, /* ARABIC KASRATAN */
+ { 0x064E, "afii57454" }, /* ARABIC FATHA */
+ { 0x064F, "afii57455" }, /* ARABIC DAMMA */
+ { 0x0650, "afii57456" }, /* ARABIC KASRA */
+ { 0x0651, "afii57457" }, /* ARABIC SHADDA */
+ { 0x0652, "afii57458" }, /* ARABIC SUKUN */
+ { 0x0660, "afii57392" }, /* ARABIC-INDIC DIGIT ZERO */
+ { 0x0661, "afii57393" }, /* ARABIC-INDIC DIGIT ONE */
+ { 0x0662, "afii57394" }, /* ARABIC-INDIC DIGIT TWO */
+ { 0x0663, "afii57395" }, /* ARABIC-INDIC DIGIT THREE */
+ { 0x0664, "afii57396" }, /* ARABIC-INDIC DIGIT FOUR */
+ { 0x0665, "afii57397" }, /* ARABIC-INDIC DIGIT FIVE */
+ { 0x0666, "afii57398" }, /* ARABIC-INDIC DIGIT SIX */
+ { 0x0667, "afii57399" }, /* ARABIC-INDIC DIGIT SEVEN */
+ { 0x0668, "afii57400" }, /* ARABIC-INDIC DIGIT EIGHT */
+ { 0x0669, "afii57401" }, /* ARABIC-INDIC DIGIT NINE */
+ { 0x066A, "afii57381" }, /* ARABIC PERCENT SIGN */
+ { 0x066D, "afii63167" }, /* ARABIC FIVE POINTED STAR */
+ { 0x0679, "afii57511" }, /* ARABIC LETTER TTEH */
+ { 0x067E, "afii57506" }, /* ARABIC LETTER PEH */
+ { 0x0686, "afii57507" }, /* ARABIC LETTER TCHEH */
+ { 0x0688, "afii57512" }, /* ARABIC LETTER DDAL */
+ { 0x0691, "afii57513" }, /* ARABIC LETTER RREH */
+ { 0x0698, "afii57508" }, /* ARABIC LETTER JEH */
+ { 0x06A4, "afii57505" }, /* ARABIC LETTER VEH */
+ { 0x06AF, "afii57509" }, /* ARABIC LETTER GAF */
+ { 0x06BA, "afii57514" }, /* ARABIC LETTER NOON GHUNNA */
+ { 0x06D2, "afii57519" }, /* ARABIC LETTER YEH BARREE */
+ { 0x06D5, "afii57534" }, /* ARABIC LETTER AE */
+ { 0x1E80, "Wgrave" }, /* LATIN CAPITAL LETTER W WITH GRAVE */
+ { 0x1E81, "wgrave" }, /* LATIN SMALL LETTER W WITH GRAVE */
+ { 0x1E82, "Wacute" }, /* LATIN CAPITAL LETTER W WITH ACUTE */
+ { 0x1E83, "wacute" }, /* LATIN SMALL LETTER W WITH ACUTE */
+ { 0x1E84, "Wdieresis" }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */
+ { 0x1E85, "wdieresis" }, /* LATIN SMALL LETTER W WITH DIAERESIS */
+ { 0x1EF2, "Ygrave" }, /* LATIN CAPITAL LETTER Y WITH GRAVE */
+ { 0x1EF3, "ygrave" }, /* LATIN SMALL LETTER Y WITH GRAVE */
+ { 0x200C, "afii61664" }, /* ZERO WIDTH NON-JOINER */
+ { 0x200D, "afii301" }, /* ZERO WIDTH JOINER */
+ { 0x200E, "afii299" }, /* LEFT-TO-RIGHT MARK */
+ { 0x200F, "afii300" }, /* RIGHT-TO-LEFT MARK */
+ { 0x2012, "figuredash" }, /* FIGURE DASH */
+ { 0x2013, "endash" }, /* EN DASH */
+ { 0x2014, "emdash" }, /* EM DASH */
+ { 0x2015, "afii00208" }, /* HORIZONTAL BAR */
+ { 0x2017, "underscoredbl" }, /* DOUBLE LOW LINE */
+ { 0x2018, "quoteleft" }, /* LEFT SINGLE QUOTATION MARK */
+ { 0x2019, "quoteright" }, /* RIGHT SINGLE QUOTATION MARK */
+ { 0x201A, "quotesinglbase" }, /* SINGLE LOW-9 QUOTATION MARK */
+ { 0x201B, "quotereversed" }, /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */
+ { 0x201C, "quotedblleft" }, /* LEFT DOUBLE QUOTATION MARK */
+ { 0x201D, "quotedblright" }, /* RIGHT DOUBLE QUOTATION MARK */
+ { 0x201E, "quotedblbase" }, /* DOUBLE LOW-9 QUOTATION MARK */
+ { 0x201F, "$quotedblreversed" }, /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */
+ { 0x2020, "dagger" }, /* DAGGER */
+ { 0x2021, "daggerdbl" }, /* DOUBLE DAGGER */
+ { 0x2022, "bullet" }, /* BULLET */
+ { 0x2024, "onedotenleader" }, /* ONE DOT LEADER */
+ { 0x2025, "twodotenleader" }, /* TWO DOT LEADER */
+ { 0x2026, "ellipsis" }, /* HORIZONTAL ELLIPSIS */
+ { 0x202C, "afii61573" }, /* POP DIRECTIONAL FORMATTING */
+ { 0x202D, "afii61574" }, /* LEFT-TO-RIGHT OVERRIDE */
+ { 0x202E, "afii61575" }, /* RIGHT-TO-LEFT OVERRIDE */
+ { 0x2030, "perthousand" }, /* PER MILLE SIGN */
+ { 0x2032, "minute" }, /* PRIME */
+ { 0x2033, "second" }, /* DOUBLE PRIME */
+ { 0x2039, "guilsinglleft" }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
+ { 0x203A, "guilsinglright" }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
+ { 0x203C, "exclamdbl" }, /* DOUBLE EXCLAMATION MARK */
+ { 0x2040, "$tie" }, /* CHARACTER TIE */
+ { 0x2044, "fraction" }, /* FRACTION SLASH */
+ { 0x2044, "$fractionslash" }, /* FRACTION SLASH; distinguish Adobe duplicates */
+ { 0x2070, "zerosuperior" }, /* SUPERSCRIPT ZERO */
+ { 0x2074, "foursuperior" }, /* SUPERSCRIPT FOUR */
+ { 0x2075, "fivesuperior" }, /* SUPERSCRIPT FIVE */
+ { 0x2076, "sixsuperior" }, /* SUPERSCRIPT SIX */
+ { 0x2077, "sevensuperior" }, /* SUPERSCRIPT SEVEN */
+ { 0x2078, "eightsuperior" }, /* SUPERSCRIPT EIGHT */
+ { 0x2079, "ninesuperior" }, /* SUPERSCRIPT NINE */
+ { 0x207D, "parenleftsuperior" }, /* SUPERSCRIPT LEFT PARENTHESIS */
+ { 0x207E, "parenrightsuperior" }, /* SUPERSCRIPT RIGHT PARENTHESIS */
+ { 0x207F, "nsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER N */
+ { 0x2080, "zeroinferior" }, /* SUBSCRIPT ZERO */
+ { 0x2081, "oneinferior" }, /* SUBSCRIPT ONE */
+ { 0x2082, "twoinferior" }, /* SUBSCRIPT TWO */
+ { 0x2083, "threeinferior" }, /* SUBSCRIPT THREE */
+ { 0x2084, "fourinferior" }, /* SUBSCRIPT FOUR */
+ { 0x2085, "fiveinferior" }, /* SUBSCRIPT FIVE */
+ { 0x2086, "sixinferior" }, /* SUBSCRIPT SIX */
+ { 0x2087, "seveninferior" }, /* SUBSCRIPT SEVEN */
+ { 0x2088, "eightinferior" }, /* SUBSCRIPT EIGHT */
+ { 0x2089, "nineinferior" }, /* SUBSCRIPT NINE */
+ { 0x208D, "parenleftinferior" }, /* SUBSCRIPT LEFT PARENTHESIS */
+ { 0x208E, "parenrightinferior" }, /* SUBSCRIPT RIGHT PARENTHESIS */
+ { 0x20A1, "colonmonetary" }, /* COLON SIGN */
+ { 0x20A3, "franc" }, /* FRENCH FRANC SIGN */
+ { 0x20A4, "lira" }, /* LIRA SIGN */
+ { 0x20A7, "peseta" }, /* PESETA SIGN */
+ { 0x20AA, "afii57636" }, /* NEW SHEQEL SIGN */
+ { 0x20AB, "dong" }, /* DONG SIGN */
+ { 0x20AC, "Euro" }, /* EURO SIGN */
+ { 0x20D7, "$vectorcomb" }, /* COMBINING RIGHT ARROW ABOVE */
+ { 0x20DD, "$circlecomb" }, /* COMBINING ENCLOSING CIRCLE */
+ { 0x2105, "afii61248" }, /* CARE OF */
+ { 0x2111, "Ifraktur" }, /* BLACK-LETTER CAPITAL I */
+ { 0x2113, "afii61289" }, /* SCRIPT SMALL L */
+ { 0x2113, "$lscript" }, /* SCRIPT SMALL L; Adobe has this as "afii61289" */
+ { 0x2116, "afii61352" }, /* NUMERO SIGN */
+ { 0x2118, "weierstrass" }, /* SCRIPT CAPITAL P */
+ { 0x211C, "Rfraktur" }, /* BLACK-LETTER CAPITAL R */
+ { 0x211E, "prescription" }, /* PRESCRIPTION TAKE */
+ { 0x2122, "trademark" }, /* TRADE MARK SIGN */
+ { 0x2126, "$Ohm" }, /* OHM SIGN; distinguish Adobe duplicates */
+ { 0x2126, "Omega" }, /* OHM SIGN */
+ { 0x212E, "estimated" }, /* ESTIMATED SYMBOL */
+ { 0x2135, "aleph" }, /* ALEF SYMBOL */
+ { 0x2153, "onethird" }, /* VULGAR FRACTION ONE THIRD */
+ { 0x2154, "twothirds" }, /* VULGAR FRACTION TWO THIRDS */
+ { 0x215B, "oneeighth" }, /* VULGAR FRACTION ONE EIGHTH */
+ { 0x215C, "threeeighths" }, /* VULGAR FRACTION THREE EIGHTHS */
+ { 0x215D, "fiveeighths" }, /* VULGAR FRACTION FIVE EIGHTHS */
+ { 0x215E, "seveneighths" }, /* VULGAR FRACTION SEVEN EIGHTHS */
+ { 0x2190, "arrowleft" }, /* LEFTWARDS ARROW */
+ { 0x2191, "arrowup" }, /* UPWARDS ARROW */
+ { 0x2192, "arrowright" }, /* RIGHTWARDS ARROW */
+ { 0x2193, "arrowdown" }, /* DOWNWARDS ARROW */
+ { 0x2194, "arrowboth" }, /* LEFT RIGHT ARROW */
+ { 0x2195, "arrowupdn" }, /* UP DOWN ARROW */
+ { 0x2196, "$arrownorthwest" }, /* NORTH WEST ARROW */
+ { 0x2197, "$arrownortheast" }, /* NORTH EAST ARROW */
+ { 0x2198, "$arrowsoutheast" }, /* SOUTH EAST ARROW */
+ { 0x2199, "$arrowsouthwest" }, /* SOUTH WEST ARROW */
+ { 0x21A8, "arrowupdnbse" }, /* UP DOWN ARROW WITH BASE */
+ { 0x21B5, "carriagereturn" }, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS */
+ { 0x21BC, "$harpoonleftbarbup" }, /* LEFTWARDS HARPOON WITH BARB UPWARDS */
+ { 0x21BD, "$harpoonleftbarbdown" }, /* LEFTWARDS HARPOON WITH BARB DOWNWARDS */
+ { 0x21C0, "$harpoonrightbarbup" }, /* RIGHTWARDS HARPOON WITH BARB UPWARDS */
+ { 0x21C1, "$harpoonrightbarbdown" }, /* RIGHTWARDS HARPOON WITH BARB DOWNWARDS */
+ { 0x21D0, "arrowdblleft" }, /* LEFTWARDS DOUBLE ARROW */
+ { 0x21D1, "arrowdblup" }, /* UPWARDS DOUBLE ARROW */
+ { 0x21D2, "arrowdblright" }, /* RIGHTWARDS DOUBLE ARROW */
+ { 0x21D3, "arrowdbldown" }, /* DOWNWARDS DOUBLE ARROW */
+ { 0x21D4, "arrowdblboth" }, /* LEFT RIGHT DOUBLE ARROW */
+ { 0x21D5, "$arrowdblupdn" }, /* UP DOWN DOUBLE ARROW */
+ { 0x2200, "universal" }, /* FOR ALL */
+ { 0x2202, "partialdiff" }, /* PARTIAL DIFFERENTIAL */
+ { 0x2203, "existential" }, /* THERE EXISTS */
+ { 0x2205, "emptyset" }, /* EMPTY SET */
+ { 0x2206, "Delta" }, /* INCREMENT */
+ { 0x2206, "$increment" }, /* INCREMENT; distinguish Adobe duplicates */
+ { 0x2207, "gradient" }, /* NABLA */
+ { 0x2208, "element" }, /* ELEMENT OF */
+ { 0x2209, "notelement" }, /* NOT AN ELEMENT OF */
+ { 0x220B, "suchthat" }, /* CONTAINS AS MEMBER */
+ { 0x220F, "product" }, /* N-ARY PRODUCT */
+ { 0x2210, "$coproduct" }, /* N-ARY COPRODUCT */
+ { 0x2211, "summation" }, /* N-ARY SUMMATION */
+ { 0x2212, "minus" }, /* MINUS SIGN */
+ { 0x2213, "$minusplus" }, /* MINUS-OR-PLUS SIGN */
+ { 0x2215, "$divisionslash" }, /* DIVISION SLASH; distinguish Adobe duplicates */
+ { 0x2217, "asteriskmath" }, /* ASTERISK OPERATOR */
+ { 0x2219, "$bulletmath" }, /* BULLET OPERATOR; distinguish Adobe duplicates */
+ { 0x221A, "radical" }, /* SQUARE ROOT */
+ { 0x221D, "proportional" }, /* PROPORTIONAL TO */
+ { 0x221E, "infinity" }, /* INFINITY */
+ { 0x221F, "orthogonal" }, /* RIGHT ANGLE */
+ { 0x2220, "angle" }, /* ANGLE */
+ { 0x2225, "$parallel" }, /* PARALLEL TO */
+ { 0x2227, "logicaland" }, /* LOGICAL AND */
+ { 0x2228, "logicalor" }, /* LOGICAL OR */
+ { 0x2229, "intersection" }, /* INTERSECTION */
+ { 0x222A, "union" }, /* UNION */
+ { 0x222B, "integral" }, /* INTEGRAL */
+ { 0x222E, "$contintegral" }, /* CONTOUR INTEGRAL */
+ { 0x2234, "therefore" }, /* THEREFORE */
+ { 0x223C, "similar" }, /* TILDE OPERATOR */
+ { 0x2240, "$wreathproduct" }, /* WREATH PRODUCT */
+ { 0x2243, "$similarequal" }, /* ASYMPTOTICALLY EQUAL TO */
+ { 0x2245, "congruent" }, /* APPROXIMATELY EQUAL TO */
+ { 0x2248, "approxequal" }, /* ALMOST EQUAL TO */
+ { 0x224D, "$equivasymptotic" }, /* EQUIVALENT TO */
+ { 0x2260, "notequal" }, /* NOT EQUAL TO */
+ { 0x2261, "equivalence" }, /* IDENTICAL TO */
+ { 0x2264, "lessequal" }, /* LESS-THAN OR EQUAL TO */
+ { 0x2265, "greaterequal" }, /* GREATER-THAN OR EQUAL TO */
+ { 0x226A, "$lessmuch" }, /* MUCH-LESS THAN */
+ { 0x226B, "$greatermuch" }, /* MUCH GREATER-THAN */
+ { 0x227A, "$precedes" }, /* PRECEDES */
+ { 0x227B, "$follows" }, /* SUCCEEDS */
+ { 0x227C, "$precedesequal" }, /* PRECEDES OR EQUAL TO */
+ { 0x227D, "$followsequal" }, /* SUCCEEDS OR EQUAL TO */
+ { 0x2282, "propersubset" }, /* SUBSET OF */
+ { 0x2283, "propersuperset" }, /* SUPERSET OF */
+ { 0x2284, "notsubset" }, /* NOT A SUBSET OF */
+ { 0x2286, "reflexsubset" }, /* SUBSET OF OR EQUAL TO */
+ { 0x2287, "reflexsuperset" }, /* SUPERSET OF OR EQUAL TO */
+ { 0x228E, "$unionmulti" }, /* MULTISET UNION */
+ { 0x2291, "$reflexsubsetsq" }, /* SQUARE IMAGE OF OR EQUAL TO */
+ { 0x2292, "$reflexsupersetsq" }, /* SQUARE ORIGINAL OF OR EQUAL TO */
+ { 0x2293, "$intersectionsq" }, /* SQUARE CAP */
+ { 0x2294, "$unionsq" }, /* SQUARE CUP */
+ { 0x2295, "circleplus" }, /* CIRCLED PLUS */
+ { 0x2296, "$circleminus" }, /* CIRCLED MINUS */
+ { 0x2297, "circlemultiply" }, /* CIRCLED TIMES */
+ { 0x2298, "$circledivide" }, /* CIRCLED DIVISION SLASH */
+ { 0x2299, "$circledot" }, /* CIRCLED DOT OPERATOR */
+ { 0x22A2, "$turnstileleft" }, /* RIGHT TACK */
+ { 0x22A3, "$turnstileright" }, /* LEFT TACK */
+ { 0x22A4, "$latticetop" }, /* DOWN TACK */
+ { 0x22A5, "perpendicular" }, /* UP TACK */
+ { 0x22B2, "$normalin" }, /* NORMAL SUBGROUP OF */
+ { 0x22B3, "$normalizes" }, /* CONTAINS AS NORMAL SUBGROUP */
+ { 0x22B4, "$reflexnormalin" }, /* NORMAL SUBGROUP OF OR EQUAL TO */
+ { 0x22B5, "$reflexnormalizes" }, /* CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
+ { 0x22C4, "$diamondmath" }, /* DIAMOND OPERATOR */
+ { 0x22C5, "dotmath" }, /* DOT OPERATOR */
+ { 0x22C6, "$starmath" }, /* STAR OPERATOR */
+ { 0x2302, "house" }, /* HOUSE */
+ { 0x2308, "$ceilingleft" }, /* LEFT CEILING */
+ { 0x2309, "$ceilingright" }, /* RIGHT CEILING */
+ { 0x230A, "$floorleft" }, /* LEFT FLOOR */
+ { 0x230B, "$floorright" }, /* RIGHT FLOOR */
+ { 0x2310, "revlogicalnot" }, /* REVERSED NOT SIGN */
+ { 0x2320, "integraltp" }, /* TOP HALF INTEGRAL */
+ { 0x2321, "integralbt" }, /* BOTTOM HALF INTEGRAL */
+ { 0x2322, "$frown" }, /* FROWN */
+ { 0x2323, "$smile" }, /* SMILE */
+ { 0x2329, "angleleft" }, /* LEFT-POINTING ANGLE BRACKET */
+ { 0x232A, "angleright" }, /* RIGHT-POINTING ANGLE BRACKET */
+ { 0x2420, "$spacesymbol" }, /* SYMBOL FOR SPACE */
+ { 0x2500, "SF100000" }, /* BOX DRAWINGS LIGHT HORIZONTAL */
+ { 0x2502, "SF110000" }, /* BOX DRAWINGS LIGHT VERTICAL */
+ { 0x250C, "SF010000" }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+ { 0x2510, "SF030000" }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+ { 0x2514, "SF020000" }, /* BOX DRAWINGS LIGHT UP AND RIGHT */
+ { 0x2518, "SF040000" }, /* BOX DRAWINGS LIGHT UP AND LEFT */
+ { 0x251C, "SF080000" }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+ { 0x2524, "SF090000" }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+ { 0x252C, "SF060000" }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+ { 0x2534, "SF070000" }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+ { 0x253C, "SF050000" }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+ { 0x2550, "SF430000" }, /* BOX DRAWINGS DOUBLE HORIZONTAL */
+ { 0x2551, "SF240000" }, /* BOX DRAWINGS DOUBLE VERTICAL */
+ { 0x2552, "SF510000" }, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
+ { 0x2553, "SF520000" }, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */
+ { 0x2554, "SF390000" }, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
+ { 0x2555, "SF220000" }, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */
+ { 0x2556, "SF210000" }, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */
+ { 0x2557, "SF250000" }, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */
+ { 0x2558, "SF500000" }, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
+ { 0x2559, "SF490000" }, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
+ { 0x255A, "SF380000" }, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
+ { 0x255B, "SF280000" }, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
+ { 0x255C, "SF270000" }, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */
+ { 0x255D, "SF260000" }, /* BOX DRAWINGS DOUBLE UP AND LEFT */
+ { 0x255E, "SF360000" }, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
+ { 0x255F, "SF370000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
+ { 0x2560, "SF420000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
+ { 0x2561, "SF190000" }, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
+ { 0x2562, "SF200000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */
+ { 0x2563, "SF230000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
+ { 0x2564, "SF470000" }, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */
+ { 0x2565, "SF480000" }, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */
+ { 0x2566, "SF410000" }, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
+ { 0x2567, "SF450000" }, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
+ { 0x2568, "SF460000" }, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
+ { 0x2569, "SF400000" }, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
+ { 0x256A, "SF540000" }, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */
+ { 0x256B, "SF530000" }, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */
+ { 0x256C, "SF440000" }, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
+ { 0x2580, "upblock" }, /* UPPER HALF BLOCK */
+ { 0x2584, "dnblock" }, /* LOWER HALF BLOCK */
+ { 0x2588, "block" }, /* FULL BLOCK */
+ { 0x258C, "lfblock" }, /* LEFT HALF BLOCK */
+ { 0x2590, "rtblock" }, /* RIGHT HALF BLOCK */
+ { 0x2591, "ltshade" }, /* LIGHT SHADE */
+ { 0x2592, "shade" }, /* MEDIUM SHADE */
+ { 0x2593, "dkshade" }, /* DARK SHADE */
+ { 0x25A0, "filledbox" }, /* BLACK SQUARE */
+ { 0x25A1, "H22073" }, /* WHITE SQUARE */
+ { 0x25AA, "H18543" }, /* BLACK SMALL SQUARE */
+ { 0x25AB, "H18551" }, /* WHITE SMALL SQUARE */
+ { 0x25AC, "filledrect" }, /* BLACK RECTANGLE */
+ { 0x25B2, "triagup" }, /* BLACK UP-POINTING TRIANGLE */
+ { 0x25B3, "$triagwhiteup" }, /* WHITE UP-POINTING TRIANGLE */
+ { 0x25BA, "triagrt" }, /* BLACK RIGHT-POINTING POINTER */
+ { 0x25BC, "triagdn" }, /* BLACK DOWN-POINTING TRIANGLE */
+ { 0x25BD, "$triagwhitedn" }, /* WHITE DOWN-POINTING TRIANGLE */
+ { 0x25C4, "triaglf" }, /* BLACK LEFT-POINTING POINTER */
+ { 0x25CA, "lozenge" }, /* LOZENGE */
+ { 0x25CB, "circle" }, /* WHITE CIRCLE */
+ { 0x25CF, "H18533" }, /* BLACK CIRCLE */
+ { 0x25D8, "invbullet" }, /* INVERSE BULLET */
+ { 0x25D9, "invcircle" }, /* INVERSE WHITE CIRCLE */
+ { 0x25E6, "openbullet" }, /* WHITE BULLET */
+ { 0x25EF, "$circlelarge" }, /* LARGE CIRCLE */
+ { 0x263A, "smileface" }, /* WHITE SMILING FACE */
+ { 0x263B, "invsmileface" }, /* BLACK SMILING FACE */
+ { 0x263C, "sun" }, /* WHITE SUN WITH RAYS */
+ { 0x2640, "female" }, /* FEMALE SIGN */
+ { 0x2642, "male" }, /* MALE SIGN */
+ { 0x2660, "spade" }, /* BLACK SPADE SUIT */
+ { 0x2663, "club" }, /* BLACK CLUB SUIT */
+ { 0x2665, "heart" }, /* BLACK HEART SUIT */
+ { 0x2666, "diamond" }, /* BLACK DIAMOND SUIT */
+ { 0x266A, "musicalnote" }, /* EIGHTH NOTE */
+ { 0x266B, "musicalnotedbl" }, /* BEAMED EIGHTH NOTES */
+ { 0x266D, "$flat" }, /* MUSIC FLAT SIGN */
+ { 0x266E, "$natural" }, /* MUSIC NATURAL SIGN */
+ { 0x266F, "$sharp" }, /* MUSIC SHARP SIGN */
+ { 0xF6BE, "dotlessj" }, /* LATIN SMALL LETTER DOTLESS J */
+ { 0xF6BF, "LL" }, /* LATIN CAPITAL LETTER LL */
+ { 0xF6C0, "ll" }, /* LATIN SMALL LETTER LL */
+ { 0xF6C3, "commaaccent" }, /* COMMA BELOW */
+ { 0xF6C4, "afii10063" }, /* CYRILLIC SMALL LETTER GHE VARIANT */
+ { 0xF6C5, "afii10064" }, /* CYRILLIC SMALL LETTER BE VARIANT */
+ { 0xF6C6, "afii10192" }, /* CYRILLIC SMALL LETTER DE VARIANT */
+ { 0xF6C7, "afii10831" }, /* CYRILLIC SMALL LETTER PE VARIANT */
+ { 0xF6C8, "afii10832" }, /* CYRILLIC SMALL LETTER TE VARIANT */
+ { 0xF6C9, "Acute" }, /* CAPITAL ACUTE ACCENT */
+ { 0xF6CA, "Caron" }, /* CAPITAL CARON */
+ { 0xF6CB, "Dieresis" }, /* CAPITAL DIAERESIS */
+ { 0xF6CC, "DieresisAcute" }, /* CAPITAL DIAERESIS ACUTE ACCENT */
+ { 0xF6CD, "DieresisGrave" }, /* CAPITAL DIAERESIS GRAVE ACCENT */
+ { 0xF6CE, "Grave" }, /* CAPITAL GRAVE ACCENT */
+ { 0xF6CF, "Hungarumlaut" }, /* CAPITAL DOUBLE ACUTE ACCENT */
+ { 0xF6D0, "Macron" }, /* CAPITAL MACRON */
+ { 0xF6D1, "cyrBreve" }, /* CAPITAL CYRILLIC BREVE */
+ { 0xF6D2, "cyrFlex" }, /* CAPITAL CYRILLIC CIRCUMFLEX */
+ { 0xF6D3, "dblGrave" }, /* CAPITAL DOUBLE GRAVE ACCENT */
+ { 0xF6D4, "cyrbreve" }, /* CYRILLIC BREVE */
+ { 0xF6D5, "cyrflex" }, /* CYRILLIC CIRCUMFLEX */
+ { 0xF6D6, "dblgrave" }, /* DOUBLE GRAVE ACCENT */
+ { 0xF6D7, "dieresisacute" }, /* DIAERESIS ACUTE ACCENT */
+ { 0xF6D8, "dieresisgrave" }, /* DIAERESIS GRAVE ACCENT */
+ { 0xF6D9, "copyrightserif" }, /* COPYRIGHT SIGN SERIF */
+ { 0xF6DA, "registerserif" }, /* REGISTERED SIGN SERIF */
+ { 0xF6DB, "trademarkserif" }, /* TRADE MARK SIGN SERIF */
+ { 0xF6DC, "onefitted" }, /* PROPORTIONAL DIGIT ONE */
+ { 0xF6DD, "rupiah" }, /* RUPIAH SIGN */
+ { 0xF6DE, "threequartersemdash" }, /* THREE QUARTERS EM DASH */
+ { 0xF6DF, "centinferior" }, /* SUBSCRIPT CENT SIGN */
+ { 0xF6E0, "centsuperior" }, /* SUPERSCRIPT CENT SIGN */
+ { 0xF6E1, "commainferior" }, /* SUBSCRIPT COMMA */
+ { 0xF6E2, "commasuperior" }, /* SUPERSCRIPT COMMA */
+ { 0xF6E3, "dollarinferior" }, /* SUBSCRIPT DOLLAR SIGN */
+ { 0xF6E4, "dollarsuperior" }, /* SUPERSCRIPT DOLLAR SIGN */
+ { 0xF6E5, "hypheninferior" }, /* SUBSCRIPT HYPHEN-MINUS */
+ { 0xF6E6, "hyphensuperior" }, /* SUPERSCRIPT HYPHEN-MINUS */
+ { 0xF6E7, "periodinferior" }, /* SUBSCRIPT FULL STOP */
+ { 0xF6E8, "periodsuperior" }, /* SUPERSCRIPT FULL STOP */
+ { 0xF6E9, "asuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER A */
+ { 0xF6EA, "bsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER B */
+ { 0xF6EB, "dsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER D */
+ { 0xF6EC, "esuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER E */
+ { 0xF6ED, "isuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER I */
+ { 0xF6EE, "lsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER L */
+ { 0xF6EF, "msuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER M */
+ { 0xF6F0, "osuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER O */
+ { 0xF6F1, "rsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER R */
+ { 0xF6F2, "ssuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER S */
+ { 0xF6F3, "tsuperior" }, /* SUPERSCRIPT LATIN SMALL LETTER T */
+ { 0xF6F4, "Brevesmall" }, /* SMALL CAPITAL BREVE */
+ { 0xF6F5, "Caronsmall" }, /* SMALL CAPITAL CARON */
+ { 0xF6F6, "Circumflexsmall" }, /* SMALL CAPITAL MODIFIER LETTER CIRCUMFLEX ACCENT */
+ { 0xF6F7, "Dotaccentsmall" }, /* SMALL CAPITAL DOT ABOVE */
+ { 0xF6F8, "Hungarumlautsmall" }, /* SMALL CAPITAL DOUBLE ACUTE ACCENT */
+ { 0xF6F9, "Lslashsmall" }, /* LATIN SMALL CAPITAL LETTER L WITH STROKE */
+ { 0xF6FA, "OEsmall" }, /* LATIN SMALL CAPITAL LIGATURE OE */
+ { 0xF6FB, "Ogoneksmall" }, /* SMALL CAPITAL OGONEK */
+ { 0xF6FC, "Ringsmall" }, /* SMALL CAPITAL RING ABOVE */
+ { 0xF6FD, "Scaronsmall" }, /* LATIN SMALL CAPITAL LETTER S WITH CARON */
+ { 0xF6FE, "Tildesmall" }, /* SMALL CAPITAL SMALL TILDE */
+ { 0xF6FF, "Zcaronsmall" }, /* LATIN SMALL CAPITAL LETTER Z WITH CARON */
+ { 0xF721, "exclamsmall" }, /* SMALL CAPITAL EXCLAMATION MARK */
+ { 0xF724, "dollaroldstyle" }, /* OLDSTYLE DOLLAR SIGN */
+ { 0xF726, "ampersandsmall" }, /* SMALL CAPITAL AMPERSAND */
+ { 0xF730, "zerooldstyle" }, /* OLDSTYLE DIGIT ZERO */
+ { 0xF731, "oneoldstyle" }, /* OLDSTYLE DIGIT ONE */
+ { 0xF732, "twooldstyle" }, /* OLDSTYLE DIGIT TWO */
+ { 0xF733, "threeoldstyle" }, /* OLDSTYLE DIGIT THREE */
+ { 0xF734, "fouroldstyle" }, /* OLDSTYLE DIGIT FOUR */
+ { 0xF735, "fiveoldstyle" }, /* OLDSTYLE DIGIT FIVE */
+ { 0xF736, "sixoldstyle" }, /* OLDSTYLE DIGIT SIX */
+ { 0xF737, "sevenoldstyle" }, /* OLDSTYLE DIGIT SEVEN */
+ { 0xF738, "eightoldstyle" }, /* OLDSTYLE DIGIT EIGHT */
+ { 0xF739, "nineoldstyle" }, /* OLDSTYLE DIGIT NINE */
+ { 0xF73F, "questionsmall" }, /* SMALL CAPITAL QUESTION MARK */
+ { 0xF760, "Gravesmall" }, /* SMALL CAPITAL GRAVE ACCENT */
+ { 0xF761, "Asmall" }, /* LATIN SMALL CAPITAL LETTER A */
+ { 0xF762, "Bsmall" }, /* LATIN SMALL CAPITAL LETTER B */
+ { 0xF763, "Csmall" }, /* LATIN SMALL CAPITAL LETTER C */
+ { 0xF764, "Dsmall" }, /* LATIN SMALL CAPITAL LETTER D */
+ { 0xF765, "Esmall" }, /* LATIN SMALL CAPITAL LETTER E */
+ { 0xF766, "Fsmall" }, /* LATIN SMALL CAPITAL LETTER F */
+ { 0xF767, "Gsmall" }, /* LATIN SMALL CAPITAL LETTER G */
+ { 0xF768, "Hsmall" }, /* LATIN SMALL CAPITAL LETTER H */
+ { 0xF769, "Ismall" }, /* LATIN SMALL CAPITAL LETTER I */
+ { 0xF76A, "Jsmall" }, /* LATIN SMALL CAPITAL LETTER J */
+ { 0xF76B, "Ksmall" }, /* LATIN SMALL CAPITAL LETTER K */
+ { 0xF76C, "Lsmall" }, /* LATIN SMALL CAPITAL LETTER L */
+ { 0xF76D, "Msmall" }, /* LATIN SMALL CAPITAL LETTER M */
+ { 0xF76E, "Nsmall" }, /* LATIN SMALL CAPITAL LETTER N */
+ { 0xF76F, "Osmall" }, /* LATIN SMALL CAPITAL LETTER O */
+ { 0xF770, "Psmall" }, /* LATIN SMALL CAPITAL LETTER P */
+ { 0xF771, "Qsmall" }, /* LATIN SMALL CAPITAL LETTER Q */
+ { 0xF772, "Rsmall" }, /* LATIN SMALL CAPITAL LETTER R */
+ { 0xF773, "Ssmall" }, /* LATIN SMALL CAPITAL LETTER S */
+ { 0xF774, "Tsmall" }, /* LATIN SMALL CAPITAL LETTER T */
+ { 0xF775, "Usmall" }, /* LATIN SMALL CAPITAL LETTER U */
+ { 0xF776, "Vsmall" }, /* LATIN SMALL CAPITAL LETTER V */
+ { 0xF777, "Wsmall" }, /* LATIN SMALL CAPITAL LETTER W */
+ { 0xF778, "Xsmall" }, /* LATIN SMALL CAPITAL LETTER X */
+ { 0xF779, "Ysmall" }, /* LATIN SMALL CAPITAL LETTER Y */
+ { 0xF77A, "Zsmall" }, /* LATIN SMALL CAPITAL LETTER Z */
+ { 0xF7A1, "exclamdownsmall" }, /* SMALL CAPITAL INVERTED EXCLAMATION MARK */
+ { 0xF7A2, "centoldstyle" }, /* OLDSTYLE CENT SIGN */
+ { 0xF7A8, "Dieresissmall" }, /* SMALL CAPITAL DIAERESIS */
+ { 0xF7AF, "Macronsmall" }, /* SMALL CAPITAL MACRON */
+ { 0xF7B4, "Acutesmall" }, /* SMALL CAPITAL ACUTE ACCENT */
+ { 0xF7B8, "Cedillasmall" }, /* SMALL CAPITAL CEDILLA */
+ { 0xF7BF, "questiondownsmall" }, /* SMALL CAPITAL INVERTED QUESTION MARK */
+ { 0xF7E0, "Agravesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH GRAVE */
+ { 0xF7E1, "Aacutesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH ACUTE */
+ { 0xF7E2, "Acircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER A WITH CIRCUMFLEX */
+ { 0xF7E3, "Atildesmall" }, /* LATIN SMALL CAPITAL LETTER A WITH TILDE */
+ { 0xF7E4, "Adieresissmall" }, /* LATIN SMALL CAPITAL LETTER A WITH DIAERESIS */
+ { 0xF7E5, "Aringsmall" }, /* LATIN SMALL CAPITAL LETTER A WITH RING ABOVE */
+ { 0xF7E6, "AEsmall" }, /* LATIN SMALL CAPITAL LETTER AE */
+ { 0xF7E7, "Ccedillasmall" }, /* LATIN SMALL CAPITAL LETTER C WITH CEDILLA */
+ { 0xF7E8, "Egravesmall" }, /* LATIN SMALL CAPITAL LETTER E WITH GRAVE */
+ { 0xF7E9, "Eacutesmall" }, /* LATIN SMALL CAPITAL LETTER E WITH ACUTE */
+ { 0xF7EA, "Ecircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER E WITH CIRCUMFLEX */
+ { 0xF7EB, "Edieresissmall" }, /* LATIN SMALL CAPITAL LETTER E WITH DIAERESIS */
+ { 0xF7EC, "Igravesmall" }, /* LATIN SMALL CAPITAL LETTER I WITH GRAVE */
+ { 0xF7ED, "Iacutesmall" }, /* LATIN SMALL CAPITAL LETTER I WITH ACUTE */
+ { 0xF7EE, "Icircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER I WITH CIRCUMFLEX */
+ { 0xF7EF, "Idieresissmall" }, /* LATIN SMALL CAPITAL LETTER I WITH DIAERESIS */
+ { 0xF7F0, "Ethsmall" }, /* LATIN SMALL CAPITAL LETTER ETH */
+ { 0xF7F1, "Ntildesmall" }, /* LATIN SMALL CAPITAL LETTER N WITH TILDE */
+ { 0xF7F2, "Ogravesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH GRAVE */
+ { 0xF7F3, "Oacutesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH ACUTE */
+ { 0xF7F4, "Ocircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER O WITH CIRCUMFLEX */
+ { 0xF7F5, "Otildesmall" }, /* LATIN SMALL CAPITAL LETTER O WITH TILDE */
+ { 0xF7F6, "Odieresissmall" }, /* LATIN SMALL CAPITAL LETTER O WITH DIAERESIS */
+ { 0xF7F8, "Oslashsmall" }, /* LATIN SMALL CAPITAL LETTER O WITH STROKE */
+ { 0xF7F9, "Ugravesmall" }, /* LATIN SMALL CAPITAL LETTER U WITH GRAVE */
+ { 0xF7FA, "Uacutesmall" }, /* LATIN SMALL CAPITAL LETTER U WITH ACUTE */
+ { 0xF7FB, "Ucircumflexsmall" }, /* LATIN SMALL CAPITAL LETTER U WITH CIRCUMFLEX */
+ { 0xF7FC, "Udieresissmall" }, /* LATIN SMALL CAPITAL LETTER U WITH DIAERESIS */
+ { 0xF7FD, "Yacutesmall" }, /* LATIN SMALL CAPITAL LETTER Y WITH ACUTE */
+ { 0xF7FE, "Thornsmall" }, /* LATIN SMALL CAPITAL LETTER THORN */
+ { 0xF7FF, "Ydieresissmall" }, /* LATIN SMALL CAPITAL LETTER Y WITH DIAERESIS */
+ { 0xF8E5, "radicalex" }, /* RADICAL EXTENDER */
+ { 0xF8E6, "arrowvertex" }, /* VERTICAL ARROW EXTENDER */
+ { 0xF8E7, "arrowhorizex" }, /* HORIZONTAL ARROW EXTENDER */
+ { 0xF8E8, "registersans" }, /* REGISTERED SIGN SANS SERIF */
+ { 0xF8E9, "copyrightsans" }, /* COPYRIGHT SIGN SANS SERIF */
+ { 0xF8EA, "trademarksans" }, /* TRADE MARK SIGN SANS SERIF */
+ { 0xF8EB, "parenlefttp" }, /* LEFT PAREN TOP */
+ { 0xF8EC, "parenleftex" }, /* LEFT PAREN EXTENDER */
+ { 0xF8ED, "parenleftbt" }, /* LEFT PAREN BOTTOM */
+ { 0xF8EE, "bracketlefttp" }, /* LEFT SQUARE BRACKET TOP */
+ { 0xF8EF, "bracketleftex" }, /* LEFT SQUARE BRACKET EXTENDER */
+ { 0xF8F0, "bracketleftbt" }, /* LEFT SQUARE BRACKET BOTTOM */
+ { 0xF8F1, "bracelefttp" }, /* LEFT CURLY BRACKET TOP */
+ { 0xF8F2, "braceleftmid" }, /* LEFT CURLY BRACKET MID */
+ { 0xF8F3, "braceleftbt" }, /* LEFT CURLY BRACKET BOTTOM */
+ { 0xF8F4, "braceex" }, /* CURLY BRACKET EXTENDER */
+ { 0xF8F5, "integralex" }, /* INTEGRAL EXTENDER */
+ { 0xF8F6, "parenrighttp" }, /* RIGHT PAREN TOP */
+ { 0xF8F7, "parenrightex" }, /* RIGHT PAREN EXTENDER */
+ { 0xF8F8, "parenrightbt" }, /* RIGHT PAREN BOTTOM */
+ { 0xF8F9, "bracketrighttp" }, /* RIGHT SQUARE BRACKET TOP */
+ { 0xF8FA, "bracketrightex" }, /* RIGHT SQUARE BRACKET EXTENDER */
+ { 0xF8FB, "bracketrightbt" }, /* RIGHT SQUARE BRACKET BOTTOM */
+ { 0xF8FC, "bracerighttp" }, /* RIGHT CURLY BRACKET TOP */
+ { 0xF8FD, "bracerightmid" }, /* RIGHT CURLY BRACKET MID */
+ { 0xF8FE, "bracerightbt" }, /* RIGHT CURLY BRACKET BOTTOM */
+ { 0xFB00, "ff" }, /* LATIN SMALL LIGATURE FF */
+ { 0xFB01, "fi" }, /* LATIN SMALL LIGATURE FI */
+ { 0xFB02, "fl" }, /* LATIN SMALL LIGATURE FL */
+ { 0xFB03, "ffi" }, /* LATIN SMALL LIGATURE FFI */
+ { 0xFB04, "ffl" }, /* LATIN SMALL LIGATURE FFL */
+ { 0xFB05, "$longst" }, /* LATIN SMALL LIGATURE LONG S T */
+ { 0xFB06, "$st" }, /* LATIN SMALL LIGATURE ST */
+ { 0xFB1F, "afii57705" }, /* HEBREW LIGATURE YIDDISH YOD YOD PATAH */
+ { 0xFB2A, "afii57694" }, /* HEBREW LETTER SHIN WITH SHIN DOT */
+ { 0xFB2B, "afii57695" }, /* HEBREW LETTER SHIN WITH SIN DOT */
+ { 0xFB35, "afii57723" }, /* HEBREW LETTER VAV WITH DAGESH */
+ { 0xFB4B, "afii57700" } /* HEBREW LETTER VAV WITH HOLAM */
+};
+#endif /* 0 */
+
+static int
+adobe_name_cmp(const void *s1, const void *s2)
+{
+ const struct adobe2unicode *a = s1;
+ const struct adobe2unicode *b = s2;
+
+ return strcmp(a->adobe_name, b->adobe_name);
+}
+
+#if 0
+static int
+unicode_id_cmp(const void *s1, const void *s2)
+{
+ const struct unicode2adobe *a = s1;
+ const struct unicode2adobe *b = s2;
+
+ return a->unicode - b->unicode;
+}
+#endif /* 0 */
+
+#if HAVE_ICONV_H
+static void
+close_iconv(void *dummy)
+{
+ UNUSED(dummy);
+ if (m_iconv_gb_ucs4 != (iconv_t)(-1)) {
+ iconv_close(m_iconv_gb_ucs4);
+ m_iconv_gb_ucs4 = (iconv_t)(-1);
+ }
+}
+#endif /* HAVE_ICONV_H */
+
+/* convert a CJK char to unicode (UCS-4) using iconv() */
+static uint32_t
+cjk2unicode(unsigned char *cjk)
+{
+#if HAVE_ICONV_H
+ uint32_t u = 0;
+ unsigned char unicode[4];
+ size_t from = 2;
+ size_t to = sizeof unicode;
+ static Boolean initialized = False;
+ char *from_ptr = (char *)cjk;
+ char *to_ptr = (char *)unicode;
+
+ if (m_iconv_gb_ucs4 == (iconv_t)(-1)) {
+ if (initialized)
+ return 0;
+ initialized = True;
+ m_iconv_gb_ucs4 = iconv_open(
+#ifdef WORDS_BIGENDIAN
+ "UCS-4BE",
+#else
+ "UCS-4LE",
+#endif
+ "GB18030");
+ if (m_iconv_gb_ucs4 == (iconv_t)(-1)) {
+ XDVI_ERROR((stderr, "cjk2unicode: iconv_open() failed: %s", strerror(errno)));
+ return 0;
+ }
+
+ register_exit_handler(close_iconv, NULL);
+
+ }
+ if (iconv(m_iconv_gb_ucs4, (iconv_char_pptrT)&from_ptr, &from, &to_ptr, &to) == (size_t)(-1)) {
+ XDVI_ERROR((stderr, "cjk2unicode: can't convert GBK to unicode: %s", strerror(errno)));
+ return 0;
+ }
+ memcpy(&u, unicode, sizeof unicode);
+ return u;
+#else /* HAVE_ICONV_H */
+ static Boolean warned = False;
+
+ if (!warned) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN, NULL, "This version of xdvi has been compiled without iconv support - "
+ "cannot convert CJK character to UTF-8");
+ warned = True;
+ }
+ return 0;
+#endif /* HAVE_ICONV_H */
+}
+
+/*
+ * Return the unicode ID of adobe_name, or 0 if it isn't found.
+ * Uses the lookup table adobe2unicode_table, or iconv for CJK fonts.
+ */
+uint32_t
+adobe2unicode_name(const char *adobe_name)
+{
+ struct adobe2unicode search_item;
+ struct adobe2unicode *match_item;
+
+ if (HAS_PREFIX(adobe_name, "cjk")) {
+ /* Special case for CJK fonts (Chinese) - ZLB: the Adobe names in
+ * the Chinese T1 fonts are of the form 'cjkXXXX' where 'XXXX' are
+ * the hex number of the GBK/GB18030 encoding */
+ unsigned char cjk[2], xx[3];
+ xx[0] = adobe_name[3];
+ xx[1] = adobe_name[4];
+ xx[2] = '\0';
+ cjk[0] = strtoul((char *)xx, NULL, 16);
+ xx[0] = adobe_name[5];
+ xx[1] = adobe_name[6];
+ cjk[1] = strtoul((char *)xx, NULL, 16);
+ /* convert GBK ==> unicode */
+ return cjk2unicode(cjk);
+ }
+ else {
+ search_item.adobe_name = adobe_name;
+
+ match_item = bsearch(&search_item, adobe2unicode_table,
+ sizeof adobe2unicode_table / sizeof adobe2unicode_table[0],
+ sizeof adobe2unicode_table[0],
+ adobe_name_cmp);
+ if (match_item != NULL)
+ return match_item->unicode;
+ else
+ return 0;
+ }
+}
+
+#if 0
+/*
+ * Return the adobe_name of unicode ID, or NULL if it isn't found.
+ * Uses the lookup table unicode2adobe_table.
+ */
+const char *
+unicode2adobe_name(uint32_t unicode)
+{
+ struct unicode2adobe search_item;
+ struct unicode2adobe *match_item;
+
+ search_item.unicode = unicode;
+
+ match_item = bsearch(&search_item, unicode2adobe_table,
+ sizeof unicode2adobe_table / sizeof unicode2adobe_table[0],
+ sizeof unicode2adobe_table[0],
+ unicode_id_cmp);
+ if (match_item != NULL)
+ return match_item->adobe_name;
+ else
+ return NULL;
+}
+#endif /* 0 */
+
+
+static uint32_t
+ucs4_lowercase(uint32_t c)
+{
+ /*
+ This table was produced by:
+
+ cat uni2adobe | while read a b; do lc_b=`echo $b | tr 'A-Z' 'a-z'`; \
+ if [ "$lc_b" != "$b" ] ; then res=`egrep " $lc_b\$" uni2adobe` ; \
+ if [ -n "$res" ]; then echo "RES: $a $b -> $res"; fi; fi; done | grep 'RES' > uni2adobe-map
+
+ And then, some Emacs keyboard macros.
+ */
+ switch (c) {
+ case 0x0041: /* A */ return 0x0061; /* a */
+ case 0x0042: /* B */ return 0x0062; /* b */
+ case 0x0043: /* C */ return 0x0063; /* c */
+ case 0x0044: /* D */ return 0x0064; /* d */
+ case 0x0045: /* E */ return 0x0065; /* e */
+ case 0x0046: /* F */ return 0x0066; /* f */
+ case 0x0047: /* G */ return 0x0067; /* g */
+ case 0x0048: /* H */ return 0x0068; /* h */
+ case 0x0049: /* I */ return 0x0069; /* i */
+ case 0x004A: /* J */ return 0x006A; /* j */
+ case 0x004B: /* K */ return 0x006B; /* k */
+ case 0x004C: /* L */ return 0x006C; /* l */
+ case 0x004D: /* M */ return 0x006D; /* m */
+ case 0x004E: /* N */ return 0x006E; /* n */
+ case 0x004F: /* O */ return 0x006F; /* o */
+ case 0x0050: /* P */ return 0x0070; /* p */
+ case 0x0051: /* Q */ return 0x0071; /* q */
+ case 0x0052: /* R */ return 0x0072; /* r */
+ case 0x0053: /* S */ return 0x0073; /* s */
+ case 0x0054: /* T */ return 0x0074; /* t */
+ case 0x0055: /* U */ return 0x0075; /* u */
+ case 0x0056: /* V */ return 0x0076; /* v */
+ case 0x0057: /* W */ return 0x0077; /* w */
+ case 0x0058: /* X */ return 0x0078; /* x */
+ case 0x0059: /* Y */ return 0x0079; /* y */
+ case 0x005A: /* Z */ return 0x007A; /* z */
+ case 0x00C0: /* Agrave */ return 0x00E0; /* agrave */
+ case 0x00C1: /* Aacute */ return 0x00E1; /* aacute */
+ case 0x00C2: /* Acircumflex */ return 0x00E2; /* acircumflex */
+ case 0x00C3: /* Atilde */ return 0x00E3; /* atilde */
+ case 0x00C4: /* Adieresis */ return 0x00E4; /* adieresis */
+ case 0x00C5: /* Aring */ return 0x00E5; /* aring */
+ case 0x00C6: /* AE */ return 0x00E6; /* ae */
+ case 0x00C7: /* Ccedilla */ return 0x00E7; /* ccedilla */
+ case 0x00C8: /* Egrave */ return 0x00E8; /* egrave */
+ case 0x00C9: /* Eacute */ return 0x00E9; /* eacute */
+ case 0x00CA: /* Ecircumflex */ return 0x00EA; /* ecircumflex */
+ case 0x00CB: /* Edieresis */ return 0x00EB; /* edieresis */
+ case 0x00CC: /* Igrave */ return 0x00EC; /* igrave */
+ case 0x00CD: /* Iacute */ return 0x00ED; /* iacute */
+ case 0x00CE: /* Icircumflex */ return 0x00EE; /* icircumflex */
+ case 0x00CF: /* Idieresis */ return 0x00EF; /* idieresis */
+ case 0x00D0: /* Eth */ return 0x00F0; /* eth */
+ case 0x00D1: /* Ntilde */ return 0x00F1; /* ntilde */
+ case 0x00D2: /* Ograve */ return 0x00F2; /* ograve */
+ case 0x00D3: /* Oacute */ return 0x00F3; /* oacute */
+ case 0x00D4: /* Ocircumflex */ return 0x00F4; /* ocircumflex */
+ case 0x00D5: /* Otilde */ return 0x00F5; /* otilde */
+ case 0x00D6: /* Odieresis */ return 0x00F6; /* odieresis */
+ case 0x00D8: /* Oslash */ return 0x00F8; /* oslash */
+ case 0x00D9: /* Ugrave */ return 0x00F9; /* ugrave */
+ case 0x00DA: /* Uacute */ return 0x00FA; /* uacute */
+ case 0x00DB: /* Ucircumflex */ return 0x00FB; /* ucircumflex */
+ case 0x00DC: /* Udieresis */ return 0x00FC; /* udieresis */
+ case 0x00DD: /* Yacute */ return 0x00FD; /* yacute */
+ case 0x00DE: /* Thorn */ return 0x00FE; /* thorn */
+ case 0x0100: /* Amacron */ return 0x0101; /* amacron */
+ case 0x0102: /* Abreve */ return 0x0103; /* abreve */
+ case 0x0104: /* Aogonek */ return 0x0105; /* aogonek */
+ case 0x0106: /* Cacute */ return 0x0107; /* cacute */
+ case 0x0108: /* Ccircumflex */ return 0x0109; /* ccircumflex */
+ case 0x010A: /* Cdotaccent */ return 0x010B; /* cdotaccent */
+ case 0x010C: /* Ccaron */ return 0x010D; /* ccaron */
+ case 0x010E: /* Dcaron */ return 0x010F; /* dcaron */
+ case 0x0110: /* Dcroat */ return 0x0111; /* dcroat */
+ case 0x0112: /* Emacron */ return 0x0113; /* emacron */
+ case 0x0114: /* Ebreve */ return 0x0115; /* ebreve */
+ case 0x0116: /* Edotaccent */ return 0x0117; /* edotaccent */
+ case 0x0118: /* Eogonek */ return 0x0119; /* eogonek */
+ case 0x011A: /* Ecaron */ return 0x011B; /* ecaron */
+ case 0x011C: /* Gcircumflex */ return 0x011D; /* gcircumflex */
+ case 0x011E: /* Gbreve */ return 0x011F; /* gbreve */
+ case 0x0120: /* Gdotaccent */ return 0x0121; /* gdotaccent */
+ case 0x0122: /* Gcommaaccent */ return 0x0123; /* gcommaaccent */
+ case 0x0124: /* Hcircumflex */ return 0x0125; /* hcircumflex */
+ case 0x0126: /* Hbar */ return 0x0127; /* hbar */
+ case 0x0128: /* Itilde */ return 0x0129; /* itilde */
+ case 0x012A: /* Imacron */ return 0x012B; /* imacron */
+ case 0x012C: /* Ibreve */ return 0x012D; /* ibreve */
+ case 0x012E: /* Iogonek */ return 0x012F; /* iogonek */
+ case 0x0132: /* IJ */ return 0x0133; /* ij */
+ case 0x0134: /* Jcircumflex */ return 0x0135; /* jcircumflex */
+ case 0x0136: /* Kcommaaccent */ return 0x0137; /* kcommaaccent */
+ case 0x0139: /* Lacute */ return 0x013A; /* lacute */
+ case 0x013B: /* Lcommaaccent */ return 0x013C; /* lcommaaccent */
+ case 0x013D: /* Lcaron */ return 0x013E; /* lcaron */
+ case 0x013F: /* Ldot */ return 0x0140; /* ldot */
+ case 0x0141: /* Lslash */ return 0x0142; /* lslash */
+ case 0x0143: /* Nacute */ return 0x0144; /* nacute */
+ case 0x0145: /* Ncommaaccent */ return 0x0146; /* ncommaaccent */
+ case 0x0147: /* Ncaron */ return 0x0148; /* ncaron */
+ case 0x014A: /* Eng */ return 0x014B; /* eng */
+ case 0x014C: /* Omacron */ return 0x014D; /* omacron */
+ case 0x014E: /* Obreve */ return 0x014F; /* obreve */
+ case 0x0150: /* Ohungarumlaut */ return 0x0151; /* ohungarumlaut */
+ case 0x0152: /* OE */ return 0x0153; /* oe */
+ case 0x0154: /* Racute */ return 0x0155; /* racute */
+ case 0x0156: /* Rcommaaccent */ return 0x0157; /* rcommaaccent */
+ case 0x0158: /* Rcaron */ return 0x0159; /* rcaron */
+ case 0x015A: /* Sacute */ return 0x015B; /* sacute */
+ case 0x015C: /* Scircumflex */ return 0x015D; /* scircumflex */
+ case 0x015E: /* Scedilla */ return 0x015F; /* scedilla */
+ case 0x0160: /* Scaron */ return 0x0161; /* scaron */
+ case 0x0162: /* Tcommaaccent */ return 0x0163; /* tcommaaccent */
+ case 0x0164: /* Tcaron */ return 0x0165; /* tcaron */
+ case 0x0166: /* Tbar */ return 0x0167; /* tbar */
+ case 0x0168: /* Utilde */ return 0x0169; /* utilde */
+ case 0x016A: /* Umacron */ return 0x016B; /* umacron */
+ case 0x016C: /* Ubreve */ return 0x016D; /* ubreve */
+ case 0x016E: /* Uring */ return 0x016F; /* uring */
+ case 0x0170: /* Uhungarumlaut */ return 0x0171; /* uhungarumlaut */
+ case 0x0172: /* Uogonek */ return 0x0173; /* uogonek */
+ case 0x0174: /* Wcircumflex */ return 0x0175; /* wcircumflex */
+ case 0x0176: /* Ycircumflex */ return 0x0177; /* ycircumflex */
+ case 0x0178: /* Ydieresis */ return 0x00FF; /* ydieresis */
+ case 0x0179: /* Zacute */ return 0x017A; /* zacute */
+ case 0x017B: /* Zdotaccent */ return 0x017C; /* zdotaccent */
+ case 0x017D: /* Zcaron */ return 0x017E; /* zcaron */
+ case 0x01A0: /* Ohorn */ return 0x01A1; /* ohorn */
+ case 0x01AF: /* Uhorn */ return 0x01B0; /* uhorn */
+ case 0x01E6: /* Gcaron */ return 0x01E7; /* gcaron */
+ case 0x01FA: /* Aringacute */ return 0x01FB; /* aringacute */
+ case 0x01FC: /* AEacute */ return 0x01FD; /* aeacute */
+ case 0x01FE: /* Oslashacute */ return 0x01FF; /* oslashacute */
+ case 0x0218: /* Scommaaccent */ return 0x0219; /* scommaaccent */
+ case 0x0386: /* Alphatonos */ return 0x03AC; /* alphatonos */
+ case 0x0388: /* Epsilontonos */ return 0x03AD; /* epsilontonos */
+ case 0x0389: /* Etatonos */ return 0x03AE; /* etatonos */
+ case 0x038A: /* Iotatonos */ return 0x03AF; /* iotatonos */
+ case 0x038C: /* Omicrontonos */ return 0x03CC; /* omicrontonos */
+ case 0x038E: /* Upsilontonos */ return 0x03CD; /* upsilontonos */
+ case 0x038F: /* Omegatonos */ return 0x03CE; /* omegatonos */
+ case 0x0391: /* Alpha */ return 0x03B1; /* alpha */
+ case 0x0392: /* Beta */ return 0x03B2; /* beta */
+ case 0x0393: /* Gamma */ return 0x03B3; /* gamma */
+ case 0x0395: /* Epsilon */ return 0x03B5; /* epsilon */
+ case 0x0396: /* Zeta */ return 0x03B6; /* zeta */
+ case 0x0397: /* Eta */ return 0x03B7; /* eta */
+ case 0x0398: /* Theta */ return 0x03B8; /* theta */
+ case 0x0399: /* Iota */ return 0x03B9; /* iota */
+ case 0x039A: /* Kappa */ return 0x03BA; /* kappa */
+ case 0x039B: /* Lambda */ return 0x03BB; /* lambda */
+ case 0x039C: /* Mu */ return 0x00B5; /* mu */
+ case 0x039D: /* Nu */ return 0x03BD; /* nu */
+ case 0x039E: /* Xi */ return 0x03BE; /* xi */
+ case 0x039F: /* Omicron */ return 0x03BF; /* omicron */
+ case 0x03A0: /* Pi */ return 0x03C0; /* pi */
+ case 0x03A1: /* Rho */ return 0x03C1; /* rho */
+ case 0x03A3: /* Sigma */ return 0x03C3; /* sigma */
+ case 0x03A4: /* Tau */ return 0x03C4; /* tau */
+ case 0x03A5: /* Upsilon */ return 0x03C5; /* upsilon */
+ case 0x03A6: /* Phi */ return 0x03C6; /* phi */
+ case 0x03A7: /* Chi */ return 0x03C7; /* chi */
+ case 0x03A8: /* Psi */ return 0x03C8; /* psi */
+ case 0x03AA: /* Iotadieresis */ return 0x03CA; /* iotadieresis */
+ case 0x03AB: /* Upsilondieresis */ return 0x03CB; /* upsilondieresis */
+ case 0x1E80: /* Wgrave */ return 0x1E81; /* wgrave */
+ case 0x1E82: /* Wacute */ return 0x1E83; /* wacute */
+ case 0x1E84: /* Wdieresis */ return 0x1E85; /* wdieresis */
+ case 0x1EF2: /* Ygrave */ return 0x1EF3; /* ygrave */
+ case 0x2126: /* Omega */ return 0x03C9; /* omega */
+ case 0x2206: /* Delta */ return 0x03B4; /* delta */
+ case 0xF6BF: /* LL */ return 0xF6C0; /* ll */
+ case 0xF6C9: /* Acute */ return 0x00B4; /* acute */
+ case 0xF6CA: /* Caron */ return 0x02C7; /* caron */
+ case 0xF6CB: /* Dieresis */ return 0x00A8; /* dieresis */
+ case 0xF6CC: /* DieresisAcute */ return 0xF6D7; /* dieresisacute */
+ case 0xF6CD: /* DieresisGrave */ return 0xF6D8; /* dieresisgrave */
+ case 0xF6CE: /* Grave */ return 0x0060; /* grave */
+ case 0xF6CF: /* Hungarumlaut */ return 0x02DD; /* hungarumlaut */
+ case 0xF6D0: /* Macron */ return 0x00AF; /* macron */
+ case 0xF6D1: /* cyrBreve */ return 0xF6D4; /* cyrbreve */
+ case 0xF6D2: /* cyrFlex */ return 0xF6D5; /* cyrflex */
+ case 0xF6D3: /* dblGrave */ return 0xF6D6; /* dblgrave */
+ default: return c;
+ }
+}
+
+/*
+ * For the unicode IDs of an accent and a base_glyph, return the
+ * unicode ID of the composed (accented) glyph. If there is no
+ * suitable composed glyph, return 0.
+ */
+uint32_t
+get_accented_glyph(uint32_t accent, uint32_t base_glyph)
+{
+ TRACE_FIND((stderr, "get_accented_glyph: %lu, %lu",
+ (unsigned long)accent, (unsigned long)base_glyph));
+ switch(accent) {
+ case 0x0060: /* grave */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C0;
+ case 0x0045: /* E */ return 0x00C8;
+ case 0x0049: /* I */ return 0x00CC;
+ case 0x004F: /* O */ return 0x00D2;
+ case 0x0055: /* U */ return 0x00D9;
+ case 0x0057: /* W */ return 0x1E80;
+ case 0x0059: /* Y */ return 0x1EF2;
+ case 0x0061: /* a */ return 0x00E0;
+ case 0x0065: /* e */ return 0x00E8;
+ case 0x0069: /* i */ return 0x00EC;
+ case 0x006F: /* o */ return 0x00F2;
+ case 0x0075: /* u */ return 0x00F9;
+ case 0x0077: /* w */ return 0x1E81;
+ case 0x0079: /* y */ return 0x1EF3;
+ default: return 0;
+ }
+ case 0x00B4: /* acute */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C1;
+ case 0x0043: /* C */ return 0x0106;
+ case 0x0045: /* E */ return 0x00C9;
+ case 0x0049: /* I */ return 0x00CD;
+ case 0x004C: /* L */ return 0x0139;
+ case 0x004E: /* N */ return 0x0143;
+ case 0x004F: /* O */ return 0x00D3;
+ case 0x0052: /* R */ return 0x0154;
+ case 0x0053: /* S */ return 0x015A;
+ case 0x0055: /* U */ return 0x00DA;
+ case 0x0057: /* W */ return 0x1E82;
+ case 0x0059: /* Y */ return 0x00DD;
+ case 0x0060: /* Z */ return 0x0179;
+ case 0x0061: /* a */ return 0x00E1;
+ case 0x0063: /* c */ return 0x0107;
+ case 0x0065: /* e */ return 0x00E9;
+ case 0x0069: /* i */ return 0x00ED;
+ case 0x006C: /* l */ return 0x013A;
+ case 0x006E: /* n */ return 0x0144;
+ case 0x006F: /* o */ return 0x00F3;
+ case 0x0072: /* r */ return 0x0155;
+ case 0x0073: /* s */ return 0x015B;
+ case 0x0075: /* u */ return 0x00FA;
+ case 0x0077: /* w */ return 0x1E83;
+ case 0x0079: /* y */ return 0x00FD;
+ case 0x0080: /* z */ return 0x017A;
+ default: return 0;
+ }
+ case 0x02C6: /* circumflex */
+ case 0x005E: /* asciicircum */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C2;
+ case 0x0045: /* E */ return 0x00CA;
+ case 0x0047: /* G */ return 0x011C;
+ case 0x0048: /* H */ return 0x0124;
+ case 0x0049: /* I */ return 0x00CE;
+ case 0x0050: /* H */ return 0x0124;
+ case 0x004F: /* O */ return 0x00D4;
+ case 0x0055: /* U */ return 0x00DB;
+ case 0x0061: /* a */ return 0x00E2;
+ case 0x0065: /* e */ return 0x00EA;
+ case 0x0067: /* g */ return 0x011D;
+ case 0x0068: /* h */ return 0x0125;
+ case 0x0069: /* i */ return 0x00EE;
+ case 0x0070: /* j */ return 0x0135;
+ case 0x006F: /* o */ return 0x00F4;
+ case 0x0075: /* u */ return 0x00FB;
+ default: return 0;
+ }
+ case 0x02DC: /* tilde */
+ case 0x007E: /* asciitilde */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C3;
+ case 0x0049: /* I */ return 0x0128;
+ case 0x004E: /* N */ return 0x00D1;
+ case 0x004F: /* O */ return 0x00D5;
+ case 0x0055: /* U */ return 0x0168;
+ case 0x0061: /* a */ return 0x00E3;
+ case 0x0069: /* i */ return 0x0129;
+ case 0x006E: /* n */ return 0x00F1;
+ case 0x006F: /* o */ return 0x00F5;
+ case 0x0075: /* u */ return 0x0169;
+ default: return 0;
+ }
+ case 0x00A8: /* dieresis */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C4;
+ case 0x0045: /* E */ return 0x00CB;
+ case 0x0049: /* I */ return 0x00CF;
+ case 0x004F: /* O */ return 0x00D6;
+ case 0x0055: /* U */ return 0x00DC;
+ case 0x0057: /* w */ return 0x1E84;
+ case 0x0061: /* a */ return 0x00E4;
+ case 0x0065: /* e */ return 0x00EB;
+ case 0x0069: /* i */ return 0x00EF;
+ case 0x006F: /* o */ return 0x00F6;
+ case 0x0075: /* u */ return 0x00FC;
+ case 0x0077: /* w */ return 0x1E85;
+ case 0x0079: /* y */ return 0x00FF;
+ default: return 0;
+ }
+ case 0x02DA: /* ring */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x00C5;
+ case 0x0061: /* a */ return 0x00E5;
+ case 0x0055: /* U */ return 0x016E;
+ case 0x0075: /* u */ return 0x016F;
+ default: return 0;
+ }
+ case 0x00B8: /* cedilla */
+ switch (base_glyph) {
+ case 0x0043: /* C */ return 0x00C7;
+ case 0x0063: /* c */ return 0x00E7;
+ case 0x0053: /* S */ return 0x015E;
+ case 0x0073: /* s */ return 0x015F;
+ default: return 0;
+ }
+ case 0x02DB: /* ogonek */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x0104;
+ case 0x0045: /* E */ return 0x0118;
+ case 0x0049: /* I */ return 0x012E;
+ case 0x0055: /* U */ return 0x0172;
+ case 0x0061: /* a */ return 0x0105;
+ case 0x0065: /* e */ return 0x0119;
+ case 0x0069: /* i */ return 0x012F;
+ case 0x006F: /* o */ return 0x02DB;
+ case 0x0075: /* u */ return 0x0173;
+ default: return 0;
+ }
+ case 0x002F: /* solidus */
+ switch (base_glyph) {
+ case 0x004C: /* L */ return 0x0141;
+ case 0x004F: /* O */ return 0x00D8;
+ case 0x006C: /* l */ return 0x0142;
+ case 0x006F: /* o */ return 0x00F8;
+ default: return 0;
+ }
+ case 0x02C7: /* caron */
+ switch (base_glyph) {
+ case 0x0043: /* C */ return 0x010C;
+ case 0x0044: /* D */ return 0x010E;
+ case 0x0045: /* E */ return 0x011A;
+ case 0x0047: /* G */ return 0x01E6;
+ case 0x004C: /* L */ return 0x013D;
+ case 0x004E: /* N */ return 0x0147;
+ case 0x0052: /* R */ return 0x0158;
+ case 0x0053: /* S */ return 0x0160;
+ case 0x0054: /* T */ return 0x0164;
+ case 0x005A: /* Z */ return 0x017D;
+ case 0x0063: /* c */ return 0x010D;
+ case 0x0064: /* d */ return 0x010F;
+ case 0x0065: /* e */ return 0x011B;
+ case 0x0067: /* g */ return 0x01E7;
+ case 0x006C: /* l */ return 0x013E;
+ case 0x006E: /* n */ return 0x0148;
+ case 0x0072: /* r */ return 0x0159;
+ case 0x0073: /* s */ return 0x0161;
+ case 0x0074: /* t */ return 0x0165;
+ case 0x007A: /* z */ return 0x017E;
+ default: return 0;
+ }
+ case 0x02D8: /* breve */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x0102;
+ case 0x0045: /* E */ return 0x0114;
+ case 0x0047: /* G */ return 0x011E;
+ case 0x0049: /* I */ return 0x012C;
+ case 0x004F: /* O */ return 0x014E;
+ case 0x0055: /* U */ return 0x016C;
+ case 0x0061: /* a */ return 0x0103;
+ case 0x0065: /* e */ return 0x0115;
+ case 0x0067: /* g */ return 0x011F;
+ case 0x0069: /* i */ return 0x012D;
+ case 0x006F: /* o */ return 0x014F;
+ case 0x0075: /* u */ return 0x016D;
+ default: return 0;
+ }
+ case 0x02DD: /* hungarumlaut */
+ switch (base_glyph) {
+ case 0x004F: /* O */ return 0x0150;
+ case 0x0055: /* U */ return 0x0170;
+ case 0x006F: /* o */ return 0x0151;
+ case 0x0075: /* u */ return 0x0171;
+ default: return 0;
+ }
+ case 0x00AF: /* macron */
+ switch (base_glyph) {
+ case 0x0041: /* A */ return 0x0100;
+ case 0x0045: /* E */ return 0x0112;
+ case 0x0049: /* I */ return 0x012A;
+ case 0x004F: /* O */ return 0x014C;
+ case 0x0055: /* U */ return 0x016A;
+ case 0x0061: /* a */ return 0x0101;
+ case 0x0065: /* e */ return 0x0113;
+ case 0x0069: /* i */ return 0x012B;
+ case 0x006D: /* m */ return 0x00AF;
+ case 0x006F: /* o */ return 0x014D;
+ case 0x0075: /* u */ return 0x016B;
+ default: return 0;
+ }
+ /* special cases: accent - char inverted */
+ case 0x0043: /* C; special case: cedilla is set after C in OT1 */
+ switch (base_glyph) {
+ case 0x00B8: /* cedilla */ return 0x00C7;
+ default: return 0;
+ }
+ case 0x0063: /* c; see above */
+ switch (base_glyph) {
+ case 0x00B8: /* cedilla */ return 0x00E7;
+ default: return 0;
+ }
+ case 0x0053: /* S; see above */
+ switch (base_glyph) {
+ case 0x00B8: /* cedilla */ return 0x015E;
+ default: return 0;
+ }
+ case 0x0073: /* s; see above */
+ switch (base_glyph) {
+ case 0x00B8: /* cedilla */ return 0x015F;
+ default: return 0;
+ }
+ }
+ return 0;
+}
+
+uint32_t
+guess_encoding(wide_ubyte ch, const char *fontname, char *retbuf)
+{
+ uint32_t i;
+ static hashTableT unknown_font_hash;
+ static Boolean hash_initialized = False;
+ size_t dummy = 0;
+
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: |%s|, char 0x%.4X", fontname, ch));
+
+ /* our encoding vectors only have size 256 */
+ if (ch > 255) {
+ XDVI_WARNING((stderr, "guess_encoding: font index %lu too large", (unsigned long)ch));
+ return 0;
+ }
+
+ if (HAS_PREFIX(fontname, "gbk")
+ && isdigit((int)fontname[(i=strlen(fontname))-1])
+ && isdigit((int)fontname[i-2]))
+ {
+ unsigned char cjk[2];
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: CJK fonts (GBK encoding)"));
+ i = atoi(fontname + i - 2); /* font no */
+ i = (i - 1) * 256 + (uint32_t)ch; /* char index */
+ cjk[0] = i / 190 + 129;
+ cjk[1] = i % 190 + 64;
+ if (cjk[1] >= 128)
+ cjk[1]++;
+ return cjk2unicode(cjk);
+ }
+
+ if (HAS_PREFIX(fontname, "cmsy") ||
+ HAS_PREFIX(fontname, "xccsy")
+ ) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_symbol", fontname));
+ return m_cm_symbol_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "cmmi") ||
+ HAS_PREFIX(fontname, "xccmi")
+ ) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_math_italics", fontname));
+ return m_cm_math_italics_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "cmex") ||
+ HAS_PREFIX(fontname, "xccex")
+ ) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_math_extended", fontname));
+ return m_cm_math_extended_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "cmtt")) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cm_typewriter", fontname));
+ return m_cm_typewriter_encoding[ch];
+ }
+ /* following to cover cmsl, cmb, cmbx, cmti, cmdunghill, whatever ...
+ hope it doesn't overgenerate ;-) */
+ if (HAS_PREFIX(fontname, "cm")
+ || HAS_PREFIX(fontname, "ccr")
+ || HAS_PREFIX(fontname, "lcmss") /* lcmss8 etc. */
+ || HAS_PREFIX(fontname, "ygoth")
+ || HAS_PREFIX(fontname, "yinit")
+ || HAS_PREFIX(fontname, "logo")
+ || HAS_PREFIX(fontname, "rsfs")
+ || HAS_PREFIX(fontname, "bbm")
+ ) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_ot1", fontname));
+ return m_ot1_encoding[ch];
+ }
+ /* cyrillic fonts */
+ if (HAS_PREFIX(fontname, "la")) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_t2", fontname));
+ return m_t2_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "ec")
+ || HAS_PREFIX(fontname, "eo")
+ || HAS_PREFIX(fontname, "eb")) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cork", fontname));
+ /* FIXME: why cork and not EC? Are there fonts that actually use EC?
+ The only difference seems that dvips' EC.enc has `ldot' at 0xb8,
+ whereas cork.enc has `ydieresis' there. A document with
+ \usepackage[T1]{fontenc}
+ also produces a ydieresis.
+ */
+ return m_cork_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "tc")) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_ts1", fontname));
+ return m_ts1_encoding[ch];
+ }
+ /* blackletter fonts with funny encoding */
+ if (HAS_PREFIX(fontname, "ysmfrak")
+ || HAS_PREFIX(fontname, "yswab")) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_yfrak", fontname));
+ /* special cases for ligatures */
+ switch (ch) {
+ case 0x85: strcpy(retbuf, "ch"); return 0;
+ case 0x86: strcpy(retbuf, "ck"); return 0;
+ case 0xA7: strcpy(retbuf, "sz"); return 0;
+ default: return m_yfrak_encoding[ch];
+ }
+ }
+ /* euler mathematical */
+ if (HAS_PREFIX(fontname, "eufm")
+ || HAS_PREFIX(fontname, "eusm")) {
+ switch (ch) {
+ case 0x0: case 0x1: return 'd'; break;
+ case 0x2: case 0x3: return 'f'; break;
+ case 0x4: return 'g'; break;
+ case 0x5: return 'k'; break;
+ case 0x6: return 't'; break;
+ case 0x7: return 'u'; break;
+ default: return m_ot1_encoding[ch];
+ }
+ }
+ /* stuff that doesn't have a good ASCII representation */
+ if (HAS_PREFIX(fontname, "lcircle")
+ || HAS_PREFIX(fontname, "line")
+ || HAS_PREFIX(fontname, "fmvr8x")
+ || HAS_PREFIX(fontname, "feymr")
+ || HAS_PREFIX(fontname, "msbm")
+ || HAS_PREFIX(fontname, "msam")
+ || HAS_PREFIX(fontname, "wasy")
+ || HAS_PREFIX(fontname, "txsy")
+ ) {
+ return 0;
+ }
+ if (HAS_PREFIX(fontname, "bbold")) {
+ return m_bbold_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "gli")
+ || HAS_PREFIX(fontname, "glj")
+ || HAS_PREFIX(fontname, "glm")
+ || HAS_PREFIX(fontname, "glt")
+ || HAS_PREFIX(fontname, "glw")
+ || HAS_PREFIX(fontname, "glx")
+ || HAS_PREFIX(fontname, "gmm")
+ || HAS_PREFIX(fontname, "gmt")
+ || HAS_PREFIX(fontname, "gmx")
+ || HAS_PREFIX(fontname, "gom")
+ || HAS_PREFIX(fontname, "gox")
+ || HAS_PREFIX(fontname, "grb")
+ || HAS_PREFIX(fontname, "grm")
+ || HAS_PREFIX(fontname, "grx")
+ || HAS_PREFIX(fontname, "gsm")
+ || HAS_PREFIX(fontname, "gsx")
+ || HAS_PREFIX(fontname, "gtt")
+ ) {
+ TRACE_FIND_VERBOSE((stderr, "guess_encoding: %s => m_cb_greek_encoding", fontname));
+ return m_cb_greek_encoding[ch];
+ }
+ if (HAS_PREFIX(fontname, "wasy")) {
+ /* these are all special symbols */
+ return 0;
+ }
+ if (HAS_PREFIX(fontname, "to")) {
+ if (ch >= '0' && ch <= '9') {
+ return ch;
+ }
+ else { /* special symbols */
+ return 0;
+ }
+ }
+
+ /* TODO:
+ txfonts
+ */
+
+ /* default: assume cork encoding, and print out a warning for each font */
+ if (!hash_initialized) {
+ unknown_font_hash = hash_create(1031);
+ hash_initialized = True;
+ }
+ if (!find_str_int_hash(&unknown_font_hash, fontname, &dummy)) {
+ if (resource.freetype) {
+ XDVI_WARNING((stderr,
+ "guess_encoding(): nothing suitable for \"%s\", assuming Cork encoding.\n"
+ "(Please tell us about this at "
+ "http://sourceforge.net/tracker/?group_id=23164&atid=377580)", fontname));
+ }
+ else {
+ XDVI_INFO((stderr,
+ "FreeType2 not enabled, assuming Cork encoding for font \"%s\".\n",
+ fontname));
+ }
+ put_str_int_hash(&unknown_font_hash, fontname, dummy);
+ }
+ return m_cork_encoding[ch];
+}
+
+/*
+ Mapping of unicode glyphs to ASCII `equivalents'
+ that are useful when searching for text.
+*/
+const char *
+search_normalize_chars(uint32_t unicode)
+{
+ const char *ret = NULL;
+ switch(unicode) {
+ case 0x2212: ret = "-"; break;
+ case 0x2022: ret = "\xb7"; break; /* middle dot */
+ default: ret = NULL; break;
+ }
+ if (ret != NULL) {
+ TRACE_FIND((stderr, "expand_searchchars: 0x%X --> `%s'",
+ (unsigned int)unicode, ret));
+ }
+ return ret;
+}
+
+/*
+ Expand a unicode ligature character consisting of several
+ `ordinary' characters to a string of those characters, and
+ map some unicode glyphs to ASCII `equivalents'.
+
+ TODO: move the more ambiguous replacements (e.g.
+ guilsinglleft vs. angleleft) into a user-defined table?
+*/
+const char *
+expand_ligature(uint32_t unicode)
+{
+ const char *ret = NULL;
+ switch(unicode) {
+ case 0xFB00: ret = "ff"; break;
+ case 0xFB01: ret = "fi"; break;
+ case 0xFB02: ret = "fl"; break;
+ case 0xFB03: ret = "ffi"; break;
+ case 0xFB04: ret = "ffl"; break;
+ case 0xFB06: ret = "st"; break;
+ case 0x0133: ret = "ij"; break;
+ case 0x2013: ret = "--"; break;
+ case 0x2014: ret = "---"; break;
+ case 0x2039:
+ case 0x2329: ret = "<"; break;
+ case 0x203A:
+ case 0x232A: ret = ">"; break;
+ case 0x2018: ret = "`"; break;
+ case 0x2019: ret = "'"; break;
+ case 0x201C: ret = "``"; break;
+ case 0x201D: ret = "''"; break;
+ case 0x2026: ret = "..."; break;
+ case 0x10ff28: ret = "{"; break;
+ case 0x10ff29: ret = "}"; break;
+ default: ret = NULL; break;
+ }
+ if (ret != NULL) {
+ TRACE_FIND((stderr, "expand_ligature: 0x%X --> `%s'",
+ (unsigned int)unicode, ret));
+ }
+ return ret;
+}
+
+/*
+ * Convert the utf8-string passed as argument to lowercase, by
+ * first converting to UCS4, then converting back, lowercasing the
+ * UCS4 characters as we go (it's easier like that).
+ */
+Boolean
+utf8_lowercase(char *utf8)
+{
+ size_t utf8_len = strlen(utf8) + 1; /* also convert terminating byte (acutally not needed ...) */
+ size_t ucs4_len = utf8_len * 6; /* ample ... */
+ int i = 0;
+ uint32_t *ucs4 = xmalloc(ucs4_len);
+ uint32_t *ucs4_start = ucs4; /* save for free()ing */
+ for (; *utf8 != '\0'; ucs4++, utf8 += i) {
+ size_t conv_len;
+ if ((i = utf8_to_ucs4(utf8, ucs4, 6 /* don't care about character len */)) < 0) {
+ XDVI_ERROR((stderr, "Error in utf8_lowercase: Illegal UTF-8 sequence"));
+ free(ucs4_start);
+ return False;
+ }
+ ucs4_to_utf8(*ucs4, utf8, &conv_len, True); /* lowercases it */
+ if ((int)conv_len != i) {
+ XDVI_ERROR((stderr, "Error in utf8_lowercase: length after UCS4 conversion (%lu)\n"
+ "differs from length after utf8 conversion(%lu) (string: %s)\n",
+ (unsigned long)conv_len, (unsigned long)i, utf8));
+ free(ucs4_start);
+ return False;
+ }
+ }
+ free(ucs4_start);
+ return True;
+}
+
+/*
+ * Adapted from iconv's utf8_wctomb in lib/utf8.h
+ * Converts the character sequence pointed to by utf8 of maximum length `len'
+ * into an UCS4 character pointed to by ucs4.
+ * TODO: maybe implement this as a macro??
+ */
+int
+utf8_to_ucs4(const char *utf8, uint32_t *ucs4, size_t len)
+{
+ const unsigned char *str = (const unsigned char *)utf8;
+ unsigned char c = *str;
+
+ if (c < 0x80) {
+ *ucs4 = c;
+ return 1;
+ }
+ else if (c < 0xc2) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ else if (c < 0xe0) {
+ if (len < 2)
+ return -1; /* len too short */
+ if (!((str[1] ^ 0x80) < 0x40)) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ *ucs4 = ((uint32_t) (c & 0x1f) << 6)
+ | (uint32_t) (str[1] ^ 0x80);
+ return 2;
+ }
+ else if (c < 0xf0) {
+ if (len < 3)
+ return -1; /* len too short */
+ if (!((str[1] ^ 0x80) < 0x40
+ && (str[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || str[1] >= 0xa0))) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ *ucs4 = ((uint32_t) (c & 0x0f) << 12)
+ | ((uint32_t) (str[1] ^ 0x80) << 6)
+ | (uint32_t) (str[2] ^ 0x80);
+ return 3;
+ }
+ else if (c < 0xf8 && sizeof(uint32_t) * 8 >= 32) {
+ if (len < 4)
+ return -1; /* len too short */
+ if (!((str[1] ^ 0x80) < 0x40
+ && (str[2] ^ 0x80) < 0x40
+ && (str[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || str[1] >= 0x90))) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ *ucs4 = ((uint32_t) (c & 0x07) << 18)
+ | ((uint32_t) (str[1] ^ 0x80) << 12)
+ | ((uint32_t) (str[2] ^ 0x80) << 6)
+ | (uint32_t) (str[3] ^ 0x80);
+ return 4;
+ }
+ else if (c < 0xfc && sizeof(uint32_t)*8 >= 32) {
+ if (len < 5)
+ return -1; /* len too short */
+ if (!((str[1] ^ 0x80) < 0x40
+ && (str[2] ^ 0x80) < 0x40
+ && (str[3] ^ 0x80) < 0x40
+ && (str[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || str[1] >= 0x88))) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ *ucs4 = ((uint32_t) (c & 0x03) << 24)
+ | ((uint32_t) (str[1] ^ 0x80) << 18)
+ | ((uint32_t) (str[2] ^ 0x80) << 12)
+ | ((uint32_t) (str[3] ^ 0x80) << 6)
+ | (uint32_t) (str[4] ^ 0x80);
+ return 5;
+ }
+ else if (c < 0xfe && sizeof(uint32_t)*8 >= 32) {
+ if (len < 6)
+ return -1; /* len too short */
+ if (!((str[1] ^ 0x80) < 0x40
+ && (str[2] ^ 0x80) < 0x40
+ && (str[3] ^ 0x80) < 0x40
+ && (str[4] ^ 0x80) < 0x40
+ && (str[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || str[1] >= 0x84))) {
+ return -1; /* illegal UTF8; shouldn't happen */
+ }
+ *ucs4 = ((uint32_t) (c & 0x01) << 30)
+ | ((uint32_t) (str[1] ^ 0x80) << 24)
+ | ((uint32_t) (str[2] ^ 0x80) << 18)
+ | ((uint32_t) (str[3] ^ 0x80) << 12)
+ | ((uint32_t) (str[4] ^ 0x80) << 6)
+ | (uint32_t) (str[5] ^ 0x80);
+ return 6;
+ }
+ else {
+ return -1; /* illegal UTF8 */
+ }
+}
+
+/* adapted from iconv's utf8_wctomb in lib/utf8.h */
+/* TODO: maybe implement this as a macro?? */
+void
+ucs4_to_utf8(uint32_t ucs4, char *utf8, size_t *len, Boolean do_lowercase)
+{
+ if (do_lowercase) {
+ ucs4 = ucs4_lowercase(ucs4);
+ TRACE_FIND_VERBOSE((stderr, "Lowercasing of 0x%lx --> 0x%lx\n", ucs4_bak, ucs4));
+ }
+ else {
+ TRACE_FIND_VERBOSE((stderr, "NOT lowercasing 0x%lx\n", ucs4));
+ }
+
+ if (ucs4 < 0x80)
+ *len = 1;
+ else if (ucs4 < 0x800)
+ *len = 2;
+ else if (ucs4 < 0x10000)
+ *len = 3;
+ else if (ucs4 < 0x200000)
+ *len = 4;
+ else if (ucs4 < 0x4000000)
+ *len = 5;
+ else if (ucs4 <= 0x7fffffff)
+ *len = 6;
+
+ switch(*len) { /* note: code falls through cases! */
+ case 6: utf8[5] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x4000000;
+ case 5: utf8[4] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x200000;
+ case 4: utf8[3] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x10000;
+ case 3: utf8[2] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0x800;
+ case 2: utf8[1] = 0x80 | (ucs4 & 0x3f); ucs4 = ucs4 >> 6; ucs4 |= 0xc0;
+ case 1: utf8[0] = ucs4;
+ }
+}
+
+
+
+/*
+ * (Lossy) conversion of utf8 sequence to an iso-latin1; produces
+ * `?' if the character is not representable in iso-latin1.
+ * Returns the number of converted characters in `len'.
+ */
+unsigned char
+utf8_to_iso_8859_1(const char *utf8, size_t *len)
+{
+ unsigned char c = *utf8;
+ uint32_t wc;
+
+ if (c < 0x80) {
+ *len = 1;
+ return c;
+ }
+ else if (c < 0xe0) {
+ *len = 2;
+ wc = ((unsigned char)(c & 0x1f) << 6) | (unsigned char)(utf8[1] ^ 0x80);
+ if (wc <= 0xff)
+ return (unsigned char)wc;
+ else
+ return '?';
+ }
+ else if (c < 0xf0) {
+ *len = 3;
+ return '?';
+ }
+ else if (c < 0xf8) {
+ *len = 4;
+ return '?';
+ }
+ else if (c < 0xfc) {
+ *len = 5;
+ return '?';
+ }
+ else if (c < 0xfe) {
+ *len = 6;
+ return '?';
+ }
+ else
+ return '?';
+}
+
+/* convert an iso_8859_1 character to utf8, writing the result
+ to the buffer `utf8' (which should have at least length 2),
+ and storing the length of the converted utf-8 sequence in *len.
+*/
+void
+iso_8859_1_to_utf8(unsigned char c, char *utf8, size_t *len)
+{
+ if (c < 0x80) {
+ *len = 1;
+ utf8[0] = c;
+ }
+ else {
+ *len = 2;
+ utf8[1] = 0x80 | (c & 0x3f);
+ c >>= 6;
+ utf8[0] = 0xc0 | (c & 0x1f);
+ }
+}
+
+/* Convert an iso_latin-1 string to a UTF-8 string (including the
+ terminating `\0'), not writing more than `len' characters to
+ `utf8'. Returns the number of written characters, or -1 if len was
+ too small to convert the entire input string.
+*/
+int
+str_iso_8859_1_to_utf8(const char *latin1, char *utf8, size_t len)
+{
+ size_t i = 0;
+
+ while (i < len && *latin1 != '\0') {
+ char tmpbuf[2];
+ size_t tmp_len = 0;
+ iso_8859_1_to_utf8((unsigned char)*latin1, tmpbuf, &tmp_len);
+ if (i + tmp_len >= len)
+ return -1;
+ memcpy(utf8 + i, tmpbuf, tmp_len);
+ i += tmp_len;
+ latin1++;
+ }
+ /* terminate utf8 */
+ if (i < len)
+ utf8[i++] = '\0';
+ else
+ return -1;
+
+ return i;
+}
+
+Boolean
+is_hyphenchar(uint32_t u)
+{
+ if (u == 0x002D || u == 0x00AD)
+ return True;
+ return False;
+}
+
+/*
+ * Determine ideographic property according to
+ * http://www.unicode.org/Public/UNIDATA/PropList.txt:
+ *
+ * 3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK
+ * 3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO
+ * 3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+ * 3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+ * 3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+ * 4E00..9FA5 ; Ideographic # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5
+ * F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+ * 20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+ * 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+ *
+ * # Total code points: 71053
+ *
+ * plus space, comma and full stop.
+ *
+ */
+Boolean
+is_ideograph(uint32_t u)
+{
+ return (u >= 0x3000 && u <= 0x3002) || /* IDEOGRAPHIC SPACE, COMMA, FULL STOP */
+ u == 0xFF61 || /* HALFWIDTH IDEOGRAPHIC FULL STOP */
+ u == 0xFF64 || /* HALFWIDTH IDEOGRAPHIC COMMA */
+ (u >= 0x3006 && u <= 0x3007) ||
+ (u >= 0x3021 && u <= 0x3029) ||
+ (u >= 0x3038 && u <= 0x303A) ||
+ (u >= 0x3400 && u <= 0x4DB5) ||
+ (u >= 0x4E00 && u <= 0x9FA5) ||
+ (u >= 0xF900 && u <= 0xFA2D) ||
+ (u >= 0x20000 && u <= 0x2A6D6) ||
+ (u >= 0x2F800 && u <= 0x2FA1D);
+}
+
+char *
+str_utf8_to_iso_8859_1(const char *utf8)
+{
+ size_t utf8_len = strlen(utf8), i = 0, offset = 0;
+ char *buf = xmalloc(4 * utf8_len + 1); /* worst case of non-printables */
+
+ while (i < utf8_len) {
+ uint32_t ucs4;
+ const char *ret;
+
+ /* fprintf(stderr, "offset: %d\n", (int)offset); */
+ /* first apply normalization heurisitcs also used by search */
+ size_t len = utf8_to_ucs4(utf8 + i, &ucs4, utf8_len + 1);
+ if ((ret = search_normalize_chars(ucs4)) != NULL) {
+ size_t len_ret = strlen(ret);
+ memcpy(buf + offset, ret, len_ret);
+ offset += len_ret;
+ }
+ else if (ucs4 <= 0xff) { /* in iso-latin1 range */
+ buf[offset++] = (unsigned char)ucs4;
+ }
+ else {
+ sprintf(buf + offset, "\\%.4lX", (unsigned long)ucs4);
+ offset += 4;
+ }
+ i += len;
+ }
+ buf[offset] = '\0';
+
+ return buf;
+}
diff --git a/Build/source/texk/xdvik/encodings.h b/Build/source/texk/xdvik/encodings.h
new file mode 100644
index 00000000000..06fef2a4dca
--- /dev/null
+++ b/Build/source/texk/xdvik/encodings.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef ENCODINGS_H_
+#define ENCODINGS_H_
+
+#include "xdvi.h"
+
+struct adobe2unicode {
+ const char *adobe_name;
+ uint32_t unicode;
+};
+
+struct unicode2adobe {
+ uint32_t unicode;
+ const char *adobe_name;
+};
+
+extern uint32_t get_accented_glyph(uint32_t accent, uint32_t base_glyph);
+extern const char *unicode2adobe_name(uint32_t unicode);
+extern uint32_t adobe2unicode_name(const char *adobe_name);
+extern uint32_t guess_encoding(wide_ubyte ch, const char *fontname, char *retbuf);
+extern const char *expand_ligature(uint32_t unicode);
+extern const char *search_normalize_chars(uint32_t unicode);
+
+extern Boolean utf8_lowercase(char *utf8);
+extern int utf8_to_ucs4(const char *utf8, uint32_t *ucs4, size_t len);
+extern void ucs4_to_utf8(uint32_t ucs4, char *utf8, size_t *len, Boolean do_lowercase);
+extern unsigned char utf8_to_iso_8859_1(const char *utf8, size_t *len);
+extern char *str_utf8_to_iso_8859_1(const char *utf8);
+extern void iso_8859_1_to_utf8(unsigned char iso_8859_1, char *utf8, size_t *len);
+extern int str_iso_8859_1_to_utf8(const char *latin1, char *utf8, size_t len);
+extern Boolean is_hyphenchar(uint32_t unicode);
+extern Boolean is_ideograph(uint32_t unicode);
+
+#endif /* ENCODINGS_H_ */
+
diff --git a/Build/source/texk/xdvik/events.c b/Build/source/texk/xdvik/events.c
new file mode 100644
index 00000000000..729a487b0e4
--- /dev/null
+++ b/Build/source/texk/xdvik/events.c
@@ -0,0 +1,6596 @@
+/*======================================================================*\
+
+Copyright (c) 1990-2019 Paul Vojta and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+#include "xdvi-config.h"
+
+#ifdef STDC_HEADERS
+# include <unistd.h>
+# include <fcntl.h>
+#endif
+#include <signal.h>
+#include <sys/file.h> /* this defines FASYNC */
+#ifdef HAVE_SYS_FCNTL_H
+# include <sys/fcntl.h> /* Or this might define FASYNC */
+#endif
+#include <sys/ioctl.h> /* this defines SIOCSPGRP and FIOASYNC */
+#include <sys/wait.h> /* ignore HAVE_SYS_WAIT_H -- we always need WNOHANG */
+
+#include "xdvi.h" /* this includes Xlib and Xutil are already included */
+#include "xdvi-debug.h"
+
+
+#ifndef MOTIF
+#include <X11/Xaw/Form.h> /* for XtNresizable */
+#endif
+
+#include <setjmp.h>
+#include <sys/time.h> /* for gettimeofday */
+
+#include <X11/IntrinsicP.h>
+
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h> /* needed for def. of XtNiconX(??) */
+
+#include "pagesel.h"
+#include "filehist.h"
+#include "special.h"
+#include "psgs.h"
+
+
+#include <errno.h>
+
+#include <ctype.h>
+
+#include "util.h"
+#include "x_util.h"
+#include "string-utils.h"
+#include "print-dialog.h"
+#include "search-dialog.h"
+#include "sfSelFile.h"
+#include "mag.h"
+#include "help-window.h"
+#include "message-window.h"
+#include "dvi-draw.h"
+#include "statusline.h"
+#include "hypertex.h"
+#include "dvi-init.h"
+#include "exit-handlers.h"
+#include "Tip.h"
+#include "browser.h"
+#include "search-internal.h"
+#include "my-snprintf.h"
+
+#include "events.h"
+#include "selection.h"
+#include "encodings.h"
+#include "pagehist.h"
+#include "xm_colorsel.h"
+#include "xm_toolbar.h"
+#include "xaw_menu.h"
+#include "xm_menu.h"
+#include "xm_prefs.h"
+
+#include "xm_prefs_appearance.h" /* for update_preferences_expert() */
+#include "xm_prefs_fonts.h" /* for update_preferences_color() */
+#include "xm_prefs_page.h" /* for update_preferences_shrink() */
+
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+#endif /* X_NOT_STDC_ENV */
+
+#if HAVE_X11_INTRINSICI_H
+# include <X11/IntrinsicI.h>
+#else
+
+/* Taken from <X11/TranslateI.h> in libXt-1.1.3 (June 2012) */
+typedef struct _LateBindings {
+ unsigned int knot:1;
+ unsigned int pair:1;
+ unsigned short ref_count; /* garbage collection */
+ KeySym keysym;
+} LateBindings, *LateBindingsPtr;
+
+extern Boolean _XtComputeLateBindings(
+ Display* /* dpy */,
+ LateBindingsPtr /* lateModifiers */,
+ Modifiers* /* computed */,
+ Modifiers* /* computedMask */
+);
+
+#endif /* not HAVE_X11_INTRINSICI_H */
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XdviBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define XdviBell(display, window, percent) XBell(display, percent)
+#endif
+
+/* Linux prefers O_ASYNC over FASYNC; SGI IRIX does the opposite. */
+#if !defined(FASYNC) && defined(O_ASYNC)
+# define FASYNC O_ASYNC
+#endif
+
+#if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC)
+# if !defined(SIOCSPGRP) || !defined(FIOASYNC)
+# define FLAKY_SIGPOLL 1
+# endif
+#endif
+
+#ifndef FLAKY_SIGPOLL
+
+# ifndef SIGPOLL
+# define SIGPOLL SIGIO
+# endif
+
+# ifndef SA_RESTART
+# define SA_RESTART 0
+# endif
+
+# if HAVE_STREAMS
+# include <stropts.h>
+
+# ifndef S_RDNORM
+# define S_RDNORM S_INPUT
+# endif
+
+# ifndef S_RDBAND
+# define S_RDBAND 0
+# endif
+
+# ifndef S_HANGUP
+# define S_HANGUP 0
+# endif
+
+# ifndef S_WRNORM
+# define S_WRNORM S_OUTPUT
+# endif
+# endif /* HAVE_STREAMS */
+
+#endif /* not FLAKY_SIGPOLL */
+
+#if HAVE_SIGACTION && !defined SA_RESETHAND
+# ifdef SA_ONESHOT
+# define SA_RESETHAND SA_ONESHOT
+# else
+# undef HAVE_SIGACTION /* Needed for Mac OS X < 10.2 (9/2002) */
+# endif
+#endif
+
+#if HAVE_POLL
+# include <poll.h>
+#else
+# if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+# else
+# if HAVE_SELECT_H
+# include <select.h>
+# endif
+# endif
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif /* HAVE_POLL */
+
+/* cannot be const since Strings in Action routines aren't either */
+static char *Act_true_retval = "true";
+static char *Act_false_retval = "false";
+
+
+#if HAVE_XI21
+
+int xi2_opcode;
+Boolean xi2_active = False;
+struct xi2_master *xi2_masters; /* linked list of master devs */
+struct xi2_master *xi2_current; /* current master device */
+struct xi2_slave *xi2_slaves; /* linked list of slave devs */
+
+struct xi2_slave xi2_no_slave; /* if no slave assigned yet */
+
+/*
+ * XInput 2.1 creates spurious enter/leave events around the time it
+ * creates fake wheel button events. So, we keep track of the last
+ * such fake button event, and if an enter/leave occurs too soon after
+ * that event, then we ignore the enter event.
+ * I've managed to get rid of this (by making sure that the relevant
+ * events come from the drawing window if possible), but I left the code
+ * here just in case.
+ */
+
+static Time xi2_ign_time; /* time of last XI 2.1 wheel button event */
+
+#endif
+
+
+static sigset_t all_signals;
+
+/*
+ * Interrupt system for receiving events. The program sets a flag
+ * whenever an event comes in, so that at the proper time (i.e., when
+ * reading a new dvi item), we can check incoming events to see if we
+ * still want to go on printing this page. This way, one can stop
+ * displaying a page if it is about to be erased anyway. We try to read
+ * as many events as possible before doing anything and base the next
+ * action on all events read.
+ * Note that the Xlib and Xt routines are not reentrant, so the most we
+ * can do is set a flag in the interrupt routine and check it later.
+ * Also, sometimes the interrupts are not generated (some systems only
+ * guarantee that SIGIO is generated for terminal files, and on the system
+ * I use, the interrupts are not generated if I use "(xdvi foo &)" instead
+ * of "xdvi foo"). Therefore, there is also a mechanism to check the
+ * event queue every 70 drawing operations or so. This mechanism is
+ * disabled if it turns out that the interrupts do work.
+ * For a fuller discussion of some of the above, see xlife in
+ * comp.sources.x.
+ */
+
+/*
+ * Signal flags
+ */
+
+/* This could be static volatile, but we want to avoid any optimizer bugs. */
+VOLATILE unsigned int sig_flags = 0;
+
+#define SF_USR 1
+#define SF_ALRM 2
+#define SF_POLL 4
+#define SF_CHLD 8
+#define SF_TERM 16
+#define SF_SEGV 32
+
+static void do_sigusr(void);
+static void do_sigalrm(void);
+static void do_sigpoll(void);
+static void do_sigchld(void);
+static void do_sigterm(void);
+static void do_sigsegv(void);
+
+/* these must be in the same order as SF_*.
+ The higher flags have higher priority, since these are
+ checked first when resolving flags_to_sigproc[sig_flags].
+
+ Example: flag := SF_TERM | SF_CHLD = 24
+
+ flags_to_sigproc[24] =>
+ do_sigterm, which sets flag to 24 & ~SF_TERM == 8
+ then, in next check:
+ flags_to_sigproc[8] =>
+ do_sigchld, which sets flag 8 & ~SF_CHLD == 0.
+*/
+#define SP0 do_sigusr
+#define SP1 do_sigalrm
+#define SP2 do_sigpoll
+#define SP3 do_sigchld
+#define SP4 do_sigterm
+#define SP5 do_sigsegv
+
+typedef void (*signalproc)(void);
+
+static const signalproc flags_to_sigproc[64] = {
+ NULL,
+ /* 1 */
+ SP0,
+ /* 2 - 3 */
+ SP1, SP1,
+ /* 4 - 7 */
+ SP2, SP2, SP2, SP2,
+ /* 8 - 15 */
+ SP3, SP3, SP3, SP3, SP3, SP3, SP3, SP3,
+ /* 16 - 31 */
+ SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4,
+ SP4, SP4, SP4, SP4, SP4, SP4, SP4, SP4,
+ /* 32 - 63 */
+ SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5,
+ SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5,
+ SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5,
+ SP5, SP5, SP5, SP5, SP5, SP5, SP5, SP5
+};
+
+#undef SP0
+#undef SP2
+#undef SP3
+#undef SP4
+#undef SP5
+
+/* file-static variables for prefix argument mechanism */
+static Boolean m_have_arg = False; /* flag whether we have a possible prefix arg */
+static int m_number = 0; /* prefix arg value, without the sign */
+static int m_sign = 1; /* is prefix arg negative? */
+
+
+/* to remember the scrollbar positions so that we can restore them
+ when `keep position' is active and window is resized to full size
+ (removing scrollbars) and then back (#810501) */
+static int m_x_scroll = 0, m_y_scroll = 0;
+
+static int source_reverse_x, source_reverse_y;
+static int source_show_all;
+
+/* globals for color stuff */
+Pixel plane_masks[4];
+XColor color_data[2];
+struct pagecolor_info page_colors = { 0, NULL };
+
+struct rgb *color_bottom;
+unsigned int color_bot_size; /* number of entries */
+struct colorframe *rcs_top;
+struct rgb fg_initial; /* Initial fg (from command line) */
+struct rgb bg_initial; /* Initial bg */
+struct bgrec *bg_head = NULL; /* head of list */
+struct bgrec *bg_current = NULL; /* current bg value */
+struct fgrec *fg_current; /* current fg value */
+struct fgrec *fg_active = NULL; /* where the GCs are */
+Pixel *color_list; /* list of colors */
+unsigned int color_list_len = 0; /* current len of list*/
+unsigned int color_list_max = 0; /* allocated size */
+Boolean color_warned = False;
+
+void null_mouse(XEvent *event)
+{
+ UNUSED(event);
+}
+
+mouse_proc mouse_motion = null_mouse;
+mouse_proc mouse_release = null_mouse;
+
+static void Act_digit(Widget, XEvent *, String *, Cardinal *);
+static void Act_find(Widget, XEvent *, String *, Cardinal *);
+static void Act_incremental_find(Widget, XEvent *, String *, Cardinal *);
+static void Act_find_next(Widget, XEvent *, String *, Cardinal *);
+static void Act_minus(Widget, XEvent *, String *, Cardinal *);
+static void Act_quit(Widget, XEvent *, String *, Cardinal *);
+static void Act_quit_confirm(Widget, XEvent *, String *, Cardinal *);
+static void Act_print(Widget, XEvent *, String *, Cardinal *);
+static void Act_save(Widget, XEvent *, String *, Cardinal *);
+static void Act_help(Widget, XEvent *, String *, Cardinal *);
+static void Act_goto_page(Widget, XEvent *, String *, Cardinal *);
+static void Act_declare_page_number(Widget, XEvent *, String *, Cardinal *);
+static void Act_toggle_mark(Widget, XEvent *, String *, Cardinal *);
+static void Act_home(Widget, XEvent *, String *, Cardinal *);
+static void Act_home_or_top(Widget, XEvent *, String *, Cardinal *);
+static void Act_end_or_bottom(Widget, XEvent *, String *, Cardinal *);
+static void Act_center(Widget, XEvent *, String *, Cardinal *);
+static void Act_left(Widget, XEvent *, String *, Cardinal *);
+static void Act_right(Widget, XEvent *, String *, Cardinal *);
+static void Act_up(Widget, XEvent *, String *, Cardinal *);
+static void Act_down(Widget, XEvent *, String *, Cardinal *);
+static void Act_up_or_previous(Widget, XEvent *, String *, Cardinal *);
+static void Act_down_or_next(Widget, XEvent *, String *, Cardinal *);
+static void Act_set_margins(Widget, XEvent *, String *, Cardinal *);
+static void Act_show_display_attributes(Widget, XEvent *, String *, Cardinal *);
+static void Act_set_density(Widget, XEvent *, String *, Cardinal *);
+static void Act_change_density(Widget, XEvent *, String *, Cardinal *);
+static void Act_fullscreen(Widget, XEvent *, String *, Cardinal *);
+#ifdef GREY
+static void Act_set_greyscaling(Widget, XEvent *, String *, Cardinal *);
+#endif
+#if COLOR
+static void Act_set_color(Widget, XEvent *, String *, Cardinal *);
+#endif
+
+static void Act_htex_anchorinfo(Widget, XEvent *, String *, Cardinal *);
+
+static void Act_reread_dvi_file(Widget, XEvent *, String *, Cardinal *);
+static void Act_select_dvi_file(Widget, XEvent *, String *, Cardinal *);
+static void Act_discard_number(Widget, XEvent *, String *, Cardinal *);
+static void Act_drag(Widget, XEvent *, String *, Cardinal *);
+static void Act_wheel(Widget, XEvent *, String *, Cardinal *);
+static void Act_hwheel(Widget, XEvent *, String *, Cardinal *);
+static void Act_press(Widget, XEvent *, String *, Cardinal *);
+static void Act_motion(Widget, XEvent *, String *, Cardinal *);
+static void Act_release(Widget, XEvent *, String *, Cardinal *);
+static void Act_toggle_grid_mode(Widget, XEvent *, String *, Cardinal *);
+static void Act_source_special(Widget, XEvent *, String *, Cardinal *);
+static void Act_show_source_specials(Widget, XEvent *, String *, Cardinal *);
+static void Act_source_what_special(Widget, XEvent *, String *, Cardinal *);
+static void Act_unpause_or_next(Widget, XEvent *, String *, Cardinal *);
+static void Act_user_exec(Widget, XEvent *, String *, Cardinal *);
+static void Act_ruler_snap_origin(Widget w, XEvent *event, String *params, Cardinal *num_params);
+static void Act_load_url(Widget w, XEvent *event, String *params, Cardinal *num_params);
+#ifdef MOTIF
+static void Act_prefs_dialog(Widget w, XEvent *event, String *params, Cardinal *num_params);
+#endif
+
+static XtActionsRec m_actions[] = {
+ {"digit", Act_digit},
+ {"mouse-modes", Act_mouse_modes},
+ {"switch-mode", Act_switch_mode},
+ {"minus", Act_minus},
+ {"recent-files", Act_recent_files},
+ {"quit", Act_quit},
+ {"quit-confirm", Act_quit_confirm},
+ {"print", Act_print},
+ {"save", Act_save},
+ {"find", Act_find},
+ {"incremental-find", Act_incremental_find},
+ {"find-next", Act_find_next},
+ {"help", Act_help},
+ {"goto-page", Act_goto_page},
+ {"use-tex-pages", Act_use_tex_pages},
+ {"forward-page", Act_forward_page},
+ {"back-page", Act_back_page},
+ {"toggle-mark", Act_toggle_mark},
+ {"declare-page-number", Act_declare_page_number},
+ {"home", Act_home},
+ {"home-or-top", Act_home_or_top},
+ {"end-or-bottom", Act_end_or_bottom},
+ {"center", Act_center},
+ {"set-keep-flag", Act_set_keep_flag},
+ {"left", Act_left},
+ {"right", Act_right},
+ {"up", Act_up},
+ {"down", Act_down},
+ {"up-or-previous", Act_up_or_previous},
+ {"down-or-next", Act_down_or_next},
+ {"set-margins", Act_set_margins},
+ {"show-display-attributes", Act_show_display_attributes},
+ {"set-shrink-factor", Act_set_shrink_factor},
+ {"shrink-to-dpi", Act_shrink_to_dpi},
+ {"set-density", Act_set_density},
+ {"change-density", Act_change_density},
+ {"fullscreen", Act_fullscreen},
+#ifdef GREY
+ {"set-greyscaling", Act_set_greyscaling},
+#endif
+#if COLOR
+ {"set-color", Act_set_color},
+#endif
+#ifdef PS
+ {"set-ps", Act_set_ps},
+#endif
+ {"htex-back", Act_htex_back},
+ {"htex-forward", Act_htex_forward},
+ {"htex-anchorinfo", Act_htex_anchorinfo},
+#ifdef PS_GS
+ {"set-gs-alpha", Act_set_gs_alpha},
+#endif
+ {"set-expert-mode", Act_set_expert_mode},
+ {"reread-dvi-file", Act_reread_dvi_file},
+ {"select-dvi-file", Act_select_dvi_file},
+ {"discard-number", Act_discard_number},
+ {"drag", Act_drag},
+ {"wheel", Act_wheel},
+ {"hwheel", Act_hwheel},
+ {"press", Act_press},
+ {"motion", Act_motion},
+ {"release", Act_release},
+ {"toggle-grid-mode", Act_toggle_grid_mode},
+ {"source-special", Act_source_special},
+ {"show-source-specials", Act_show_source_specials},
+ {"source-what-special", Act_source_what_special},
+ {"unpause-or-next", Act_unpause_or_next},
+ {"user-exec", Act_user_exec},
+#if 0 /* not implemented yet */
+ {"set-papersize", Act_set_papersize},
+ {"set-paper-landscape", Act_set_paper_landscape},
+#endif
+ {"load-url", Act_load_url},
+ {"scroll-list-up", Act_scroll_list_up},
+ {"scroll-list-down", Act_scroll_list_down},
+ {"pagehistory-clear", Act_pagehistory_clear},
+ {"pagehistory-back", Act_pagehistory_back},
+ {"pagehistory-forward", Act_pagehistory_forward},
+ {"pagehistory-delete-backward", Act_pagehistory_delete_backward},
+ {"pagehistory-delete-forward", Act_pagehistory_delete_forward},
+#ifdef MOTIF
+ {"prefs-dialog", Act_prefs_dialog},
+#endif
+ {"magnifier", Act_magnifier},
+ {"ruler", Act_ruler},
+ {"ruler-snap-origin", Act_ruler_snap_origin},
+ {"text-selection", Act_text_selection},
+ {"do-href", Act_href},
+ {"do-href-newwindow", Act_href_newwindow},
+ {"switch-magnifier-units", Act_switch_magnifier_units},
+};
+
+
+Boolean
+compile_action(const char *str, struct xdvi_action **app)
+{
+ const char *p, *p1, *p2, *end_cmd;
+ XtActionsRec *actp;
+ struct xdvi_action *ap;
+ String *params;
+ Cardinal num_params;
+
+ for (;;) {
+
+ while (*str == ' ' || *str == '\t')
+ ++str;
+
+ if (*str == '\0' || *str == '\n')
+ break;
+
+ p = str;
+
+ /* find end of command name */
+ while (isalnum((int)*p) || *p == '-' || *p == '_')
+ ++p;
+
+ end_cmd = p;
+
+ for (actp = m_actions; ; ++actp) {
+ if (actp >= m_actions + XtNumber(m_actions)) {
+ const char *tmp = strchr(str, '\0');
+ if (tmp == NULL) {
+ tmp = p;
+ }
+ XDVI_WARNING((stderr, "Cannot compile action \"%.*s\".",
+ (int) (tmp - str), str));
+ *app = NULL;
+ return False;
+ }
+ if (memcmp(str, actp->string, p - str) == 0
+ && actp->string[p - str] == '\0')
+ break;
+ }
+
+ while (*p == ' ' || *p == '\t')
+ ++p;
+ if (*p != '(') {
+ while (*p != '\0' && *p != '\n')
+ ++p;
+ XDVI_WARNING((stderr, "Syntax error in action %.*s.",
+ (int) (p - str), str));
+ *app = NULL;
+ return False;
+ }
+
+ do {++p;}
+ while (*p == ' ' || *p == '\t');
+
+ num_params = 0;
+ if (*p == ')')
+ params = NULL;
+ else {
+ Cardinal max_params = 4;
+
+ params = xmalloc(max_params * sizeof (String));
+
+ for (;;) { /* loop over params */
+ if (*p == '"') {
+ ++p;
+ p1 = strchr(p, '"');
+ if (p1 == NULL) {
+ p1 = strchr(p, '\n');
+ if (p1 == NULL)
+ p1 = p + strlen(p);
+ XDVI_WARNING((stderr, "Syntax error in action %.*s.",
+ (int) (p1 - str), str));
+ while (num_params > 0) {
+ --num_params;
+ free(params[num_params]);
+ }
+ free(params);
+ *app = NULL;
+ return False;
+ }
+ params[num_params++] = xstrndup(p, p1 - p);
+
+ do {++p1;}
+ while (*p1 == ' ' || *p1 == '\t');
+
+ if (*p1 != ')' && *p1 != ',') {
+ p2 = strchr(p1, '\n');
+ if (p2 == NULL)
+ p2 = p1 + strlen(p1);
+ XDVI_WARNING((stderr, "Syntax error in action %.*s.",
+ (int) (p2 - str), str));
+ while (num_params > 0) {
+ --num_params;
+ free(params[num_params]);
+ }
+ free(params);
+ *app = NULL;
+ return False;
+ }
+ }
+ else { /* param is not quoted */
+ for (p1 = p;; ++p1) {
+ if (*p1 == '\0' || *p1 == '\n') {
+ XDVI_WARNING((stderr,
+ "Syntax error in action %.*s.",
+ (int) (p1 - str), str));
+ while (num_params > 0) {
+ --num_params;
+ free(params[num_params]);
+ }
+ free(params);
+ *app = NULL;
+ return False;
+ }
+ if (*p1 == ')' || *p1 == ',')
+ break;
+ }
+ p2 = p1;
+ while (p2 > p && (p2[-1] == ' ' || p2[-1] == '\t'))
+ --p2;
+ params[num_params++] = xstrndup(p, p2 - p);
+ }
+
+ p = p1;
+ if (*p == ')')
+ break;
+
+ do {++p;}
+ while (*p == ' ' || *p == '\t');
+
+ if (num_params >= max_params) {
+ max_params *= 2;
+ params = xrealloc(params, max_params * sizeof (String));
+ }
+ }
+ } /* end if */
+
+ ap = xmalloc(sizeof *ap);
+ ap->proc = actp->proc;
+ ap->command = xstrndup(str, end_cmd - str);
+ ap->params = params;
+ ap->num_params = num_params;
+
+ *app = ap;
+ app = &ap->next;
+
+ str = p + 1;
+ }
+
+ *app = NULL;
+ return True;
+}
+
+/*
+ * cached_compile_action does the same as compile_action, but retains
+ * the compiled actions. It is used only in Act_mouse_modes(), which
+ * otherwise would recompile the same actions over and over again.
+ */
+
+struct avl_cached_action {
+ AVL_COMMON;
+ struct xdvi_action *ap;
+};
+
+
+static void
+cached_compile_action(const char *str, struct xdvi_action **app)
+{
+ static struct avl_cached_action *avl_ca_head = NULL;
+ struct avl_cached_action *avl_ca;
+
+ avl_ca = (struct avl_cached_action *)
+ avladd(str, strlen(str), (struct avl **) &avl_ca_head,
+ sizeof (struct avl_cached_action));
+
+ if (avl_ca->key == str) { /* if new record */
+ avl_ca->key = xstrdup(str); /* copy string to new storage */
+ compile_action(str, &avl_ca->ap);
+ }
+ *app = avl_ca->ap;
+}
+
+
+/*
+ * Access to m_actions
+ */
+int get_num_actions(void)
+{
+ return XtNumber(m_actions);
+}
+
+XtActionsRec *get_actions(void)
+{
+ return m_actions;
+}
+
+/*
+ * Data for buffered events.
+ */
+
+#ifndef FLAKY_SIGPOLL
+static VOLATILE int event_freq = 70;
+#else
+#define event_freq 70
+#endif
+
+static void can_exposures(struct WindowRec *windowrec);
+
+
+/*
+ * Set the flag so that termination occurs, via the above routine.
+ * This should be used in place of xdvi_exit() when there may be a
+ * non-killable process running (e.g., anytime within read_events()).
+ */
+
+static void
+xdvi_normal_exit(void)
+{
+ sig_flags |= SF_TERM;
+}
+
+static void
+xdvi_normal_exit_cb(XtPointer arg)
+{
+ UNUSED(arg);
+ sig_flags |= SF_TERM;
+}
+
+void
+xdvi_exit_callback(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ sig_flags |= SF_TERM;
+}
+
+/*
+ * Event-handling routines.
+ */
+
+
+void
+expose(struct WindowRec *windowrec,
+ int x, int y,
+ unsigned int w, unsigned int h)
+{
+ if (windowrec->min_x > x)
+ windowrec->min_x = x;
+ if (windowrec->max_x < (int)(x + w))
+ windowrec->max_x = x + w;
+ if (windowrec->min_y > y)
+ windowrec->min_y = y;
+ if (windowrec->max_y < (int)(y + h))
+ windowrec->max_y = y + h;
+
+ globals.ev.flags |= EV_EXPOSE;
+}
+
+void
+clearexpose(struct WindowRec *windowrec,
+ int x, int y,
+ unsigned w, unsigned h)
+{
+ XClearArea(DISP, windowrec->win, x, y, w, h, False);
+ expose(windowrec, x, y, w, h);
+}
+
+/*
+ * Routines for X11 toolkit.
+ */
+
+static Position m_window_x, m_window_y;
+static Arg arg_xy[] = {
+ {XtNx, (XtArgVal) &m_window_x},
+ {XtNy, (XtArgVal) &m_window_y},
+};
+
+#define get_xy() XtGetValues(globals.widgets.draw_widget, arg_xy, XtNumber(arg_xy))
+
+
+static void
+warn_num_params(const char *act_name, String *params, int num_params, int max_params)
+{
+ if (num_params > max_params) {
+ XDVI_WARNING((stderr, "Too many parameters (%d) for action \"%s\", ignoring all after \"%s\"",
+ num_params, act_name, params[max_params - 1]));
+ }
+}
+
+
+void
+handle_command(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct xdvi_action *actp;
+
+ UNUSED(call_data);
+
+ /* call all actions registered for this event */
+ for (actp = (struct xdvi_action *)client_data; actp != NULL; actp = actp->next) {
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "calling action with param: %s\n",
+ actp->num_params ? actp->params[0] : "(null)");
+ (actp->proc)(widget, NULL, actp->params, &actp->num_params);
+ }
+}
+
+#ifdef MOTIF
+int
+set_bar_value(Widget bar, int value, int max)
+{
+ XmScrollBarCallbackStruct call_data;
+
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "set_bar_value: val %d, max %d\n", value, max);
+#endif
+ if (value > max)
+ value = max;
+ if (value < 0)
+ value = 0;
+ call_data.value = value;
+ XtVaSetValues(bar, XmNvalue, value, NULL);
+ XtCallCallbacks(bar, XmNvalueChangedCallback, &call_data);
+ return value;
+}
+#endif
+
+void
+home(wide_bool scrl)
+{
+ if (!scrl)
+ XUnmapWindow(DISP, mane.win);
+# ifdef MOTIF
+ {
+ int value;
+
+ if (!resource.keep_flag) {
+ value = (globals.page.w - mane.width) / 2;
+ if (value > resource.sidemargin_int / mane.shrinkfactor)
+ value = resource.sidemargin_int / mane.shrinkfactor;
+ (void)set_bar_value(globals.widgets.x_bar, value, (int)(globals.page.w - mane.width));
+ }
+
+ value = (globals.page.h - mane.height) / 2;
+ if (value > resource.topmargin_int / mane.shrinkfactor)
+ value = resource.topmargin_int / mane.shrinkfactor;
+ (void)set_bar_value(globals.widgets.y_bar, value, (int)(globals.page.h - mane.height));
+ }
+# else
+ get_xy();
+ if (!resource.keep_flag && globals.widgets.x_bar != NULL) {
+ int coord = (globals.page.w - mane.width) / 2;
+
+ if (coord > resource.sidemargin_int / mane.shrinkfactor)
+ coord = resource.sidemargin_int / mane.shrinkfactor;
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_x + coord));
+ }
+ if (globals.widgets.y_bar != NULL) {
+ int coord = (globals.page.h - mane.height) / 2;
+
+ if (coord > resource.topmargin_int / mane.shrinkfactor)
+ coord = resource.topmargin_int / mane.shrinkfactor;
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_y + coord));
+ }
+# endif /* MOTIF */
+ if (!scrl) {
+ XMapWindow(DISP, mane.win);
+ /* Wait for the server to catch up---this eliminates flicker. */
+ XSync(DISP, False);
+ }
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+/*
+ * Same as home(), except move to the bottom of the page.
+ */
+
+static void
+home_bottom(wide_bool scrl)
+{
+ UNUSED(scrl);
+ XUnmapWindow(DISP, mane.win);
+#ifdef MOTIF
+ {
+ int value;
+
+ if (!resource.keep_flag) {
+ value = (globals.page.w - mane.width) / 2;
+ if (value > resource.sidemargin_int / mane.shrinkfactor)
+ value = resource.sidemargin_int / mane.shrinkfactor;
+ (void)set_bar_value(globals.widgets.x_bar, value, (int)(globals.page.w - mane.width));
+ }
+
+ (void)set_bar_value(globals.widgets.y_bar, (int)(globals.page.h - mane.height), (int)(globals.page.h - mane.height));
+ }
+#else /* MOTIF */
+ get_xy();
+ if (!resource.keep_flag && globals.widgets.x_bar != NULL) {
+ int coord = (globals.page.w - mane.width) / 2;
+
+ if (coord > resource.sidemargin_int / mane.shrinkfactor)
+ coord = resource.sidemargin_int / mane.shrinkfactor;
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_x + coord));
+ }
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_window_y + (globals.page.h - mane.height)));
+#endif /* MOTIF */
+ XMapWindow(DISP, mane.win);
+ /* Wait for the server to catch up---this eliminates flicker. */
+ XSync(DISP, False);
+
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+
+#ifndef MOTIF
+static void
+handle_destroy_bar(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(w);
+ UNUSED(call_data);
+ *(Widget *) client_data = NULL;
+}
+#endif
+
+static Boolean resized = False;
+
+static void
+get_geom(void)
+{
+ static Dimension new_clip_w, new_clip_h;
+
+ static Arg arg_wh_clip[] = {
+ {XtNwidth, (XtArgVal) &new_clip_w},
+ {XtNheight, (XtArgVal) &new_clip_h},
+ };
+
+ static Dimension window_w, window_h;
+
+ static Arg arg_wh[] = {
+ {XtNwidth, (XtArgVal) &window_w},
+ {XtNheight, (XtArgVal) &window_h},
+ };
+
+
+ int old_clip_w;
+
+#ifdef MOTIF
+ /* event handlers for Motif scrollbars have already been added
+ in create_initialize_widgets(), xdvi.c */
+ XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh));
+#else
+ XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh));
+ /* Note: widgets may be destroyed but not forgotten */
+ if (globals.widgets.x_bar == NULL) {
+ globals.widgets.x_bar = XtNameToWidget(globals.widgets.vport_widget, "horizontal");
+ if (globals.widgets.x_bar != NULL) {
+ XtAddCallback(globals.widgets.x_bar, XtNdestroyCallback, handle_destroy_bar,
+ (XtPointer)&globals.widgets.x_bar);
+#ifdef USE_PANNER
+ XtAddEventHandler(globals.widgets.x_bar, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask,
+ False, handle_x_scroll, NULL);
+#endif
+ }
+ }
+ if (globals.widgets.y_bar == NULL) {
+ globals.widgets.y_bar = XtNameToWidget(globals.widgets.vport_widget, "vertical");
+ if (globals.widgets.y_bar != NULL) {
+ XtAddCallback(globals.widgets.y_bar, XtNdestroyCallback, handle_destroy_bar,
+ (XtPointer)&globals.widgets.y_bar);
+#ifdef USE_PANNER
+ XtAddEventHandler(globals.widgets.y_bar, ButtonMotionMask | ButtonPressMask | ButtonReleaseMask,
+ False, handle_y_scroll, NULL);
+#endif
+ }
+ }
+#endif
+ XtGetValues(globals.widgets.clip_widget, arg_wh_clip, XtNumber(arg_wh_clip));
+
+ old_clip_w = mane.width;
+
+ /* we need to do this because
+ sizeof(Dimension) != sizeof(int)
+ */
+ mane.width = new_clip_w;
+ mane.height = new_clip_h;
+ if (old_clip_w == 0) {
+ globals.ev.flags |= EV_NEWPAGE;
+ }
+
+ if (resource.keep_flag) {
+#ifndef MOTIF
+ Dimension d;
+ int curr_scroll;
+ if ((globals.widgets.x_bar != NULL && m_x_scroll != 0) || (globals.widgets.y_bar != NULL && m_y_scroll != 0)) {
+ get_xy();
+ }
+#endif
+ if (globals.widgets.x_bar != NULL && m_x_scroll != 0) {
+#ifdef MOTIF
+ if (m_x_scroll > 0)
+ (void)set_bar_value(globals.widgets.x_bar, m_x_scroll, (int)(globals.page.w - mane.width));
+#else
+ XtVaGetValues(globals.widgets.clip_widget, XtNy, &d, NULL);
+ curr_scroll = d - m_window_x;
+ if (m_x_scroll > curr_scroll) {
+ TRACE_GUI((stderr, "======== diff: %d", m_x_scroll - curr_scroll));
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(m_x_scroll - curr_scroll));
+ }
+#endif
+ }
+ if (globals.widgets.y_bar != NULL && m_y_scroll != 0) {
+#ifdef MOTIF
+ if (m_y_scroll > 0)
+ (void)set_bar_value(globals.widgets.y_bar, m_y_scroll, (int)(globals.page.h - mane.height));
+#else
+ XtVaGetValues(globals.widgets.clip_widget, XtNy, &d, NULL);
+ curr_scroll = d - m_window_y;
+ if (m_y_scroll > curr_scroll) {
+ TRACE_GUI((stderr, "======== diff: %d", m_y_scroll - curr_scroll));
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(m_y_scroll - curr_scroll));
+ }
+#endif
+ }
+ }
+ /* home(False); */
+ resized = False;
+}
+
+/*
+ * Callback routines
+ */
+
+void
+handle_resize(Widget widget, XtPointer junk, XEvent *event, Boolean *cont)
+{
+ UNUSED(widget);
+ UNUSED(junk);
+ UNUSED(event);
+ UNUSED(cont);
+
+ resized = True;
+#ifndef MOTIF
+ handle_statusline_resize();
+ handle_pagelist_resize();
+#endif
+}
+
+void
+reconfig(void)
+{
+ /* Dimension x, y; */
+
+ if (globals.dvi_file.bak_fp == NULL)
+ return;
+
+#ifndef MOTIF
+ XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)False, NULL);
+#endif
+ TRACE_GUI((stderr, "globals.widgets.draw_widget: w %d, h %d", globals.page.w, globals.page.h));
+ XtVaSetValues(globals.widgets.draw_widget, XtNwidth, (XtArgVal)globals.page.w, XtNheight, (XtArgVal)globals.page.h, NULL);
+
+#ifdef TEST_SCROLLING
+ /* XtVaSetValues(globals.widgets.draw_background, XtNwidth, (XtArgVal)globals.page.w, XtNheight, (XtArgVal)globals.page.h, NULL); */
+#endif
+
+#ifndef MOTIF
+ handle_statusline_resize(); /* without this, statusline will disappear */
+ /* following not needed? */
+ /* handle_pagelist_resize(); */
+#endif
+
+ get_geom();
+
+ /* set_windowsize(&x, &y */
+ /* #ifndef MOTIF */
+ /* , get_panel_width() */
+ /* #endif */
+ /* ); */
+ /* XResizeWindow(DISP, XtWindow(globals.widgets.top_level), x, y); */
+ /* reconfigure_window(False, x, y, True); */
+ /* reconfig_window(); */
+}
+
+
+int
+check_goto_page(int pageno, Boolean insert_into_pagehist)
+{
+ int retval;
+ if (pageno < 0) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Can't go to page %d, going to first page instead", pageno + 1); */
+ retval = 0;
+ }
+ else if (pageno >= total_pages) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, */
+/* "Can't go to page %d, going to last page (%d) instead", */
+/* pageno + 1, total_pages); */
+ retval = total_pages - 1;
+ }
+ else
+ retval = pageno;
+
+ if (insert_into_pagehist) {
+ page_history_insert(retval);
+ }
+ return retval;
+}
+
+
+static int
+check_goto_tex_page(int pageno)
+{
+ /*
+ Translate from TeX page number to `real' page number if
+ needed. Note that pageno is a C-style 0-based number, hence we
+ add 1 for the argument of pageinfo_get_index_of_number().
+ */
+ int retval;
+ if (resource.use_tex_pages) {
+ int res = pageinfo_get_index_of_number(pageno + 1);
+ if (res >= 0)
+ retval = res;
+ else {
+ xdvi_bell();
+ if (pageno < 1) {
+/* statusline_info(STATUS_SHORT, "Can't go to page %d, going to first page instead", pageno + 1); */
+ retval = 0;
+ }
+ else {
+ /* there is no quick way to determine the last page number in the TeX page index */
+/* statusline_info(STATUS_SHORT, */
+/* "Can't go to page %d, going to last page instead", */
+/* pageno + 1); */
+ retval = total_pages - 1;
+ }
+ }
+ page_history_insert(retval);
+ }
+ else {
+ retval = check_goto_page(pageno, True);
+ }
+ return retval;
+}
+
+/* |||
+ * Currently the event handler does not coordinate XCopyArea requests
+ * with GraphicsExpose events. This can lead to problems if the window
+ * is partially obscured and one, for example, drags a scrollbar.
+ */
+
+/*
+ * Actions for the translation mechanism.
+ */
+
+/* if there are global prefixes, return them in res and reset them to defaults */
+static Boolean
+get_prefix_arg(int *res)
+{
+ Boolean ret;
+
+ *res = m_sign * m_number;
+ ret = m_have_arg;
+ /* reset global flags */
+ m_have_arg = False;
+ m_number = 0;
+ m_sign = 1;
+ return ret;
+}
+
+Boolean
+get_int_arg(String *param, Cardinal *num_params, int *res)
+{
+ if (*num_params > 0) {
+ *res = atoi(*param);
+ return True;
+ }
+ else {
+ if (get_prefix_arg(res)) { /* prefix argument? */
+ return True;
+ }
+ }
+ return False;
+}
+
+
+Boolean
+toggle_arg(int arg, String *param, Cardinal *num_params)
+{
+ if (*num_params > 0) {
+ if (**param != 't' && (atoi(*param) != 0) == arg)
+ return False;
+ }
+ else {
+ if (m_have_arg) {
+ int tmparg = m_number;
+
+ m_have_arg = False;
+ m_number = 0;
+ m_sign = 1;
+
+ if ((tmparg != 0) == arg)
+ return False;
+ }
+ }
+ return True;
+}
+
+Boolean
+check_resource_expert(void *val, const char *param)
+{
+ int j = strtol(param, (char **)NULL, 10);
+ /* check if the j-1th bit is set: */
+ return (*(int *)val >> (j - 1)) & 1;
+}
+
+Boolean
+check_papersize(void *val, const char *param)
+{
+ UNUSED(val);
+ UNUSED(param);
+ return False; /* TODO */
+}
+
+Boolean
+check_paper_landscape(void *val, const char *param)
+{
+ UNUSED(val);
+ UNUSED(param);
+ return False; /* TODO */
+}
+
+/* comparison functions for the menu setting code */
+Boolean
+check_toggle(void *val, const char *param)
+{
+ Boolean *on = val;
+ if (strcmp(param, "toggle") == 0) {
+ return *on;
+ }
+ else {
+ fprintf(stderr, "TODO: check_toggle: arg |%s|, curr: %d\n", param, *(int *)val);
+ return *on;
+ }
+}
+
+Boolean
+check_int(void *val, const char *param)
+{
+ int i = strtol(param, (char **)NULL, 10);
+ return i == *(int *)val;
+}
+
+void
+Act_ruler(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ MYTRACE((stderr, "ruler!\n"));
+
+ if (dvi_file_changed()) {
+ globals.ev.flags |= EV_RELOAD;
+ return;
+ }
+
+#ifdef MOTIF
+ /* see xm_menu.c for an explanation of this */
+ if (event && pulldown_menu_active(event->xany.serial)) {
+ return;
+ }
+#endif
+
+ if (bg_current == NULL) {
+ /*
+ HACK ALERT: we can arrive here after loading a new file via the file selector
+ for which not all fonts have been generated. In that case, dereferencing
+ bg_current would bomb. Try to recover by simply returning here.
+ */
+ return;
+ }
+
+ show_ruler(event);
+ globals.curr_mode = RULER_MODE_ACTIVE;
+ globals.ev.flags |= EV_CURSOR;
+ XFlush(DISP);
+ show_distance_from_ruler(event, False);
+}
+
+void
+Act_text_selection(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ MYTRACE((stderr, "text selection!\n"));
+
+ if (dvi_file_changed()) {
+ globals.ev.flags |= EV_RELOAD;
+ return;
+ }
+
+#ifdef MOTIF
+ /* see xm_menu.c for an explanation of this */
+ if (pulldown_menu_active(event->xany.serial)) {
+ return;
+ }
+#endif
+
+ if (bg_current == NULL) {
+ /*
+ HACK ALERT: we can arrive here after loading a new file via the file selector
+ for which not all fonts have been generated. In that case, dereferencing
+ bg_current would bomb. Try to recover by simply returning here.
+ */
+ return;
+ }
+
+ globals.curr_mode = TEXT_MODE_ACTIVE;
+ globals.ev.flags |= EV_CURSOR;
+ XFlush(DISP);
+ text_selection_start(event);
+ text_motion(event);
+}
+
+/****************************************************************************
+ * Actions specific to the handling of the magnifier
+ */
+
+void
+Act_magnifier(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+
+ MYTRACE((stderr, "magnifier!\n"));
+
+ if (dvi_file_changed()) {
+ globals.ev.flags |= EV_RELOAD;
+ return;
+ }
+
+#ifdef MOTIF
+ /* see xm_menu.c for an explanation of this */
+ if (pulldown_menu_active(event->xany.serial)) {
+ return;
+ }
+#endif
+
+ if (bg_current == NULL) {
+ /*
+ HACK ALERT: we can arrive here after loading a new file via the file selector
+ for which not all fonts have been generated. In that case, dereferencing
+ bg_current would bomb. Try to recover by simply returning here.
+ */
+ return;
+ }
+
+ if (event->type != ButtonPress || mouse_release != null_mouse
+ || MAGNIFIER_ACTIVE || mane.shrinkfactor == 1 || *num_params != 1) {
+ XdviBell(DISP, event->xany.window, 0);
+ if (mane.shrinkfactor == 1) {
+ statusline_info(STATUS_SHORT,
+ "No magnification available at shrink factor 1");
+ }
+ return;
+ }
+
+ magnifier_move(*params, event);
+}
+
+void
+Act_switch_magnifier_units(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ size_t k = 0;
+ static char *TeX_units[] = {
+ "mm", "pt", "in", "sp", "bp", "cc", "dd", "pc", "px",
+ };
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ for (k = 0; k < XtNumber(TeX_units); ++k)
+ if (strcmp(resource.tick_units, TeX_units[k]) == 0)
+ break;
+ k++;
+ if (k >= XtNumber(TeX_units))
+ k = 0;
+ resource.tick_units = TeX_units[k];
+ if (globals.curr_mode == RULER_MODE_ACTIVE) {
+ show_distance_from_ruler(event, False);
+ }
+ else {
+ statusline_info(STATUS_SHORT, "Ruler units: %s\n", resource.tick_units);
+ }
+}
+
+void
+Act_href(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int x, y;
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(num_params);
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y, &x, &y, &dummy);
+
+ if (params) {
+ if (htex_handleref(x, y, False))
+ *params = Act_true_retval;
+ else
+ *params = Act_false_retval;
+ }
+}
+
+void
+Act_href_newwindow(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int x, y;
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(num_params);
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y, &x, &y, &dummy);
+
+ if (params) {
+ if (htex_handleref(x, y, True))
+ *params = Act_true_retval;
+ else
+ *params = Act_false_retval;
+ }
+}
+
+static void
+Act_digit(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int digit;
+ /* for overflow checks */
+ static const int MAXINT_QUOT = INT_MAX / 10;
+ static const int MAXINT_MOD = INT_MAX % 10;
+
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params != 1 || (digit = **params - '0') > 9) {
+ xdvi_bell();
+ return;
+ }
+ m_have_arg = True;
+
+ /* don't increment m_number if it would overflow */
+ if (m_number < MAXINT_QUOT || (m_number == MAXINT_QUOT && digit <= MAXINT_MOD)) {
+ m_number = m_number * 10 + digit;
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */
+ statusline_info(STATUS_SHORT, "numerical prefix: %s%d", m_sign < 0 ? "-" : "", m_number);
+ }
+ else {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT, "numerical prefix: %s%d: no larger value possible", m_sign < 0 ? "-" : "", m_number);
+ }
+}
+
+static void
+Act_minus(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ m_have_arg = True;
+ m_sign = -m_sign;
+ if (m_number > 0) {
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */
+ statusline_info(STATUS_SHORT, "numerical prefix: %s%d", m_sign < 0 ? "-" : "", m_number);
+ }
+ else {
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */
+ statusline_info(STATUS_SHORT, "numerical prefix: %s", m_sign < 0 ? "-" : "");
+ }
+}
+
+static void
+Act_quit(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+#ifndef FLAKY_SIGPOLL
+ if (globals.debug & DBG_EVENT)
+ puts(event_freq < 0
+ ? "SIGPOLL is working"
+ : "no SIGPOLL signals received");
+#endif
+ xdvi_normal_exit();
+}
+
+static void
+Act_quit_confirm(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ static Widget dialog = 0;
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+#ifndef FLAKY_SIGPOLL
+ if (globals.debug & DBG_EVENT)
+ puts(event_freq < 0
+ ? "SIGPOLL is working"
+ : "no SIGPOLL signals received");
+#endif
+
+ /* already a quit dialog open? */
+ if (dialog != 0) {
+ /* HACK ALERT: use brute force, since tests for XtIsRealized()
+ or XtIsMapped() don't work?? Grabbing the server apparently
+ has problems with Xaw, and it's not a nice solution anyway ... */
+ if (kill_message_window(dialog))
+ xdvi_bell();
+ }
+
+ dialog = choice_dialog_sized(globals.widgets.top_level,
+ MSG_QUESTION,
+ SIZE_SMALL,
+ NULL,
+#ifndef MOTIF
+ "quit",
+#endif
+ NULL, NULL, /* no pre_callbacks */
+ "OK", xdvi_normal_exit_cb, NULL,
+ "Cancel", NULL, NULL,
+ "Really quit xdvi?");
+}
+
+static void
+Act_load_url(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(num_params);
+ launch_browser(*params);
+}
+
+static void
+Act_print(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ /* static so that we can pass them around to callbacks etc. */
+ static struct save_or_print_info info;
+ static struct select_pages_info pinfo = {
+ 0, 0, check_marked, { 0, NULL }, NO_ERROR
+ };
+ static struct file_info finfo = {
+ NULL, NULL,
+ NULL, NULL,
+ NULL
+ };
+ static Boolean first_time = True;
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (first_time) {
+ info.shell = info.printlog = NULL;
+ info.act = FILE_PRINT;
+ info.pinfo = &pinfo;
+ info.finfo = &finfo;
+ info.callbacks = NULL;
+ first_time = False;
+ }
+ save_or_print_callback(&info);
+}
+
+static void
+Act_save(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ /* static so that we can pass them around to callbacks etc. */
+ static struct save_or_print_info info;
+ static struct select_pages_info pinfo = {
+ 0, 0, check_marked, { 0, NULL }, NO_ERROR
+ };
+ static struct file_info finfo = {
+ NULL, NULL,
+ NULL, NULL,
+ NULL
+ };
+ static Boolean first_time = True;
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (first_time) {
+ info.shell = info.printlog = NULL;
+ info.act = FILE_SAVE;
+ info.pinfo = &pinfo;
+ info.finfo = &finfo;
+ info.callbacks = NULL;
+ first_time = False;
+ }
+ save_or_print_callback(&info);
+}
+
+static void
+Act_find(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+ dvi_find_string(NULL, False);
+}
+
+static void
+Act_incremental_find(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+ isearch_start();
+}
+
+static void
+Act_find_next(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+ dvi_find_string(NULL, True);
+}
+
+static void
+Act_help(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ char *arg = NULL;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params > 0)
+ arg = *params;
+
+ show_help(globals.widgets.top_level, arg);
+}
+
+static home_proc home_action = NULL;
+
+void
+goto_page(int new_page, home_proc proc, Boolean force)
+{
+ /* SU: added clearing the window here, otherwise old window content
+ will survive switching pages as long as globals.pausing.flag is active
+ (i.e. when accidentally changing page instead of unpausing)
+ */
+ if (globals.pausing.flag) {
+#if PS_GS
+ gs_erase_page();
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+
+ if (globals.dvi_file.bak_fp == NULL) {
+ current_page = new_page; /* so that xdvi gets the page change */
+ return;
+ }
+
+ xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__,
+ new_page >= 0 && new_page < total_pages,
+ "%d >= 0 && %d < %d", new_page, new_page, total_pages);
+
+ if (current_page != new_page || force) {
+ globals.cursor.flags &= ~CURSOR_LINK; /* disable link cursor if needed */
+
+ current_page = new_page;
+ home_action = proc;
+ globals.warn_spec_now = resource.warn_spec;
+ /* this seems unneccessary */
+ /* if (!resource.keep_flag) */
+ /* home(False); */
+#if defined(MOTIF) && HAVE_XPM
+ tb_check_navigation_sensitivity(current_page);
+ /* page_history_update_toolbar_navigation(); */
+#endif
+ maybe_scroll_pagelist(current_page, False);
+
+ if (globals.pausing.num_save)
+ globals.pausing.num = globals.pausing.num_save[new_page];
+ else
+ globals.pausing.num = 0;
+ /* Control-L (and changing the page) clears this box */
+ globals.src.fwd_box_page = -1;
+
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+ }
+}
+
+
+static void
+Act_goto_page(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ Boolean clear_statusline = False;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("goto-page()", params, *num_params, 1);
+
+ if (*num_params > 0) {
+ if (**params == 'e') {
+ arg = total_pages - 1;
+ }
+ else
+ arg = atoi(*params) - globals.pageno_correct;
+ }
+ else {
+ if (get_prefix_arg(&arg)) {
+ clear_statusline = True;
+ arg -= globals.pageno_correct;
+ }
+ else {
+ arg = total_pages - 1;
+ }
+ }
+ if (arg == total_pages - 1) {
+ /* with TeX numbers, total_pages - 1 might not be found in the page list,
+ so don't use check_goto_tex_page() in this case */
+ goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False);
+ }
+ else {
+ goto_page(check_goto_tex_page(arg), resource.keep_flag ? NULL : home, False);
+ }
+ search_signal_page_changed();
+ if (clear_statusline)
+ statusline_clear();
+ statusline_erase("Page history:");
+}
+
+void
+Act_recent_files(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+}
+
+void
+Act_use_tex_pages(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+
+ if (*num_params == 0) {
+ if (m_have_arg) {
+ resource.use_tex_pages = (m_number != 0);
+ m_have_arg = False;
+ m_number = 0;
+ m_sign = 1;
+ }
+ else {
+ resource.use_tex_pages = !resource.use_tex_pages;
+ }
+ }
+ else
+ resource.use_tex_pages = (**params == 't' ? !resource.use_tex_pages : atoi(*params));
+
+ if (resource.use_tex_pages) {
+ statusline_info(STATUS_SHORT, "Using TeX page numbers for \"g\", goto-page()");
+ }
+ else {
+ statusline_info(STATUS_SHORT, "Using physical page numbers for \"g\", goto-page()");
+ }
+
+ store_preference(NULL, "useTeXPages", "%s", resource.use_tex_pages ? "True" : "False");
+
+ set_menu(&resource.use_tex_pages, Act_use_tex_pages, check_toggle);
+
+ refresh_pagelist(total_pages, current_page);
+}
+
+void
+Act_forward_page(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ Boolean clear_statusline = False;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg))
+ arg = 1;
+ else
+ clear_statusline = True;
+
+ arg += current_page;
+
+ if (arg == current_page) { /* zero argument -> redraw page */
+ globals.src.fwd_box_page = -1;
+ search_reset_info();
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+ statusline_info(STATUS_SHORT, "Page redrawn.");
+ return;
+ }
+ else if (current_page >= total_pages - 1) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Last page of DVI file"); */
+ return;
+ }
+
+ goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False);
+ if (clear_statusline)
+ statusline_clear();
+ statusline_erase("Page history:");
+ search_signal_page_changed();
+}
+
+void
+Act_back_page(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ Boolean clear_statusline = False;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg))
+ arg = 1;
+ else
+ clear_statusline = True;
+
+ arg = current_page - arg;
+
+ if (current_page == 0) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "First page of DVI file"); */
+ return;
+ }
+
+ goto_page(check_goto_page(arg, True), resource.keep_flag ? NULL : home, False);
+ if (clear_statusline)
+ statusline_clear();
+ statusline_erase("Page history:");
+ search_signal_page_changed();
+}
+
+static void
+Act_declare_page_number(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (globals.curr_mode == RULER_MODE_ACTIVE) {
+ show_distance_from_ruler(event, True);
+ return;
+ }
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = 0;
+ }
+ globals.pageno_correct = arg - current_page;
+ statusline_info(STATUS_SHORT, "Current page number set to %d", arg);
+}
+
+static void
+Act_toggle_mark(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (globals.dvi_file.bak_fp == NULL)
+ return;
+
+ if (
+#ifdef MOTIF
+ (resource.expert_mode & XPRT_SHOW_PAGELIST) == 0
+#else
+ (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0
+#endif
+ ) {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT,
+ "Expert mode: Page list not available.");
+ return;
+ }
+
+ if (*num_params > 0) {
+ arg = atoi(*params);
+ if (arg < -1 || arg > 2) {
+ xdvi_bell();
+ statusline_error(STATUS_SHORT,
+ "Possible arguments: none (toggle current), "
+ "-1 (mark all), 0 (unmark all), 1 (toggle odd), 2 (toggle even)");
+ }
+ list_toggle_marks(arg);
+ }
+ else if (get_prefix_arg(&arg)) {
+ list_toggle_marks(arg);
+ statusline_clear();
+ }
+ else {
+ arg = current_page;
+ list_toggle_current(arg);
+ }
+}
+
+static void
+Act_home(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ home(True);
+}
+
+static void
+Act_home_or_top(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (resource.keep_flag) {
+ String args[1];
+ args[0] = "10"; /* should be large enough ... */
+ XtCallActionProc(globals.widgets.top_level, "up", NULL, args, 1);
+ }
+ else {
+ home(True);
+ }
+}
+
+static void
+Act_end_or_bottom(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ String args[1];
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ args[0] = "10"; /* should be large enough ... */
+ XtCallActionProc(globals.widgets.top_level, "down", NULL, args, 1);
+
+ if (!resource.keep_flag
+#ifndef MOTIF
+ && globals.widgets.x_bar != NULL
+#endif
+ ) {
+ XtCallActionProc(globals.widgets.top_level, "right", NULL, args, 1);
+ }
+}
+
+static void
+Act_center(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int x, y;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+#ifdef MOTIF
+ /* The clip widget gives a more exact value. */
+ x = event->xkey.x - mane.width / 2;
+ y = event->xkey.y - mane.height / 2;
+
+ x = set_bar_value(globals.widgets.x_bar, x, (int)(globals.page.w - mane.width));
+ y = set_bar_value(globals.widgets.y_bar, y, (int)(globals.page.h - mane.height));
+ get_xy();
+ XWarpPointer(DISP, None, None, 0, 0, 0, 0, -x - m_window_x, -y - m_window_y);
+#else
+
+ if (event == NULL)
+ return; /* button actions do not provide events */
+
+ x = event->xkey.x - mane.width / 2;
+ y = event->xkey.y - mane.height / 2;
+ /* The clip widget gives a more exact value. */
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(x));
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(y));
+ XWarpPointer(DISP, None, None, 0, 0, 0, 0, -x, -y);
+#endif
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+void
+Act_ruler_snap_origin(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (globals.curr_mode == RULER_MODE_ACTIVE)
+ ruler_snap_origin(event);
+}
+
+#if 0
+void
+Act_set_papersize(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(num_params);
+
+ fprintf(stderr, "set_paperformat: %s\n", *params);
+ resource.paper = *params;
+ set_menu((void *)resource.paper, Act_set_papersize, check_papersize);
+}
+
+void
+Act_set_paper_landscape(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(num_params);
+
+ resource.paper_landscape = !resource.paper_landscape;
+ fprintf(stderr, "set_paper_landscape: %s\n", *params);
+
+ set_menu((char *)resource.paper, Act_set_paper_landscape, check_paper_landscape);
+}
+#endif /* 0 */
+
+
+void
+Act_set_keep_flag(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(event);
+ UNUSED(w);
+
+ if (*num_params == 0) {
+ if (m_have_arg) {
+ resource.keep_flag = (m_number != 0);
+ m_have_arg = False;
+ m_number = 0;
+ m_sign = 1;
+ }
+ else {
+ resource.keep_flag = !resource.keep_flag;
+ }
+ }
+ else
+ resource.keep_flag = (**params == 't'
+ ? !resource.keep_flag : atoi(*params));
+ if (resource.keep_flag) {
+ statusline_info(STATUS_SHORT, "Keeping position when switching pages");
+ }
+ else {
+ statusline_info(STATUS_SHORT,
+ "Not keeping position when switching pages");
+ }
+
+ store_preference(NULL, "keepPosition", "%s", resource.keep_flag ? "True" : "False");
+
+ set_menu(&resource.keep_flag, Act_set_keep_flag, check_toggle);
+}
+
+static void
+Act_left(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("left()", params, *num_params, 1);
+
+#ifdef MOTIF
+ get_xy();
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "left for %p\n", (void *)w);
+ fprintf(stderr, "window x: %d, y: %d\n", m_window_x, m_window_y);
+#endif
+
+ (void)set_bar_value(globals.widgets.x_bar, (*num_params == 0 ? (-2 * (int)mane.width / 3)
+ : (int)(-my_atof(*params) * mane.width)) - m_window_x,
+ (int)(globals.page.w - mane.width));
+#else
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params == 0 ? (-2 * (int)mane.width / 3)
+ : (int)(-my_atof(*params) * mane.width)));
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Horizontal scrolling not possible"); */
+ }
+#endif
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+static void
+Act_right(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("right()", params, *num_params, 1);
+
+#ifdef MOTIF
+ get_xy();
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "right for %p\n", (void *)w);
+ fprintf(stderr, "window x: %d, y: %d\n", m_window_x, m_window_y);
+#endif
+
+ (void)set_bar_value(globals.widgets.x_bar, (*num_params == 0 ? (2 * (int)mane.width / 3)
+ : (int)(my_atof(*params) * mane.width)) - m_window_x,
+ (int)(globals.page.w - mane.width));
+#else
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params == 0 ? (2 * (int)mane.width / 3)
+ : (int)(my_atof(*params) * mane.width)));
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Horizontal scrolling not possible"); */
+ }
+#endif
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+static void
+Act_up(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("up()", params, *num_params, 1);
+
+#ifdef MOTIF
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "up for %p\n", (void *)w);
+#endif
+ get_xy();
+ (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (-2 * (int)mane.height / 3)
+ : (int)(-my_atof(*params) * mane.height)) - m_window_y,
+ (int)(globals.page.h - mane.height));
+#else
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params == 0 ? (-2 * (int)mane.height / 3)
+ : (int)(-my_atof(*params) * mane.height)));
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Vertical scrolling not possible"); */
+ }
+#endif
+#ifdef USE_PANNER
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+static void
+Act_down(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("down()", params, *num_params, 1);
+
+#ifdef MOTIF
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "down for %p\n", (void *)w);
+#endif
+ get_xy();
+ (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (2 * (int)mane.height / 3)
+ : (int)(my_atof(*params) * mane.height)) - m_window_y,
+ (int)(globals.page.h - mane.height));
+#else
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params == 0 ? (2 * (int)mane.height / 3)
+ : (int)(my_atof(*params) * mane.height)));
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "Vertical scrolling not possible"); */
+ }
+#endif
+#ifdef USE_PANNER
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+static void
+Act_down_or_next(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("down-or-next()", params, *num_params, 1);
+
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "down-or-next for %p\n", (void *)w);
+#endif
+
+#ifdef MOTIF
+ get_xy();
+ if (m_window_y > (int)mane.height - (int)globals.page.h) {
+ (void)set_bar_value(globals.widgets.y_bar, (*num_params == 0 ? (2 * (int)mane.height / 3)
+ : (int)(my_atof(*params) * mane.height)) -
+ m_window_y, (int)(globals.page.h - mane.height));
+ return;
+ }
+#else
+ if (globals.widgets.y_bar != NULL) {
+ get_xy();
+ if (m_window_y > (int)mane.height - (int)globals.page.h) {
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params ==
+ 0 ? (2 * (int)mane.height / 3)
+ : (int)(my_atof(*params) * mane.height)));
+ return;
+ }
+ }
+#endif
+
+ if (current_page < total_pages - 1) {
+ goto_page(current_page + 1, home, False);
+ search_signal_page_changed();
+ }
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "At bottom of last page"); */
+ }
+#ifdef USE_PANNER
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+ statusline_erase("Page history:");
+}
+
+
+static void
+Act_up_or_previous(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ do_autoscroll = False;
+
+ warn_num_params("up-or-previous()", params, *num_params, 1);
+
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "up-or-previous for %p\n", (void *)w);
+#endif
+#ifdef MOTIF
+ get_xy();
+ if (m_window_y < 0) {
+ (void)set_bar_value(globals.widgets.y_bar,
+ (*num_params == 0 ? (-2 * (int)mane.height / 3)
+ : (int)(-my_atof(*params) * mane.height)) - m_window_y,
+ (int)(globals.page.h - mane.height));
+ return;
+ }
+#else
+ if (globals.widgets.y_bar != NULL) {
+ get_xy();
+ if (m_window_y < 0) {
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(*num_params ==
+ 0 ? (-2 * (int)mane.height / 3)
+ : (int)(-my_atof(*params) * mane.height)));
+ return;
+ }
+ }
+#endif
+
+ if (current_page > 0) {
+ goto_page(current_page - 1, home_bottom, False);
+ search_signal_page_changed();
+ }
+ else {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "At top of first page"); */
+ }
+ statusline_erase("Page history:");
+#ifdef USE_PANNER
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+
+static void
+Act_set_margins(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+#ifndef MOTIF
+ if (event == NULL)
+ return; /* button actions do not provide events */
+#endif
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y, &resource.sidemargin_int, &resource.topmargin_int, &dummy); /* throw away last argument */
+ statusline_info(STATUS_SHORT, "Margins set to cursor position (%d, %d)", resource.sidemargin_int, resource.topmargin_int);
+ resource.sidemargin_int *= mane.shrinkfactor;
+ resource.topmargin_int *= mane.shrinkfactor;
+}
+
+static void
+Act_show_display_attributes(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ statusline_error(STATUS_SHORT, "Unit = %d, bitord = %d, byteord = %d",
+ BitmapUnit(DISP), BitmapBitOrder(DISP),
+ ImageByteOrder(DISP));
+}
+
+int
+shrink_to_fit(void)
+{
+ int value1;
+ int value2;
+ static Dimension window_w;
+#ifndef MOTIF
+ static Dimension window_h;
+#endif
+
+ static Arg arg_wh[] = {
+ {XtNwidth, (XtArgVal) &window_w}
+#ifndef MOTIF
+ , {XtNheight, (XtArgVal) &window_h}
+#endif
+ };
+
+
+#ifdef MOTIF
+ XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh));
+#else
+ XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh));
+#endif
+
+ value1 = ROUNDUP(globals.page.unshrunk_w, window_w - 2);
+
+#ifdef MOTIF
+ { /* account for menubar */
+ static Dimension new_h;
+
+ /* get rid of scrollbar */
+ XtVaSetValues(globals.widgets.draw_widget, XtNwidth, (XtArgVal)1, XtNheight, (XtArgVal)1, NULL);
+ XtVaGetValues(globals.widgets.clip_widget, XtNheight, &new_h, NULL);
+ value2 = ROUNDUP(globals.page.unshrunk_h, new_h - 2);
+ }
+#else
+ /* FIXME: value seems too small here! */
+ value2 = ROUNDUP(globals.page.unshrunk_h, window_h - 2);
+#endif
+
+ return value1 > value2 ? value1 : value2;
+}
+
+void
+do_set_shrinkfactor(int arg, Boolean set_resource)
+{
+ static int shrink_bak = -1;
+
+ /* We don't store this as preference since it may affect initial window geometry. */
+ /* store_preference(NULL, "shrinkFactor", "%d", arg); */
+
+ if (globals.curr_mode == TEXT_MODE_ACTIVE) {
+ text_change_region(TEXT_SEL_CLEAR, NULL);
+ }
+
+ mane.shrinkfactor = arg;
+ if (set_resource)
+ resource.shrinkfactor = mane.shrinkfactor;
+
+ set_menu(&arg, Act_set_shrink_factor, check_int);
+#if HAVE_XMP
+ tb_set_zoom_sensitivity(arg != 1);
+#endif
+
+ if (arg != 1 && arg != shrink_bak) {
+ shrink_bak = arg;
+#if GREY
+#if COLOR
+ if (resource.use_grey)
+ fg_active = NULL;
+#else
+ if (resource.use_grey)
+ init_pix();
+#endif
+#endif /* GREY */
+ reset_fonts();
+ }
+ init_page();
+ reconfig();
+
+ htex_resize_page();
+
+ /* this seems unneccessary */
+ /* if (!resource.keep_flag) */
+ /* home(False); */
+
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+
+/* A 'meta' action that is bound to mouse buttons and invokes actions depending on current mouse mode */
+void
+Act_mouse_modes(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int i;
+ size_t mode_idx = 0; /* default: one action for all modes */
+ struct xdvi_action *my_action = NULL, *ap = NULL;
+
+ if (*num_params > 1) { /* different actions */
+ if (resource.mouse_mode >= *num_params) {
+ size_t k;
+ XDVI_WARNING((stderr, "Only %d parameters in X resource 'mouse-modes', should be %d",
+ *num_params, resource.mouse_mode + 1));
+ for (k = 0; k < *num_params; k++) {
+ XDVI_WARNING((stderr, "Param %d: `%s'", (int)(k + 1), params[k]));
+ }
+ return;
+ }
+ mode_idx = resource.mouse_mode;
+ }
+
+ cached_compile_action(params[mode_idx], &my_action);
+ for (i = 0, ap = my_action; ap; ap = ap->next, i++) {
+ String *args;
+ String retval;
+
+ TRACE_EVENTS((stderr, "Action %d for mode %lu: '%s', %d args |%s| maps to proc |%p|",
+ i, (unsigned long) mode_idx, ap->command, ap->num_params,
+ ap->num_params > 0 ? ap->params[0] : "(none)",
+ ap->proc));
+
+ /* copy args because the action proc may modify them (see below) */
+ if (ap->num_params) {
+ args = xmalloc(ap->num_params * sizeof (String));
+ memcpy(args, ap->params, ap->num_params * sizeof (String));
+ }
+ else args = xmalloc(sizeof (String));
+
+ /* now call the action proc directly */
+ XtCallActionProc(w, ap->command, event, args, ap->num_params);
+
+ retval = args[0];
+ free(args);
+ if (retval == Act_true_retval) { /* we may compare the pointers here */
+ /* Special case: Only invoke first action, not subsequent ones;
+ * e.g. if mouse is over a link and action is Act_href or
+ * Act_href_newwindow (currently the only cases where this is used).
+ */
+ break;
+ }
+ }
+}
+
+
+void
+Act_set_shrink_factor(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ /* Set a limit to the shrink factors allowed; otherwise xdvi may
+ consume a lot of memory (even run out of memory in malloc) in
+ the allocation for the subpixel lookup table pixeltbl,
+ dvi-draw.c. The `correct' solution would be to recognize that at a
+ certain shrink, the only pixel for a character will be always
+ set to `on' anyway, so that we could do without the lookup table for
+ very large shrink factors ... */
+ static const int SHRINK_MAX = 999;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("set-shrink-factor()", params, *num_params, 1);
+
+ if (*num_params > 0) {
+ if (**params == 'a')
+ arg = shrink_to_fit();
+ else if (**params == '-')
+ arg = mane.shrinkfactor + 1;
+ else if (**params == '+')
+ arg = mane.shrinkfactor - 1;
+ else
+ arg = atoi(*params);
+ }
+ else if (!get_prefix_arg(&arg)) {
+ arg = shrink_to_fit();
+ }
+
+ if (arg <= 0) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, */
+/* "No more enlarging possible"); */
+ return;
+ }
+
+ if (arg > SHRINK_MAX) {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT,
+ "Shrink factor %d too large (maximum: %d)", arg, SHRINK_MAX);
+ return;
+ }
+
+ /* SU: added clearing the window here, else old window content
+ will survive changing shrink
+ */
+ if (globals.pausing.flag) {
+#if PS_GS
+ gs_erase_page();
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+
+ statusline_info(STATUS_SHORT, "shrink factor: %d", arg);
+#if 0
+ /* Uncommented this, otherwise selecting `shrink to fit' with same value as
+ current mane.shrinkfactor will clear the canvas (only fixed by changing shrink
+ factor again). That bug is also present in xdvik-22.48-alpha3. */
+ if (arg == mane.shrinkfactor) {
+ return;
+ }
+#endif
+
+ do_set_shrinkfactor(arg, True);
+
+#if MOTIF
+ /* note: mustn't do that inside do_set_shrinkfactor(),
+ or we get into an endless loop! */
+ update_preferences_shrink();
+#endif
+}
+
+void
+Act_shrink_to_dpi(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("shrink-to-dpi()", params, *num_params, 1);
+
+ if (!get_int_arg(params, num_params, &arg))
+ arg = 0;
+
+ if (arg > 0)
+ arg = (double)resource.pixels_per_inch / arg + 0.5;
+
+ if (arg <= 0) {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT,
+ "shrink-to-dpi requires a positive argument");
+ return;
+ }
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+#if PS_GS
+ gs_erase_page();
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+#if 0
+ /* Uncommented this, otherwise selecting `shrink to fit' with same value as
+ current mane.shrinkfactor will clear the canvas (only fixed by changing shrink
+ factor again). That bug is also present in xdvik-22.48-alpha3. */
+ if (arg == mane.shrinkfactor)
+ return;
+#endif
+ do_set_shrinkfactor(arg, True);
+
+#if MOTIF
+ /* note: mustn't do that inside do_set_shrinkfactor(),
+ or we get into an endless loop! */
+ update_preferences_shrink();
+#endif
+}
+
+void
+do_set_density(double newgamma, Boolean force, Boolean update_resource)
+{
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+ XClearWindow(DISP, mane.win);
+ }
+
+#ifdef GREY
+ if (resource.use_grey) {
+ if (newgamma == resource.gamma && !force) {
+ statusline_info(STATUS_SHORT, "density value: %.3f", newgamma);
+ return;
+ }
+ resource.gamma = newgamma;
+ if (update_resource)
+ globals.curr_gamma = resource.gamma;
+
+#if COLOR
+ fg_active = NULL;
+ reset_colors();
+#else
+ init_pix();
+ if (G_visual->class != TrueColor) {
+ return;
+ }
+ reset_fonts();
+#endif /* COLOR */
+ statusline_info(STATUS_SHORT, "density value: %.3f", newgamma);
+ } else
+#endif /* GREY */
+ {
+ reset_fonts();
+ if (mane.shrinkfactor == 1) {
+ statusline_info(STATUS_SHORT,
+ "set-density ignored at magnification 1");
+ return;
+ }
+ statusline_info(STATUS_SHORT, "density value: %.3f", newgamma);
+ }
+
+ store_preference(NULL, "gamma", "%f", resource.gamma);
+
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+static void
+Act_set_density(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("set-density()", params, *num_params, 1);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ xdvi_bell();
+ return;
+ }
+ /* if (arg < 0) { */
+ /* XBell(DISP, 0); */
+ /* statusline_info(STATUS_SHORT, */
+ /* "set-density requires a positive value"); */
+ /* return; */
+ /* } */
+ do_set_density(arg != 0 ? arg / 100.0 : 1.0, False, True);
+#if MOTIF
+ update_preferences_darkness();
+#else
+ store_preference(NULL, "gamma", "%f", resource.gamma);
+#endif
+}
+
+
+static void
+Act_change_density(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ double diff;
+ double oldgamma = resource.gamma;
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("change-density()", params, *num_params, 1);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ xdvi_bell();
+ return;
+ }
+ diff = oldgamma / arg;
+ if (oldgamma + diff <= 0.0)
+ oldgamma = 0.0;
+ else
+ oldgamma += diff;
+ do_set_density(oldgamma, False, True);
+#if MOTIF
+ update_preferences_darkness();
+#endif
+}
+
+static void h_restore_scroll_position(int orig_pos,
+#ifndef MOTIF
+ Dimension *get_pos,
+#endif
+ Widget scrollbar)
+{
+ if (resource.keep_flag && orig_pos != 0 && scrollbar != NULL) {
+#ifdef MOTIF
+ if (!resource.fullscreen) {
+ /* only scroll back in non-fullscreen mode */
+ (void)set_bar_value(scrollbar, orig_pos, INT_MAX);
+ }
+#else
+ int curr_pos;
+ get_xy();
+ XtVaGetValues(globals.widgets.clip_widget, XtNx, get_pos, NULL);
+ curr_pos = -((*get_pos) - m_window_x);
+ if (curr_pos - orig_pos > 0) {
+ XtCallCallbacks(scrollbar, XtNscrollProc, cast_int_to_XtPointer(curr_pos - orig_pos));
+ }
+#endif /* MOTIF */
+ }
+}
+
+static void
+Act_fullscreen(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Dimension main_win_w, main_win_h;
+ static int orig_x = 0, orig_y = 0;
+#ifndef MOTIF
+ static Dimension get_x, get_y;
+#endif
+ static Dimension old_w = 0, old_h = 0;
+ Dimension panel_width = 0;
+#if 0
+ static Dimension w_old = 0, h_old = 0;
+#endif
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!toggle_arg(resource.fullscreen, params, num_params)) {
+ return;
+ }
+
+ resource.fullscreen = !resource.fullscreen;
+
+#ifndef MOTIF
+ panel_width = get_panel_width();
+#endif
+
+ if (resource.fullscreen) {
+ /* when toggling to fullscreen, save current scrollbar values
+ and window geometry */
+ XtVaGetValues(globals.widgets.top_level, XtNwidth, &old_w, XtNheight, &old_h, NULL);
+ /* fprintf(stderr, "saved geometry: %dx%d\n", old_w, old_h); */
+#ifdef MOTIF
+ if (globals.widgets.x_bar != NULL)
+ XtVaGetValues(globals.widgets.x_bar, XmNvalue, &orig_x, NULL);
+ if (globals.widgets.y_bar != NULL)
+ XtVaGetValues(globals.widgets.y_bar, XmNvalue, &orig_y, NULL);
+#else
+ get_xy();
+ if (globals.widgets.x_bar != NULL)
+ XtVaGetValues(globals.widgets.clip_widget, XtNx, &get_x, NULL);
+ if (globals.widgets.y_bar != NULL)
+ XtVaGetValues(globals.widgets.clip_widget, XtNy, &get_y, NULL);
+ orig_x = -(get_x - m_window_x);
+ orig_y = -(get_y - m_window_y);
+#endif /* MOTIF */
+ /* fprintf(stderr, "Current offsets: %d, %d, %d, %d\n", orig_x, m_window_x, orig_y, m_window_y); */
+ }
+ if (resource.fullscreen) {
+ set_windowsize(&main_win_w, &main_win_h, panel_width, 0, False);
+ }
+ else { /* re-use old window sizes, or initialize them if started in fullscreen mode */
+ if (old_w == 0 || old_h == 0) /* started in fullscreen mode */
+ set_windowsize(&old_w, &old_h, panel_width, 0, False);
+ else
+ set_windowsize(&old_w, &old_h, panel_width, 0, True);
+ }
+
+ /* fprintf(stderr, "reconfigure window!\n"); */
+ if (resource.fullscreen)
+ reconfigure_window(resource.fullscreen, main_win_w, main_win_h, True);
+ else {
+ reconfigure_window(resource.fullscreen, old_w, old_h, True);
+ }
+
+ /* restore horizontal/vertical scroll positions */
+ h_restore_scroll_position(orig_x,
+#ifndef MOTIF
+ &get_x,
+#endif
+ globals.widgets.x_bar);
+ h_restore_scroll_position(orig_y,
+#ifndef MOTIF
+ &get_y,
+#endif
+ globals.widgets.y_bar);
+
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+#ifdef GREY
+
+static void
+Act_set_greyscaling(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ warn_num_params("set-greyscaling()", params, *num_params, 1);
+
+ if (!get_int_arg(params, num_params, &arg)) { /* no arg, toggle */
+ if (!toggle_arg(resource.use_grey, params, num_params)) {
+ return;
+ }
+ resource.use_grey = !resource.use_grey;
+ if (resource.use_grey) {
+ statusline_info(STATUS_SHORT, "greyscaling on");
+ }
+ else {
+ statusline_info(STATUS_SHORT, "greyscaling off");
+ }
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+ return;
+ }
+
+ switch (arg) {
+ case 0:
+ resource.use_grey = False;
+ statusline_info(STATUS_SHORT, "greyscaling off");
+ break;
+ case 1:
+ resource.use_grey = True;
+ statusline_info(STATUS_SHORT, "greyscaling on");
+ break;
+ default:
+ {
+ float newgamma = arg != 0 ? arg / 100.0 : 1.0;
+ resource.use_grey = newgamma;
+ statusline_info(STATUS_SHORT, "greyscale value: %.1f", newgamma);
+ }
+ }
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+ XClearWindow(DISP, mane.win);
+ }
+
+ if (resource.use_grey) {
+ if (G_visual->class != TrueColor)
+ init_plane_masks();
+#if COLOR
+ fg_active = NULL;
+#else
+ init_pix();
+#endif
+ }
+ reset_fonts();
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+#endif
+
+#if COLOR
+
+void
+do_toggle_color(Boolean update_resource)
+{
+ if (resource.use_color) {
+ resource.use_color = False;
+ full_reset_colors();
+ scanned_page_color = total_pages;
+#if PS
+ if (ignore_papersize_specials || scanned_page_ps <= total_pages) {
+ scanned_page = scanned_page_ps;
+ }
+#endif
+ statusline_info(STATUS_SHORT, "color specials off");
+ }
+ else {
+ resource.use_color = True;
+ scanned_page = scanned_page_color = scanned_page_reset;
+ statusline_info(STATUS_SHORT, "color specials on");
+ }
+ if (update_resource)
+ globals.curr_use_color = resource.use_color;
+
+#ifdef MOTIF
+ update_preferences_color();
+#endif
+ globals.ev.flags |= EV_NEWPAGE;
+}
+
+static void
+Act_set_color(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!toggle_arg(resource.use_color, params, num_params)) {
+ return;
+ };
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+ XClearWindow(DISP, mane.win);
+ }
+
+ do_toggle_color(True);
+}
+
+#endif /* COLOR */
+
+#if PS
+
+void
+Act_set_ps(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(event);
+ UNUSED(w);
+
+ if (!get_int_arg(params, num_params, &arg))
+ resource.postscript++;
+ else
+ resource.postscript = arg;
+
+ if (resource.postscript > 2)
+ resource.postscript = 0;
+
+#ifdef PS_GS
+ if (!resource.useGS) {
+ if (resource.postscript > 0) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ "This version of xdvi depends on ghostscript for rendering Postscript images. "
+ "Postscript rendering cannot be activated if the option ``-noghostscript'' is used "
+ "or if the resource ``Ghostscript'' is set to false.",
+ /* message */
+ "Option ``-noghostscript'' is active; "
+ "cannot enable Postscript rendering without ghostscript.");
+ }
+ resource.postscript = 0;
+ }
+#endif
+ if (resource.postscript > 0) {
+ scanned_page_ps = scanned_page_ps_bak;
+ if (scanned_page > scanned_page_ps)
+ scanned_page = scanned_page_ps;
+ if (resource.postscript == 1) {
+ statusline_info(STATUS_SHORT, "Postscript rendering on");
+ }
+ else {
+ statusline_info(STATUS_SHORT, "Postscript rendering on (with bounding box)");
+ }
+ }
+ else {
+ scanned_page_ps_bak = scanned_page_ps;
+ scanned_page_ps = total_pages;
+#if COLOR
+ if (ignore_papersize_specials || scanned_page_color <= total_pages) {
+ scanned_page = scanned_page_color;
+ }
+#endif
+ statusline_info(STATUS_SHORT, "Postscript rendering off; displaying bounding box instead");
+ }
+
+ store_preference(NULL, "postscript", "%d", resource.postscript);
+
+ psp.toggle(resource.postscript);
+
+ set_menu(&resource.postscript, Act_set_ps, check_int);
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+ XClearWindow(DISP, mane.win);
+ }
+
+ globals.ev.flags |= EV_PS_TOGGLE;
+ XFlush(DISP);
+}
+
+#endif /* PS */
+
+void
+Act_htex_back(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ htex_back();
+}
+
+void
+Act_htex_forward(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ htex_forward();
+}
+
+static void
+Act_htex_anchorinfo(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int x, y;
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y, &x, &y, &dummy);
+ htex_displayanchor(x, y);
+}
+
+#ifdef PS_GS
+void
+Act_set_gs_alpha(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!toggle_arg(resource.gs_alpha, params, num_params)) {
+ return;
+ }
+ resource.gs_alpha = !resource.gs_alpha;
+
+ if (resource.gs_alpha) {
+ statusline_info(STATUS_SHORT, "ghostscript alpha active");
+ }
+ else {
+ statusline_info(STATUS_SHORT, "ghostscript alpha inactive");
+ }
+
+ store_preference(NULL, "gsAlpha", "%s", resource.gs_alpha ? "True" : "False");
+
+ set_menu(&resource.gs_alpha, Act_set_gs_alpha, check_toggle);
+
+ /* like elsewhere */
+ if (globals.pausing.flag) {
+#if PS_GS
+ gs_erase_page();
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+
+ globals.ev.flags |= EV_PS_TOGGLE;
+ XFlush(DISP);
+}
+#endif
+
+static void
+Act_reread_dvi_file(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ /* fprintf(stderr, "reread file!\n"); */
+ globals.ev.flags |= EV_RELOAD;
+}
+
+static void
+Act_discard_number(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ m_have_arg = False;
+ m_number = 0;
+ m_sign = 1;
+
+ statusline_info(STATUS_SHORT, "numerical prefix discarded");
+}
+
+/*
+ * Actions to support dragging the image.
+ */
+
+static int drag_last_x, drag_last_y; /* last position of cursor */
+
+static int text_last_x = -1;
+static int text_last_y = -1;
+static int text_last_page = -1;
+
+static void drag_motion(XEvent *);
+static void drag_release(XEvent *);
+
+static void
+text_release(XEvent * event)
+{
+ int ulx, uly, w, h;
+ static char *text;
+ int text_len = 0;
+
+ UNUSED(event);
+
+ MYTRACE((stderr, "text_release!\n"));
+
+ if (mouse_motion == null_mouse)
+ return;
+ mouse_motion = mouse_release = null_mouse;
+
+ w = text_last_x - drag_last_x;
+ h = text_last_y - drag_last_y;
+
+ if (w == 0 || h == 0) {
+ text_last_x = text_last_y = -1;
+ drag_last_x = drag_last_y = -1;
+ text_last_page = -1;
+ return;
+ }
+
+ if (w < 0) {
+ ulx = drag_last_x + w;
+ w = -w;
+ }
+ else
+ ulx = drag_last_x;
+
+ if (h < 0) {
+ uly = drag_last_y + h;
+ h = -h;
+ }
+ else
+ uly = drag_last_y;
+
+ free(text);
+ /* this allocates text */
+ text = get_text_selection(&text_len,
+ ulx * currwin.shrinkfactor,
+ uly * currwin.shrinkfactor,
+ (ulx + w) * currwin.shrinkfactor,
+ (uly + h) * currwin.shrinkfactor);
+ if (text[0] == '\0') {
+ /* fprintf(stdout, "Text selection empty.\n"); */
+ return;
+ }
+
+ TRACE_GUI((stderr, "Selected `%s'", text));
+
+ if (text_len > 4 * XMaxRequestSize(DISP) - 32) {
+ xdvi_bell();
+ statusline_error(STATUS_MEDIUM, "Selection too large (%d bytes, maximum %d bytes)",
+ text_len, 4 * XMaxRequestSize(DISP) - 32);
+ return;
+ }
+
+ if (!set_selection(text, globals.widgets.top_level)) {
+ xdvi_bell();
+ statusline_error(STATUS_MEDIUM, "Could not set primary selection!");
+ text_change_region(TEXT_SEL_CLEAR, NULL);
+ }
+}
+
+void
+text_motion(XEvent *event)
+{
+ MYTRACE((stderr, "motion!\n"));
+ text_change_region(TEXT_SEL_MOVE, event);
+}
+
+static void
+get_rectangle(XRectangle *rect, int x, int y, int last_x, int last_y)
+{
+ rect->width = ABS(x - last_x);
+ rect->height = ABS(y - last_y);
+ rect->x = (x < last_x) ? x : last_x;
+ rect->y = (y < last_y) ? y : last_y;
+}
+
+static void
+crop_to_window(int *x, int *y)
+{
+ if (*x < -currwin.base_x + 1)
+ *x = -currwin.base_x + 1;
+ else if (*x > -currwin.base_x + (int)ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1)
+ *x = -currwin.base_x + ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1;
+
+ if (*y < -currwin.base_y + 1)
+ *y = -currwin.base_y + 1;
+ else if (*y > -currwin.base_y + (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1)
+ *y = -currwin.base_y + (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1;
+}
+
+void
+text_change_region(textSelectionT mode, XEvent *event)
+{
+ static GC bboxGC = 0;
+ static GC redrawGC = 0; /* needed since bboxGC is clipped to diff of old and new region */
+
+ if (bboxGC == 0) {
+ XGCValues values;
+ unsigned long valuemask;
+
+ values.function = GXinvert; /* as in search code */
+ if (values.function == GXinvert) {
+ valuemask = GCFunction;
+ }
+ else {
+ values.foreground = WhitePixelOfScreen(SCRN) ^ BlackPixelOfScreen(SCRN);
+ /* fprintf(stderr, "foreground: 0x%lx, white pixel: 0x%lx, black pixel: 0x%lx\n", */
+ /* values.foreground, WhitePixelOfScreen(SCRN), BlackPixelOfScreen(SCRN)); */
+ valuemask = GCFunction | GCForeground;
+ }
+ values.line_width = 1;
+ valuemask |= GCLineWidth;
+ bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values);
+ redrawGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values);
+ }
+
+ MYTRACE((stderr, "mode: %d\n", mode));
+ switch (mode) {
+ case TEXT_SEL_MOVE:
+ {
+ int x, y;
+
+ Window dummy;
+
+ XRectangle redraw = { -1, -1, 0, 0 };
+
+ ASSERT(event != NULL, "event in text_change_region() musn't be NULL for TEXT_SEL_MOVE");
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y,
+ &x, &y,
+ &dummy);
+
+ crop_to_window(&x, &y);
+
+ get_rectangle(&redraw, x, y, drag_last_x, drag_last_y);
+
+ /*
+ * If we have an old region, we want to clip the GC to the area:
+ *
+ * (clip \cup redraw) - (clip \cap redraw)
+ *
+ * and redraw both rectangle areas; otherwise, just draw the redraw area.
+ */
+
+ if (text_last_x != -1 && text_last_y != -1) {
+
+ XRectangle clip = { -1, -1, 0, 0 };
+
+ Region clip_region = XCreateRegion();
+ Region redraw_region = XCreateRegion();
+ Region union_region = XCreateRegion();
+ Region intersect_region = XCreateRegion();
+
+ get_rectangle(&clip, text_last_x, text_last_y, drag_last_x, drag_last_y);
+
+ XUnionRectWithRegion(&clip, clip_region, clip_region);
+ XUnionRectWithRegion(&redraw, redraw_region, redraw_region);
+
+ XUnionRegion(clip_region, redraw_region, union_region);
+ XIntersectRegion(clip_region, redraw_region, intersect_region);
+
+ XSubtractRegion(union_region, intersect_region, redraw_region);
+
+ XSetRegion(DISP, bboxGC, redraw_region);
+
+ XDestroyRegion(clip_region);
+ XDestroyRegion(redraw_region);
+ XDestroyRegion(union_region);
+ XDestroyRegion(intersect_region);
+
+ XFillRectangle(DISP, mane.win, bboxGC, clip.x, clip.y, clip.width, clip.height);
+ }
+
+ XFillRectangle(DISP, mane.win, bboxGC, redraw.x, redraw.y, redraw.width, redraw.height);
+
+ text_last_x = x;
+ text_last_y = y;
+ text_last_page = current_page;
+ }
+ break;
+ case TEXT_SEL_CLEAR:
+ unset_selection(globals.widgets.top_level);
+ case TEXT_SEL_ERASE:
+ case TEXT_SEL_REDRAW:
+ if (text_last_page == current_page
+ && text_last_x != -1 && text_last_y != -1
+ && drag_last_x != -1 && drag_last_y != -1) {
+
+ XRectangle clear = { -1, -1, 0, 0 };
+
+ get_rectangle(&clear, text_last_x, text_last_y, drag_last_x, drag_last_y);
+
+ if (mode == TEXT_SEL_CLEAR) {
+ text_last_x = text_last_y = drag_last_x = drag_last_y = -1;
+ text_last_page = -1;
+ /* Note ZLB: the region is erased instead of inverted to avoid
+ * multiple inverting problem. An exposure is generated to
+ * make the region redrawn */
+ clearexpose(&mane, clear.x, clear.y, clear.width, clear.height);
+ }
+ else if (clip_region_to_rect(&clear)) {
+ if (mode == TEXT_SEL_ERASE) {
+ /* If width or height are 0, XClearArea will clear entire window
+ * from coordinates x, y, so check for that: */
+ if (clear.width > 0 && clear.height > 0)
+ XClearArea(DISP, mane.win, clear.x, clear.y, clear.width, clear.height, False);
+ }
+ else
+ XFillRectangle(DISP, mane.win, redrawGC, clear.x, clear.y, clear.width, clear.height);
+ }
+ }
+ break;
+ }
+}
+
+void
+text_selection_start(XEvent *event)
+{
+ int x, y;
+ Window dummy;
+
+ /* erase existing region */
+ text_change_region(TEXT_SEL_CLEAR, NULL);
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y,
+ &x, &y,
+ &dummy); /* throw away last argument */
+
+ crop_to_window(&x, &y);
+
+ drag_last_x = x;
+ drag_last_y = y;
+
+ text_last_x = text_last_y = -1;
+
+ MYTRACE((stderr, "selection start; mouse_release: %p; null: %p!\n", mouse_release, null_mouse));
+ if (mouse_release == null_mouse) {
+ MYTRACE((stderr, "init text_motion!\n"));
+ mouse_motion = text_motion;
+ mouse_release = text_release;
+ }
+/* resource.mouse_mode_text_selection_active = True; */
+}
+
+void
+Act_switch_mode(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+/* mouseModeT prev_mode = resource.mouse_mode; */
+ int arg = -1;
+/* char *ptr; */
+ const char *mode_name = NULL;
+ const char *mode_description = NULL;
+/* XEvent ev; */
+
+ /* if called the first time from main(), this is only used
+ * to initialize the menu according to the mode.
+ */
+ Boolean initialization = (w == globals.widgets.top_level);
+
+ UNUSED(event);
+
+ if (get_int_arg(params, num_params, &arg)) {
+ if (arg < MOUSE_MODE1 || arg >= MOUSE_MODE_MAX) {
+ statusline_info(STATUS_SHORT, "Argument for Act_switch_mode outside of range from %d to %d",
+ MOUSE_MODE1, MOUSE_MODE_MAX - 1);
+ resource.mouse_mode++;
+ }
+ else
+ resource.mouse_mode = (mouseModeT)arg;
+ }
+ else
+ resource.mouse_mode++;
+
+ /* check if wrapped */
+ if (resource.mouse_mode >= MOUSE_MODE_MAX)
+ resource.mouse_mode = MOUSE_MODE1;
+
+ if (globals.curr_mode == RULER_MODE_ACTIVE) {
+ clear_ruler();
+ mouse_motion = mouse_release = null_mouse;
+ }
+ else if (globals.curr_mode == TEXT_MODE_ACTIVE) {
+ text_change_region(TEXT_SEL_CLEAR, NULL);
+ mouse_motion = mouse_release = null_mouse;
+ }
+ globals.curr_mode = NO_MODE_ACTIVE;
+
+ switch(resource.mouse_mode) {
+ case MOUSE_MODE1:
+ mode_name = resource.mouse_mode1_name;
+ mode_description = resource.mouse_mode1_description;
+ break;
+ case MOUSE_MODE2:
+ mode_name = resource.mouse_mode2_name;
+ mode_description = resource.mouse_mode2_description;
+/* globals.cursor.flags |= CURSOR_TEXT; /\*XXX FIXME: don't hardcode flag here; instead, have Act_text_selection set it *\/ */
+ break;
+ case MOUSE_MODE3:
+ mode_name = resource.mouse_mode3_name;
+ mode_description = resource.mouse_mode3_description;
+/* globals.cursor.flags |= CURSOR_RULER; */
+ break;
+ default: /* can't happen */
+ XDVI_WARNING((stderr, "resource.mouse_mode larger than %d!", resource.mouse_mode));
+ break;
+ }
+
+ globals.ev.flags |= EV_CURSOR;
+ XFlush(DISP);
+
+ if (!initialization) {
+ statusline_info(STATUS_SHORT, "%s mode; %s", mode_name, mode_description);
+ store_preference(NULL, "mouseMode", "%d", resource.mouse_mode);
+ }
+ set_menu(&resource.mouse_mode, Act_switch_mode, check_int);
+
+
+ /*XXX FIXME: Activate mode by synthesizing a mouse event??? */
+/* synthesize_event(&ev, globals.widgets.draw_widget); */
+/* Act_mouse_modes(w, event, params, num_params); */
+}
+
+static void
+Act_drag(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+
+ if (mouse_release != null_mouse && mouse_release != drag_release)
+ return;
+
+ if ((globals.curr_mode == TEXT_MODE_ACTIVE) && text_last_page != -1
+ /* this was:
+ && (text_last_x != drag_last_x || text_last_y != drag_last_y)
+ but that isn't restrictive enough */
+ ) { /* dragging would mess up region drawing */
+ xdvi_bell();
+ statusline_info(STATUS_SHORT, "Cannot drag page when selection is active");
+ return;
+ }
+
+ if (*num_params != 1) {
+ XDVI_WARNING((stderr, "drag() requires 1 argument (got %d)", *num_params));
+ return;
+ }
+ switch (**params) {
+ case '|':
+ globals.cursor.flags |= CURSOR_DRAG_V;
+ break;
+ case '-':
+ globals.cursor.flags |= CURSOR_DRAG_H;
+ break;
+ case '+':
+ globals.cursor.flags |= CURSOR_DRAG_A;
+ break;
+ default:
+ XDVI_WARNING((stderr, "drag(): Valid arguments are `+', `|' or `-'"));
+ }
+
+ globals.ev.flags |= EV_CURSOR;
+
+ if (mouse_release == null_mouse) {
+ mouse_motion = drag_motion;
+ mouse_release = drag_release;
+ drag_last_x = event->xbutton.x_root;
+ drag_last_y = event->xbutton.y_root;
+ }
+ else
+ drag_motion(event);
+
+ XFlush(DISP);
+}
+
+
+static void
+drag_motion(XEvent * event)
+{
+#ifdef MOTIF
+ get_xy();
+#endif
+
+ if (globals.cursor.flags & (CURSOR_DRAG_H | CURSOR_DRAG_A)) { /* horizontal motion */
+#ifdef MOTIF
+ (void)set_bar_value(globals.widgets.x_bar,
+ drag_last_x - event->xbutton.x_root - m_window_x,
+ (int)(globals.page.w - mane.width));
+#else
+ if (globals.widgets.x_bar != NULL) {
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc,
+ cast_int_to_XtPointer(drag_last_x - event->xbutton.x_root));
+ }
+#endif
+ drag_last_x = event->xbutton.x_root;
+ }
+
+ if (globals.cursor.flags & (CURSOR_DRAG_V | CURSOR_DRAG_A)) { /* vertical motion */
+#ifdef MOTIF
+ (void)set_bar_value(globals.widgets.y_bar,
+ drag_last_y - event->xbutton.y_root - m_window_y,
+ (int)(globals.page.h - mane.height));
+#else
+ if (globals.widgets.y_bar != NULL) {
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(drag_last_y - event->xbutton.y_root));
+ }
+#endif
+ drag_last_y = event->xbutton.y_root;
+ }
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+
+static void
+drag_release(XEvent * event)
+{
+ drag_motion(event);
+ mouse_motion = mouse_release = null_mouse;
+
+ globals.cursor.flags &= ~(CURSOR_DRAG_H | CURSOR_DRAG_V | CURSOR_DRAG_A);
+ globals.ev.flags |= EV_CURSOR;
+ XFlush(DISP);
+}
+
+
+
+/* Wheel mouse support. */
+
+static int wheel_button = -1;
+
+static void
+Act_wheel(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int dist;
+
+ UNUSED(w);
+
+ if (*num_params != 1) {
+ XDVI_WARNING((stderr, "wheel() requires 1 argument (got %d)", *num_params));
+ return;
+ }
+ dist = (strchr(*params, '.') == NULL) ? atoi(*params)
+ : (int)(my_atof(*params) * resource.wheel_unit);
+#ifdef MOTIF
+ get_xy();
+ set_bar_value(globals.widgets.y_bar, dist - m_window_y, (int)(globals.page.h - mane.height));
+#else
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(dist));
+#endif
+
+ if (event != NULL)
+ wheel_button = event->xbutton.button;
+
+#ifdef USE_PANNER
+ handle_y_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+static int wheel_h_button = -1;
+
+static void
+Act_hwheel(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int dist;
+
+ UNUSED(w);
+
+ if (*num_params != 1) {
+ XDVI_WARNING((stderr, "wheel() requires 1 argument (got %d)", *num_params));
+ return;
+ }
+ dist = (strchr(*params, '.') == NULL) ? atoi(*params)
+ : (int)(my_atof(*params) * resource.wheel_unit);
+#ifdef MOTIF
+ get_xy();
+ set_bar_value(globals.widgets.x_bar, dist - m_window_x,
+ (int) (globals.page.w - mane.width));
+#else
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc,
+ cast_int_to_XtPointer(dist));
+#endif
+
+ if (event != NULL)
+ wheel_h_button = event->xbutton.button;
+
+#ifdef USE_PANNER
+ handle_x_scroll(NULL, NULL, NULL, NULL);
+#endif
+}
+
+
+/* Internal mouse actions. */
+
+/*
+ * Here xdvi does its own parsing and processing of translations for mouse
+ * button presses. This is necessary because the X Toolkit does not recognize
+ * <Btn6Down> or <Btn7Down> event types.
+ */
+
+#if HAVE_X11_INTRINSICI_H
+# include <X11/IntrinsicI.h>
+#else
+
+/* From <X11/TranslateI.h> */
+extern Boolean _XtComputeLateBindings(
+ Display* /* dpy */,
+ struct _LateBindings* /* lateModifiers */,
+ Modifiers* /* computed */,
+ Modifiers* /* computedMask */
+);
+
+#endif /* HAVE_X11_INTRINSICI_H */
+
+
+static void
+Act_press(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ struct mouse_acts *mactp;
+ struct xdvi_action *actp;
+
+#if HAVE_XI21
+ if (xi2_active
+ && (xi2_current->slave->btn_mask & (1 << event->xbutton.button))) {
+ TRACE_EVENTS((stderr, "Ignoring button %d press (XI 2.1 active)",
+ event->xbutton.button));
+ if (event->xbutton.button <= 5)
+ wheel_button = event->xbutton.button;
+ else
+ wheel_h_button = event->xbutton.button;
+ xi2_ign_time = event->xbutton.time;
+ return;
+ }
+#endif
+
+ for (mactp = mouse_actions; mactp != NULL; mactp = mactp->next) {
+ if (event->xbutton.button == mactp->button || mactp->button == 0) {
+ Modifiers mask = 0;
+ Modifiers value = 0;
+
+ if (mactp->late_bindings == NULL
+ || _XtComputeLateBindings(DISP, mactp->late_bindings,
+ &value, &mask)) {
+ mask |= mactp->mask;
+ value |= mactp->value;
+ if (((value ^ event->xbutton.state) & mask) == 0) {
+ for (actp = mactp->action; actp != NULL;
+ actp = actp->next)
+ (actp->proc)(w, event, actp->params, &actp->num_params);
+ return;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+Act_motion(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ /* remember last position, to do this only when pointer is actually moved */
+ static int old_x = -1, old_y = -1;
+ int x, y;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ MYTRACE((stderr, "act_motion!\n"));
+
+ if (globals.curr_mode == RULER_MODE_ACTIVE) {
+ show_distance_from_ruler(event, False);
+ }
+ /* This used to be:
+ (abs(x - old_x) > x_threshold || abs(y - old_y) > y_threshold))
+ but that didn't work too well either. Just change it whenever user
+ moves the mouse. */
+ if (!MAGNIFIER_ACTIVE && !(globals.curr_mode == RULER_MODE_ACTIVE)
+ && pointerlocate(&x, &y) && (x != old_x || y != old_y)) {
+ htex_displayanchor(x, y);
+ old_x = x;
+ old_y = y;
+ }
+
+ if ((int)(event->xbutton.button) != wheel_button
+ && ((int) (event->xbutton.button) != wheel_h_button)) {
+ MYTRACE((stderr, "mouse_motion!\n"));
+ mouse_motion(event);
+ }
+}
+
+
+static void
+Act_release(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if ((int)(event->xbutton.button) == wheel_button) {
+ wheel_button = -1;
+ return;
+ }
+
+ if ((int)(event->xbutton.button) == wheel_h_button) {
+ wheel_h_button = -1;
+ return;
+ }
+
+ mouse_release(event);
+}
+
+static void
+Act_toggle_grid_mode(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = -1;
+ }
+ switch (arg) {
+ case -1:
+ resource.grid_mode = !resource.grid_mode;
+ if (resource.grid_mode) {
+ statusline_info(STATUS_SHORT, "Grid mode on");
+ }
+ else {
+ statusline_info(STATUS_SHORT, "Grid mode off");
+ }
+ break;
+ case 1: /* fall through */
+ case 2: /* fall through */
+ case 3:
+ resource.grid_mode = arg;
+ statusline_info(STATUS_SHORT, "Grid mode %d", arg);
+ break;
+ default:
+ xdvi_bell();
+ statusline_info(STATUS_SHORT,
+ "Valid arguments for grid mode are: none (toggles), 1, 2, 3");
+ return;
+ }
+ init_page();
+ reconfig();
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+
+/* Actions for source specials. */
+
+void
+Act_source_special(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if ((event->type == ButtonPress && mouse_release != null_mouse)
+ || MAGNIFIER_ACTIVE) {
+ xdvi_bell();
+ return;
+ }
+
+ source_reverse_x = event->xbutton.x;
+ source_reverse_y = event->xbutton.y;
+ if (event->xbutton.window != mane.win)
+ (void)XTranslateCoordinates(DISP,
+ RootWindowOfScreen(SCRN), mane.win,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ &source_reverse_x,
+ &source_reverse_y,
+ &dummy); /* throw away last argument */
+
+ source_reverse_x = (source_reverse_x + mane_base_x) * mane.shrinkfactor;
+ source_reverse_y = (source_reverse_y + mane_base_y) * mane.shrinkfactor;
+
+ globals.ev.flags |= EV_SRC;
+}
+
+void
+Act_show_source_specials(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ Boolean clear_statusline = False;
+
+ UNUSED(w);
+
+ if (!get_int_arg(params, num_params, &arg))
+ arg = -1;
+ else
+ clear_statusline = True;
+
+ if ((event->type == ButtonPress && mouse_release != null_mouse)
+ || MAGNIFIER_ACTIVE) {
+ xdvi_bell();
+ return;
+ }
+
+ if (!(globals.ev.flags & EV_SRC)) {
+ source_reverse_x = -1;
+ source_show_all = (arg == 1 ? True : False);
+
+ globals.ev.flags |= EV_SRC;
+ }
+ if (clear_statusline)
+ statusline_clear();
+}
+
+void
+Act_source_what_special(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int my_x, my_y;
+ Window dummy;
+
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ (void)XTranslateCoordinates(DISP, event->xkey.window, mane.win,
+ event->xkey.x, event->xkey.y, &my_x, &my_y, &dummy); /* throw away last argument */
+ my_x = (my_x + mane_base_x) * mane.shrinkfactor;
+ my_y = (my_y + mane_base_y) * mane.shrinkfactor;
+ source_reverse_search(my_x, my_y, False);
+}
+
+static const char *user_exec_help =
+"The user-exec() action lets you run a child process. "
+"It takes a single string, which is tokenized on whitespace.";
+
+void
+Act_user_exec(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ char **argv;
+ int i;
+ char *errmsg = NULL;
+
+ if (*num_params == 0)
+ errmsg = "No arguments supplied to the user-exec() action.";
+ else if (*num_params > 1)
+ errmsg = "Too many arguments supplied to the user-exec() action.";
+ else if (setenv("XDVI_FILE", globals.dvi_name, 1) == -1)
+ errmsg = strerror(errno);
+
+ if (errmsg) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ /* helptext */
+ user_exec_help,
+ /* popup */
+ errmsg);
+ return;
+ }
+
+ argv = get_separated_list(params[0], " \t", True);
+ fork_process(argv[0], False, NULL, NULL, NULL, 0, argv);
+ for (i = 0; argv[i] != NULL; i++)
+ free(argv[i]);
+ free(argv);
+}
+
+static void
+select_cb(const char *filename, void *data)
+{
+ UNUSED(data);
+ if (filename != NULL) {
+ TRACE_FILES((stderr, "new filename: |%s|", filename));
+
+ if (resource.filesel_open_new_window) {
+ /* char *fname = expand_filename_append_dvi(filename); */
+ launch_xdvi(filename, NULL);
+ }
+ else {
+ /* the filename should be complete already, so don't append .dvi */
+ set_dvi_name(expand_filename(filename, USE_CWD_PATH));
+ current_page = 0; /* switch to first page */
+ close_old_filep();
+ globals.ev.flags |= EV_NEWDOC;
+ globals.ev.flags |= EV_PAGEHIST_INSERT;
+ }
+ }
+}
+
+static void
+Act_select_dvi_file(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ /* static so that we can pass its address */
+ static struct filesel_callback cb = {
+ NULL, NULL, "xdvik: Open File", "Open file:", "OK", "Cancel",
+ NULL, "*.dvi", True, False, NULL, NULL
+ };
+ int arg = -1;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (get_int_arg(params, num_params, &arg)) { /* try item from file history */
+ char *fname;
+ int dummy_page;
+
+ if (arg < 1) {
+ xdvi_bell();
+ statusline_info(STATUS_MEDIUM, "Error: File history number must be >= 1");
+ }
+ else if ((fname = file_history_get_elem(arg - 1, &dummy_page)) == NULL) {
+ statusline_info(STATUS_MEDIUM, "No file number %d in history (history size: %lu)",
+ arg, (unsigned long)file_history_size());
+ }
+ else {
+ file_history_open(fname);
+ }
+ return;
+ }
+
+ file_history_set_page(current_page);
+
+ cb.func_ptr = select_cb;
+ cb.init_path = globals.dvi_file.dirname;
+ if (cb.shell == NULL)
+ cb.shell = XsraSelFile(globals.widgets.top_level, &cb);
+ XsraSelFilePopup(&cb);
+}
+
+/*
+ * If all GUI elements have been turned on/off, make this synonymous
+ * with expert mode off/on, so that next `x' keystroke does something
+ * reasonable.
+ */
+void
+update_expert_mode(void)
+{
+ if ((resource.expert_mode & (XPRT_SHOW_STATUSLINE | XPRT_SHOW_SCROLLBARS
+#ifdef MOTIF
+ | XPRT_SHOW_PAGELIST | XPRT_SHOW_TOOLBAR | XPRT_SHOW_MENUBAR
+#else
+ | XPRT_SHOW_BUTTONS
+#endif
+ )) == XPRT_SHOW_ALL) {
+ resource.expert = False;
+ }
+ else if ((resource.expert_mode & (XPRT_SHOW_STATUSLINE
+#ifdef MOTIF
+ | XPRT_SHOW_SCROLLBARS | XPRT_SHOW_PAGELIST
+ | XPRT_SHOW_TOOLBAR | XPRT_SHOW_MENUBAR
+#else
+ | BROKEN_RECONFIG ? 0 : XPRT_SHOW_SCROLLBARS | XPRT_SHOW_BUTTONS
+#endif
+ )) == XPRT_SHOW_NONE) {
+ resource.expert = True;
+ }
+}
+
+void
+Act_set_expert_mode(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ int arg;
+ Boolean clear_statusline = False;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg))
+ arg = -1;
+ else
+ clear_statusline = True;
+
+ switch(arg) {
+ case 1:
+ resource.expert_mode ^= XPRT_SHOW_STATUSLINE;
+ toggle_statusline();
+ update_expert_mode();
+ break;
+ case 2:
+#ifndef MOTIF
+ /* show this warning only when not toggling global expert mode
+ (that's why it can't be inside toggle_scrollbars) */
+ if (BROKEN_RECONFIG) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Sorry - cannot toggle scrollbars with this X Version.\n"
+ "This version of XFree has a broken implementation of the viewportWidget, "
+ "which would break the layout if the scrollbars are toggled. "
+ "Versions that are known to work have a VendorRelease version below 4000 or above 4002. "
+ "You will need to update your XFree server to fix this.");
+ return;
+ }
+#endif
+ resource.expert_mode ^= XPRT_SHOW_SCROLLBARS;
+ toggle_scrollbars();
+ update_expert_mode();
+ break;
+
+#ifdef MOTIF
+ case 3:
+ resource.expert_mode ^= XPRT_SHOW_PAGELIST;
+ toggle_pagelist();
+ update_expert_mode();
+ break;
+
+ case 4: /* toolbar */
+ resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
+ toggle_toolbar();
+ update_expert_mode();
+ break;
+
+ case 5:
+ resource.expert_mode ^= XPRT_SHOW_MENUBAR;
+ toggle_menubar();
+ update_expert_mode();
+ break;
+#else
+ case 3:
+ /* fprintf(stderr, "sidebar\n"); */
+ resource.expert_mode ^= XPRT_SHOW_BUTTONS;
+ toggle_buttons();
+ update_expert_mode();
+ break;
+#endif
+ default:
+ /* warn 'em */
+ if (
+#ifdef MOTIF
+ arg > 5
+#else
+ arg > 3
+#endif
+ ) {
+ statusline_info(STATUS_SHORT, "Number %d too large for `set-expert-mode', using 0 (= toggle) instead.",
+ arg);
+ }
+ /* toggle all items */
+ resource.expert = !resource.expert;
+ if (resource.expert)
+ resource.expert_mode = XPRT_SHOW_NONE;
+ else
+ resource.expert_mode = XPRT_SHOW_ALL;
+
+ toggle_statusline();
+#ifndef MOTIF
+ if (!BROKEN_RECONFIG)
+ toggle_scrollbars();
+#else
+ toggle_scrollbars();
+#endif
+
+#ifdef MOTIF
+ toggle_pagelist();
+ toggle_toolbar();
+ toggle_menubar();
+#else
+ toggle_buttons();
+#endif
+ }
+
+#ifdef MOTIF
+ update_preferences_expert();
+#endif
+
+ store_preference(NULL, "expertMode", "%d", resource.expert_mode);
+
+ if (clear_statusline)
+ statusline_clear();
+}
+
+Boolean have_src_specials = False;
+static Boolean do_update_property = False;
+
+#ifdef USE_PANNER
+void
+handle_x_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont)
+{
+#if !defined(MOTIF)
+ Dimension get_x = 0;
+#endif
+
+ UNUSED(w);
+ UNUSED(closure);
+ UNUSED(ev);
+ UNUSED(cont);
+
+ if (/* !resource.keep_flag || */ globals.widgets.x_bar == NULL)
+ return;
+
+#ifdef MOTIF
+ XtVaGetValues(globals.widgets.x_bar, XmNvalue, &m_x_scroll, NULL);
+#else
+ get_xy();
+ XtVaGetValues(globals.widgets.clip_widget, XtNx, &get_x, NULL);
+ m_x_scroll = get_x - m_window_x;
+ scroll_x_panner(m_x_scroll);
+#endif /* MOTIF */
+}
+
+void
+handle_y_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont)
+{
+#if !defined(MOTIF)
+ Dimension get_y = 0;
+#endif
+
+ UNUSED(w);
+ UNUSED(closure);
+ UNUSED(ev);
+ UNUSED(cont);
+
+ if (/* !resource.keep_flag || */ globals.widgets.y_bar == NULL)
+ return;
+
+#ifdef MOTIF
+ XtVaGetValues(globals.widgets.y_bar, XmNvalue, &m_y_scroll, NULL);
+#else
+ get_xy();
+ XtVaGetValues(globals.widgets.clip_widget, XtNy, &get_y, NULL);
+ m_y_scroll = get_y - m_window_y;
+ scroll_y_panner(m_y_scroll);
+#endif /* MOTIF */
+}
+#endif /* USE_PANNER */
+
+void
+handle_expose(Widget w, XtPointer closure, XEvent *ev, Boolean *cont)
+{
+ struct WindowRec *windowrec = (struct WindowRec *)closure;
+
+ UNUSED(w);
+ UNUSED(cont);
+
+ if (windowrec == &magnifier) {
+ if (magnifier_stat < 0) { /* destroy upon exposure */
+ magnifier_stat = 0;
+ mag_release(ev);
+ return;
+ }
+ else
+ magnifier_stat = 0;
+ }
+
+ do_update_property = False;
+
+ if (have_src_specials && !MAGNIFIER_ACTIVE) {
+ do_update_property = True;
+ }
+
+ expose(windowrec, (&(ev->xexpose))->x, (&(ev->xexpose))->y,
+ (unsigned int)(&(ev->xexpose))->width, (unsigned int)(&(ev->xexpose))->height);
+}
+
+
+void
+handle_property_change(Widget w, XtPointer junk,
+ XEvent *ev, Boolean *cont)
+{
+ char *prop_ret;
+ size_t prop_len;
+
+ UNUSED(w);
+ UNUSED(junk);
+ UNUSED(cont);
+
+ if ((&(ev->xproperty))->window != XtWindow(globals.widgets.top_level)) /* if spurious event */
+ return;
+
+ if ((&(ev->xproperty))->atom == atom_src_goto()) {
+ /* forward search requested */
+ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_src_goto(),
+ &prop_ret,
+ XGetWindowProperty)) == 0) {
+ TRACE_CLIENT((stderr, "property_get_data() failed for atom_src_goto()!"));
+ return;
+ }
+ TRACE_CLIENT((stderr, "got back atom_src_goto: |%s|", prop_ret));
+ globals.src.fwd_string = prop_ret;
+ globals.ev.flags |= EV_SRC;
+ }
+ else if ((&(ev->xproperty))->atom == atom_find_string()) {
+ /* string search requested */
+ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_find_string(),
+ &prop_ret,
+ XGetWindowProperty)) == 0) {
+ TRACE_CLIENT((stderr, "property_get_data() failed for atom_find_string()!"));
+ return;
+ }
+ TRACE_FIND((stderr, "got back atom_find_string: |%s|", prop_ret));
+ resource.find_string = prop_ret;
+ globals.ev.flags |= EV_FIND;
+ }
+ else if ((&(ev->xproperty))->atom == atom_reload()) {
+ /* like do_sigusr(); there's no data in this case. */
+ TRACE_CLIENT((stderr, "atom_reload()"));
+ globals.ev.flags |= EV_RELOAD;
+ }
+ else if ((&(ev->xproperty))->atom == atom_newdoc()) {
+ /* loading a new file */
+ FILE *new_fp;
+ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_newdoc(),
+ &prop_ret,
+ XGetWindowProperty)) == 0) {
+ TRACE_CLIENT((stderr, "property_get_data() returned zero length for atom_newdoc()"));
+ /* just raise it in this case */
+ XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level));
+ raise_message_windows();
+ return;
+ }
+ TRACE_CLIENT((stderr, "got back atom_newdoc: |%s|", prop_ret));
+ if ((new_fp = XFOPEN(prop_ret, "r")) == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL, "Loading %s failed: %s",
+ prop_ret, strerror(errno));
+ return;
+ }
+ set_dvi_name_expand(prop_ret);
+
+ globals.ev.flags |= EV_NEWDOC;
+ }
+ else if ((&(ev->xproperty))->atom == atom_newpage()) {
+ /* jumping to a different page */
+ int newpage;
+ char *testptr;
+ if ((prop_len = property_get_data(XtWindow(globals.widgets.top_level), atom_newpage(),
+ &prop_ret,
+ XGetWindowProperty)) == 0) {
+ TRACE_CLIENT((stderr, "property_get_data() failed for atom_newpage(): |%s|", prop_ret));
+ return;
+ }
+ TRACE_CLIENT((stderr, "got back atom_newpage: |%s|", prop_ret));
+ if (strcmp(prop_ret, "+") == 0) { /* special case: treat `+' as last page */
+ newpage = total_pages - 1;
+ }
+ else {
+ newpage = strtol(prop_ret, &testptr, 10) - 1;
+ if (*testptr != '\0') {
+ XDVI_FATAL((stderr, "Invalid page number: `%s'.", prop_ret));
+ }
+ }
+
+ if (newpage == total_pages - 1) { /* as in Act_goto_page() */
+ goto_page(check_goto_page(newpage, True), resource.keep_flag ? NULL : home, False);
+ search_signal_page_changed();
+ }
+ else {
+ goto_page(check_goto_tex_page(newpage), resource.keep_flag ? NULL : home, False);
+ search_signal_page_changed();
+ }
+ }
+ else if ((&(ev->xproperty))->atom == atom_raise()) {
+ XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level));
+ raise_message_windows();
+ }
+ else if ((&(ev->xproperty))->atom == atom_reread_prefs()) {
+ read_user_preferences(globals.widgets.top_level, ".xdvirc.tmp");
+ }
+}
+
+
+/*
+ * Signal routines. At the signal level, all we do is set flags.
+ */
+
+#ifndef FLAKY_SIGPOLL
+static RETSIGTYPE
+handle_sigpoll(int signo)
+{
+ UNUSED(signo);
+
+ globals.ev.ctr = 1;
+ event_freq = -1; /* forget Plan B */
+ sig_flags |= SF_POLL;
+# ifndef HAVE_SIGACTION
+ (void) signal(SIGPOLL, handle_sigpoll); /* reset the signal */
+# endif
+}
+#endif
+
+static RETSIGTYPE
+handle_sigterm(int signo)
+{
+ UNUSED(signo);
+
+ sig_flags |= SF_TERM;
+}
+
+static RETSIGTYPE
+handle_sigchld(int signo)
+{
+ UNUSED(signo);
+
+ sig_flags |= SF_CHLD;
+}
+
+static RETSIGTYPE
+handle_sigalrm(int signo)
+{
+ UNUSED(signo);
+
+ sig_flags |= SF_ALRM;
+}
+
+static RETSIGTYPE
+ignore_sigusr(int signo)
+{
+ UNUSED(signo);
+ fprintf(stderr, "IGNORE SIGUSR1!\n");
+}
+
+static RETSIGTYPE
+handle_sigusr(int signo)
+{
+ UNUSED(signo);
+
+ globals.ev.ctr = 1;
+ sig_flags |= SF_USR;
+}
+
+static RETSIGTYPE
+handle_sigsegv(int signo)
+{
+ UNUSED(signo);
+
+ XDVI_ABORT((stderr, "Segmentation fault - trying to clean up and aborting ..."));
+}
+
+static Boolean sigalarm_initialized = False;
+
+void
+setup_sigalarm(void)
+{
+#if HAVE_SIGACTION
+ struct sigaction a;
+
+ a.sa_handler = handle_sigalrm;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGALRM);
+ a.sa_flags = 0;
+ sigaction(SIGALRM, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGALRM, handle_sigalrm);
+#endif /* not HAVE_SIGACTION */
+
+ sigalarm_initialized = True;
+}
+
+/*
+ * Called from main to set up the signal handlers.
+ */
+void
+setup_signal_handlers(Boolean early)
+{
+#ifndef FLAKY_SIGPOLL
+ int sock_fd = 0;
+#endif
+#if HAVE_SIGACTION
+ struct sigaction a;
+#endif
+
+ if (early) {
+#if HAVE_SIGACTION
+ a.sa_handler = ignore_sigusr;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGUSR1);
+ a.sa_flags = 0;
+ sigaction(SIGUSR1, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGUSR1, ignore_sigusr);
+#endif /* not HAVE_SIGACTION */
+
+ (void)sigemptyset(&all_signals);
+ (void)sigaddset(&all_signals, SIGUSR1);
+ return;
+ }
+
+
+#if HAVE_SIGACTION
+ a.sa_handler = handle_sigusr;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGUSR1);
+ a.sa_flags = 0;
+ sigaction(SIGUSR1, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGUSR1, handle_sigusr);
+#endif /* not HAVE_SIGACTION */
+
+#ifndef FLAKY_SIGPOLL
+#if HAVE_SIGACTION
+ /* Subprocess handling, e.g., MakeTeXPK, fails on the Alpha without
+ this, because SIGPOLL interrupts the call of system(3), since OSF/1
+ doesn't retry interrupted wait calls by default. From code by
+ maj@cl.cam.ac.uk. */
+ a.sa_handler = handle_sigpoll;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGPOLL);
+ a.sa_flags = SA_RESTART;
+ sigaction(SIGPOLL, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGPOLL, handle_sigpoll);
+#endif /* not HAVE_SIGACTION */
+
+ sock_fd = ConnectionNumber(DISP);
+ prep_fd(sock_fd, False);
+#endif /* not FLAKY_SIGPOLL */
+
+#if HAVE_SIGACTION
+ a.sa_handler = handle_sigterm;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGINT);
+ (void) sigaddset(&a.sa_mask, SIGQUIT);
+ (void) sigaddset(&a.sa_mask, SIGTERM);
+ (void) sigaddset(&a.sa_mask, SIGHUP);
+ a.sa_flags = SA_RESETHAND;
+ sigaction(SIGINT, &a, NULL);
+ sigaction(SIGQUIT, &a, NULL);
+ sigaction(SIGTERM, &a, NULL);
+ sigaction(SIGHUP, &a, NULL);
+ a.sa_handler = handle_sigsegv;
+ (void)sigemptyset(&a.sa_mask);
+ (void)sigaddset(&a.sa_mask, SIGSEGV);
+ a.sa_flags = 0;
+ sigaction(SIGSEGV, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGINT, handle_sigterm);
+ (void) signal(SIGQUIT, handle_sigterm);
+ (void) signal(SIGTERM, handle_sigterm);
+ (void) signal(SIGHUP, handle_sigterm);
+ (void)signal(SIGSEGV, handle_sigsegv);
+#endif /* not HAVE_SIGACTION */
+
+#if HAVE_SIGACTION
+ a.sa_handler = handle_sigchld;
+ (void) sigemptyset(&a.sa_mask);
+ (void) sigaddset(&a.sa_mask, SIGCHLD);
+ a.sa_flags = 0;
+ sigaction(SIGCHLD, &a, NULL);
+#else /* not HAVE_SIGACTION */
+ (void) signal(SIGCHLD, handle_sigchld);
+#endif /* not HAVE_SIGACTION */
+
+ (void)sigemptyset(&all_signals);
+ (void)sigaddset(&all_signals, SIGPOLL);
+ (void)sigaddset(&all_signals, SIGINT);
+ (void)sigaddset(&all_signals, SIGQUIT);
+ (void)sigaddset(&all_signals, SIGTERM);
+ (void)sigaddset(&all_signals, SIGHUP);
+ (void)sigaddset(&all_signals, SIGCHLD);
+ (void)sigaddset(&all_signals, SIGALRM);
+ (void)sigaddset(&all_signals, SIGUSR1);
+ (void)sigaddset(&all_signals, SIGSEGV);
+
+}
+
+
+/*
+ * Mid-level signal handlers. These are called from within read_events(),
+ * and do the actual work appropriate for the given signal.
+ */
+
+/*
+ * Process-related routines. Call set_chld(xchild *) to indicate
+ * that a given child process should be watched for when it
+ * terminates. Call clear_chld() to remove the process from the
+ * list. When the child terminates, the record is removed from
+ * the list and xchild->proc is called.
+ * The caller can set the `io' member in xchild to a pointer to
+ * an xio structure for reading from the file descriptor; see
+ * psgs.c and util.c for examples.
+ */
+
+static struct xchild *child_recs = NULL; /* head of child process list */
+
+void
+set_chld(struct xchild *cp)
+{
+ cp->next = child_recs;
+ child_recs = cp;
+}
+
+void
+clear_chld(struct xchild *cp)
+{
+ struct xchild **cpp;
+ struct xchild *cp2;
+
+ if (child_recs == NULL) {
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "child_recs: %p\n", (void *)child_recs);
+ return;
+ }
+ for (cpp = &child_recs;;) {
+ cp2 = *cpp;
+ if (cp2 == cp)
+ break;
+ cpp = &cp2->next;
+ }
+ *cpp = cp->next;
+}
+
+static void
+do_sigchld(void)
+{
+ pid_t pid;
+ int status;
+
+ sig_flags &= ~SF_CHLD;
+
+#if ! HAVE_SIGACTION
+ (void) signal(SIGCHLD, handle_sigchld); /* reset the signal */
+#endif
+ for (;;) {
+#if HAVE_WAITPID
+ pid = waitpid(-1, &status, WNOHANG);
+#else
+ pid = wait3(&status, WNOHANG, NULL);
+#endif
+ if (pid == 0) break;
+
+ if (pid != -1) {
+ struct xchild **cpp;
+ struct xchild *cp;
+
+ for (cpp = &child_recs;;) {
+ cp = *cpp;
+ if (cp == NULL)
+ break;
+ if (cp->pid == pid) {
+ *cpp = cp->next; /* unlink it */
+ /* call exit reporting procedure for this child */
+ (cp->proc)(status, cp);
+ break;
+ }
+ cpp = &cp->next;
+ }
+ break;
+ }
+
+ if (errno == EINTR) continue;
+ if (errno == ECHILD) break;
+#if HAVE_WAITPID
+ perror("xdvi: waitpid");
+#else
+ perror("xdvi: wait3");
+#endif
+ break;
+ }
+}
+
+
+/*
+ * File-related routines. Call set_io() to indicate that a given fd
+ * should be watched for ability to input or output data. Call clear_io()
+ * to remove it from the list. When poll()/select() indicates that the fd
+ * is available for the indicated type of i/o, the corresponding routine
+ * is called. Call clear_io() to remove an fd from the list.
+ * Both set_io() and clear_io() can be called from within read_proc or
+ * write_proc (although turning an io descriptor on or off is better
+ * accomplished by setting the events flag in the xio structure, and
+ * in the corresponding pollfd structure if the pfd pointer is not NULL
+ * (it is always non-NULL when read_proc and write_proc are called)).
+ * We allocate space for one additional record in the pollfd array, to
+ * accommodate the fd for the X connection; this is done by initializing
+ * num_fds to 1 instead of zero.
+ */
+
+static struct xio *iorecs = NULL; /* head of xio list */
+
+#if HAVE_POLL
+static struct pollfd *fds = NULL;
+static int num_fds = 1; /* current number of fds */
+static int max_fds = 0; /* max allocated number of fds */
+static Boolean io_dirty= True; /* need to recompute fds[] array */
+#else
+static int numfds = 0;
+static fd_set readfds;
+static fd_set writefds;
+#endif
+
+void
+set_io(struct xio *ip)
+{
+ ip->next = iorecs;
+ iorecs = ip;
+
+#if HAVE_POLL
+ ++num_fds;
+ if (!io_dirty && num_fds <= max_fds) {
+ fds[num_fds - 1].fd = ip->fd;
+ fds[num_fds - 1].events = ip->xio_events;
+ ip->pfd = &fds[num_fds - 1];
+ }
+ else {
+ ip->pfd = NULL;
+ io_dirty = True;
+ }
+#else
+ if (numfds <= ip->fd) numfds = ip->fd + 1;
+#endif
+}
+
+void
+clear_io(struct xio *ip)
+{
+ struct xio **ipp;
+
+ for (ipp = &iorecs;;) {
+ struct xio *ip2;
+
+ ip2 = *ipp;
+ if (ip2 == ip) break;
+ ipp = &ip2->next;
+ }
+ *ipp = ip->next;
+
+#if HAVE_POLL
+ --num_fds;
+ io_dirty = True;
+#else
+# if FLAKY_SIGPOLL
+ numfds = ConnectionNumber(DISP);
+# else
+ numfds = (event_freq < 0 ? -1 : ConnectionNumber(DISP));
+# endif
+ for (ip = iorecs; ip != NULL; ip = ip->next)
+ if (ip->fd > numfds)
+ numfds = ip->fd;
+ ++numfds;
+#endif /* !HAVE_POLL */
+}
+
+static void
+do_sigpoll(void)
+{
+#if FLAKY_SIGPOLL
+ sig_flags &= ~SF_POLL;
+#else
+ struct xio *ip;
+
+ sig_flags &= ~SF_POLL;
+
+# if HAVE_POLL
+
+ if (io_dirty) {
+ struct pollfd *fp;
+
+ if (num_fds > max_fds) {
+ if (fds != NULL) free(fds);
+ fds = xmalloc(num_fds * sizeof *fds);
+ memset(fds, 0, num_fds * sizeof *fds);
+ max_fds = num_fds;
+ fds->fd = ConnectionNumber(DISP);
+ fds->events = POLLIN;
+ }
+ fp = fds + 1;
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ fp->fd = ip->fd;
+ fp->events = ip->xio_events;
+ ip->pfd = fp;
+ ++fp;
+ }
+ io_dirty = False;
+ }
+
+ for (;;) {
+ if (poll(fds + 1, num_fds - 1, 0) >= 0)
+ break;
+
+ if (errno != EAGAIN && errno != EINTR) {
+ perror("xdvi: poll");
+ return;
+ }
+ }
+
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ int revents = ip->pfd->revents;
+ if (revents & POLLIN && ip->read_proc != NULL)
+ (void)(ip->read_proc)(ip->fd, ip->data);
+ if (revents & POLLOUT && ip->write_proc != NULL)
+ (ip->write_proc)(ip->fd, ip->data);
+ }
+
+# else
+
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ if (ip->xio_events & XIO_IN)
+ FD_SET(ip->fd, &readfds);
+ if (ip->xio_events & XIO_OUT)
+ FD_SET(ip->fd, &writefds);
+ }
+
+ for (;;) {
+ struct timeval tv;
+
+ tv.tv_sec = tv.tv_usec = 0;
+ if (select(numfds, &readfds, &writefds, (fd_set *) NULL, &tv) >= 0)
+ break;
+
+ if (errno != EAGAIN && errno != EINTR) {
+ perror("select (xdvi read_events)");
+ return;
+ }
+ }
+
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ if (FD_ISSET(ip->fd, &readfds) && ip->read_proc != NULL)
+ (void)(ip->read_proc)(ip->fd, ip->data);
+ if (FD_ISSET(ip->fd, &writefds) && ip->write_proc != NULL)
+ (ip->write_proc)(ip->fd, ip->data);
+ }
+
+# endif
+#endif /* not FLAKY_SIGPOLL */
+}
+
+
+/*
+ * Timer-related routines. Call set_timer() to set a timer a given number
+ * of milliseconds in the future. At that time, the timer will be cleared
+ * and the given procedure will be called with argument set to the struct
+ * passed to set_timer(). The timer routine may call set_timer() or
+ * cancel_timer().
+ */
+
+
+static struct xtimer *timers = NULL; /* head of timer list */
+
+static struct itimerval itv = {{0, 0}, {0, 0}};
+
+#ifndef timercmp
+#define timercmp(a, b, OP) (((a)->tv_sec OP (b)->tv_sec || \
+ ((a)->tv_sec == (b)->tv_sec && (a)->tv_usec OP (b)->tv_usec)))
+#endif /* timercmp */
+
+
+static void
+show_timers(const char *what)
+{
+ struct xtimer *tp;
+ fprintf(stderr, "=======%s; timers:\n", what);
+ for (tp = timers; tp != NULL; tp = tp->next) {
+ fprintf(stderr, "timer %p: %lu\n", (void *)tp, (unsigned long)tp->when.tv_sec);
+ }
+ fprintf(stderr, "=======\n");
+}
+
+void
+set_timer(struct xtimer *tp, int ms)
+{
+ struct xtimer **tpp;
+ struct xtimer *tp2;
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: set_timer\n", __FILE__, __LINE__);
+
+ gettimeofday(&tp->when, NULL);
+ itv.it_value.tv_sec = ms / 1000;
+ itv.it_value.tv_usec = (ms % 1000) * 1000;
+ tp->when.tv_sec += itv.it_value.tv_sec;
+ tp->when.tv_usec += itv.it_value.tv_usec;
+ if (tp->when.tv_usec >= 1000000) {
+ tp->when.tv_usec -= 1000000;
+ ++tp->when.tv_sec;
+ }
+
+ for (tpp = &timers;;) { /* add timer to list */
+ tp2 = *tpp;
+ if (tp2 == NULL || timercmp(&tp->when, &tp2->when, <))
+ break;
+ tpp = &tp2->next;
+ }
+ tp->next = tp2;
+ *tpp = tp;
+
+ if (tpp == &timers) {
+ setitimer(ITIMER_REAL, &itv, NULL);
+ if (ms == 0)
+ sig_flags |= SF_ALRM;
+ }
+ if (globals.debug & DBG_EVENT)
+ show_timers("after set_timer");
+}
+
+void
+cancel_timer(struct xtimer *tp)
+{
+ struct xtimer **tpp;
+
+ if (globals.debug & DBG_EVENT)
+ show_timers("beginning of cancel_timer");
+
+ if (timers == NULL) {
+ fprintf(stderr, "%s:%d: BUG? timers == NULL!\n", __FILE__, __LINE__);
+ return;
+ }
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: cancel_timer %p from %p\n", __FILE__, __LINE__, (void *)&timers, (void *)tp);
+
+ ASSERT(timers != NULL, "timers in cancel_timer() mustn't be NULL");
+ for (tpp = &timers; ; ) { /* remove from list */
+ if (*tpp == tp)
+ break;
+ tpp = &(*tpp)->next;
+ }
+
+ *tpp = (*tpp)->next; /* unlink it */
+
+ if (timers == NULL) { /* cancel SIGALRM */
+ itv.it_value.tv_sec = itv.it_value.tv_usec = 0;
+ setitimer(ITIMER_REAL, &itv, NULL);
+ }
+}
+
+#if XDVI_XT_TIMER_HACK
+/*
+ * Original comment by Paul:
+ * Newer versions of the Motif toolkit use the timer facility
+ * (XtAppAddTimeOut(), etc.) in the X Toolkit. Proper functioning of
+ * this mechanism, however, requires that the X Toolkit be in charge of
+ * blocking. Since xdvi does its own blocking, this means that we need
+ * to provide working alternatives to these X Toolkit routines (by
+ * redefining them ...).
+ * One symptom of the above-mentioned bug is that the printlog window
+ * eventually stops showing dvips progress until you move the mouse.
+ *
+ * Comment SU:
+ * Xdvik also uses XtAppAddTimeOut() in other places (hyperref/statusline/...),
+ * so we also need these redefinitions also in the Xaw version.
+ *
+ */
+
+static void xt_alarm(struct xtimer *this, void *data);
+
+static struct xtimer *xt_free_timers = NULL;
+
+XtIntervalId
+XtAddTimeOut(unsigned long interval, XtTimerCallbackProc proc, XtPointer closure)
+{
+ return XtAppAddTimeOut(NULL, interval, proc, closure);
+}
+
+XtIntervalId
+XtAppAddTimeOut(XtAppContext app, unsigned long interval, XtTimerCallbackProc proc, XtPointer closure)
+{
+ struct xtimer *tp;
+
+ UNUSED(app);
+
+ /* FIXME: better way of checking this instead of static boolean sigalarm_initialized?
+ The following doesn't work, even after
+ sigaddset(&all_signals, SIGALRM);
+
+ static sigset_t sig_set;
+ (void)sigprocmask(0, NULL, &sig_set);
+ if (sigismember(&sig_set, SIGALRM))
+ ... OK ...
+ else
+ ... NOT OK ...
+ */
+ ASSERT(sigalarm_initialized, "Shouldn't invoke XtAppAddTimeOut() before setup_sigalarm()");
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "XtAppAddTimeOut: %lu msecs\n", interval);
+
+ if (xt_free_timers == NULL)
+ tp = xmalloc(sizeof *tp);
+ else {
+ tp = xt_free_timers;
+ xt_free_timers = xt_free_timers->next;
+ }
+
+ tp->proc = xt_alarm;
+ tp->data = closure;
+ tp->xt_proc = proc;
+ tp->closure = closure;
+
+ set_timer(tp, interval);
+
+ if (globals.debug & DBG_EVENT)
+ show_timers("XtAppAddTimeOut");
+
+ return (XtIntervalId)tp;
+}
+
+void
+XtRemoveTimeOut(XtIntervalId id)
+{
+ struct xtimer *tp;
+
+ ASSERT(id != 0, "XtIntervalId argument in XtRemoveTimeOut() mustn't be NULL");
+ tp = (struct xtimer *)id;
+
+ /* Motif (2.1 on Solaris 9, 2003) sometimes calls XtRemoveTimeOut() after
+ the timer event has occurred, so we need to be sure not to remove
+ the timer record twice. */
+ if (tp->proc == NULL)
+ return;
+
+ cancel_timer(tp);
+
+ tp->next = xt_free_timers;
+ xt_free_timers = tp;
+
+ if (globals.debug & DBG_EVENT)
+ show_timers("XtRemoveTimeOut");
+}
+
+void
+xt_alarm(struct xtimer *tp, void *data)
+{
+ XtIntervalId id;
+ UNUSED(data);
+
+ tp->proc = NULL; /* flag timer as used-up */
+ id = (XtIntervalId)tp;
+ (tp->xt_proc)(tp->closure, &id);
+
+ tp->next = xt_free_timers;
+ xt_free_timers = tp;
+
+ if (globals.debug & DBG_EVENT)
+ show_timers("xt_alarm");
+}
+#endif /* XDVI_XT_TIMER_HACK */
+
+static void
+do_sigalrm(void)
+{
+ struct timeval now;
+
+ sig_flags &= ~SF_ALRM;
+#ifndef HAVE_SIGACTION
+ (void) signal(SIGALRM, handle_sigalrm); /* reset the signal */
+#endif
+
+ gettimeofday(&now, NULL);
+
+ while (timers != NULL && timercmp(&timers->when, &now, <=)) {
+ struct xtimer *tp = timers;
+ timers = timers->next; /* unlink it _first_ */
+ (tp->proc)(tp, tp->data);
+ }
+
+ if (timers != NULL) { /* set next timer */
+ int i;
+ itv.it_value.tv_sec = timers->when.tv_sec - now.tv_sec;
+ i = timers->when.tv_usec - now.tv_usec;
+ if (i < 0) {
+ --itv.it_value.tv_sec;
+ i += 1000000;
+ }
+ itv.it_value.tv_usec = i;
+
+ setitimer(ITIMER_REAL, &itv, NULL);
+ }
+}
+
+
+
+/*
+ * Handle SIGUSR1 signal. Pretty straightforward.
+ */
+
+static void
+do_sigusr(void)
+{
+ sig_flags &= ~SF_USR;
+#ifndef HAVE_SIGACTION
+ (void) signal(SIGUSR1, handle_sigusr); /* reset the signal */
+#endif
+ globals.ev.flags |= EV_RELOAD;
+}
+
+
+static void
+do_sigsegv(void)
+{
+ sig_flags &= ~SF_SEGV;
+#ifndef HAVE_SIGACTION
+ (void) signal(SIGSEGV, handle_sigsegv); /* reset the signal */
+#endif
+ handle_sigsegv(SIGSEGV);
+}
+
+
+/*
+ * Handle termination signals. Just call xdvi_exit, which does all the
+ * work, since that is the common exit point.
+ */
+
+static void
+do_sigterm(void)
+{
+ sig_flags &= ~SF_TERM;
+
+ xdvi_exit(EXIT_SUCCESS);
+}
+
+/*
+ * This routine should be used for all exits. (SU: This is different
+ * from non-k xdvi, where it's only used for `non-early' exits; all
+ * routines called here should be aware of their own state and either
+ * perform cleanup or just return, unless xdvi_exit() itself checks for
+ * the status).
+ */
+
+void
+xdvi_exit(int status)
+{
+ struct xchild *cp;
+
+ /* do the following only if the window has been opened: */
+ if (globals.widgets.top_level != 0 && XtIsRealized(globals.widgets.top_level)) {
+ char *filehist;
+ file_history_set_page(current_page);
+ filehist = file_history_get_list();
+ store_preference(NULL, "fileHistory", "%s", filehist);
+ free(filehist);
+
+#if MOTIF
+ if (preferences_changed()) {
+ return;
+ }
+ /* else { */
+ /* fprintf(stderr, "Preferences not changed.\n"); */
+ /* } */
+#endif
+ /* try to save user preferences, unless we're exiting with an error */
+ if (status == EXIT_SUCCESS && !save_user_preferences(True))
+ return;
+
+ /* Clean up the "xdvi windows" property in the root window. */
+ update_window_property(XtWindow(globals.widgets.top_level), False);
+ }
+
+#if PS
+ ps_destroy_nofree();
+#endif
+
+ /* loop through child processes */
+ for (cp = child_recs; cp != NULL; cp = cp->next) {
+ if (cp->killsig > 0)
+ kill(cp->pid, cp->killsig);
+ else if (cp->killsig < 0)
+ kill(-cp->pid, -cp->killsig);
+ }
+
+ call_exit_handlers();
+
+ exit(status);
+}
+
+
+#if HAVE_XI21
+
+/*
+ * XInput 2.1 event processing.
+ *
+ * The XInput system has (virtual) "master" devices, including a master
+ * pointer and master keyboard (and maybe others), and "slave" devices
+ * that can be assigned to a master. Each master can have only one slave
+ * at a time. If you have two mice plugged in, for example, each is a
+ * separate slave device, and the one assigned to the master pointer device
+ * is whichever one was moved or clicked most recently. Moving or clicking
+ * the other mouse would then cause an XInput SlaveSwitch event, which
+ * notifies the X client that a different pointer is now active (and the
+ * previously active mouse would then become inactive).
+ *
+ * The code here looks not just at events from the master pointer, it also
+ * tracks events from the slave pointer devices. This is because the
+ * valuators for each slave pointer may have different scales.
+ *
+ * The XI_Motion events contain the master and slave ids of the device
+ * sending the event, so in principle it wouldn't be necessary to track
+ * SlaveSwitch events. However, we do track these events, because we need
+ * to know the valuator values at the time of the switch (otherwise, e.g.,
+ * the first click of a wheel mouse would be lost).
+ *
+ * It is also possible that a valuator may change while the pointer is
+ * outside of the drawing window. So, we need to reset the valuator
+ * values upon XI_Enter events. For some strange reason, we get extra
+ * XI_Enter events when using a traditional wheel mouse, and so the code
+ * takes care to ignore those. This only happens with the Xaw toolkit.
+ *
+ * Slave devices have events that notify clients when they are (i) added
+ * or removed, (ii) attached or detached, and (iii) enabled or disabled.
+ * We only worry about (iii), and for disabled devices we don't bother to
+ * delete the data structure.
+ *
+ */
+
+/*
+ * xi2_find_master: set xi2_current to record for given device id
+ * Return True if found, False if not.
+ */
+
+static Boolean
+xi2_find_master(int id)
+{
+ struct xi2_master *mp;
+
+ for (mp = xi2_masters; mp != NULL; mp = mp->next)
+ if (mp->id == id) {
+ xi2_current = mp;
+ return True;
+ }
+ return False;
+}
+
+/*
+ * xi2_find_slave: set xi2_current->slave to record for given slave device
+ * Return True if found, False if not.
+ */
+
+static Boolean
+xi2_find_slave(int id)
+{
+ struct xi2_slave *sp;
+
+ for (sp = xi2_slaves; sp != NULL; sp = sp->next)
+ if (sp->id == id) {
+ xi2_current->slave = sp;
+ return True;
+ }
+ return False;
+}
+
+/*
+ * Handle XI2 Enter event. We need to look at these events because if the
+ * user scrolls in some other window, then the valuator will be changed
+ * by a large amount, and that scrolling should not occur also in the
+ * main xdvi window when the user resumes scrolling here.
+ */
+
+static void
+xi2_ev_enter(XIEnterEvent *xi_event)
+{
+ XIDeviceInfo *info;
+ int ndevices;
+ int i;
+
+ if (xi_event->time < xi2_ign_time + 5) {
+ TRACE_EVENTS((stderr, "Ignoring XI_Enter event as spurious."));
+ return;
+ }
+
+ if (xi2_current->id != xi_event->deviceid
+ && !xi2_find_master(xi_event->deviceid)) {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_Enter event: master device %d not found",
+ xi_event->deviceid));
+ return;
+ }
+
+ if (xi_event->sourceid == xi2_current->id) {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_Enter event for master device."));
+ return;
+ }
+ else if (xi_event->sourceid != xi2_current->slave->id) {
+ struct xi2_slave *prev_slave = xi2_current->slave;
+
+ if (!xi2_find_slave(xi_event->sourceid)) {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_Enter event: device %d->%d not found.",
+ xi_event->deviceid, xi_event->sourceid));
+ return;
+ }
+ TRACE_EVENTS((stderr,
+ "%s %d->%d",
+ prev_slave == &xi2_no_slave
+ ? "Implicit switch in XI_Enter to"
+ : "Received out-of-turn XI_Enter event for",
+ xi_event->deviceid, xi_event->sourceid));
+ if (!xi2_current->slave->enabled)
+ TRACE_EVENTS((stderr, "Caution: slave is not enabled."));
+ }
+ else {
+ TRACE_EVENTS((stderr, "Received XI_Enter event"));
+ }
+
+ info = XIQueryDevice(DISP, xi_event->sourceid, &ndevices);
+ if (info == NULL || ndevices != 1) {
+ TRACE_EVENTS((stderr, "xi2_ev_enter: XIQueryDevice failed for %d",
+ xi_event->sourceid));
+ return;
+ }
+
+ for (i = 0; i < info->num_classes; ++i)
+ if (info->classes[i]->type == XIValuatorClass) {
+ XIValuatorClassInfo *valuator;
+
+ valuator = (XIValuatorClassInfo *) info->classes[i];
+ if (valuator->number == xi2_current->slave->vert.number) {
+ xi2_current->slave->vert.lastexact =
+ xi2_current->slave->vert.lastval = valuator->value;
+ xi2_current->slave->vert.serial =
+ LastKnownRequestProcessed(DISP);
+ }
+ else if (valuator->number == xi2_current->slave->horiz.number) {
+ xi2_current->slave->horiz.lastexact =
+ xi2_current->slave->horiz.lastval = valuator->value;
+ xi2_current->slave->horiz.serial =
+ LastKnownRequestProcessed(DISP);
+ }
+ }
+ XIFreeDeviceInfo(info);
+}
+
+static void
+xi2_emulate_action(struct xdvi_action *actp, struct xi2_valinfo *valinfo,
+ double value)
+{
+ double factor;
+ int dist;
+
+ for (; actp != NULL; actp = actp->next) {
+ if (actp->proc == Act_wheel || actp->proc == Act_hwheel) {
+ if (actp->num_params == 0)
+ factor = resource.wheel_unit;
+ else if (index(actp->params[0], '.') == NULL)
+ factor = atoi(actp->params[0]);
+ else
+ factor = atof(actp->params[0]) * resource.wheel_unit;
+ factor /= valinfo->increment;
+
+ if (valinfo->factor != fabs(factor)) {
+ valinfo->lastval = valinfo->lastexact;
+ valinfo->factor = fabs(factor);
+ }
+
+ /*
+ * In extreme cases, the server may reset the valuator to zero
+ * to avoid large values. The next few lines avoid the extreme
+ * scrolling event that would otherwise occur in this event.
+ */
+ if (fabs(value - valinfo->lastval) > INT_MAX / 2) {
+ valinfo->lastval +=
+ value > valinfo->lastval ? INT_MAX : -INT_MAX;
+ TRACE_EVENTS((stderr,
+ "Adjusted for pointer overflow; lastval = %g, new = %g\n",
+ valinfo->lastval, value));
+ }
+
+ dist = (value - valinfo->lastval) * factor;
+ if (dist == 0) {
+ valinfo->lastexact = value;
+ continue;
+ }
+
+ if (actp->proc == Act_wheel) {
+# if !MOTIF
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc,
+ cast_int_to_XtPointer(dist));
+# else /* MOTIF */
+ get_xy();
+ set_bar_value(globals.widgets.y_bar,
+ dist - m_window_y, (int) (globals.page.h - mane.height));
+# endif /* MOTIF */
+ }
+ else { /* Act_hwheel */
+# if !MOTIF
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc,
+ cast_int_to_XtPointer(dist));
+# else /* MOTIF */
+ get_xy();
+ set_bar_value(globals.widgets.x_bar,
+ dist - m_window_x, (int) (globals.page.w - mane.width));
+# endif /* MOTIF */
+ }
+ /* The next line puts back any rounding error */
+ valinfo->lastval += dist / factor;
+ valinfo->lastexact = value;
+ }
+ else if (actp->proc == Act_mouse_modes) {
+ size_t mode_idx = 0; /* default: one action for all modes */
+ struct xdvi_action *my_action = NULL;
+
+ if (actp->num_params > 1) { /* if different actions */
+ if (resource.mouse_mode >= actp->num_params) {
+ size_t k;
+
+ XDVI_WARNING((stderr, "X action 'mouse-modes' called "
+ "with only %d parameters, should be %d",
+ actp->num_params, resource.mouse_mode + 1));
+ for (k = 0; k < actp->num_params; k++) {
+ XDVI_WARNING((stderr, " Param %d: `%s'",
+ (int)(k + 1), actp->params[k]));
+ }
+ return;
+ }
+ mode_idx = resource.mouse_mode;
+ }
+
+ cached_compile_action(actp->params[mode_idx], &my_action);
+ xi2_emulate_action(my_action, valinfo, value);
+ }
+ else
+ TRACE_EVENTS((stderr, "Mouse_translations action is neither "
+ "wheel() nor hwheel(); ignoring."));
+ }
+}
+
+static void
+xi2_do_valuator(XIDeviceEvent *xi_event, struct xi2_valinfo *valinfo,
+ int button, double value)
+{
+ struct mouse_acts *mactp;
+ Modifiers state;
+
+ state = xi_event->buttons.mask[0];
+ if (xi_event->buttons.mask_len >= 2) {
+ state |= xi_event->buttons.mask[1] << 8;
+ if (xi_event->buttons.mask_len >= 3) {
+ state |= xi_event->buttons.mask[2] << 16;
+ if (xi_event->buttons.mask_len >= 4)
+ state |= xi_event->buttons.mask[3] << 24;
+ }
+ }
+
+ for (mactp = mouse_actions; mactp != NULL; mactp = mactp->next)
+ if (mactp->button == button || mactp->button == 0) {
+ Modifiers mask = 0;
+ Modifiers mods_value = 0;
+
+ if (mactp->late_bindings == NULL
+ || _XtComputeLateBindings(DISP, mactp->late_bindings,
+ &mods_value, &mask)) {
+ mask |= mactp->mask;
+ mods_value |= mactp->value;
+ if (((mods_value ^ state) & mask) == 0) {
+ xi2_emulate_action(mactp->action, valinfo, value);
+ return;
+ }
+ }
+ }
+}
+
+static void
+xi2_ev_motion(XIDeviceEvent *xi_event)
+{
+ double *val;
+ int i;
+ XEvent event;
+
+ if (xi2_current->id != xi_event->deviceid
+ && !xi2_find_master(xi_event->deviceid)) {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_Motion event: master device %d not found",
+ xi_event->deviceid));
+ return;
+ }
+
+ if (xi2_current->slave->id != xi_event->sourceid) {
+ struct xi2_slave *prev_slave = xi2_current->slave;
+
+ if (!xi2_find_slave(xi_event->sourceid)) {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_Motion event: device %d->%d not found.",
+ xi_event->deviceid, xi_event->sourceid));
+ return;
+ }
+ TRACE_EVENTS((stderr, "%s %d->%d\n",
+ prev_slave == &xi2_no_slave
+ ? "Implicit switch in XI_Motion to"
+ : "Received out-of-turn XI_Motion event for",
+ xi_event->deviceid, xi_event->sourceid));
+ if (!xi2_current->slave->enabled)
+ TRACE_EVENTS((stderr, "Caution: slave is not enabled."));
+ }
+
+ val = xi_event->valuators.values;
+ for (i = 0; i < xi_event->valuators.mask_len * 8; ++i)
+ if (XIMaskIsSet(xi_event->valuators.mask, i)) {
+ if (i == xi2_current->slave->vert.number) {
+ if ((long) (xi_event->serial
+ - xi2_current->slave->vert.serial) < 0) {
+ TRACE_EVENTS((stderr,
+ "Vertical valuator in EnterEvent was outdated "
+ "(%lu < %lu)",
+ xi_event->serial, xi2_current->slave->vert.serial));
+ xi2_current->slave->vert.serial = xi_event->serial;
+ xi2_current->slave->vert.lastexact =
+ xi2_current->slave->vert.lastval = *val;
+ }
+ else
+ xi2_do_valuator(xi_event, &xi2_current->slave->vert, 5,
+ *val);
+ }
+ else if (i == xi2_current->slave->horiz.number) {
+ if ((long) (xi_event->serial
+ - xi2_current->slave->horiz.serial) < 0) {
+ TRACE_EVENTS((stderr,
+ "Horizontal valuator in EnterEvent was outdated"));
+ xi2_current->slave->horiz.serial = xi_event->serial;
+ xi2_current->slave->horiz.lastexact =
+ xi2_current->slave->horiz.lastval = *val;
+ }
+ else
+ xi2_do_valuator(xi_event, &xi2_current->slave->horiz, 7,
+ *val);
+ }
+ ++val;
+ }
+
+ /* For some reason the X server doesn't want to send a core motion
+ * event if an XInput motion event is already being sent.
+ * So we need to fake it. The routines called from Act_motion()
+ * should be sure to use only the fields provided here. */
+ event.xmotion.window = xi_event->event;
+ event.xmotion.x = xi_event->event_x;
+ event.xmotion.y = xi_event->event_y;
+ event.xmotion.x_root = xi_event->root_x;
+ event.xmotion.y_root = xi_event->root_y;
+ Act_motion(NULL, &event, NULL, NULL);
+}
+
+static void
+xi2_ev_devchange(XIDeviceChangedEvent *xi_event)
+{
+ struct xi2_slave *sp;
+
+ if (xi_event->reason == XISlaveSwitch) {
+ struct xi2_master *mp;
+
+ TRACE_EVENTS((stderr,
+ "Received XI_DeviceChanged event, XISlaveSwitch, device = %d->%d",
+ xi_event->deviceid, xi_event->sourceid));
+
+ for (sp = xi2_slaves;; sp = sp->next) {
+ if (sp == NULL) {
+ TRACE_EVENTS((stderr, "ignoring (device not found)"));
+ return;
+ }
+ if (sp->id == xi_event->sourceid)
+ break;
+ }
+
+ for (mp = xi2_masters;; mp = mp->next) {
+ if (mp == NULL) {
+ TRACE_EVENTS((stderr,
+ "Cannot switch slave (master device not found)"));
+ return;
+ }
+ if (mp->id == xi_event->deviceid)
+ break;
+ }
+ mp->slave = sp;
+
+ /* A valuator may change when a slave is switched off */
+ xi2_init_valuators(sp, xi_event->classes, xi_event->num_classes);
+
+ if (!sp->enabled)
+ TRACE_EVENTS((stderr, "Caution: slave device is not enabled."));
+ }
+ else if (xi_event->reason == XIDeviceChange) {
+ /* In principle, this will add any device, but there's no "use" */
+ /* field, so no easy way to check if it's a suitable slave device.*/
+ TRACE_EVENTS((stderr,
+ "Received XI_DeviceChanged event, XIDeviceChange, device = %d->%d",
+ xi_event->deviceid, xi_event->sourceid));
+
+ for (sp = xi2_slaves;; sp = sp->next) {
+ if (sp == NULL) {
+ TRACE_EVENTS((stderr, " (new device)"));
+ sp = xmalloc(sizeof (struct xi2_slave));
+ sp->id = xi_event->sourceid;
+ sp->enabled = 0;
+ sp->next = xi2_slaves;
+ xi2_slaves = sp;
+ break;
+ }
+ if (sp->id == xi_event->sourceid)
+ break;
+ }
+
+ xi2_init_valuators(sp, xi_event->classes, xi_event->num_classes);
+
+ if (!xi2_active && sp->btn_mask) {
+ TRACE_EVENTS((stderr, "Activating XI2 now."));
+ xi2_activate();
+ }
+ }
+ else {
+ TRACE_EVENTS((stderr,
+ "Ignoring XI_DeviceChanged event with unknown reason %x, "
+ "device = %d->%d",
+ xi_event->reason, xi_event->deviceid, xi_event->sourceid));
+ }
+}
+
+
+static void
+xi2_ev_hierchange(XIHierarchyEvent *xi_event)
+{
+ XIHierarchyInfo *infp, *inf_end;
+
+ if (globals.debug & DBG_EVENT) {
+ fprintf(stderr, "%s:%d: XI_HierarchyChanged event: ",
+ __FILE__, __LINE__);
+ if (xi_event->flags & XIMasterAdded)
+ fputs(" XIMasterAdded", stderr);
+ if (xi_event->flags & XIMasterRemoved)
+ fputs(" XIMasterRemoved", stderr);
+ if (xi_event->flags & XISlaveAdded)
+ fputs(" XISlaveAdded", stderr);
+ if (xi_event->flags & XISlaveRemoved)
+ fputs(" XISlaveRemoved", stderr);
+ if (xi_event->flags & XISlaveAttached)
+ fputs(" XISlaveAttached", stderr);
+ if (xi_event->flags & XISlaveDetached)
+ fputs(" XISlaveDetached", stderr);
+ if (xi_event->flags & XIDeviceEnabled)
+ fputs(" XIDeviceEnabled", stderr);
+ if (xi_event->flags & XIDeviceDisabled)
+ fputs(" XIDeviceDisabled", stderr);
+ if (!xi_event->flags)
+ fputs("no flags(?)", stderr);
+ fputc('\n', stderr);
+ }
+
+ if (!(xi_event->flags & (XIDeviceEnabled | XIDeviceDisabled)))
+ return;
+
+ inf_end = xi_event->info + (xi_event->num_info - 1);
+ for (infp = xi_event->info; infp <= inf_end; ++infp) {
+ struct xi2_slave *sp;
+
+ if (infp->use != XISlavePointer && infp->use != XIFloatingSlave)
+ continue;
+
+ for (sp = xi2_slaves;; sp = sp->next) {
+ if (sp == NULL) {
+ if (infp->enabled)
+ TRACE_EVENTS((stderr,
+ " Ignoring enable request for %d->%d (not found)",
+ infp->attachment, infp->deviceid));
+ break;
+ }
+ if (sp->id == infp->deviceid) {
+ if (infp->enabled != sp->enabled) {
+ TRACE_EVENTS((stderr, " %s %d->%d",
+ infp->enabled ? "Enabling" : "Disabling",
+ infp->attachment, infp->deviceid));
+ sp->enabled = infp->enabled;
+ if (!sp->enabled && xi2_current->slave == sp) {
+ TRACE_EVENTS((stderr,
+ " Removing from master device"));
+ xi2_current->slave = &xi2_no_slave;
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+#endif /* HAVE_XI21 */
+
+
+/*
+ * Since redrawing the screen is (potentially) a slow task, xdvi checks
+ * for incoming events while this is occurring. It does not register
+ * a work proc that draws and returns every so often, as the toolkit
+ * documentation suggests. Instead, it checks for events periodically
+ * (or not, if SIGPOLL can be used instead) and processes them in
+ * a subroutine called by the page drawing routine. This routine (below)
+ * checks to see if anything has happened and processes those events and
+ * signals. (Or, if it is called when there is no redrawing that needs
+ * to be done, it blocks until something happens.)
+ *
+ * Ultimately, the goal is to have this be the only place in xdvi where
+ * blocking occurs.
+ *
+ * The argument to this function should be a mask of event types (EV_*)
+ * indicating which event types should cause read_events to return instead
+ * of waiting for more events. This function will always process all
+ * pending events and signals before returning.
+ * The return value is the value of globals.ev.flags.
+ */
+
+unsigned int
+read_events(unsigned int ret_mask)
+{
+ XEvent event;
+
+#if !HAVE_POLL
+ if (numfds == 0)
+ numfds = ConnectionNumber(DISP) + 1;
+#endif
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: read_events %u\n", __FILE__, __LINE__, ret_mask);
+ for (;;) {
+ globals.ev.ctr = event_freq;
+ /*
+ * The above line clears the flag indicating that an event is
+ * pending. So if an event comes in right now, the flag will be
+ * set again needlessly, but we just end up making an extra call.
+ * Also, be careful about destroying the magnifying glass while
+ * drawing on it.
+ */
+
+#if !FLAKY_SIGPOLL
+
+ if (event_freq < 0) { /* if SIGPOLL works */
+ if (!XtPending()) {
+ sigset_t oldsig;
+
+ (void) sigprocmask(SIG_BLOCK, &all_signals, &oldsig);
+ for (;;) {
+#ifdef SHOW_SIG_FLAGS
+ /* this gives HUGE output ... */
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: sig_flags = %d\n",
+ __FILE__, __LINE__, sig_flags);
+#endif
+ while (sig_flags) {
+ flags_to_sigproc[sig_flags]();
+ }
+
+ if (XtPending())
+ break;
+
+ if (globals.ev.flags & ret_mask) {
+ (void) sigprocmask(SIG_SETMASK, &oldsig, (sigset_t *) NULL);
+ return globals.ev.flags;
+ }
+ (void) sigsuspend(&oldsig);
+ }
+ (void) sigprocmask(SIG_SETMASK, &oldsig, (sigset_t *) NULL);
+ }
+ }
+ else
+
+#endif /* not FLAKY_SIGPOLL */
+
+ {
+ for (;;) {
+ struct xio *ip;
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: (flaky) sig_flags = %d\n",
+ __FILE__, __LINE__, sig_flags);
+ while (sig_flags) {
+ sigset_t oldsig;
+
+ (void) sigprocmask(SIG_BLOCK, &all_signals, &oldsig);
+
+ while (sig_flags) {
+ flags_to_sigproc[sig_flags]();
+ }
+
+ (void) sigprocmask(SIG_SETMASK, &oldsig,
+ (sigset_t *) NULL);
+ }
+
+ if (XtPending())
+ break;
+
+ if (globals.ev.flags & ret_mask)
+ return globals.ev.flags;
+
+ /* If a SIGUSR1 signal comes right now, then it will wait
+ until an X event or another SIGUSR1 signal arrives. */
+
+#if HAVE_POLL
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: have_poll!\n",
+ __FILE__, __LINE__);
+ if (io_dirty) {
+ struct pollfd *fp;
+
+ if (num_fds > max_fds) {
+ if (fds != NULL) free(fds);
+ fds = xmalloc(num_fds * sizeof *fds);
+ max_fds = num_fds;
+ fds->fd = ConnectionNumber(DISP);
+ fds->events = POLLIN;
+ }
+ fp = fds + 1;
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ fp->fd = ip->fd;
+ fp->events = ip->xio_events;
+ ip->pfd = fp;
+ ++fp;
+ }
+ io_dirty = False;
+ }
+
+ for (;;) {
+ if (poll(fds, num_fds, -1) >= 0) {
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ int revents = ip->pfd->revents;
+
+ if (revents & POLLIN && ip->read_proc != NULL)
+ (ip->read_proc)(ip->fd, ip->data);
+ if (revents & POLLOUT && ip->write_proc != NULL)
+ (ip->write_proc)(ip->fd, ip->data);
+ }
+ break;
+ }
+
+ if (errno == EINTR)
+ break;
+
+ if (errno != EAGAIN) {
+ perror("xdvi: poll");
+ break;
+ }
+ }
+#else /* HAVE_POLL */
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: NOT have_poll!\n",
+ __FILE__, __LINE__);
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_SET(ConnectionNumber(DISP), &readfds);
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ if (ip->xio_events & XIO_IN)
+ FD_SET(ip->fd, &readfds);
+ if (ip->xio_events & XIO_OUT)
+ FD_SET(ip->fd, &writefds);
+ }
+
+ for (;;) {
+ if (select(numfds, &readfds, &writefds, (fd_set *) NULL,
+ (struct timeval *) NULL) >= 0) {
+ for (ip = iorecs; ip != NULL; ip = ip->next) {
+ if (FD_ISSET(ip->fd, &readfds) && ip->read_proc != NULL) {
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: reading from %d\n",
+ __FILE__, __LINE__, ip->fd);
+ (ip->read_proc)(ip->fd, ip->data);
+ }
+ if (FD_ISSET(ip->fd, &writefds) && ip->write_proc != NULL) {
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: writing to %d\n",
+ __FILE__, __LINE__, ip->fd);
+ (ip->write_proc)(ip->fd, ip->data);
+ }
+ }
+ break;
+ }
+
+ if (errno == EINTR)
+ break;
+
+ if (errno != EAGAIN) {
+ perror("xdvi: select");
+ break;
+ }
+ }
+#endif /* HAVE_POLL */
+ }
+ }
+
+ XtAppNextEvent(globals.app, &event);
+
+#ifdef MOTIF
+ if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) != 0)
+ TipAppHandle(globals.app, &event);
+#endif
+
+#if HAVE_XI21
+ if (event.xany.type == GenericEvent
+ && event.xcookie.extension == xi2_opcode) {
+ if (!XGetEventData(DISP, &event.xcookie)) {
+ TRACE_EVENTS((stderr,
+ "Received XI2 event, of type %d, with no cookie",
+ event.xcookie.evtype));
+ }
+ else {
+ switch (event.xcookie.evtype) {
+
+ case XI_HierarchyChanged:
+ xi2_ev_hierchange(event.xcookie.data);
+ break;
+
+ case XI_DeviceChanged:
+ xi2_ev_devchange(event.xcookie.data);
+ break;
+
+ case XI_Enter:
+ xi2_ev_enter(event.xcookie.data);
+ break;
+
+ case XI_Motion:
+ /* This needs to be filled in by the client */
+ ((XIDeviceEvent *) event.xcookie.data)->serial
+ = event.xany.serial;
+ xi2_ev_motion(event.xcookie.data);
+ break;
+
+ default:
+ TRACE_EVENTS((stderr,
+ "Received XI2 event of unknown type %d",
+ event.xcookie.evtype));
+
+ }
+ XFreeEventData(DISP, &event.xcookie);
+ }
+ continue;
+ }
+#endif /* HAVE_XI21 */
+
+ if (resized)
+ get_geom();
+
+ if (event.xany.window == magnifier.win && event.type == Expose) {
+ handle_expose((Widget) NULL, (XtPointer)&magnifier, &event,
+ (Boolean *) NULL);
+ continue;
+ }
+ else if (globals.broken_motif_event_handling &&
+ (globals.cursor.flags & (CURSOR_RULER | CURSOR_TEXT))) {
+ /* In this case, Act_motion() and Act_release() are not called properly
+ * for updating the ruler/text selection (it works with the magnifier though),
+ * so we need to invoke them ourselves here: */
+ if (event.type == MotionNotify)
+ Act_motion(NULL, &event, NULL, NULL);
+ else if (event.type == ButtonRelease)
+ Act_release(NULL, &event, NULL, NULL);
+ }
+
+#ifdef MOTIF
+ if (XtIsRealized(globals.widgets.top_level)
+ && event.xany.window == XtWindow(globals.widgets.clip_widget)
+ && event.type == KeyPress) { /* workaround for #610206 */
+ motif_translations_hack();
+ }
+#else
+ if (resource.expert_mode & XPRT_SHOW_BUTTONS)
+ SubMenuHandleEvent(globals.app, &event);
+#endif
+ XtDispatchEvent(&event);
+ }
+}
+
+
+/*
+ * Higher-level routines for managing events.
+ */
+
+static void
+can_exposures(struct WindowRec *windowrec)
+{
+ windowrec->min_x = windowrec->min_y = MAXDIM;
+ windowrec->max_x = windowrec->max_y = 0;
+}
+
+void
+redraw(struct WindowRec *windowrec)
+{
+ currwin = *windowrec;
+ globals.win_expose.min_x = currwin.min_x + currwin.base_x;
+ globals.win_expose.min_y = currwin.min_y + currwin.base_y;
+ globals.win_expose.max_x = currwin.max_x + currwin.base_x;
+ globals.win_expose.max_y = currwin.max_y + currwin.base_y;
+ can_exposures(windowrec);
+
+ /* fix for bug #619070 - the complicated flags (and do_update_property)
+ are needed to avoid too many updates at exposures, especially for
+ a window of another xdvi instance when the magnifier intersects with
+ that window.
+ */
+ if (have_src_specials && do_update_property
+ && globals.win_expose.min_x != 1
+ && globals.win_expose.max_y - globals.win_expose.min_y != 1
+ && currwin.base_x == 0 && currwin.base_y == 0) {
+ update_window_property(XtWindow(globals.widgets.top_level), True);
+ }
+
+ TRACE_EVENTS((stderr, "Redraw %d x %d at (%d, %d) (base=%d,%d)",
+ globals.win_expose.max_x - globals.win_expose.min_x,
+ globals.win_expose.max_y - globals.win_expose.min_y,
+ globals.win_expose.min_x, globals.win_expose.min_y,
+ currwin.base_x, currwin.base_y));
+
+ /* can't use ev_cursor here, since the event loop might not see this change quick enough */
+ if (!(globals.ev.flags & EV_CURSOR)) {
+ TRACE_EVENTS((stderr, "Cursor: %ld", globals.cursor.flags));
+ if (!(globals.cursor.flags & (CURSOR_MAG | CURSOR_DRAG_H | CURSOR_DRAG_V | CURSOR_DRAG_A))) {
+ if (resource.mouse_mode == MOUSE_MODE3)
+ XDefineCursor(DISP, CURSORWIN, globals.cursor.mode3);
+ else
+ XDefineCursor(DISP, CURSORWIN, globals.cursor.wait);
+ XFlush(DISP);
+ }
+ globals.ev.flags |= EV_CURSOR;
+ }
+
+ /* No longer needed since windows are correctly transient now */
+ /* raise_message_windows(); */
+ raise_file_selector();
+ draw_page();
+ globals.warn_spec_now = False;
+}
+
+
+void
+redraw_page(void)
+{
+#if COLOR
+ const struct rgb *rgbp;
+#endif
+ TRACE_FILES((stderr, "Redraw page on %p", (void *)globals.dvi_file.bak_fp));
+
+ if (globals.dvi_file.bak_fp == NULL)
+ return;
+
+ if (scanned_page < current_page) {
+ TRACE_FILES((stderr, "redraw_page: scanned_page = %d, current_page = %d, prescanning %p\n",
+ scanned_page, current_page, (void *)globals.dvi_file.bak_fp));
+
+ prescan(globals.dvi_file.bak_fp);
+
+ if (globals.ev.flags & EV_GE_NEWPAGE) { /* if we need to re-prescan */
+ return;
+ }
+ }
+
+ TRACE_FILES((stderr, "redraw_page: current_page = %d", current_page));
+ if (pageinfo_get_window_width(current_page) != globals.page.unshrunk_w
+ || pageinfo_get_window_height(current_page) != globals.page.unshrunk_h) {
+ TRACE_FILES((stderr, "NEW SIZE: %dx%d",
+ pageinfo_get_window_width(current_page), pageinfo_get_window_height(current_page)));
+ init_page();
+ reconfig();
+ }
+
+ /* We can't call home() without proper unshrunk_page_*, which requires
+ * prescan(), which can't be done from within read_events() */
+
+ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ There's some complicated interaction with Postscript specials
+ here: if home_action check comes before the gs stuff, psp.drawfile
+ might not get initialized correctly, resulting in empty PS figures
+ (bounding box instead of figure). This is different in xdvi, due to
+ different handling of the home_action stuff, but at the moment I can't
+ remember the reason for this ...
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BUG ALERT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ */
+#if PS_GS
+ if (gs_postpone_prescan) {
+ if (!setjmp(globals.ev.canit)) {
+ gs_resume_prescan();
+ }
+ else
+ return;
+ }
+#endif
+ if (home_action != NULL) {
+ home_action(False);
+ home_action = NULL;
+ /* This discards the expose event generated by home()
+ (1 for each page) */
+ if (read_events(EV_NOWAIT) & EV_GE_NEWPAGE) {
+ return;
+ }
+
+ can_exposures(&mane);
+ }
+
+#if COLOR
+ rgbp = &bg_initial;
+ if (page_colors.stack != NULL) {
+ ASSERT(current_page < (int)page_colors.size, "page_colors.size too small");
+ rgbp = &page_colors.stack[current_page].bg;
+ }
+
+ /* Set background color */
+ if (bg_current == NULL
+ || rgbp->r != bg_current->color.r
+ || rgbp->g != bg_current->color.g
+ || rgbp->b != bg_current->color.b) {
+ struct bgrec **bgpp;
+
+ for (bgpp = &bg_head;;) {
+ bg_current = *bgpp;
+ if (bg_current == NULL) { /* if bg is not in list */
+ bg_current = *bgpp = xmalloc(sizeof *bg_current);
+ bg_current->next = NULL;
+ bg_current->color = *rgbp;
+ bg_current->fg_head = NULL;
+ bg_current->pixel_good = False;
+ break;
+ }
+ if (bg_current->color.r == rgbp->r
+ && bg_current->color.g == rgbp->g
+ && bg_current->color.b == rgbp->b)
+ break;
+ bgpp = &bg_current->next;
+ }
+ fg_current = NULL; /* force change of foreground color */
+ /* globals.gc.high is only used in XDrawRectangle, so its background color
+ doesn't need to be changed. */
+ if (globals.debug & DBG_DVI)
+ printf("Changing background color to %5d %5d %5d\n",
+ bg_current->color.r, bg_current->color.g,
+ bg_current->color.b);
+
+ if (!bg_current->pixel_good) {
+ bg_current->pixel = alloc_color(&bg_current->color,
+ color_data[1].pixel);
+ bg_current->pixel_good = True;
+ }
+ XSetWindowBackground(DISP, mane.win, bg_current->pixel);
+#if MOTIF && !FIXED_FLUSHING_PAGING
+ XtVaSetValues(XtParent(globals.widgets.draw_widget), XtNbackground, bg_current->pixel, NULL);
+#endif
+ /* XSetWindowBackground(DISP, mane.win, bg_current->pixel); */
+ /* XClearWindow(DISP, mane.win); */
+#if 0 /* don't recolor the cursor - gives too low contrast on color backgrounds,
+ and bad appearance when part of the background is white and cursor mask
+ is colored */
+ {
+ XColor bg_Color;
+ bg_Color.pixel = bg_current->pixel;
+ XQueryColor(DISP, G_colormap, &bg_Color);
+ XRecolorCursor(DISP, globals.cursor.ready, &globals.cr_color, &bg_Color);
+ XRecolorCursor(DISP, globals.cursor.wait, &globals.cr_color, &bg_Color);
+ }
+#endif
+ }
+#endif /* COLOR */
+
+ if (!globals.pausing.flag) {
+#if PS_GS
+ gs_erase_page();
+#endif
+ XClearWindow(DISP, mane.win);
+ }
+
+ if (G_backing_store != NotUseful) {
+ mane.min_x = mane.min_y = 0;
+ mane.max_x = globals.page.w;
+ mane.max_y = globals.page.h;
+ }
+ else {
+ get_xy();
+ mane.min_x = -m_window_x;
+ mane.max_x = -m_window_x + mane.width;
+ mane.min_y = -m_window_y;
+ mane.max_y = -m_window_y + mane.height;
+ }
+
+ /* update_TOC(); */
+ redraw(&mane);
+}
+
+void
+do_pages(void)
+{
+ if (globals.debug & DBG_BATCH) {
+
+ (void)read_events(EV_GT_IDLE);
+ for (current_page = 0; current_page < total_pages; ++current_page) {
+ if (resource.keep_flag) {
+ home_action = NULL;
+ }
+ else {
+ home_action = home;
+ }
+ globals.warn_spec_now = resource.warn_spec;
+#if PS_GS
+ for (;;) {
+ redraw_page();
+ (void) read_events(EV_NOWAIT);
+ if (!(globals.ev.flags & (EV_NEWPAGE | EV_NEWDOC | EV_RELOAD)))
+ break;
+ globals.ev.flags = EV_IDLE;
+ }
+#else
+ redraw_page();
+#endif
+ }
+ xdvi_exit(EXIT_SUCCESS);
+ }
+ else {
+ for (;;) { /* normal operation */
+ (void) read_events(EV_GT_IDLE);
+ TRACE_EVENTS((stderr, "globals.ev.flags: %d; ev_newpage: %d, ev_newdoc: %d, ev_reload: %d\n",
+ globals.ev.flags, EV_NEWPAGE, EV_NEWDOC, EV_RELOAD));
+ /* NOTE: reloading must be checked first! */
+ if (globals.ev.flags & (EV_NEWPAGE | EV_NEWDOC | EV_RELOAD | EV_PS_TOGGLE)) {
+ TRACE_EVENTS((stderr, "EV_NEWPAGE | ..."));
+ globals.ev.flags &= ~(EV_NEWPAGE | EV_EXPOSE | EV_PS_TOGGLE);
+ if (globals.ev.flags & EV_RELOAD) {
+ dviErrFlagT errflag;
+
+ globals.ev.flags &= ~EV_RELOAD;
+ if (load_dvi_file(
+#if !DELAYED_MKTEXPK
+ True,
+#endif
+ &errflag)) {
+ statusline_info(STATUS_SHORT, "File reloaded.");
+ }
+ /* else { */
+ /* statusline_info(STATUS_MEDIUM, "File corrupted, not reloading."); */
+ /* } */
+ }
+ if (globals.ev.flags & EV_NEWDOC) {
+ dviErrFlagT errflag;
+ TRACE_EVENTS((stderr, "EV_NEWDOC!"));
+ /* fprintf(stderr, "newdoc!\n"); */
+ TRACE_FILES((stderr, "current page: %d", current_page));
+ /* file_history_set_page(current_page); */
+ globals.ev.flags &= ~EV_NEWDOC;
+ if (load_dvi_file(
+#if !DELAYED_MKTEXPK
+ True,
+#endif
+ &errflag)) {
+ statusline_append(STATUS_SHORT, "Opened ", "Opened \"%s\"", globals.dvi_name);
+ /* statusline_info(STATUS_SHORT, "Opened \"%s\"", globals.dvi_name); */
+ TRACE_FILES((stderr, "Adding to history: |%s|\n", globals.dvi_name));
+ if (file_history_push(globals.dvi_name)) { /* it's a new file, add to history */
+ TRACE_FILES((stderr, "New entry!"));
+ filehist_menu_add_entry(globals.dvi_name);
+ }
+ else { /* only need to move existing elements to new positions */
+ TRACE_FILES((stderr, "Existing entry!\n"));
+ filehist_menu_refresh();
+ }
+ }
+ }
+
+ can_exposures(&mane);
+ can_exposures(&magnifier);
+
+ if (globals.dvi_file.bak_fp != NULL) {
+ TRACE_EVENTS((stderr, "redraw_page()"));
+ redraw_page();
+ }
+ else {
+ TRACE_EVENTS((stderr, "dvi_file_changed()"));
+ (void)dvi_file_changed();
+ }
+ }
+ else if (globals.ev.flags & EV_PAGEHIST_GOTO_PAGE) {
+ int pageno;
+ globals.ev.flags &= ~EV_PAGEHIST_GOTO_PAGE;
+ pageno = check_goto_page(page_history_get_page(), False);
+ goto_page(pageno, resource.keep_flag ? NULL : home, False);
+ TRACE_FILES((stderr, "got page: %d", pageno));
+ }
+ else if (globals.ev.flags & EV_FILEHIST_GOTO_PAGE) {
+ int pageno;
+ globals.ev.flags &= ~EV_FILEHIST_GOTO_PAGE;
+ pageno = check_goto_page(file_history_get_page(), True);
+ goto_page(pageno, resource.keep_flag ? NULL : home, False);
+ TRACE_FILES((stderr, "got page: %d", pageno));
+ }
+ else if (globals.ev.flags & EV_PAGEHIST_INSERT) {
+ globals.ev.flags &= ~EV_PAGEHIST_INSERT;
+ page_history_insert(current_page);
+ }
+ else if (globals.ev.flags & EV_FIND_CANCEL) {
+ /* NOTE: This must be done before checking for expose() */
+ globals.ev.flags &= ~EV_FIND_CANCEL;
+ }
+ else if (globals.ev.flags & EV_ANCHOR) {
+ /*
+ * Similar to forward search: search for a htex anchor.
+ * This needs to come before the next case which does the redraw_page(),
+ * otherwise anchors for the current page might not be drawn at all:
+ * anchor_search() sets the info later used by htex_draw_anchormarkers(),
+ * which is invoked by redraw_page().
+ */
+
+ /* switch off the link cursor */
+ globals.cursor.flags &= ~CURSOR_LINK;
+
+ if (dvi_file_changed())
+ continue;
+
+ anchor_search(g_anchor_pos);
+
+ /* added, otherwise anchors on same page may not be drawn */
+ /* NOTE: This caused a crash when clicking on link "Langer" on p3 of diss.dvi
+ since the color stack wasn't allocated for the target pages. Removed for the
+ time being, since I can't reproduce the problem for which it was introduced.
+ CVS commit message was:
+ "fix anchor drawing for other window"
+ */
+ /* redraw(&mane); */
+
+ globals.ev.flags &= ~EV_ANCHOR;
+ }
+ else if (globals.ev.flags & EV_SRC) {
+ /*
+ * Source special operations are deferred to here because
+ * they call geom_scan(), which may call define_font(),
+ * which may call makefont(), which may call read_events()
+ * recursively.
+ */
+ if (globals.src.fwd_string != NULL) {
+ const char *s = globals.src.fwd_string;
+
+ if (dvi_file_changed())
+ continue;
+
+ source_forward_search(s);
+ globals.ev.flags &= ~EV_SRC;
+ globals.src.fwd_string = NULL;
+
+ /* de-iconify window if needed, and raise it */
+ XMapRaised(XtDisplay(globals.widgets.top_level), XtWindow(globals.widgets.top_level));
+ raise_message_windows();
+ }
+ else if (source_reverse_x != -1) {
+ if (dvi_file_changed())
+ continue;
+
+ source_reverse_search(source_reverse_x, source_reverse_y, True);
+ globals.ev.flags &= ~EV_SRC;
+ }
+ else {
+ source_special_show(source_show_all);
+ globals.ev.flags &= ~EV_SRC;
+ }
+ }
+ /* support for `-findstring' */
+ else if (globals.ev.flags & EV_FIND) {
+ if (dvi_file_changed())
+ continue;
+
+ if (resource.find_string != NULL) { /* not first call */
+ dvi_find_string(resource.find_string, False);
+ resource.find_string = NULL;
+ }
+ else { /* actually should never arrive here?? */
+ dvi_find_string(NULL, True);
+ }
+ globals.ev.flags &= ~EV_FIND;
+ }
+ else if (globals.ev.flags & EV_MAG_MOVE) {
+ MYTRACE((stderr, "moving mag!\n"));
+ move_magnifier();
+ }
+ else if (globals.ev.flags & EV_EXPOSE) {
+ if (magnifier.min_x < MAXDIM) {
+ /* fprintf(stderr, "magnifier < maxdim!\n"); */
+ if (mane.min_x >= MAXDIM) {
+ /* fprintf(stderr, "mane >= maxdim!\n"); */
+ globals.ev.flags &= ~EV_EXPOSE;
+ }
+ redraw(&magnifier);
+ }
+ else {
+ /* see comment in mag.c */
+ globals.ev.flags &= ~EV_EXPOSE;
+ if (mane.min_x < MAXDIM) {
+ redraw(&mane);
+ }
+ }
+ }
+ else if (globals.ev.flags & EV_CURSOR) {
+ /*
+ * This code eliminates unnecessary calls to XDefineCursor,
+ * since this is a slow operation on some hardware (e.g., S3
+ * chips).
+ */
+ XSync(DISP, False);
+ if (!XtPending()) {
+ Cursor curr;
+
+ if (globals.cursor.flags & CURSOR_DRAG_V)
+ curr = globals.cursor.drag_v;
+ else if (globals.cursor.flags & CURSOR_DRAG_H)
+ curr = globals.cursor.drag_h;
+ else if (globals.cursor.flags & CURSOR_DRAG_A)
+ curr = globals.cursor.drag_a;
+ else if (resource.mouse_mode == MOUSE_MODE3)
+ curr = globals.cursor.mode3;
+ else if (resource.mouse_mode == MOUSE_MODE2)
+ curr = globals.cursor.mode2;
+ else if (globals.cursor.flags & CURSOR_LINK)
+ curr = globals.cursor.link;
+ else if (globals.cursor.flags & CURSOR_MAG)
+ curr = globals.cursor.empty;
+ else if (globals.cursor.flags & CURSOR_CORRUPTED)
+ curr = globals.cursor.corrupted;
+ else if (globals.pausing.flag)
+ curr = globals.cursor.pause;
+ else
+ curr = globals.cursor.mode1;
+ XDefineCursor(DISP, CURSORWIN, curr);
+ globals.ev.flags &= ~EV_CURSOR;
+ }
+ }
+ XFlush(DISP);
+ }
+ }
+}
+
+static void
+Act_unpause_or_next(Widget w, XEvent *event,
+ String *params, Cardinal *num_params)
+{
+ if (globals.pausing.flag) {
+ globals.pausing.num++;
+ if (globals.pausing.num_save)
+ globals.pausing.num_save[current_page] = globals.pausing.num;
+ redraw_page();
+ }
+ else {
+ Act_down_or_next(w, event, params, num_params);
+ }
+}
+
+/*
+ * timer callback for watching the DVI file.
+ */
+void
+watch_file_cb(XtPointer client_data, XtIntervalId *id)
+{
+ static XtIntervalId timer = 0;
+
+ UNUSED(client_data);
+ UNUSED(id);
+
+ if (resource.watch_file > 0.0) {
+ unsigned long watch_time_ms;
+
+ (void)dvi_file_changed();
+
+ if (timer) {
+ XtRemoveTimeOut(timer);
+ timer = (XtIntervalId)(XtIntervalId)0;
+ }
+
+ watch_time_ms = (unsigned long)(resource.watch_file * 1000);
+ timer = XtAppAddTimeOut(globals.app, watch_time_ms, watch_file_cb, (XtPointer)NULL);
+ }
+}
+
+void
+Act_scroll_list_up(Widget w, XEvent *event, String *params,
+ Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (current_page == 0) {
+ xdvi_bell();
+ /* statusline_info(STATUS_SHORT, "First page of DVI file"); */
+ return;
+ }
+ goto_page(check_goto_page(current_page - 1, True),
+ resource.keep_flag ? NULL : home, False);
+ search_signal_page_changed();
+ statusline_erase("Page history:");
+}
+
+void
+Act_scroll_list_down(Widget w, XEvent *event, String *params,
+ Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (current_page >= total_pages - 1) {
+ xdvi_bell();
+ /* statusline_info(STATUS_SHORT, "Last page of DVI file"); */
+ return;
+ }
+ goto_page(check_goto_page(current_page + 1, True),
+ resource.keep_flag ? NULL : home, False);
+ search_signal_page_changed();
+ statusline_erase("Page history:");
+}
+
+void Act_pagehistory_back(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = 1;
+ }
+ page_history_move(-arg);
+}
+
+void Act_pagehistory_forward(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = 1;
+ }
+ page_history_move(arg);
+}
+
+void Act_pagehistory_clear(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ page_history_clear();
+}
+
+void Act_pagehistory_delete_backward(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = 1;
+ }
+ page_history_delete(-arg);
+}
+
+void Act_pagehistory_delete_forward(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = 1;
+ }
+ page_history_delete(arg);
+}
+
+#ifdef MOTIF
+void Act_prefs_dialog(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ int arg;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (!get_int_arg(params, num_params, &arg)) {
+ arg = -1;
+ }
+
+ popup_preferences_dialog(globals.widgets.top_level, arg);
+}
+#endif /* MOTIF */
+
diff --git a/Build/source/texk/xdvik/events.h b/Build/source/texk/xdvik/events.h
new file mode 100644
index 00000000000..cc94f9c4925
--- /dev/null
+++ b/Build/source/texk/xdvik/events.h
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 1990-2015 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef EVENTS_H_
+#define EVENTS_H_
+
+/*
+ * Flag values and masks for event_flags
+ */
+
+#define EV_IDLE (1<<0) /* 1 - non-event */
+#define EV_CURSOR (1<<1) /* 2 - cursor needs to revert back to ready */
+#define EV_EXPOSE (1<<2) /* 4 - expose occurred somewhere */
+#define EV_MAG_MOVE (1<<3) /* 8 - magnifier moved */
+#define EV_MAG_GONE (1<<4) /* 16 - magnifier gone while being drawn */
+#define EV_ACK (1<<5) /* 32 - used internally */
+#define EV_SRC (1<<6) /* 64 - source special operation is pending */
+#define EV_ANCHOR (1<<7) /* 128 - anchor search is pending - should maybe move this up? */
+#define EV_FIND (1<<8) /* 256 - string search */
+#define EV_FIND_CANCEL (1<<9) /* 512 - string search cancelled */
+#define EV_FILEHIST_GOTO_PAGE (1<<10) /* 1024 - get page from file history */
+#define EV_PAGEHIST_INSERT (1<<11) /* 2048 - get page from file history */
+#define EV_PAGEHIST_GOTO_PAGE (1<<12) /* 4096 - go to page from file history */
+#define EV_NEWPAGE (1<<13) /* 8192 - new page requested */
+#define EV_PS_TOGGLE (1<<14) /* 16384 - PostScript toggled on or off */
+#define EV_RELOAD (1<<15) /* 32768 - reload dvi file */
+#define EV_NEWDOC (1<<16) /* 65536 - new dvi file requested */
+#define EV_TERM (1<<17) /* 131072 - quit */
+#define EV_MAXPLUS1 (1<<18) /* 262144 - marker for highest element */
+
+#define EV_GE_IDLE (EV_MAXPLUS1 - EV_IDLE)
+#define EV_GT_IDLE (EV_MAXPLUS1 - EV_CURSOR)
+#define EV_GE_CURSOR (EV_MAXPLUS1 - EV_CURSOR)
+#define EV_GE_EXPOSE (EV_MAXPLUS1 - EV_EXPOSE)
+#define EV_GE_MAG_MOVE (EV_MAXPLUS1 - EV_MAG_MOVE)
+#define EV_GE_MAG_GONE (EV_MAXPLUS1 - EV_MAG_GONE)
+#define EV_GE_ACK (EV_MAXPLUS1 - EV_ACK)
+#define EV_GE_FIND (EV_MAXPLUS1 - EV_FIND)
+#define EV_GE_FIND_CANCEL (EV_MAXPLUS1 - EV_FIND_CANCEL)
+#define EV_GE_NEWPAGE (EV_MAXPLUS1 - EV_NEWPAGE)
+#define EV_GE_PS_TOGGLE (EV_MAXPLUS1 - EV_PS_TOGGLE)
+#define EV_GE_NEWDOC (EV_MAXPLUS1 - EV_NEWDOC)
+#define EV_GE_RELOAD (EV_MAXPLUS1 - EV_RELOAD)
+#define EV_GE_TERM (EV_MAXPLUS1 - EV_TERM)
+
+#define EV_NOWAIT EV_GE_IDLE
+
+
+struct xio {
+ struct xio *next; /* link to next in list */
+ int fd; /* file descriptor */
+ int xio_events; /* same as in struct pollfd
+ (can't call it events because poll.h
+ on AIX defines events to something else) */
+#if HAVE_POLL
+ struct pollfd *pfd;
+#endif
+ char *(*read_proc) (int, void *); /* call to read from fd, or NULL */
+ void (*write_proc) (int, void *); /* call to write to fd, or NULL */
+ void *data; /* data passed as second argument to read_proc()/write_proc() */
+};
+
+struct xchild; /* forward declaration */
+
+typedef void (*childProcT)(int exitval, struct xchild *this);
+
+struct xchild {
+ struct xchild *next; /* link to next in list */
+ pid_t pid; /* pid of process, or 0 */
+ char *name; /* name of process, for printing error message */
+ struct xio *io; /* pointer to i/o structure for reading error msg. */
+ void *data; /* arbitrary data passed to proc */
+ int killsig; /* signal to use when killing it, or 0 */
+
+ /* proc is a pointer to a function to call when the child exits; it will be
+ * called with 2 arguments:
+ * - The return status of the child
+ * - A pointer to the current struct (so that the procedure can free()
+ * (elements of) the struct when needed, or have access to the data field).
+ */
+ childProcT proc;
+};
+
+typedef enum xtimerT_ {
+ XTM_DEFAULT = 0,
+ XTM_STATUSLINE,
+ XTM_HREF
+} xtimerT;
+
+struct xtimer {
+ struct xtimer *next; /* link to next in chain */
+ struct timeval when; /* when to call the routine */
+ xtimerT type; /* timer type */
+ void (*proc) (struct xtimer *this, void *data); /* procedure to call */
+ void *data;
+#if XDVI_XT_TIMER_HACK
+ XtTimerCallbackProc xt_proc; /* additional data for Xt callbacks */
+ XtPointer closure;
+#endif
+};
+
+extern void set_timer(struct xtimer *tp, int ms);
+extern void cancel_timer(struct xtimer *tp);
+
+extern int get_num_actions(void);
+extern XtActionsRec *get_actions(void);
+
+extern int atopix(const char *);
+extern int atopix_signed(const char *);
+
+extern int check_goto_page(int pageno, Boolean insert_into_pagehist);
+extern Boolean get_int_arg(String * param, Cardinal *num_params, int *res);
+extern Boolean toggle_arg(int arg, String * param, Cardinal *num_params);
+
+extern void clearexpose(struct WindowRec *windowrec, int x, int y, unsigned w,
+ unsigned h);
+extern void expose(struct WindowRec *windowrec, int x, int y, unsigned int w,
+ unsigned int h);
+extern void home(wide_bool);
+extern int set_bar_value(Widget bar, int value, int max);
+
+extern void reconfig(void);
+extern void redraw(struct WindowRec *windowrec);
+extern void handle_resize(Widget, XtPointer, XEvent *, Boolean *);
+extern void handle_expose(Widget, XtPointer, XEvent *, Boolean *);
+extern void handle_property_change(Widget, XtPointer, XEvent *, Boolean *);
+extern void handle_command(Widget widget, XtPointer client_data,
+ XtPointer call_data);
+extern void showmessage(const char *);
+extern void set_chld(struct xchild *);
+extern void clear_chld(struct xchild *);
+extern void set_io(struct xio *);
+extern void clear_io(struct xio *);
+extern void xdvi_exit(int);
+extern unsigned int read_events(unsigned int);
+
+typedef void (*home_proc) (wide_bool);
+extern void goto_page(int page, home_proc proc, Boolean force);
+
+extern void setup_sigalarm(void);
+extern void setup_signal_handlers(Boolean early);
+extern int shrink_to_fit(void);
+extern void do_pages(void);
+extern void do_set_density(double newgamma, Boolean force, Boolean update_resource);
+extern void do_toggle_color(Boolean update_resource);
+
+extern void Act_mouse_modes(Widget w, XEvent *event, String *params, Cardinal *num_params);
+
+#ifdef PS
+extern void Act_set_ps(Widget w, XEvent *event, String *params, Cardinal *num_params);
+#endif
+
+#ifdef PS_GS
+extern void Act_set_gs_alpha(Widget w, XEvent *event, String *params, Cardinal *num_params);
+#endif
+
+extern void Act_recent_files(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_htex_back(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_htex_forward(Widget w, XEvent *event, String *params, Cardinal *num_params);
+
+extern void Act_set_keep_flag(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_back_page(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_forward_page(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void do_set_shrinkfactor(int arg, Boolean set_resource);
+extern void Act_set_shrink_factor(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_shrink_to_dpi(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_set_expert_mode(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_use_tex_pages(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_ruler_mode(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_set_expert_mode(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_switch_mode(Widget w, XEvent *event, String *params, Cardinal *num_params);
+
+#if defined(NEW_MENU_CREATION) || defined(MOTIF)
+extern void Act_set_papersize(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_set_paper_landscape(Widget w, XEvent *event, String *params, Cardinal *num_params);
+#endif /* NEW_MENU_CREATION */
+
+extern void Act_scroll_list_up(Widget w, XEvent *event, String *params,
+ Cardinal *num_params);
+extern void Act_scroll_list_down(Widget w, XEvent *event, String *params,
+ Cardinal *num_params);
+extern void Act_pagehistory_clear(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_pagehistory_back(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_pagehistory_forward(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_pagehistory_delete_backward(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_pagehistory_delete_forward(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_magnifier(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_ruler(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_text_selection(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_switch_magnifier_units(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_href(Widget w, XEvent *event, String *params, Cardinal *num_params);
+extern void Act_href_newwindow(Widget w, XEvent *event, String *params, Cardinal *num_params);
+
+extern void null_mouse(XEvent *ignored);
+extern void text_motion(XEvent *event);
+
+typedef enum { TEXT_SEL_MOVE, TEXT_SEL_CLEAR, TEXT_SEL_REDRAW, TEXT_SEL_ERASE } textSelectionT;
+extern void text_change_region(textSelectionT mode, XEvent *event);
+
+extern void text_selection_start(XEvent *event);
+
+#if COLOR
+
+extern void update_expert_mode(void);
+
+extern Boolean check_resource_expert(void *val, const char *param);
+extern Boolean check_paper_landscape(void *val, const char *param);
+extern Boolean check_papersize(void *val, const char *param);
+extern Boolean check_toggle(void *val, const char *param);
+extern Boolean check_int(void *val, const char *param);
+
+#endif /* COLOR */
+
+
+struct xdvi_action {
+ XtActionProc proc;
+ String command;
+ String *params;
+ Cardinal num_params;
+ struct xdvi_action *next;
+};
+
+extern Boolean compile_action(const char *str, struct xdvi_action **);
+extern void watch_file_cb(XtPointer client_data, XtIntervalId * id);
+extern void redraw_page(void);
+
+#ifdef USE_PANNER
+extern void handle_x_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont);
+extern void handle_y_scroll(Widget w, XtPointer closure, XEvent *ev, Boolean *cont);
+#endif
+extern void xdvi_exit_callback(Widget w, XtPointer client_data, XtPointer call_data);
+
+#endif /* EVENTS_H_ */
diff --git a/Build/source/texk/xdvik/exit-handlers.c b/Build/source/texk/xdvik/exit-handlers.c
new file mode 100644
index 00000000000..0b34fdc2f45
--- /dev/null
+++ b/Build/source/texk/xdvik/exit-handlers.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2004-2015 Stefan Ulrich and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ Exit handlers: Procedures taking a void * that can be registered
+ via register_exit_handler() and will be called fromx xdvi_exit().
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "exit-handlers.h"
+#include "util.h"
+
+static struct exit_list {
+ exit_procedure proc;
+ void *arg;
+ struct exit_list *next;
+} *exit_procs = NULL;
+
+void register_exit_handler(exit_procedure proc, void *arg)
+{
+ struct exit_list *ep;
+
+ /* first check for duplicates (needed because of remove_tmp_dvi_file) */
+ for (ep = exit_procs; ep != NULL; ep = ep->next) {
+ if (ep->proc == proc && ep->arg == arg)
+ return;
+ }
+
+ ep = xmalloc(sizeof *ep);
+ ep->proc = proc;
+ ep->arg = arg;
+ ep->next = exit_procs;
+ exit_procs = ep;
+}
+
+#if 0 /* This is currently unused. */
+void unregister_exit_handler(exit_procedure proc)
+{
+ size_t i;
+ for (i = 0; i < exit_procs_size; i++) {
+ if (exit_procs[i].proc == proc) {
+ fprintf(stderr, "unregistering %p!\n", (void *)proc);
+ exit_procs[i].proc = NULL;
+ exit_procs[i].arg = NULL;
+ }
+ }
+}
+#endif
+
+void call_exit_handlers(void)
+{
+ struct exit_list *ep;
+
+ for (ep = exit_procs; ep != NULL; ep = ep->next) {
+ ep->proc(ep->arg);
+ /* fprintf(stderr, "calling exit proc %lu\n", (unsigned long)i); */
+ }
+
+ /* free them */
+ while (exit_procs != NULL) {
+ ep = exit_procs;
+ exit_procs = exit_procs->next;
+ free(ep);
+ }
+}
diff --git a/Build/source/texk/xdvik/exit-handlers.h b/Build/source/texk/xdvik/exit-handlers.h
new file mode 100644
index 00000000000..e9fb2de0b52
--- /dev/null
+++ b/Build/source/texk/xdvik/exit-handlers.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2004-2015 Stefan Ulrich and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef EXIT_HANDLERS_H_
+#define EXIT_HANDLERS_H_
+
+typedef void (*exit_procedure) (void *);
+
+extern void register_exit_handler(exit_procedure proc, void *arg);
+/* extern void unregister_exit_handler(exit_procedure proc); */
+extern void call_exit_handlers(void);
+
+#endif /* EXIT_HANDLERS_H_ */
diff --git a/Build/source/texk/xdvik/filehist.c b/Build/source/texk/xdvik/filehist.c
new file mode 100644
index 00000000000..d669ad7a358
--- /dev/null
+++ b/Build/source/texk/xdvik/filehist.c
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ List of recently visited files, initialized from X resource
+ fileHistory and displayed in `File -> Open Recent' menu.
+*/
+
+#include "xdvi-config.h"
+
+#include <ctype.h>
+
+#include "xdvi.h"
+#include "util.h"
+#include "dl_list.h"
+#include "my-snprintf.h"
+#include "string-utils.h"
+#include "dvi-init.h"
+#include "events.h"
+#include "message-window.h"
+#include "xm_menu.h"
+#include "xaw_menu.h"
+#include "filehist.h"
+
+/****************************************************************************
+ *
+ * File-scope globals
+ *
+ ****************************************************************************/
+
+/* list of files */
+static struct dl_list *m_file_history = NULL;
+
+/* current size of the list */
+static int m_file_history_length = 0;
+
+/* /\* current position in the list *\/ */
+/* static int m_file_history_currpos = 0; */
+
+/* item in above list */
+struct file_history {
+ char *filename;
+ int pageno;
+};
+
+#define DEBUG 1
+
+/****************************************************************************
+ *
+ * Private functions
+ *
+ ****************************************************************************/
+
+static void
+file_history_show(struct dl_list *list)
+{
+ if (globals.debug & DBG_FILES) {
+ int n;
+ fprintf(stderr, "======= File history:\n");
+ for (n = 0; list != NULL; list = list->next, n++) {
+ struct file_history *item = (struct file_history *)(list->item);
+ if (item == NULL) {
+ fprintf(stderr, "item %d is NULL!\n", n);
+ continue;
+ }
+ fprintf(stderr, "item %d: %d:%s\n", n, item->pageno, item->filename);
+ }
+ }
+}
+
+
+/****************************************************************************
+ *
+ * Exported functions
+ *
+ ****************************************************************************/
+
+void
+file_history_init(void)
+{
+ char **fileinfo;
+ size_t i;
+ struct dl_list *head = NULL;
+
+ m_file_history_length = 0;
+
+ if (resource.file_history == NULL)
+ return;
+
+ fileinfo = get_separated_list(resource.file_history, "\n", False);
+
+ for (i = 0; fileinfo[i] != NULL && i < (size_t)resource.file_history_size; i++) {
+ struct file_history *item = xmalloc(sizeof *item);
+ char *ptr;
+ int pageno = strtol(fileinfo[i], &ptr, 10);
+ TRACE_FILES((stderr, "FILEINFO: %s", fileinfo[i]));
+ if (ptr == fileinfo[i]) {
+ XDVI_WARNING((stderr, "Missing page number in resource line `%s'!\n",
+ fileinfo[i]));
+ pageno = 0;
+ }
+ else {
+ while (isspace((int)*ptr))
+ ptr++;
+ }
+
+ item->pageno = pageno;
+ item->filename = xstrdup(ptr);
+
+ TRACE_FILES((stderr, "FILE: %d:%s", item->pageno, item->filename));
+
+ m_file_history = dl_list_insert(m_file_history, item);
+ if (head == NULL) /* remember head position */
+ head = m_file_history;
+
+ TRACE_FILES((stderr, "NEW ELEM: %p", (void *)m_file_history));
+
+ m_file_history_length++;
+
+ free(fileinfo[i]);
+ }
+ free(fileinfo);
+
+ m_file_history = head;
+ file_history_show(m_file_history);
+}
+
+static Boolean
+equals_filename(const void *it, const void *fname)
+{
+ const struct file_history *item = (const struct file_history *)it;
+ const char *filename = (const char *)fname;
+
+ return strcmp(item->filename, filename) == 0;
+}
+
+
+/* put new elem for filename `filename' and page number `page' at the front
+ of the list. Return True if the addition caused the history to grow, else
+ False (in case the item was only moved to the front).
+*/
+Boolean
+file_history_push(const char *filename)
+{
+ int i;
+ struct file_history *item = NULL;
+ void *removed_data = NULL;
+ struct file_history *removed_item = NULL;
+ int len_bak = m_file_history_length;
+ int count = 0;
+
+ TRACE_FILES((stderr, "Pushing: |%s|", filename));
+
+ /* if list already contains an item with same filename, remove it */
+ m_file_history = dl_list_remove(m_file_history, filename, &count, &removed_data, equals_filename);
+ if (count == 0)
+ m_file_history_length++;
+
+ removed_item = (struct file_history *)removed_data;
+
+ file_history_show(m_file_history);
+
+ TRACE_FILES((stderr, "current length: %d, max: %d", m_file_history_length, resource.file_history_size));
+
+ /* truncate list if it has reached its max length */
+ if (m_file_history_length > resource.file_history_size) {
+ struct dl_list *listpos = m_file_history;
+ struct dl_list *last_pos = listpos;
+ for (i = 0; listpos != NULL && i < m_file_history_length; i++) {
+ last_pos = listpos;
+ listpos = listpos->next;
+ }
+
+ item = last_pos->item; /* reuse item */
+ TRACE_FILES((stderr, "Re-using item: |%s| -> |%s|", item->filename, filename));
+ item->filename = xrealloc(item->filename, strlen(filename) + 1);
+ strcpy(item->filename, filename);
+
+ (void)dl_list_remove_item(&last_pos);
+ m_file_history_length--;
+ }
+ else if (removed_item != NULL) {
+ TRACE_FILES((stderr, "Re-using item: |%s|\n", removed_item->filename));
+ item = removed_item; /* reuse item */
+ }
+ else {
+ item = xmalloc(sizeof *item);
+ TRACE_FILES((stderr, "NEW item: |%s|\n", filename));
+ item->filename = xstrdup(filename);
+ item->pageno = 0;
+ }
+
+ /* add new element at front of list */
+ m_file_history = dl_list_push_front(m_file_history, item);
+
+ file_history_show(m_file_history);
+
+ TRACE_FILES((stderr, "returning: %d < %d", len_bak, m_file_history_length));
+ return len_bak < m_file_history_length;
+}
+
+size_t file_history_size(void)
+{
+ return m_file_history_length;
+}
+
+void file_history_set_page(int pageno)
+{
+ struct dl_list *head;
+
+ TRACE_FILES((stderr, "SETTING HEAD to %d", pageno));
+ file_history_show(m_file_history);
+ head = dl_list_head(m_file_history);
+ if (head != NULL) {
+ struct file_history *item = (struct file_history *)head->item;
+ TRACE_FILES((stderr, "Setting page of |%s| to %d", item->filename, pageno));
+ item->pageno = pageno;
+ }
+}
+
+void file_history_set_page_at(int idx, int pageno)
+{
+ int i;
+ struct dl_list *listpos = dl_list_head(m_file_history);
+ struct file_history *item;
+
+ for (i = 0; listpos != NULL && i < idx; i++) {
+ listpos = listpos->next;
+ }
+ if (listpos == NULL) {
+ TRACE_FILES((stderr, "Asked for file at position %d, but only %d elements in list",
+ idx, i - 1));
+ return;
+ }
+ item = (struct file_history *)listpos->item;
+ TRACE_FILES((stderr, "set_page_at index %d: Setting page of |%s| to %d", idx, item->filename, pageno));
+ item->pageno = pageno;
+}
+
+int file_history_get_page(void)
+{
+ struct dl_list *head = dl_list_head(m_file_history);
+ if (head != NULL) {
+ struct file_history *item = (struct file_history *)head->item;
+ TRACE_FILES((stderr, "Getting page of |%s|: %d", item->filename, item->pageno));
+ return item->pageno;
+ }
+ return 0;
+}
+
+/*
+ * Invoke `callback' for each elem of file history, passing
+ * the current index, filename, page number, and data passed to
+ * this function.
+ */
+void
+file_history_enumerate(filehistCallbackT callback, void *data)
+{
+ int i;
+ struct dl_list *listpos = dl_list_head(m_file_history);
+
+ for (i = 0; listpos != NULL; i++) {
+ struct file_history *item = (struct file_history *)listpos->item;
+ callback(i, item->filename, item->pageno, data);
+ listpos = listpos->next;
+ }
+}
+
+char *
+file_history_get_elem(int idx, int *ret_page)
+{
+ int i;
+ struct dl_list *listpos = dl_list_head(m_file_history);
+ struct file_history *item;
+
+ for (i = 0; listpos != NULL && i < idx; i++) {
+ listpos = listpos->next;
+ }
+ if (listpos == NULL) {
+ XDVI_WARNING((stderr, "Asked for file at position %d, but only %d elements in list",
+ idx, i - 1));
+ return NULL;
+ }
+ item = (struct file_history *)listpos->item;
+ *ret_page = item->pageno;
+ file_history_show(m_file_history);
+ return item->filename;
+}
+
+char *
+file_history_get_list(void)
+{
+ char buf[LENGTH_OF_INT];
+ char *ret = xstrdup("");
+ struct dl_list *listpos;
+
+ for (listpos = dl_list_head(m_file_history);
+ listpos != NULL;
+ listpos = listpos->next) {
+
+ struct file_history *item = (struct file_history *)listpos->item;
+ SNPRINTF(buf, LENGTH_OF_INT, "%d ", item->pageno);
+ ret = xstrcat(ret, buf);
+ ret = xstrcat(ret, item->filename);
+ ret = xstrcat(ret, "\n");
+ }
+
+ ret[strlen(ret) - 1] = '\0'; /* chop off excess \n at end */
+ return ret;
+}
+
+void
+file_history_open(const char *fname)
+{
+ Boolean tried_dvi_ext = True;
+ char *new_dvi_name = NULL;
+
+ int dummy_cnt = 0;
+ void *dummy_data = NULL;
+
+ file_history_set_page(current_page);
+ if ((new_dvi_name = open_dvi_file_wrapper(fname,
+ True, /* pretend file is from commandline, otherwise xdvi will
+ try to fork for non-existing files, leading to confusing
+ popup error messages */
+ False, &tried_dvi_ext,
+ True /* don't exit on error */)) == NULL) {
+ /* remove this item from the file history */
+ m_file_history = dl_list_remove(m_file_history, fname, &dummy_cnt, &dummy_data, equals_filename);
+ m_file_history_length--;
+ file_history_show(m_file_history);
+
+ filehist_menu_refresh();
+ return;
+ }
+ else {
+ dviErrFlagT errflag;
+ if (load_dvi_file(
+#if !DELAYED_MKTEXPK
+ True,
+#endif
+ &errflag)) {
+ /* page_history_insert(pageno); */
+ set_dvi_name(new_dvi_name);
+
+ globals.ev.flags |= EV_NEWDOC;
+ globals.ev.flags |= EV_FILEHIST_GOTO_PAGE;
+ }
+ else { /* re-open old file */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Could not open `%s': %s.\n"
+ /* "Removing this file from the history." */,
+ globals.dvi_name, get_dvi_error(errflag));
+ /* remove this item from the file history */
+ m_file_history = dl_list_remove(m_file_history, globals.dvi_name,
+ &dummy_cnt, &dummy_data,
+ equals_filename);
+ m_file_history_length--;
+ filehist_menu_refresh();
+
+ if (!internal_open_dvi(globals.dvi_name, &errflag, True
+#if DELAYED_MKTEXPK
+ , True
+#endif
+ )) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Couldn't reopen `%s': %s.\n"
+ /* "Removing this file from the history." */,
+ globals.dvi_name, get_dvi_error(errflag));
+ /* remove this item from the file history */
+ m_file_history = dl_list_remove(m_file_history, globals.dvi_name, &dummy_cnt, &dummy_data, equals_filename);
+ m_file_history_length--;
+ filehist_menu_refresh();
+ }
+ else {
+ globals.ev.flags |= EV_NEWPAGE;
+ }
+ }
+ }
+}
diff --git a/Build/source/texk/xdvik/filehist.h b/Build/source/texk/xdvik/filehist.h
new file mode 100644
index 00000000000..5a1a75925fd
--- /dev/null
+++ b/Build/source/texk/xdvik/filehist.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef FILEHIST_H_
+#define FILEHIST_H_
+
+typedef void (*filehistCallbackT) (int idx, const char *filename, int pageno, void *data);
+
+extern void file_history_enumerate(filehistCallbackT callback, void *data);
+extern void file_history_init(void);
+extern Boolean file_history_push(const char *filename);
+extern void file_history_set_page(int pageno);
+extern void file_history_set_page_at(int idx, int pageno);
+extern int file_history_get_page(void);
+extern char *file_history_get_elem(int idx, int *ret_page);
+extern char *file_history_get_list(void);
+extern void file_history_open(const char *filename);
+extern size_t file_history_size(void);
+
+#endif /* FILEHIST_H_ */
+
diff --git a/Build/source/texk/xdvik/font-open.c b/Build/source/texk/xdvik/font-open.c
new file mode 100644
index 00000000000..daa40775641
--- /dev/null
+++ b/Build/source/texk/xdvik/font-open.c
@@ -0,0 +1,1899 @@
+/*
+ font-open.c: find font files. The routine font_open() itself bears
+ no relation (except for the interface) to the original font_open().
+
+ Copyright (c) 1999-2013 The texk project
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "dvi-draw.h"
+#include "util.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "my-snprintf.h"
+#include "print-log.h"
+
+#include "statusline.h"
+#include "message-window.h"
+#include "font-open.h"
+
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/tex-glyph.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(status) (((status) & 255) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(status) ((unsigned)(status) >> 8)
+#endif
+#ifndef WIFSIGNALED
+# ifndef WIFSTOPPED
+# define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
+# endif
+# define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
+#endif
+#ifndef WTERMSIG
+# define WTERMSIG(status) ((status) & 0x7f)
+#endif
+
+/* if POSIX O_NONBLOCK is not available, use O_NDELAY */
+#if !defined(O_NONBLOCK) && defined(O_NDELAY)
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#ifdef EWOULDBLOCK
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN)
+# else
+# define AGAIN_CONDITION (errno == EWOULDBLOCK)
+# endif
+#else /* EWOULDBLOCK */
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EAGAIN)
+# endif
+#endif /* EWOULDBLOCK */
+
+#if HAVE_POLL
+# include <poll.h>
+# define XIO_IN POLLIN
+# define XIO_OUT POLLOUT
+#else
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif /* HAVE_POLL */
+
+
+ /* see just above the second init_t1_lookup for why this was chosen */
+#define DVIPS_SETUP 1
+
+#if FREETYPE || PS
+
+/*
+ * The following code handles lookup of Type 1 fonts for use as FreeType
+ * fonts, and for use within MetaPost output.
+ * The system psfonts.map file is read into an AVL tree as needed (lazy
+ * evaluation), and searched for Type 1 fonts.
+ */
+
+struct p_list { /* list of map file names */
+ struct p_list *next;
+ const char *value;
+};
+
+ /* Initialize this list to "psfonts.map". */
+
+static struct p_list psfonts_map = {NULL, "psfonts.map"};
+
+static struct p_list *p_head = &psfonts_map;
+static struct p_list **p_tail = &psfonts_map.next;
+
+static FILE *mapfile = NULL;
+
+static char *ffline = NULL; /* an array used to store */
+ /* the file name being formed. */
+ /* It expands as needed. */
+ /* Also used elsewhere. */
+static size_t ffline_len = 0; /* current length of ffline[] */
+
+/*
+ * Expand ffline[] to at least the given size.
+ */
+
+static void
+expandline(int n)
+{
+ int newlen = n + 128;
+
+ ffline = (ffline == NULL) ? xmalloc(newlen) : xrealloc(ffline, newlen);
+ ffline_len = newlen;
+}
+
+
+/*
+ * Like fgets(), but read an arbitrarily long line into ffline[].
+ */
+
+static Boolean
+fgets_long(FILE *f)
+{
+ int len;
+
+ if (fgets(ffline, ffline_len, f) == NULL)
+ return False;
+
+ len = 0;
+ for (;;) {
+ len += strlen(ffline + len);
+ if (len > 0 && ffline[len - 1] == '\n') {
+ ffline[--len] = '\0';
+ break;
+ }
+ if (len < ffline_len - 1)
+ break;
+ expandline(len);
+ fgets(ffline + len, ffline_len - len, f);
+ }
+
+ return True;
+}
+
+# if DVIPS_SETUP
+
+/*
+ * Get list of map files from dvips config file(s).
+ */
+
+static void
+getdefaults(FILE *f)
+{
+ char *p, *q;
+ int len;
+ struct p_list *p_node;
+
+ while (fgets_long(f)) {
+ p = ffline;
+ while (*p == ' ' || *p == '\t') ++p;
+ if (*p == 'p') {
+ do ++p;
+ while (*p == ' ' || *p == '\t');
+
+ if (*p == '+')
+ do ++p;
+ while (*p == ' ' || *p == '\t');
+ else { /* discard old list */
+ struct p_list *pl, *pl2;
+
+ *p_tail = NULL;
+ pl = p_head;
+ if (pl == &psfonts_map) pl = pl->next;
+ while (pl != NULL) {
+ free((char *) pl->value);
+ pl2 = pl->next;
+ free(pl);
+ pl = pl2;
+ }
+ p_tail = &p_head;
+ }
+
+ /* get white-delimited argument */
+ len = strlen(p);
+ q = memchr(p, ' ', len);
+ if (q != NULL) len = q - p;
+ q = memchr(p, '\t', len);
+ if (q != NULL) len = q - p;
+ p[len] = '\0';
+
+ p_node = xmalloc(sizeof *p_node);
+ p_node->value = xmemdup(p, len + 1);
+ *p_tail = p_node;
+ p_tail = &p_node->next;
+ }
+ }
+
+ fclose(f);
+}
+
+# endif /* DVIPS_SETUP */
+
+/*
+ * Open the next (available) map file.
+ */
+
+static Boolean
+open_next_mapfile(void)
+{
+ char *filename;
+
+ /*
+ * Look for the first (openable) map file. Others will be read later
+ * as needed.
+ */
+
+ while (p_head != NULL) {
+ filename = kpse_find_file(p_head->value, kpse_program_text_format,
+ True);
+ if (filename == NULL)
+ filename = kpse_find_file(p_head->value, kpse_fontmap_format,
+ True);
+ if (filename == NULL) {
+ XDVI_WARNING((stderr,
+ "could not find dvips map file %s; skipping\n",
+ p_head->value));
+ }
+ else {
+ mapfile = XFOPEN(filename, OPEN_MODE);
+ if (mapfile == NULL) {
+ XDVI_WARNING((stderr,
+ "could not open dvips map file %s: %s\n",
+ filename, strerror(errno)));
+ free(filename);
+ }
+ else {
+ TRACE_FT((stderr, "Map file: %s\n", filename));
+ free(filename);
+ return True;
+ }
+ }
+ p_head = p_head->next;
+ }
+
+ return False;
+}
+
+
+/*
+ * Initialize these lookup routines.
+ */
+
+# if DVIPS_SETUP
+
+Boolean
+init_t1_lookup(void)
+{
+ char *filename;
+ struct stat statbuf;
+ FILE *f;
+ char *dvipsrc;
+
+ if (ffline == NULL) expandline(80);
+
+ filename = find_file("config.ps", &statbuf, kpse_dvips_config_format);
+ if (filename == NULL) {
+ TRACE_FT((stderr, "could not find file config.ps; skipping"));
+ }
+ else {
+ f = XFOPEN(filename, OPEN_MODE);
+ if (f == NULL) {
+ TRACE_FT((stderr, "could not open file %s: %s",
+ filename, strerror(errno)));
+ }
+ else
+ getdefaults(f);
+ free(filename);
+ }
+
+ dvipsrc = getenv("DVIPSRC");
+ if (dvipsrc == NULL) {
+ dvipsrc = getenv("HOME");
+ if (dvipsrc != NULL) {
+ size_t n;
+
+ n = strlen(dvipsrc);
+ if (n + 10 > ffline_len) expandline(n + 10);
+ memcpy(ffline, dvipsrc, n);
+ memcpy(ffline + n, "/.dvipsrc", 10);
+ dvipsrc = ffline;
+ }
+ }
+ if (dvipsrc != NULL) {
+ f = XFOPEN(dvipsrc, OPEN_MODE);
+ if (f == NULL) {
+ TRACE_FT((stderr,
+ "could not open dvipsrc file %s: %s; skipping",
+ dvipsrc, strerror(errno)));
+ }
+ else
+ getdefaults(f);
+ }
+
+ filename = find_file("config.xdvi", &statbuf, kpse_dvips_config_format);
+ if (filename == NULL) {
+ TRACE_FT((stderr, "could not find file config.xdvi; skipping"));
+ }
+ else {
+ f = XFOPEN(filename, OPEN_MODE);
+ if (f == NULL) {
+ TRACE_FT((stderr, "could not open file %s: %s",
+ filename, strerror(errno)));
+ }
+ else
+ getdefaults(f);
+ free(filename);
+ }
+
+ *p_tail = NULL;
+
+ return open_next_mapfile();
+}
+
+# else /* !DVIPS_SETUP */
+
+/*
+ * Under the earlier regime, T1 lookup was controlled by xdvi.cfg.
+ *
+ * This has been disabled, for the following reasons.
+ *
+ * It only supported "enc" and "dvipsmap" directives.
+ *
+ * The "enc" directives selected implicit encoding files for fonts ending
+ * in certain character strings (8r, 8c, 8y), unless the map file
+ * explicitly referenced a .enc file. However, among the dvips map files
+ * supplied with TeX Live 2012 (at least) there were no such fonts ending
+ * in 8r and 8y, and the encoding file for the 8c fonts was cork.enc,
+ * which is no longer included in TeX Live.
+ *
+ * As for the dvipsmap directives, it seemed better to use the dvips
+ * configuration method.
+ */
+
+Boolean
+init_t1_lookup(void)
+{
+ char *filename;
+ FILE *fp;
+ char *keyword;
+ char *ptr;
+ struct p_list *p_node;
+ char *enc;
+ char *name;
+ static const char delim[] = "\t \n\r";
+
+ if (ffline == NULL) expandline(80);
+
+ filename = kpse_find_file("xdvi.cfg", kpse_program_text_format, 1);
+ if (filename == NULL) {
+ statusline_error(STATUS_MEDIUM,
+ "Warning: Unable to find \"xdvi.cfg\"!");
+ return open_next_mapfile();
+ }
+
+ if ((fp = XFOPEN(filename, "r")) == NULL) {
+ XDVI_ERROR((stderr, "Cannot open config file `%s' for reading: %s",
+ filename, strerror(errno)));
+ free(filename);
+ return open_next_mapfile();
+ }
+
+ TRACE_FT((stderr, "Reading cfg file %s", filename));
+
+ while (fgets_long(fp)) {
+ keyword = ffline;
+
+ /* Skip leading whitespace */
+ while (*keyword == ' ' || *keyword == '\t')
+ keyword++;
+
+ /* % in first column is a correct comment */
+ if (*keyword == '%' || *keyword == '\0' || *keyword == '\n')
+ continue;
+
+ keyword = strtok(keyword, delim);
+
+ if (strcmp(keyword, "dvipsmap") == 0) {
+ if ((ptr = strtok(NULL, delim)) == NULL) {
+ XDVI_WARNING((stderr, "Syntax error in entry \"%s\"",
+ ffline));
+ continue;
+ }
+ TRACE_FT((stderr, "DVIPSMAP: '%s'", ptr));
+
+ /* Add it to the list for later reading */
+ p_node = xmalloc(sizeof *p_node);
+ p_node->value = xmemdup(ptr, strlen(ptr) + 1);
+ /* If we're still pointing to the default list, remove it */
+ if (p_tail == &psfonts_map.next)
+ p_tail = &p_head;
+ *p_tail = p_node;
+ p_tail = &p_node->next;
+ }
+ else if (strcmp(keyword, "encmap") == 0) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ "Your xdvi.cfg file is for a previous version "
+ "of xdvik. Please replace it with the xdvi.cfg file "
+ "in the current xdvik distribution.",
+ "The keyword \"encmap\" in xdvi.cfg is no longer "
+ "supported. Please update the config file %s.",
+ filename);
+ }
+ else if (strcmp(keyword, "enc") == 0) {
+ enc = strtok(NULL, delim);
+ name = strtok(NULL, delim);
+ if ((ptr = strtok(NULL, delim)) == NULL) {
+ XDVI_WARNING((stderr,
+ "Syntax error in entry \"%s\" (skipping line)",
+ ffline));
+ continue;
+ }
+# if 0
+ i = new_encoding(enc, ptr);
+ TRACE_FT((stderr, "Encoding[%d]: '%s' = '%s' -> '%s'",
+ i, enc, name, ptr));
+# endif
+ } else {
+ /* again, nag them with a popup so that they'll do something
+ about this ... */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ "Please check the syntax of your config file. "
+ "Valid keywords are: \"enc\" and \"dvipsmap\".",
+ "Skipping unknown keyword \"%s\" in config file %s.",
+ keyword, filename);
+ }
+ }
+ *p_tail = NULL; /* terminate linked list of map files */
+
+ fclose(fp);
+ free(filename);
+
+ return open_next_mapfile();
+}
+
+# endif /* not DVIPS_SETUP */
+
+
+/*
+ * Information about Type 1 fonts is stored in an AVL tree.
+ */
+
+static struct avl_t1 *t1_head = NULL;
+
+
+/*
+ * Parse line from psfonts.map file.
+ */
+
+static struct avl_t1 *
+dvips_parse(const char *line)
+{
+ const char *w1p, *encp, *pfp, *qp;
+ size_t w1l, encl, pfl, ql;
+ const char *w2p;
+ size_t w2l;
+ const char *p, *p0;
+ const char *err;
+ struct avl_t1 *t1p;
+ char *q;
+
+ w2l = w1l = encl = pfl = ql = 0;
+ err = NULL;
+ p = line;
+ for (;;) { /* loop over words */
+ while (*p == ' ' || *p == '\t') ++p;
+ if (*p == '\0')
+ break;
+
+ if (*p == '"') { /* quoted string */
+ const char *p_end;
+
+ p0 = p + 1;
+ p_end = p0 + strlen(p0);
+ p = memchr(p0, '"', p_end - p0);
+ if (p == NULL) p = p_end;
+ qp = (ql == 0 ? p0 : NULL);
+ ql += p - p0 + 1;
+ if (*p == '"') ++p;
+ continue;
+ }
+
+ if (*p == '<') { /* encoding or pfa/b file */
+ int wtype = 0;
+
+ ++p;
+ if (*p == '<') {
+ wtype = 1; /* font file */
+ ++p;
+ }
+ else if (*p == '[') {
+ wtype = -1; /* encoding file */
+ ++p;
+ }
+
+ /* find word */
+ while (*p == ' ' || *p == '\t') ++p;
+ p0 = p;
+ while (*p != '\0' && *p != ' ' && *p != '\t') ++p;
+
+ if (wtype == 0 && p > p0 + 4 && p[-4] == '.') {
+ if (memcmp(p - 3, "enc", 3) == 0
+ || memcmp(p - 3, "ENC", 3) == 0)
+ wtype = -1;
+ else if (memcmp(p - 3, "pfa", 3) == 0
+ || memcmp(p - 3, "pfb", 3) == 0
+ || memcmp(p - 3, "PFA", 3) == 0
+ || memcmp(p - 3, "PFB", 3) == 0)
+ wtype = 1;
+ }
+
+ if (wtype > 0) {
+ if (pfl != 0)
+ err = "more than one font file given";
+ else {
+ pfp = p0;
+ pfl = p - p0 + 1;
+ }
+ }
+ else if (wtype < 0) {
+ if (encl != 0)
+ err = "more than one encoding file given";
+ else {
+ encp = p0;
+ encl = p - p0 + 1;
+ }
+ }
+ else
+ err = "cannot identify file type";
+ }
+ else { /* if ordinary word */
+ p0 = p;
+ while (*p != '\0' && *p != ' ' && *p != '\t') ++p;
+ if (w1l == 0) {
+ w1p = p0;
+ w1l = p - p0;
+ }
+ else if (w2l == 0) {
+ w2p = p0;
+ w2l = p - p0;
+ }
+ else
+ err = "more than two non-download words given";
+ }
+ } /* end loop over words */
+
+ if (w1l == 0) {
+ TRACE_FT((stderr,
+ "map file %s: line \"%s\" does not give a font name.",
+ p_head->value, line));
+ return NULL;
+ }
+
+ if (err != NULL) {
+ TRACE_FT((stderr, "map file %s, font %.*s: %s", p_head->value,
+ (int) w1l, w1p, err));
+ return NULL;
+ }
+
+ t1p = (struct avl_t1 *) avladd(w1p, w1l, (struct avl **) &t1_head,
+ sizeof(struct avl_t1));
+
+ if (t1p->key != w1p) { /* if existing record */
+ TRACE_FT((stderr,
+ "map file %s, font %.*s: duplicate record; using first one",
+ p_head->value, (int) w1l, w1p));
+ return NULL;
+ }
+
+ t1p->key = q = xmalloc(w1l + w2l + 1 + pfl + encl + ql);
+
+ memcpy(q, w1p, w1l);
+ q += w1l;
+ t1p->psname = t1p->key;
+ if (w2l != 0) {
+ t1p->psname = q;
+ memcpy(q, w2p, w2l);
+ q += w2l;
+ }
+ *q++ = '\0';
+
+ t1p->fontfile = NULL;
+ if (pfl != 0) {
+ t1p->fontfile = q;
+ memcpy(q, pfp, pfl - 1);
+ q += pfl;
+ q[-1] = '\0';
+ }
+
+ t1p->encname = t1p->addinfo = NULL;
+# if FREETYPE
+ t1p->bad = False;
+ t1p->ft = NULL;
+# endif
+
+ if (encl != 0) {
+ t1p->encname = q;
+ memcpy(q, encp, encl - 1);
+ q += encl;
+ q[-1] = '\0';
+ }
+
+ if (ql != 0) {
+ t1p->addinfo = q;
+ if (qp != 0) {
+ memcpy(q, qp, ql - 1);
+ q += ql;
+ }
+ else { /* multiple quoted strings; rescan to get them */
+ const char *p_end;
+
+ p = line;
+ p_end = p + strlen(p);
+ for (;;) {
+ while (*p == ' ' || *p == '\t') ++p;
+ if (*p == '\0')
+ break;
+
+ /* found a word */
+ if (*p == '"') {
+ ++p;
+ p0 = p;
+ p = memchr(p0, '"', p_end - p0);
+ if (p == NULL) p = p_end;
+ memcpy(q, p0, p - p0);
+ q += p - p0;
+ *q++ = ' ';
+ if (*p == '\0') break;
+ ++p;
+ }
+ else /* skip unquoted word */
+ while (*p != '\0' && *p != ' ' && *p != '\t') ++p;
+ }
+ }
+ q[-1] = '\0';
+ }
+
+ return t1p;
+}
+
+/*
+ * Information on the Ghostscript font aliasing mechanism is kept in
+ * another AVL tree. Each identifier points to a list of strings,
+ * up to one from each Fontmap file. Within a Fontmap file, later entries
+ * for a given string override earlier ones.
+ */
+
+struct avl_gs { /* structure for gs font information */
+ AVL_COMMON;
+ short fontmap_number; /* sequence of most recent entry */
+ Boolean in_use;
+ struct gs_list *list;
+};
+
+struct gs_list { /* list of Fontmap entries for this font name */
+ struct gs_list *next;
+ const char value[0];
+};
+
+static struct avl_gs *gs_head = NULL;
+
+typedef void (*gs_path_proc)(FILE *);
+
+static const char *env_gs_lib;
+
+static FILE *
+gs_try_fopen(const char *str, unsigned int len, const char *name)
+{
+ unsigned int namelen = strlen(name) + 1;
+ FILE *f;
+
+ if (len + namelen + 1 > ffline_len) expandline(len + namelen + 1);
+ memcpy(ffline, str, len);
+ ffline[len] = '/';
+ memcpy(ffline + len + 1, name, namelen);
+
+ f = XFOPEN(ffline, OPEN_MODE);
+
+ TRACE_FT((stderr, "gs_try_fopen: %s: %s", ffline,
+ f != NULL ? "file opened" : strerror(errno)));
+
+ return f;
+}
+
+static FILE *
+gs_path_fopen(const char *name, gs_path_proc proc)
+{
+ const char *str1 = env_gs_lib;
+ const char *str2 = DEFAULT_GS_LIB_PATH;
+ const char *str1_end, *str2_end;
+ const char *p1, *p2;
+ FILE *f;
+ unsigned int namelen;
+
+ if (str1 == NULL) {
+ str1 = str2;
+ str2 = NULL;
+ }
+
+ str1_end = str1 + strlen(str1);
+
+ for (;;) {
+ p1 = memchr(str1, ':', str1_end - str1);
+ if (p1 == NULL) p1 = str1_end;
+ if (p1 == str1) {
+ if (str2 != NULL) {
+ str2_end = str2 + strlen(str2);
+ for (;;) {
+ p2 = memchr(str2, ':', str2_end - str2);
+ if (p2 == NULL) p2 = str2_end;
+ if (p2 > str2) {
+ f = gs_try_fopen(str2, p2 - str2, name);
+ if (f != NULL) {
+ if (proc != NULL)
+ proc(f);
+ else
+ return f;
+ }
+ }
+ if (*p2 == '\0')
+ break;
+ str2 = p2 + 1;
+ }
+ str2 = NULL;
+ }
+ }
+ else {
+ f = gs_try_fopen(str1, p1 - str1, name);
+ if (f != NULL) {
+ if (proc != NULL)
+ proc(f);
+ else
+ return f;
+ }
+ }
+
+ if (*p1 == '\0')
+ break;
+ str1 = p1 + 1;
+ }
+
+ /* leave the file name in ffline[] for error message */
+ namelen = strlen(name) + 1;
+ if (namelen > ffline_len) expandline(namelen);
+ memcpy(ffline, name, namelen);
+
+ return NULL;
+}
+
+
+static FILE *
+lookup_gs_font(const char *font, const char **path_ret)
+{
+ struct avl_gs *gsfp;
+ int font_len;
+ int i;
+
+ font_len = strlen(font);
+ gsfp = gs_head;
+ for (;;) {
+ if (gsfp == NULL) /* if not found */
+ return NULL;
+
+ i = font_len - gsfp->key_len;
+ if (i == 0)
+ i = memcmp(font, gsfp->key, font_len);
+ if (i == 0) { /* if found */
+ struct gs_list *gl, *gl2, *gl3;
+ FILE *f;
+
+ if (gsfp->in_use) {
+ TRACE_FT((stderr, "Alias loop for %s detected; ignoring.",
+ font));
+ return NULL;
+ }
+
+ /* If we haven't done it yet, reverse the linked list */
+ if (gsfp->fontmap_number != 0) {
+ gsfp->fontmap_number = 0;
+ gl = gsfp->list;
+ gl2 = NULL;
+ while (gl != NULL) {
+ gl3 = gl->next;
+ gl->next = gl2;
+ gl2 = gl;
+ gl = gl3;
+ }
+ gsfp->list = gl2;
+ }
+ gsfp->in_use = True;
+ f = NULL;
+ for (gl = gsfp->list; gl != NULL; gl = gl->next) {
+ if (gl->value[0] == '\0') { /* if alias */
+ TRACE_FT((stderr, "Found alias %s --> %s",
+ font, gl->value + 1));
+ f = lookup_gs_font(gl->value + 1, path_ret);
+ if (f == NULL)
+ TRACE_FT((stderr, "Alias %s not found.",
+ gl->value + 1));
+ if (f != NULL) break;
+ }
+ else {
+ TRACE_FT((stderr, "Checking file %s", gl->value));
+ if (gl->value[0] == '/' || (gl->value[0] == '.'
+ && (gl->value[1] == '/' || (gl->value[1] == '.'
+ && gl->value[2] == '/')))) {
+ f = XFOPEN(gl->value, OPEN_MODE);
+ if (f != NULL) {
+ *path_ret = xstrdup(gl->value);
+ break;
+ }
+ }
+ else {
+ f = gs_path_fopen(gl->value, NULL);
+ if (f != NULL) {
+ *path_ret = xstrdup(ffline);
+ break;
+ }
+ }
+ }
+ }
+ gsfp->in_use = False;
+ return f;
+ }
+ gsfp = (struct avl_gs *) (i < 0 ? gsfp->left : gsfp->right);
+ }
+}
+
+
+#define GS_BUF_SIZE 4096
+
+struct gsfile {
+ FILE *f;
+ unsigned char *buffer;
+ const unsigned char *bufpos;
+ const unsigned char *buf_end;
+};
+
+static Boolean
+gs_fillbuf(struct gsfile *gsf)
+{
+ unsigned char *p;
+ unsigned int len;
+
+ if (gsf->buf_end < gsf->buffer + GS_BUF_SIZE)
+ return False;
+
+ gsf->bufpos = p = gsf->buffer;
+ for (;;) {
+ len = gsf->buf_end - p;
+ if (len <= 0) break;
+ len = fread(p, 1, len, gsf->f);
+ if (len <= 0) break;
+ p += len;
+ }
+ gsf->buf_end = p;
+ return (p > gsf->buffer);
+}
+
+static unsigned char gs_ctype[256];
+
+#define GS_EOF '\0'
+#define GS_ERR '%'
+#define LPAREN '('
+#define RPAREN ')'
+
+static void
+init_gs_ctype(void)
+{
+ const char *p;
+
+ for (p = " \t\f\n\r";; ++p) {
+ gs_ctype[(unsigned char) *p] = 1; /* white space */
+ if (*p == '\0') break;
+ }
+ gs_ctype['/'] = 2; /* literal token */
+ gs_ctype['('] = 3; /* string */
+ for (p = ")<>[]{}%"; *p != '\0'; ++p)
+ gs_ctype[(unsigned char) *p] = 4; /* delimiter */
+}
+
+static unsigned char
+get_gs_character(struct gsfile *gsfp)
+{
+ unsigned char c;
+
+ for (;;) {
+ if (gsfp->bufpos >= gsfp->buf_end && !gs_fillbuf(gsfp))
+ return '%';
+ c = *gsfp->bufpos++;
+
+ /* Check for comments */
+ if (c == '%') {
+ for (;;) {
+ const unsigned char *p1, *p2;
+
+ p1 = memchr(gsfp->bufpos, '\n',
+ gsfp->buf_end - gsfp->bufpos);
+ if (p1 == NULL) p1 = gsfp->buf_end;
+ p2 = memchr(gsfp->bufpos, '\r', p1 - gsfp->bufpos);
+ if (p2 != NULL) p1 = p2;
+ p2 = memchr(gsfp->bufpos, '\f', p1 - gsfp->bufpos);
+ if (p2 != NULL) p1 = p2;
+ if (p1 < gsfp->buf_end) {
+ gsfp->bufpos = p1 + 1;
+ break;
+ }
+ if (!gs_fillbuf(gsfp))
+ return '%';
+ }
+ continue;
+ }
+
+ if (gs_ctype[c] != 1)
+ break;
+ }
+
+ return c;
+}
+
+static unsigned char
+get_gs_token(struct gsfile *gsfp,
+ unsigned int pos,
+ unsigned int *pos_ret,
+ const char *file_type)
+{
+ unsigned char gs_t_type;
+ unsigned char c;
+ const unsigned char *p0;
+ unsigned int pos0;
+ unsigned int depth;
+
+ gs_t_type = c = get_gs_character(gsfp);
+ if (c == '%')
+ return GS_EOF;
+
+ p0 = gsfp->bufpos;
+ switch (gs_ctype[c]) {
+ case 0: /* most characters */
+ case 2: /* '/' */
+ --p0; /* retain initial character */
+ pos0 = pos;
+ for (;;) {
+ if (gsfp->bufpos >= gsfp->buf_end) {
+ unsigned int len = gsfp->bufpos - p0;
+
+ if (pos + len >= ffline_len) expandline(pos + len);
+ memmove(ffline + pos, p0, len);
+ pos += len;
+ if (!gs_fillbuf(gsfp))
+ break;
+ p0 = gsfp->buffer;
+ }
+ if (gs_ctype[*gsfp->bufpos] != 0) {
+ unsigned int len = gsfp->bufpos - p0;
+
+ if (pos + len >= ffline_len) expandline(pos + len);
+ memmove(ffline + pos, p0, len);
+ pos += len;
+ break;
+ }
+ ++gsfp->bufpos;
+ }
+ /* Filter out DOS ^Z */
+ if (pos == pos0 + 1 && ffline[pos0] == '\032')
+ return GS_EOF;
+ break;
+
+ case 3: /* left parenthesis */
+ depth = 1;
+ for (;;) {
+ const unsigned char *p1, *p2, *p3;
+
+ if (gsfp->bufpos >= gsfp->buf_end) {
+ unsigned int len = gsfp->bufpos - p0;
+
+ if (pos + len >= ffline_len) expandline(pos + len);
+ memmove(ffline + pos, p0, len);
+ pos += len;
+ if (!gs_fillbuf(gsfp)) {
+ TRACE_FT((stderr,
+ "unterminated string in %s file; giving up.",
+ file_type));
+ return GS_ERR;
+ }
+ p0 = gsfp->buffer;
+ }
+ p1 = memchr(gsfp->bufpos, RPAREN,
+ gsfp->buf_end - gsfp->bufpos);
+ if (p1 == NULL) p1 = gsfp->buf_end;
+ for (;;) {
+ p2 = memchr(gsfp->bufpos, LPAREN, p1 - gsfp->bufpos);
+ if (p2 == NULL) p2 = p1;
+ p3 = p2;
+ for (;;) {
+ if (p3 <= gsfp->bufpos) {
+ if (c == '\\') --p3;
+ break;
+ }
+ if (p3[-1] != '\\') break;
+ --p3;
+ }
+ c = '\\' - 1 + ((p2 - p3) & 1);
+ if (p2 >= p1)
+ break;
+ if (c != '\\')
+ ++depth;
+ gsfp->bufpos = p2 + 1;
+ c = '\0';
+ }
+ if (p1 < gsfp->buf_end) { /* if left parenthesis at p1 */
+ if (c != '\\') {
+ if (--depth == 0) {
+ unsigned int len = p1 - p0;
+
+ if (pos + len >= ffline_len)
+ expandline(pos + len);
+ memmove(ffline + pos, p0, len);
+ pos += len;
+ gsfp->bufpos = p1 + 1;
+ break;
+ }
+ }
+ ++p1;
+ }
+ gsfp->bufpos = p1;
+ }
+ /* We could do backslash escaping here, but it's probably
+ unnecessary. */
+ break;
+
+ default:
+ TRACE_FT((stderr,
+ "invalid character `%c' encountered in %s file; giving up.",
+ c, file_type));
+ return GS_ERR;
+ }
+
+ *pos_ret = pos;
+ return gs_t_type;
+}
+
+
+static short gs_fontmap_number = 0;
+
+static void
+process_gs_fontmap(FILE *f)
+{
+ struct gsfile gsf;
+ unsigned char buffer[GS_BUF_SIZE];
+ unsigned char ttype;
+ unsigned int pos1, pos2, pos3;
+
+ ++gs_fontmap_number;
+
+ gsf.f = f;
+ gsf.buffer = buffer;
+ gsf.bufpos = gsf.buf_end = buffer + GS_BUF_SIZE;
+
+ /*
+ * Allow entries of the following types:
+ *
+ * (string) .runlibfile
+ * (string) .runlibfileifexists
+ * /identifier (string) ;
+ * /identifier /alias ;
+ */
+
+ for (;;) {
+ ttype = get_gs_token(&gsf, 0, &pos1, "Fontmap");
+ if (ttype == GS_EOF || ttype == GS_ERR)
+ break;
+ if (ttype == LPAREN) {
+ Boolean quiet = False;
+ FILE *f1;
+
+ ttype = get_gs_token(&gsf, pos1, &pos2, "Fontmap");
+ if (ttype == GS_ERR)
+ break;
+ if (ttype == GS_EOF) {
+ TRACE_FT((stderr,
+ "unexpected end of Fontmap file; giving up."));
+ break;
+ }
+ if (ttype == '.' && pos2 - pos1 == 19
+ && memcmp(ffline + pos1, ".runlibfileifexists", 19) == 0)
+ quiet = True;
+ else if (ttype != '.' || pos2 - pos1 != 11
+ || memcmp(ffline + pos1, ".runlibfile", 11) != 0) {
+ TRACE_FT((stderr, "invalid token following \"(%.*s)\" in Fontmap file; giving up.",
+ (int) pos1, ffline));
+ break;
+ }
+
+ ffline[pos1] = '\0';
+ if (ffline[0] == '/' || (ffline[0] == '.' && (ffline[1] == '/'
+ || (ffline[1] == '.' && ffline[2] == '/'))))
+ f1 = XFOPEN(ffline, OPEN_MODE);
+ else {
+ char *q;
+
+ q = xmemdup(ffline, pos1 + 1);
+ f1 = gs_path_fopen(q, NULL);
+ free(q);
+ }
+
+ if (f1 == NULL) {
+ if (!quiet)
+ XDVI_WARNING((stderr, "Fontmap .runlibfile: %s: %s",
+ ffline, strerror(errno)));
+ else
+ TRACE_FT((stderr,
+ "Fontmap .runlibfileifexists: %s: %s\n",
+ ffline, strerror(errno)));
+ }
+ else {
+ --gs_fontmap_number;
+ process_gs_fontmap(f1);
+ }
+ }
+ else if (ttype == '/') {
+ struct avl_gs *gsfp;
+ struct gs_list *gslp;
+
+ ttype = get_gs_token(&gsf, pos1, &pos2, "Fontmap");
+ if (ttype == GS_ERR)
+ break;
+ if (ttype == GS_EOF) {
+ TRACE_FT((stderr,
+ "unexpected end of Fontmap file; giving up."));
+ break;
+ }
+ if ((ttype != '/' && ttype != LPAREN)
+ || pos2 == pos1 /* empty string would mess things up */
+ || get_gs_token(&gsf, pos2, &pos3, "Fontmap") != ';'
+ || pos3 != pos2 + 1) {
+ TRACE_FT((stderr,
+ "invalid token following \"%.*s\" in Fontmap file; giving up.",
+ (int) pos1, ffline));
+ break;
+ }
+ if (ttype == '/')
+ ffline[pos1] = '\0'; /* mark aliases by initial \0 */
+ ffline[pos2++] = '\0'; /* terminate string */
+
+ /* Add to database */
+ gsfp = (struct avl_gs *) avladd(ffline + 1, pos1 - 1,
+ (struct avl **) &gs_head, sizeof *gsfp);
+
+ if (gsfp->key == ffline + 1) { /* if new record */
+ gsfp->key = xmemdup(ffline + 1, pos1 - 1);
+ gsfp->in_use = False;
+ gsfp->list = NULL;
+ }
+ else {
+ if (strlen(gsfp->list->value + 1) + 2 == pos2 - pos1
+ && memcmp(gsfp->list->value, ffline + pos1, pos2 - pos1)
+ == 0)
+ continue; /* ignore duplicate entry */
+ if (gsfp->fontmap_number == gs_fontmap_number) {
+ /* Later entries in a Fontmap file override earlier
+ ones */
+ gslp = gsfp->list;
+ gsfp->list = gslp->next;
+ free(gslp);
+ }
+ }
+ gslp = xmalloc(sizeof *gslp + pos2 - pos1);
+ gslp->next = gsfp->list;
+ gsfp->list = gslp;
+ memcpy((char *) gslp->value, ffline + pos1, pos2 - pos1);
+
+ gsfp->fontmap_number = gs_fontmap_number;
+ }
+ else {
+ TRACE_FT((stderr,
+ "invalid token \"%s\" in Fontmap file; giving up.",
+ ffline));
+ }
+ }
+
+ fclose(f);
+}
+
+/*
+ * Read Ghostscript Fontmap files. These are used if the line in
+ * psfonts.map does not contain a filename for the font.
+ *
+ * For example:
+ * n019003l NimbusSanL-Regu
+ */
+
+static void
+read_gs_fontmaps(void)
+{
+ env_gs_lib = getenv("XDVI_GS_LIB");
+ if (env_gs_lib == NULL)
+ env_gs_lib = getenv("GS_LIB");
+
+ if (gs_ctype[0] == 0)
+ init_gs_ctype();
+
+ (void) gs_path_fopen("Fontmap", process_gs_fontmap);
+}
+
+
+/*
+ * pre_lookup_t1_font - Find a Type 1 font (or return NULL).
+ */
+
+static struct avl_t1 *
+pre_lookup_t1_font(const char *fontname)
+{
+ struct avl_t1 *t1p;
+ size_t len;
+ int i;
+
+ /* first, search for the font */
+
+ len = strlen(fontname);
+ t1p = t1_head;
+ while (t1p != NULL) {
+ i = len - t1p->key_len;
+ if (i == 0)
+ i = memcmp(fontname, t1p->key, len);
+ if (i == 0)
+ return t1p; /* found it */
+ t1p = (struct avl_t1 *) (i < 0 ? t1p->left : t1p->right);
+ }
+
+ /* next, read in more records in hopes of finding the font */
+
+ if (p_head != NULL)
+ for (;;) {
+ if (!fgets_long(mapfile)) { /* if end of file */
+ fclose(mapfile);
+ p_head = p_head->next;
+ if (!open_next_mapfile())
+ return NULL;
+ continue;
+ }
+
+ if (*ffline < ' ' || *ffline == '*' || *ffline == '#'
+ || *ffline == ';' || *ffline == '%')
+ continue;
+
+ t1p = dvips_parse(ffline);
+
+ if (t1p != NULL && t1p->key_len == len
+ && memcmp(t1p->key, fontname, len) == 0)
+ return t1p; /* found it */
+ }
+
+ return NULL;
+}
+
+/*
+ * lookup_t1_font - Find a Type 1 font (or return NULL).
+ */
+
+Boolean
+lookup_t1_font(struct font *fontp,
+ const char *fontname)
+{
+ struct avl_t1 *t1p;
+ struct ftfont *ftp;
+
+ t1p = pre_lookup_t1_font(fontname);
+
+ if (t1p == NULL)
+ return False;
+
+ if (t1p->bad) {
+ TRACE_FT((stderr,
+ "Font %s is marked as bad: skipping scalable version",
+ fontname));
+ return False;
+ }
+
+ ftp = t1p->ft;
+ if (ftp != NULL) { /* if it's is already in use at another size */
+ struct font *first_size;
+
+ /* The first node in the linked list of sizes contains the file */
+ /* reference, so we link in the new node after the first node */
+ first_size = ftp->first_size;
+ fontp->next_size = first_size->next_size;
+ first_size->next_size = fontp;
+ }
+ else { /* first use at this size */
+ t1p->ft = ftp = xmalloc(sizeof *ftp);
+ ftp->face = NULL;
+ ftp->t1 = t1p;
+ ftp->first_size = fontp;
+ fontp->next_size = NULL;
+ }
+ fontp->ft = ftp;
+ fontp->size = NULL;
+
+ return True;
+}
+
+FILE *
+open_t1_font(struct avl_t1 *t1p,
+ const char **path_ret)
+{
+ FILE *f;
+
+ if (t1p->fontfile == NULL) { /* look up in GS Fontmap */
+ static Boolean gs_fontmap_initialized = False;
+
+ if (!gs_fontmap_initialized) {
+ read_gs_fontmaps();
+ gs_fontmap_initialized = True;
+ }
+
+ TRACE_FT((stderr,
+ "Looking for font %.*s using gs method (PS name %s) --",
+ t1p->key_len, t1p->key, t1p->psname));
+ f = lookup_gs_font(t1p->psname, path_ret);
+
+ if (f == NULL) {
+ TRACE_FT((stderr, "cannot find Type 1 font %s",
+ t1p->psname));
+ return NULL;
+ }
+
+ TRACE_FT((stderr, "Found file %s", *path_ret));
+ }
+ else {
+ char *filename;
+
+ filename = kpse_find_file(t1p->fontfile, kpse_type1_format, 0);
+ if (filename == NULL) {
+ TRACE_FT((stderr, "cannot find Type 1 font file %s "
+ "(will try PK version instead).",
+ t1p->fontfile));
+ return NULL;
+ }
+
+ f = XFOPEN(filename, OPEN_MODE);
+ if (f == NULL) {
+ TRACE_FT((stderr, "cannot open Type 1 font file %s: %s",
+ filename, strerror(errno)));
+ free(filename);
+ return NULL;
+ }
+ *path_ret = filename;
+ }
+
+ return f;
+}
+
+
+/*
+ * Read the encoding vector file. This assumes the same format as afm2tfm.
+ */
+
+extern struct findrec search_header; /* from special.c */
+
+void
+read_encoding(struct avl_enc *encp)
+{
+ char *filename;
+ FILE *f;
+ struct gsfile gsf;
+ unsigned char buffer[GS_BUF_SIZE];
+ jmp_buf err_env;
+ unsigned char ttype;
+ unsigned int pos1, pos2;
+ unsigned int identindex[256];
+ const char *str;
+ unsigned int i;
+
+ TRACE_FT((stderr, "Reading encoding file %s", encp->key));
+
+ encp->valid = False;
+
+ /*
+ * With TDS 1.0/kpathsea 3.5.2(?), encoding files are in texmf/fonts/enc
+ * and accessed via kpse_enc_format; see e.g.:
+ * http://tug.org/mailman/htdig/tex-live/2004-January/004734.html
+ *
+ * The lookups under kpse_program_text_format and
+ * kpse_tex_ps_header_format are kept for backwards compatibility.
+ */
+
+ filename = kpse_find_file(encp->key, kpse_enc_format, 0);
+ if (filename == NULL) {
+ filename = kpse_find_file(filename, kpse_program_text_format, 0);
+ if (filename == NULL)
+ filename = kpse_find_file(filename, kpse_tex_ps_header_format,
+ True);
+ }
+ if (filename == NULL) {
+ TRACE_FT((stderr,
+ "cannot find encoding file %s; ignoring encoding", encp->key));
+ return;
+ }
+
+ f = XFOPEN(filename, OPEN_MODE);
+ if (f == NULL) {
+ TRACE_FT((stderr, "cannot open encoding file %s: %s",
+ filename, strerror(errno)));
+ free(filename);
+ return;
+ }
+ free(filename);
+
+ if (gs_ctype[0] == 0)
+ init_gs_ctype();
+
+ gsf.f = f;
+ gsf.buffer = buffer;
+ gsf.bufpos = gsf.buf_end = buffer + GS_BUF_SIZE;
+
+ if (!setjmp(err_env)) {
+ if (get_gs_token(&gsf, 0, &pos1, "encoding") != '/'
+ || get_gs_character(&gsf) != '[')
+ longjmp(err_env, 1);
+
+ pos1 = 0;
+ for (i = 0; i < 256; ++i) {
+ if (get_gs_token(&gsf, pos1, &pos2, "encoding") != '/')
+ longjmp(err_env, 1);
+ if (pos2 == pos1 + 8
+ && memcmp(ffline + pos1, "/.notdef", 8) == 0)
+ identindex[i] = 0;
+ else {
+ ffline[pos1] = '\0';
+ identindex[i] = pos1 + 1;
+ pos1 = pos2;
+ }
+ }
+
+ if (get_gs_character(&gsf) != ']')
+ longjmp(err_env, 1);
+
+ ttype = get_gs_token(&gsf, pos1, &pos2, "encoding");
+ if (!(ttype == GS_EOF
+ || (ttype == 'd' && pos2 == pos1 + 3
+ && memcmp(ffline + pos1, "def", 3) == 0
+ && get_gs_token(&gsf, pos2, &pos2, "encoding") == GS_EOF)))
+ longjmp(err_env, 1);
+
+ if (pos1 >= ffline_len) expandline(pos1 + 1);
+ ffline[pos1] = '\0';
+ str = xmemdup(ffline + 1, pos1);
+ for (i = 0; i < 256; ++i)
+ encp->vec[i] =
+ (identindex[i] != 0 ? str + identindex[i] - 1 : NULL);
+
+ encp->valid = True;
+ }
+ else /* if error */
+ TRACE_FT((stderr,
+ "invalid format in encoding file %s; giving up.", encp->key));
+
+ fclose(f);
+}
+
+#endif /* FREETYPE || PS */
+
+
+#if 0
+static int mktexpk_io[2];
+static struct xchild mktexpk_child = { NULL, 0, True, "font creation", NULL, NULL, mktexpk_ended };
+
+static char *read_from_mktexpk(int ignored);
+static void write_to_mktexpk(int ignored);
+
+static struct xio mktexpk_xio = { NULL, 0, XIO_IN,
+#if HAVE_POLL
+ NULL,
+#endif
+ read_from_mktexpk,
+ NULL, NULL};
+
+
+static void
+mktexpk_ended(int status, struct xchild *this)
+{
+ char str[1024] = "";
+ char *err_msg = NULL;
+
+ fprintf(stderr, "------- MKTEXPK_ENDED!\n");
+ if (this->io != NULL && WIFEXITED(status)) {
+ err_msg = (this->io->read_proc)(this->io->fd, NULL);
+ SNPRINTF(str, 1024, "\nProcess `%s' returned exit code %d.\n",
+ this->name, WEXITSTATUS(status));
+ str[1024 - 1] = '\0';
+ printlog_append_str(str);
+ if (err_msg != NULL) {
+ fprintf(stderr, "FROM MKTEXPK: |%s|\n", err_msg);
+ printlog_append_str(err_msg);
+ }
+ }
+ printlog_enable_closebutton();
+ /* free(this->name); */
+ /* free(this->io); */
+ /* free(this); */
+
+ read_from_mktexpk(0);
+ clear_io(this->io);
+ (void)close(mktexpk_xio.fd);
+
+ if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) == 0) {
+ printlog_append("Done.\n", strlen("Done.\n"));
+ }
+ else
+ sprintf(str, "\nPrint process returned exit code %d.\n",
+ WEXITSTATUS(status));
+ }
+ else if (WIFSIGNALED(status))
+ sprintf(str, "\nPrint process terminated by signal %d.\n",
+ WTERMSIG(status));
+ else
+ sprintf(str, "\nPrint process returned unknown status 0x%x.\n",
+ status);
+
+
+}
+
+static char *
+read_from_mktexpk(int fd)
+{
+ int bytes;
+ char line[80];
+ char *buf;
+
+ fprintf(stderr, "------- READ_FROM_MKTEXPK!\n");
+ for (;;) {
+#ifndef MOTIF
+ bytes = read(fd, line, sizeof line);
+#else
+ bytes = read(fd, line, sizeof line - 1);
+#endif
+ if (bytes < 0) {
+ if (AGAIN_CONDITION)
+ break;
+ perror("xdvi: read_from_mktexpk");
+ break;
+ }
+
+ if (bytes == 0)
+ break;
+ else {
+#ifdef MOTIF
+ line[bytes] = '\0';
+#endif
+ fprintf(stderr, "------- READ_FROM_MKTEXPK:|%s|\n", line);
+ printlog_append(line, bytes);
+ }
+ }
+ buf = xmalloc(bytes + 1);
+ memcpy(buf, line, bytes);
+ buf[bytes] = '\0';
+ return buf;
+}
+
+static void
+write_to_mktexpk(int ignored)
+{
+ UNUSED(ignored);
+
+ return;
+}
+#endif /* 0 */
+
+
+#if DELAYED_MKTEXPK
+
+/* hash table for names of missing fonts, and their indexes */
+static hashTableT missing_font_hash;
+
+/* counters for missing fonts */
+static int missing_font_ctr = 0;
+static int missing_font_curr = 0;
+
+static const char *const dummy_font_value = ""; /* used as value in hash table of missing fonts ... */
+
+/* static char **all_fonts = NULL; */
+/* static size_t all_fonts_size = 0; */
+
+void
+reset_missing_font_count(void)
+{
+ missing_font_ctr = missing_font_curr = 0;
+}
+
+/* Register font `fname' at size `dpi' as a font for which we'll need
+ * to create a PK file
+ */
+static void
+add_missing_font(const char *fname, int dpi)
+{
+ char *buf = NULL;
+
+ if (missing_font_hash.size == 0) {
+ missing_font_hash = hash_create(197);
+ }
+
+ /* font name (hash key) needs to be dynamically allocated here */
+ buf = xmalloc(strlen(fname) + strlen(" at ") + LENGTH_OF_INT + 1);
+ sprintf(buf, "%s at %d", fname, dpi);
+ if (hash_lookup(missing_font_hash, buf) == NULL) {
+ missing_font_ctr++;
+ hash_insert(&missing_font_hash, buf, dummy_font_value);
+ }
+}
+
+/* Check if font `fname' at size `dpi' is in the hash of fonts for which
+ * we need to create a PK file. If it is, return its index (>= 0) and delete
+ * it from the hash table; else, return -1.
+ */
+static Boolean
+get_and_remove_missing_font(const char *fname, int dpi)
+{
+ char buf[1024];
+
+ if (missing_font_hash.size == 0)
+ return False;
+
+ SNPRINTF(buf, 1024, "%s at %d", fname, dpi);
+ buf[1023] = '\0';
+ if (hash_lookup(missing_font_hash, buf) == NULL) {
+ return False;
+ }
+
+ hash_remove(&missing_font_hash, buf, dummy_font_value);
+ return True;
+}
+
+
+static Boolean
+message_font_creation(const char *fname, int dpi)
+{
+ if (get_and_remove_missing_font(fname, dpi)) {
+ missing_font_curr++;
+ statusline_info(STATUS_MEDIUM,
+ "Creating PK font: %s at %d dpi (%d of %d) ...",
+ fname,
+ dpi,
+ missing_font_curr,
+ missing_font_ctr);
+ force_statusline_update();
+ return True;
+ }
+ return False;
+}
+#endif /* DELAYED_MKTEXPK */
+
+FILE *
+font_open(
+#if DELAYED_MKTEXPK
+ Boolean load_font_now,
+#endif
+ struct font *fontp,
+ const char **font_ret,
+ int *dpi_ret)
+{
+ char *name;
+ kpse_glyph_file_type file_ret;
+#if DELAYED_MKTEXPK
+ Boolean message_done = False;
+ Boolean need_statusline_update = False;
+#endif
+ /* defaults in case of success; filename_ret will be
+ non-NULL iff the fallback font is used.
+ */
+ *font_ret = NULL;
+ /* filename_ret is NULL iff a T1 version of a font has been used */
+ fontp->filename = NULL;
+ *dpi_ret = fontp->fsize;
+
+ if (resource.omega) { /* for omega, first try 16-bit ovf's, then 8-bit vf's. */
+ name = kpse_find_ovf(fontp->fontname);
+ if (name == NULL)
+ name = kpse_find_vf(fontp->fontname);
+ }
+ else {
+ name = kpse_find_vf(fontp->fontname);
+ }
+
+ if (name) { /* found a vf font */
+ /* pretend it has the expected dpi value, else caller will complain */
+ *dpi_ret = fontp->fsize;
+ fontp->filename = name;
+ return XFOPEN(name, FOPEN_R_MODE);
+ }
+
+#if FREETYPE
+ if (resource.freetype
+# if DELAYED_MKTEXPK
+ && load_font_now
+# endif
+ ) {
+ /* First attempt: freetype font of correct size
+ * (for delayed_mtkexpk, only when scanning postamble for the first time)
+ */
+ if (lookup_t1_font(fontp, fontp->fontname)) {
+ TRACE_FT((stderr, "found freetype font %s", fontp->fontname));
+ return NULL;
+ }
+ TRACE_FT((stderr,
+ "Freetype version of font %s not found, trying pixel version next, then fallback",
+ fontp->fontname));
+ }
+#endif /* FREETYPE */
+
+
+ /*
+ TODO:
+
+ Probably a better approach would be as follows:
+
+ 1. Read the postamble to get all font definitions. Then, set:
+
+ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile);
+
+ and run load_font() on all of the fonts, with an array in which to save
+ the names that don't exist (that returned NULL).
+
+ 2. Run load_font() again on the fonts that didn't exist in step
+ (1) and display the output in a window. This somehow needs to
+ be fork()ed so that the window itself remains responsive.
+ (Maybe it's easier to call mktexpk directly on the command-line?)
+
+ _________________________________________________________
+ | |
+ | Xdvi is creating fonts, please be patient ... |
+ | |
+ | Font xyz (n of m) |
+ | |
+ | Errors: 0 [ Show Details ... ] |
+ | |
+ | [ ... some progress meter or busy indicator ... ] |
+ | |
+ | |
+ | [ Exit xdvi ] [ Help ] |
+ | |
+ ---------------------------------------------------------
+
+ This window can be shown before the main window is opened.
+
+ */
+
+ /* Second try: PK/GF/... font within allowable size range */
+ /*
+ NOTE SU: The problem with this is that it will already use the PK version
+ of the fallback font (e.g. cmr10.600pk) if the PK version exists, so the
+ Type1 version of the fallback won't get used at all. But maybe this isn't
+ that severe, given that the font is grossly wrong anyway.
+ */
+#if DELAYED_MKTEXPK
+ if (load_font_now) {
+ fprintf(stderr, "loading font now\n");
+ if (message_font_creation(fontp->fontname, (int)(fontp->fsize + 0.5))) {
+ message_done = True;
+ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+ }
+ else {
+ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile);
+ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+ /* no success if either name is NULL or the filename returned in file_ret is
+ a different font */
+#if 1
+ /* ??? Bug with tex/test2.tex if cmbr exists but cmr doesn't ??? */
+ fprintf(stderr, "creating %s\n", fontp->fontname);
+ if (!name || strcmp(file_ret.name, fontp->fontname) != 0) {
+ statusline_info(STATUS_MEDIUM,
+ "Creating PK font: %s at %d dpi ...",
+ fontp->fontname,
+ (int)(fontp->fsize + 0.5));
+ need_statusline_update = True;
+ force_statusline_update();
+ kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile);
+ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+ }
+#endif
+ }
+ }
+ else {
+ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+ }
+#else /* DELAYED_MKTEXPK */
+ name = kpse_find_glyph(fontp->fontname, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+#endif /* DELAYED_MKTEXPK */
+
+ if (name) { /* success */
+#if DELAYED_MKTEXPK
+ if (need_statusline_update) {
+ statusline_info(STATUS_SHORT, "Creating PK font: %s at %d dpi ... done",
+ fontp->fontname,
+ (int)(fontp->fsize + 0.5));
+ force_statusline_update();
+ }
+#endif
+ *dpi_ret = file_ret.dpi;
+ fontp->filename = name;
+ *font_ret = file_ret.name;
+ TRACE_FT((stderr, "Found pixel version: %s at %d dpi", file_ret.name, *dpi_ret));
+#if DELAYED_MKTEXPK
+ if (message_done) {
+ statusline_append(STATUS_VERYSHORT, "DUMMY", /* append text, don't overwrite */
+ "done.");
+ force_statusline_update();
+ }
+#endif
+ return XFOPEN(name, FOPEN_R_MODE);
+ }
+#if DELAYED_MKTEXPK
+ else if (!load_font_now) {
+ add_missing_font(fontp->fontname, (int)(fontp->fsize + 0.5));
+ return NULL;
+ }
+#endif
+ else if (resource.alt_font != NULL) {
+ /* The strange thing about kpse_find_glyph() is that it
+ won't create a PK version of alt_font if it doesn't
+ already exist. So we invoke it explicitly a second time
+ for that one.
+ */
+ TRACE_FT((stderr, "Trying fallback"));
+#if FREETYPE
+ if (resource.freetype
+#if DELAYED_MKTEXPK
+ && load_font_now
+#endif
+ ) {
+ /* Third attempt: freetype version of fallback font */
+ if (lookup_t1_font(fontp, resource.alt_font)) {
+ TRACE_FT((stderr, "found fallback font for %s: %s",
+ fontp->fontname, resource.alt_font));
+ *font_ret = xstrdup(resource.alt_font);
+ return NULL;
+ }
+ TRACE_FT((stderr,
+ "Freetype version of fallback font %s not found, trying pixel version",
+ resource.alt_font));
+ }
+#endif /* FREETYPE */
+ /* Fourth attempt: PK version of fallback font */
+ name = kpse_find_glyph(resource.alt_font, (unsigned)(fontp->fsize + .5),
+ kpse_any_glyph_format, &file_ret);
+ if (name) { /* success */
+ TRACE_FT((stderr, "Success for PK version of fallback"));
+ *dpi_ret = file_ret.dpi;
+ fontp->filename = name;
+ *font_ret = xstrdup(resource.alt_font);
+ return XFOPEN(name, FOPEN_R_MODE);
+ }
+ else {
+ TRACE_FT((stderr, "Failure for PK version of fallback"));
+ }
+ }
+
+ /* all other cases are failure */
+ TRACE_FT((stderr, "Failure"));
+ return NULL;
+}
diff --git a/Build/source/texk/xdvik/font-open.h b/Build/source/texk/xdvik/font-open.h
new file mode 100644
index 00000000000..236ee6d7192
--- /dev/null
+++ b/Build/source/texk/xdvik/font-open.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2002-2013 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef FONT_OPEN_H_
+#define FONT_OPEN_H_
+
+
+#if FREETYPE || PS
+
+#include "util.h" /* get AVL basics */
+
+#if FREETYPE
+# include <ft2build.h>
+# include FT_FREETYPE_H
+#endif
+
+
+/*
+ * AVL tree structures.
+ */
+
+ /* Data structure for Type 1 fonts -- contents of psfonts.map */
+struct avl_t1 {
+ AVL_COMMON;
+ const char *psname; /* PS name of font */
+ const char *fontfile; /* (short) name of pfa/pfb file */
+ const char *encname; /* (short) name of encoding file */
+ const char *addinfo; /* additional PS instructions */
+# if FREETYPE
+ Boolean bad; /* if later found to be unloadable */
+ struct ftfont *ft; /* pointer to FreeType record */
+# endif
+};
+
+
+# if FREETYPE
+
+struct ftfont { /* info for FreeType font (Type 1 or TrueType) */
+ FT_Face face; /* NULL means not loaded yet */
+ struct font *first_size;
+ struct avl_t1 *t1;
+ /* struct avl_tt *tt; */
+ struct FT_StreamRec_ stream;
+ struct avl_enc *enc; /* pointer to encoding record */
+ double expn; /* expansion factor */
+};
+
+struct avl_enc {
+ AVL_COMMON;
+ Boolean valid;
+ const char *vec[256];
+};
+
+# endif /* FREETYPE */
+
+extern Boolean init_t1_lookup(void);
+extern Boolean lookup_t1_font(struct font *fontp, const char *fontname);
+extern FILE *open_t1_font (struct avl_t1 *t1p, const char **path_ret);
+extern void read_encoding(struct avl_enc *encp);
+
+#endif /* FREETYPE || PS */
+
+
+extern FILE *font_open(
+#if DELAYED_MKTEXPK
+ Boolean load_font_now,
+#endif
+ struct font *fontp,
+ const char **font_ret,
+ int *dpi_ret);
+
+#if DELAYED_MKTEXPK
+void reset_missing_font_count(void);
+#endif
+
+#endif /* FONT_OPEN_H_ */
diff --git a/Build/source/texk/xdvik/ft.c b/Build/source/texk/xdvik/ft.c
new file mode 100644
index 00000000000..66ca6b55723
--- /dev/null
+++ b/Build/source/texk/xdvik/ft.c
@@ -0,0 +1,484 @@
+/*========================================================================*\
+
+Copyright (c) 2013 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+\*========================================================================*/
+
+/*
+ * FreeType (PostScript Type 1 and TrueType) font reading routines.
+ * Public routines are load_ft_font and read_ft_char.
+ * The prototype for load_ft_font is in dvi-init.h.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "dvi-init.h"
+#include "dvi-draw.h"
+#include "util.h"
+#include "font-open.h"
+
+#include <ctype.h>
+#include <math.h>
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_SIZES_H
+
+static FT_Library library = NULL;
+
+static struct avl_enc *enc_head = NULL;
+
+/* From xc/lib/X11/PutImage.c */
+
+#if !WORDS_BIGENDIAN
+static const unsigned char reverse_byte[0x100] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+#endif /* !WORDS_BIGENDIAN */
+
+
+/*
+ * FreeType I/O stream functions
+ */
+
+static unsigned long
+xdvi_stream_read(FT_Stream stream,
+ unsigned long offset,
+ unsigned char *buffer,
+ unsigned long count)
+{
+ struct font *fontp;
+
+ fontp = ((struct ftfont *) stream->descriptor.pointer)->first_size;
+ open_font_file(fontp);
+ fseek(fontp->file, offset, SEEK_SET);
+ return (unsigned long) fread(buffer, 1, count, fontp->file);
+}
+
+static void
+xdvi_stream_close(FT_Stream stream)
+{
+ /* do nothing */
+}
+
+
+/*
+ * Public routines
+ */
+
+static void
+read_ft_char(struct font *fontp, wide_ubyte ch)
+{
+ struct glyph *g;
+ FT_Face face;
+ FT_GlyphSlot slot;
+ int bmTypeT_wide;
+ int err;
+
+ if (globals.debug & DBG_PK)
+ printf("Loading FreeType char %d", ch);
+
+ /*
+ * Load it unscaled first, so that we can get a more accurate
+ * (non-hinted) value of the horizontal advance.
+ */
+
+ g = &fontp->glyph[ch];
+ face = fontp->ft->face;
+ FT_Activate_Size(fontp->size);
+ err = FT_Load_Glyph(face, g->addr, FT_LOAD_NO_SCALE);
+ if (err != 0)
+ XDVI_FATAL((stderr, "FT_Load_Glyph: error = %d", err));
+
+ g->dvi_adv = face->glyph->metrics.horiAdvance * fontp->ft->expn
+ * fontp->pixsize * (1 << 16) / face->units_per_EM + 0.5;
+
+ /* Now do the real loading. */
+
+ err = FT_Load_Glyph(face, g->addr, FT_LOAD_RENDER | FT_LOAD_MONOCHROME);
+ if (err != 0)
+ XDVI_FATAL((stderr, "FT_Load_Glyph: error = %d", err));
+
+ slot = face->glyph;
+ g->bitmap.w = slot->bitmap.width;
+ g->bitmap.h = slot->bitmap.rows;
+
+ if (globals.debug & DBG_PK)
+ printf(", size=%dx%d, dvi_adv=%ld\n", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+
+ alloc_bitmap(&g->bitmap);
+ bmTypeT_wide = ROUNDUP((int) g->bitmap.w, BMBITS);
+
+ if (slot->bitmap.width > 0) {
+ int i;
+ unsigned char *p;
+ bmUnitT *q;
+
+ p = slot->bitmap.buffer;
+ q = (bmUnitT *) g->bitmap.bits;
+ for (i = g->bitmap.h; i > 0; --i) {
+#if WORDS_BIGENDIAN
+ memcpy(q, p, (slot->bitmap.width + 7) / 8);
+#else
+ unsigned char *p1 = p;
+ bmUnitT *q1 = q;
+ bmUnitT data = 0;
+ int shift = 0;
+ int j;
+
+ for (j = (slot->bitmap.width + 7) / 8; j > 0; --j) {
+ if (shift >= BMBITS) {
+ *q1++ = data;
+ data = 0;
+ shift = 0;
+ }
+ data |= reverse_byte[*p1++] << shift;
+ shift += 8;
+ }
+ *q1 = data;
+#endif
+ p += slot->bitmap.pitch;
+ q += bmTypeT_wide;
+ }
+ }
+
+ /* The offset of (-1,-1) is from comparing bitmaps of 'R' and 'a'
+ between cmr10.pfb and cmr10.300pk. */
+ g->x = -1 - slot->bitmap_left;
+ g->y = slot->bitmap_top - 1;
+}
+
+/*
+ * Do the ScaleFont, etc. directives.
+ */
+
+static Boolean
+set_transform(struct ftfont *ftp,
+ const char *str)
+{
+ double x = 1.0;
+ double y = 0.0;
+
+ for (;;) {
+ while (isspace((unsigned char)*str)) ++str;
+ if (*str == '\0')
+ break;
+
+ if (isdigit((unsigned char)*str) || *str == '.' || *str == '-') {
+ double arg = strtod(str, (char **) &str);
+
+ while (isspace((unsigned char)*str)) ++str;
+
+ if (memcmp(str, "ObliqueSlant", 12) == 0
+ && (isspace((unsigned char)str[12]) || str[12] == '\0')) {
+ arg = -tan(arg);
+ str += 12;
+ while (isspace((unsigned char)*str)) ++str;
+ }
+
+ if (memcmp(str, "SlantFont", 9) == 0
+ && (isspace((unsigned char)str[9]) || str[9] == '\0')) {
+ y += arg;
+ str += 9;
+ }
+ else if (memcmp(str, "ExtendFont", 10) == 0
+ && (isspace((unsigned char)str[10]) || str[10] == '\0')) {
+ x *= arg;
+ str += 10;
+ }
+ else return False;
+ }
+ else { /* other characters; presume encoding name */
+ while (!isspace((unsigned char)*str) && *str != '\0') ++str;
+ while (isspace((unsigned char)*str)) ++str;
+ if (memcmp(str, "ReEncodeFont", 12) == 0
+ && (isspace((unsigned char)str[12]) || str[12] == '\0'))
+ str += 12;
+ else
+ return False;
+ }
+ }
+
+ if (x != 1.0 || y != 0.0) {
+ FT_Matrix mat;
+
+ mat.xx = (FT_Fixed) (x * 0x10000 + 0.5);
+ mat.xy = (FT_Fixed) (y * 0x10000 + 0.5);
+ mat.yx = 0;
+ mat.yy = 0x10000;
+
+ FT_Set_Transform(ftp->face, &mat, NULL);
+ ftp->expn = x;
+ }
+
+ return True;
+}
+
+
+/*
+ * When a document uses many freetype fonts, it can take a while to read
+ * them all (due mostly to disk access issues). So, we delay loading
+ * freetype fonts until they're needed.
+ *
+ * Therefore, this routine is not called until it is time to render a
+ * character from the font (see set_ft_char() in dvi-draw.c).
+ *
+ * It loads and sets up the font.
+ */
+
+Boolean
+load_ft_font(struct font *fontp)
+{
+ struct ftfont *ftp;
+ struct avl_t1 *t1p;
+ struct font *fontp2;
+ FT_Face face;
+ FT_Size size;
+ int err;
+ const char *path;
+ FILE *f;
+
+ ftp = fontp->ft;
+ t1p = ftp->t1;
+ fontp2 = ftp->first_size;
+
+ if (!resource.freetype) {
+ TRACE_FT((stderr,
+ "load_ft_font returning: freetype has been turned off"));
+ return False;
+ }
+
+ if (t1p->bad) {
+ TRACE_FT((stderr, "Font %s was flagged as bad; skipping (size %d)",
+ fontp->fontname, (int) (fontp->fsize + 0.5)));
+ return False;
+ }
+
+ face = ftp->face;
+ if (face != NULL) { /* if this face is already in use */
+ err = FT_New_Size(face, &size);
+ if (err != 0) {
+ /* This error is probably better kept at stderr instead of
+ a popup (too annoying) or the statusline (might disappear
+ too fast) ... */
+ XDVI_ERROR((stderr, "Could not load FreeType font %s at %d: "
+ "FreeType FT_New_Size error = %d.\n"
+ "Will try pixel version instead.\n"
+ "Please see the FreeType documentation for details "
+ "about this.",
+ fontp->fontname, (int) (fontp->fsize + 0.5), err));
+ return False;
+ }
+ }
+ else {
+ FT_Open_Args args;
+
+ f = open_t1_font(t1p, &path);
+ if (f == NULL)
+ return False;
+
+ if (library == NULL) {
+ err = FT_Init_FreeType(&library);
+ if (err != 0) {
+ XDVI_ERROR((stderr,
+ "Could not initialize FreeType library: "
+ "FreeType FT_Init_FreeType error = %d.\n"
+ "Turning off use of FreeType.\n"
+ "Please see the FreeType documentation for details "
+ "about this.",
+ err));
+ resource.freetype = False;
+ free((char *) path);
+ fclose(f);
+ return False;
+ }
+ }
+
+ fontp2->filename = path;
+ fontp2->file = f;
+
+ fseek(f, 0L, SEEK_END);
+ ftp->stream.size = ftell(f);
+ fseek(f, 0L, SEEK_SET); /* this might not be necessary */
+
+ ftp->stream.descriptor.pointer = ftp;
+ ftp->stream.read = xdvi_stream_read;
+ ftp->stream.close = xdvi_stream_close;
+
+ args.flags = FT_OPEN_STREAM;
+ args.stream = &ftp->stream;
+ err = FT_Open_Face(library, &args, 0, &face);
+ if (err != 0) {
+ /* This error is probably better kept at stderr instead of
+ a popup (too annoying) or the statusline (might disappear
+ too fast) ... */
+ XDVI_ERROR((stderr, "Could not load FreeType font %s: "
+ "FreeType FT_Open_Face error = %d.\n"
+ "Will try pixel version instead.\n"
+ "Please see the FreeType documentation for details "
+ "about this.",
+ fontp->fontname, err));
+ free((char *) path);
+ fclose(f);
+ fontp2->file = NULL;
+ fontp2->filename = NULL;
+ return False;
+ }
+ ftp->face = face;
+
+ if (!FT_IS_SCALABLE(face)) {
+ TRACE_FT((stderr, "Font %s is not scalable.", fontp->fontname));
+ FT_Done_Face(face);
+ free((char *) path);
+ fclose(f);
+ fontp2->file = NULL;
+ fontp2->filename = NULL;
+ return False;
+ }
+
+ ftp->expn = 1.0;
+ if (t1p->addinfo != NULL)
+ if (!set_transform(ftp, t1p->addinfo)) {
+ FT_Done_Face(face);
+ free((char *) path);
+ fclose(f);
+ fontp2->file = NULL;
+ fontp2->filename = NULL;
+ return False;
+ }
+
+ if (face->charmap == NULL) {
+ if (face->num_charmaps > 0) {
+ if ((globals.debug & DBG_PK) && face->num_charmaps > 1)
+ printf("Choosing the first of %d charmaps.\n",
+ face->num_charmaps);
+ }
+ FT_Set_Charmap(face, face->charmaps[0]);
+ }
+ else if (face->charmap->encoding == ft_encoding_unicode
+ && FT_Select_Charmap(face, ft_encoding_adobe_custom) != 0
+ && FT_Select_Charmap(face, ft_encoding_adobe_standard) != 0
+ && FT_Select_Charmap(face, ft_encoding_adobe_expert) != 0) {
+ if (globals.debug & DBG_PK)
+ puts("Using unicode charmap for font.");
+ fputs("Using unicode charmap\n", stderr); /* ||| */
+ }
+
+ ftp->enc = NULL;
+ if (t1p->encname != NULL) { /* if there's an encoding */
+ struct avl_enc *encp;
+
+ encp = (struct avl_enc *) avladd(t1p->encname,
+ strlen(t1p->encname),
+ (struct avl **) &enc_head, sizeof *encp);
+ if (encp->key == t1p->encname) /* if new record */
+ read_encoding(encp);
+ if (encp->valid)
+ ftp->enc = encp;
+ }
+
+ size = face->size;
+ }
+
+ /* Get character indices (store them in addr) */
+
+ if (globals.debug & DBG_PK)
+ printf("Character indices for %s:\n", fontp->fontname);
+
+ FT_Activate_Size(size);
+
+ err = FT_Set_Char_Size(face,
+ (int) (fontp->pixsize * (72<<6) / resource.pixels_per_inch + 0.5), 0,
+ resource.pixels_per_inch, resource.pixels_per_inch);
+ if (err != 0)
+ XDVI_FATAL((stderr, "FT_Set_Char_Size: error = %d\n", err));
+
+ /* Look for already-computed character indices */
+ for (fontp2 = ftp->first_size;; fontp2 = fontp2->next_size) {
+ int i;
+
+ if (fontp2 == NULL) { /* if not found */
+ struct avl_enc *encp = ftp->enc;
+
+ for (i = 0; i < 256; ++i) {
+ int ci;
+
+ if (encp == NULL)
+ ci = FT_Get_Char_Index(face, i);
+ else {
+ const char *glyphname = encp->vec[i];
+
+ if (glyphname == NULL)
+ ci = 0;
+ else
+ ci = FT_Get_Name_Index(face,
+ (FT_String *) glyphname);
+ }
+
+ fontp->glyph[i].addr = ci;
+ if (globals.debug & DBG_PK)
+ printf("%3d->%3d%s", i, ci, (i + 1) % 8 ? " " : "\n");
+ }
+ break;
+ }
+ if (fontp2->size != NULL) { /* found the information */
+ for (i = 0; i < 256; ++i)
+ fontp->glyph[i].addr = fontp2->glyph[i].addr;
+ break;
+ }
+ }
+
+ fontp->size = size; /* it needed to be NULL in the above loop */
+ fontp->read_char = read_ft_char;
+
+ return True;
+}
diff --git a/Build/source/texk/xdvik/gf.c b/Build/source/texk/xdvik/gf.c
new file mode 100644
index 00000000000..72dab5ffe36
--- /dev/null
+++ b/Build/source/texk/xdvik/gf.c
@@ -0,0 +1,326 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+\*========================================================================*/
+
+/*
+ * GF font reading routines.
+ * Public routines are read_GF_index and read_GF_char.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "dvi-init.h"
+#include "util.h"
+
+#define PAINT_0 0
+#define PAINT1 64
+#define PAINT2 65
+#define PAINT3 66
+#define BOC 67
+#define BOC1 68
+#define EOC 69
+#define SKIP0 70
+#define SKIP1 71
+#define SKIP2 72
+#define SKIP3 73
+#define NEW_ROW_0 74
+#define NEW_ROW_MAX 238
+#define XXX1 239
+#define XXX2 240
+#define XXX3 241
+#define XXX4 242
+#define YYY 243
+#define NO_OP 244
+#define CHAR_LOC 245
+#define CHAR_LOC0 246
+#define PRE 247
+#define POST 248
+#define POST_POST 249
+
+#define GF_ID_BYTE 131
+#define TRAILER 223 /* Trailing bytes at end of file */
+
+static FILE *GF_file;
+
+static void
+expect(ubyte ch)
+{
+ ubyte ch1 = get_byte(GF_file);
+
+ if (ch1 != ch)
+ XDVI_FATAL((stderr, "Bad GF file: %d expected, %d received.", ch, ch1));
+}
+
+static void
+too_many_bits(ubyte ch)
+{
+ XDVI_FATAL((stderr, "Too many bits found when loading character %d", ch));
+}
+
+/*
+ * Public routines
+ */
+
+
+static void
+read_GF_char(struct font *fontp,
+ wide_ubyte ch)
+{
+ struct glyph *g;
+ ubyte cmnd;
+ int min_m, max_m, min_n, max_n;
+ bmUnitT *cp, *basep, *maxp;
+ int bytes_wide;
+ Boolean paint_switch;
+#define White False
+#define Black True
+ Boolean new_row;
+ int count;
+ int word_weight;
+
+ g = &fontp->glyph[ch];
+ GF_file = fontp->file;
+
+ if (globals.debug & DBG_PK)
+ printf("Loading gf char %d", ch);
+
+ for (;;) {
+ switch (cmnd = get_byte(GF_file)) {
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ fseek(GF_file, (long)get_bytes(GF_file, (int)(cmnd - XXX1 + 1)), SEEK_CUR);
+ continue;
+ case YYY:
+ (void)get_bytes(GF_file, 4);
+ continue;
+ case BOC:
+ (void)get_bytes(GF_file, 4); /* skip character code */
+ (void)get_bytes(GF_file, 4); /* skip pointer to prev char */
+ min_m = get_lbytes(GF_file, 4);
+ max_m = get_lbytes(GF_file, 4);
+ g->x = -min_m;
+ min_n = get_lbytes(GF_file, 4);
+ g->y = max_n = get_lbytes(GF_file, 4);
+ g->bitmap.w = max_m - min_m + 1;
+ g->bitmap.h = max_n - min_n + 1;
+ break;
+ case BOC1:
+ (void)get_byte(GF_file); /* skip character code */
+ g->bitmap.w = get_byte(GF_file); /* max_m - min_m */
+ g->x = g->bitmap.w - get_byte(GF_file); /* ditto - max_m */
+ ++g->bitmap.w;
+ g->bitmap.h = get_byte(GF_file) + 1;
+ g->y = get_byte(GF_file);
+ break;
+ default:
+ XDVI_FATAL((stderr, "Bad BOC code: %d", cmnd));
+ }
+ break;
+ }
+ paint_switch = White;
+
+ if (globals.debug & DBG_PK)
+ printf(", size=%dx%d, dvi_adv=%ld\n", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+
+ alloc_bitmap(&g->bitmap);
+ cp = basep = (bmUnitT *) g->bitmap.bits;
+ /*
+ * Read character data into *basep
+ */
+ bytes_wide = ROUNDUP((int)g->bitmap.w, BMBITS) * BMBYTES;
+ maxp = ADD(basep, g->bitmap.h * bytes_wide);
+ memset(g->bitmap.bits, 0, g->bitmap.h * bytes_wide);
+ new_row = False;
+ word_weight = BMBITS;
+ for (;;) {
+ count = -1;
+ cmnd = get_byte(GF_file);
+ if (cmnd < 64)
+ count = cmnd;
+ else if (cmnd >= NEW_ROW_0 && cmnd <= NEW_ROW_MAX) {
+ count = cmnd - NEW_ROW_0;
+ paint_switch = White; /* it'll be complemented later */
+ new_row = True;
+ }
+ else
+ switch (cmnd) {
+ case PAINT1:
+ case PAINT2:
+ case PAINT3:
+ count = get_bytes(GF_file, (int)(cmnd - PAINT1 + 1));
+ break;
+ case EOC:
+ if (cp >= ADD(basep, bytes_wide))
+ too_many_bits(ch);
+ return;
+ case SKIP1:
+ case SKIP2:
+ case SKIP3:
+ basep += get_bytes(GF_file, (int)(cmnd - SKIP0)) * bytes_wide / sizeof(bmUnitT);
+ /* *((char **)&basep) += get_bytes(GF_file, WIDENINT cmnd - SKIP0) * bytes_wide; */
+ case SKIP0:
+ new_row = True;
+ paint_switch = White;
+ break;
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ fseek(GF_file, (long)get_bytes(GF_file, (int)(cmnd - XXX1 + 1)), SEEK_CUR);
+ break;
+ case YYY:
+ (void)get_bytes(GF_file, 4);
+ break;
+ case NO_OP:
+ break;
+ default:
+ XDVI_FATAL((stderr, "Bad command in GF file: %d", cmnd));
+ } /* end switch */
+ if (new_row) {
+ basep += bytes_wide / sizeof(bmUnitT);
+ /* *((char **)&basep) += bytes_wide; */
+ if (basep >= maxp || cp >= basep)
+ too_many_bits(ch);
+ cp = basep;
+ word_weight = BMBITS;
+ new_row = False;
+ }
+ if (count >= 0) {
+ while (count)
+ if (count <= word_weight) {
+#ifndef WORDS_BIGENDIAN
+ if (paint_switch)
+ *cp |= bit_masks[count] << (BMBITS - word_weight);
+#endif
+ word_weight -= count;
+#ifdef WORDS_BIGENDIAN
+ if (paint_switch)
+ *cp |= bit_masks[count] << word_weight;
+#endif
+ break;
+ }
+ else {
+ if (paint_switch)
+#ifndef WORDS_BIGENDIAN
+ *cp |= bit_masks[word_weight] << (BMBITS - word_weight);
+#else
+ *cp |= bit_masks[word_weight];
+#endif
+ cp++;
+ count -= word_weight;
+ word_weight = BMBITS;
+ }
+ paint_switch = 1 - paint_switch;
+ }
+ } /* end for */
+}
+
+
+void
+read_GF_index(struct font *fontp, wide_bool hushcs)
+{
+ int hppp, vppp;
+ ubyte ch, cmnd;
+ struct glyph *g;
+ long checksum;
+
+ fontp->read_char = read_GF_char;
+ GF_file = fontp->file;
+ if (globals.debug & DBG_PK)
+ printf("Reading GF pixel file %s\n", fontp->filename);
+ /*
+ * Find postamble.
+ */
+ fseek(GF_file, (long)-4, SEEK_END);
+ while (get_bytes(GF_file, 4) != ((unsigned long)TRAILER << 24 | TRAILER << 16
+ | TRAILER << 8 | TRAILER))
+ fseek(GF_file, (long)-5, SEEK_CUR);
+ fseek(GF_file, (long)-5, SEEK_CUR);
+ for (;;) {
+ ch = get_byte(GF_file);
+ if (ch != TRAILER)
+ break;
+ fseek(GF_file, (long)-2, SEEK_CUR);
+ }
+ if (ch != GF_ID_BYTE)
+ XDVI_FATAL((stderr, "Bad end of font file %s", fontp->fontname));
+ fseek(GF_file, (long)-6, SEEK_CUR);
+ expect(POST_POST);
+ fseek(GF_file, get_lbytes(GF_file, 4), SEEK_SET); /* move to postamble */
+ /*
+ * Read postamble.
+ */
+ expect(POST);
+ (void)get_bytes(GF_file, 4); /* pointer to last eoc + 1 */
+ (void)get_bytes(GF_file, 4); /* skip design size */
+ checksum = get_bytes(GF_file, 4);
+ if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0
+ && !hushcs)
+ XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, gf = %lu) in font file %s",
+ fontp->checksum, checksum, fontp->filename));
+ hppp = get_lbytes(GF_file, 4);
+ vppp = get_lbytes(GF_file, 4);
+ if (hppp != vppp && (globals.debug & DBG_PK))
+ printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp);
+ (void)get_bytes(GF_file, 4); /* skip min_m */
+ (void)get_bytes(GF_file, 4); /* skip max_m */
+ (void)get_bytes(GF_file, 4); /* skip min_n */
+ (void)get_bytes(GF_file, 4); /* skip max_n */
+ /*
+ * Prepare glyph array.
+ */
+ fontp->glyph = xmalloc(256 * sizeof(struct glyph));
+ memset((char *)fontp->glyph, 0, 256 * sizeof(struct glyph));
+ /*
+ * Read glyph directory.
+ */
+ while ((cmnd = get_byte(GF_file)) != POST_POST) {
+ int addr;
+
+ ch = get_byte(GF_file); /* character code */
+ g = &fontp->glyph[ch];
+ switch (cmnd) {
+ case CHAR_LOC:
+ /* g->pxl_adv = get_lbytes(GF_file, 4); */
+ (void)get_bytes(GF_file, 4);
+ (void)get_bytes(GF_file, 4); /* skip dy */
+ break;
+ case CHAR_LOC0:
+ /* g->pxl_adv = get_byte(GF_file) << 16; */
+ (void)get_byte(GF_file);
+ break;
+ default:
+ XDVI_FATAL((stderr, "Non-char_loc command found in GF preamble: %d", cmnd));
+ }
+ g->dvi_adv = fontp->dimconv * get_lbytes(GF_file, 4);
+ addr = get_bytes(GF_file, 4);
+ if (addr != -1)
+ g->addr = addr;
+ if (globals.debug & DBG_PK)
+ printf("Read GF glyph for character %d; dy = %ld, addr = %x\n",
+ ch, g->dvi_adv, addr);
+ }
+}
diff --git a/Build/source/texk/xdvik/gui/Panner.c b/Build/source/texk/xdvik/gui/Panner.c
new file mode 100644
index 00000000000..8a8577a617d
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/Panner.c
@@ -0,0 +1,1238 @@
+/*
+ * $XConsortium: Panner.c,v 1.52 95/01/10 14:31:26 kaleb Exp $
+ *
+ Copyright (c) 1989, 1994 X Consortium
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name of the X Consortium shall not be
+ used in advertising or otherwise to promote the sale, use or other dealings
+ in this Software without prior written authorization from the X Consortium.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "string-utils.h"
+
+#if defined(MOTIF) && defined(USE_PANNER) && USE_XAW_PANNER /* entire file */
+
+#if defined(__GNUC__) && DEVEL_MODE
+#warning COMPILING Panner_c
+#endif
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h> /* for XtN and XtC defines */
+#include <X11/Xmu/CharSet.h> /* for XmuCompareISOLatin1() */
+#include "PannerP.h" /* us */
+#include <X11/Xos.h>
+#include <X11/Xmu/Misc.h> /* for Min */
+#include <X11/Xmu/Drawing.h>
+#include <ctype.h> /* for isascii() etc. */
+
+extern Bool XmuDistinguishablePixels(); /* not defined in any Xmu headers */
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define panBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define panBell(display, window, percent) XBell(display, percent)
+#endif
+
+/*
+ ======================================================================
+ begin copy from Simple.c
+ ======================================================================
+*/
+
+#define offset(field) XtOffsetOf(SimpleRec, simple.field)
+
+static XtResource resources[] = {
+ {XtNcursor, XtCCursor, XtRCursor, sizeof(Cursor),
+ offset(cursor), XtRImmediate, (XtPointer) None},
+ {XtNinsensitiveBorder, XtCInsensitive, XtRPixmap, sizeof(Pixmap),
+ offset(insensitive_border), XtRImmediate, (XtPointer) NULL},
+ {XtNpointerColor, XtCForeground, XtRPixel, sizeof(Pixel),
+ offset(pointer_fg), XtRString, XtDefaultForeground},
+ {XtNpointerColorBackground, XtCBackground, XtRPixel, sizeof(Pixel),
+ offset(pointer_bg), XtRString, XtDefaultBackground},
+ {XtNcursorName, XtCCursor, XtRString, sizeof(String),
+ offset(cursor_name), XtRString, NULL},
+ {XtNinternational, XtCInternational, XtRBoolean, sizeof(Boolean),
+ offset(international), XtRImmediate, (XtPointer) FALSE},
+#undef offset
+};
+
+static void ClassPartInitialize(), ClassInitialize(),Realize(),ConvertCursor();
+static Bool SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args);
+static Bool ChangeSensitive(Widget w);
+
+SimpleClassRec simpleClassRec = {
+ { /* core fields */
+ /* superclass */ (WidgetClass) &widgetClassRec,
+ /* class_name */ "Simple",
+ /* widget_size */ sizeof(SimpleRec),
+ /* class_initialize */ ClassInitialize,
+ /* class_part_initialize */ ClassPartInitialize,
+ /* class_inited */ FALSE,
+ /* initialize */ NULL,
+ /* initialize_hook */ NULL,
+ /* realize */ Realize,
+ /* actions */ NULL,
+ /* num_actions */ 0,
+ /* resources */ resources,
+ /* num_resources */ XtNumber(resources),
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ TRUE,
+ /* compress_exposure */ TRUE,
+ /* compress_enterleave */ TRUE,
+ /* visible_interest */ FALSE,
+ /* destroy */ NULL,
+ /* resize */ NULL,
+ /* expose */ NULL,
+#warning FIXME: incompatible pointer type
+ /* set_values */ SetValues,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ NULL,
+ /* version */ XtVersion,
+ /* callback_private */ NULL,
+ /* tm_table */ NULL,
+ /* query_geometry */ XtInheritQueryGeometry,
+ /* display_accelerator */ XtInheritDisplayAccelerator,
+ /* extension */ NULL
+ },
+ { /* simple fields */
+ /* change_sensitive */ ChangeSensitive
+#ifndef HAVE_OLD_XAW
+ , NULL
+#endif
+ }
+};
+
+WidgetClass simpleWidgetClass = (WidgetClass)&simpleClassRec;
+
+static void ClassInitialize()
+{
+ static XtConvertArgRec convertArg[] = {
+ {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen),
+ sizeof(Screen *)},
+ {XtResourceString, (XtPointer) XtNpointerColor, sizeof(Pixel)},
+ {XtResourceString, (XtPointer) XtNpointerColorBackground,
+ sizeof(Pixel)},
+ {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.colormap),
+ sizeof(Colormap)}
+ };
+
+ XawInitializeWidgetSet();
+ XtSetTypeConverter( XtRString, XtRColorCursor, XmuCvtStringToColorCursor,
+ convertArg, XtNumber(convertArg),
+ XtCacheByDisplay, (XtDestructor)NULL);
+}
+
+static void ClassPartInitialize(class)
+ WidgetClass class;
+{
+ SimpleWidgetClass c = (SimpleWidgetClass) class;
+ SimpleWidgetClass super = (SimpleWidgetClass)
+ c->core_class.superclass;
+
+ if (c->simple_class.change_sensitive == NULL) {
+ char buf[BUFSIZ];
+
+ (void) sprintf(buf,
+ "%s Widget: The Simple Widget class method 'change_sensitive' is undefined.\nA function must be defined or inherited.",
+ c->core_class.class_name);
+ XtWarning(buf);
+ c->simple_class.change_sensitive = ChangeSensitive;
+ }
+
+ if (c->simple_class.change_sensitive == XtInheritChangeSensitive)
+ c->simple_class.change_sensitive = super->simple_class.change_sensitive;
+}
+
+static void Realize(w, valueMask, attributes)
+ Widget w;
+ Mask *valueMask;
+ XSetWindowAttributes *attributes;
+{
+ Pixmap border_pixmap = 0;
+ if (!XtIsSensitive(w)) {
+ /* change border to gray; have to remember the old one,
+ * so XtDestroyWidget deletes the proper one */
+ if (((SimpleWidget)w)->simple.insensitive_border == None)
+ ((SimpleWidget)w)->simple.insensitive_border =
+ XmuCreateStippledPixmap(XtScreen(w),
+ w->core.border_pixel,
+ w->core.background_pixel,
+ w->core.depth);
+ border_pixmap = w->core.border_pixmap;
+ attributes->border_pixmap =
+ w->core.border_pixmap = ((SimpleWidget)w)->simple.insensitive_border;
+
+ *valueMask |= CWBorderPixmap;
+ *valueMask &= ~CWBorderPixel;
+ }
+
+ ConvertCursor(w);
+
+ if ((attributes->cursor = ((SimpleWidget)w)->simple.cursor) != None)
+ *valueMask |= CWCursor;
+
+ XtCreateWindow( w, (unsigned int)InputOutput, (Visual *)CopyFromParent,
+ *valueMask, attributes );
+
+ if (!XtIsSensitive(w))
+ w->core.border_pixmap = border_pixmap;
+}
+
+/* Function Name: ConvertCursor
+ * Description: Converts a name to a new cursor.
+ * Arguments: w - the simple widget.
+ * Returns: none.
+ */
+
+static void
+ConvertCursor(w)
+ Widget w;
+{
+ SimpleWidget simple = (SimpleWidget) w;
+ XrmValue from, to;
+ Cursor cursor;
+
+ if (simple->simple.cursor_name == NULL)
+ return;
+
+ from.addr = (XPointer) simple->simple.cursor_name;
+ from.size = strlen((char *) from.addr) + 1;
+
+ to.size = sizeof(Cursor);
+ to.addr = (XPointer) &cursor;
+
+ if (XtConvertAndStore(w, XtRString, &from, XtRColorCursor, &to)) {
+ if ( cursor != None)
+ simple->simple.cursor = cursor;
+ }
+ else {
+ XtAppErrorMsg(XtWidgetToApplicationContext(w),
+ "convertFailed","ConvertCursor","XawError",
+ "Simple: ConvertCursor failed.",
+ (String *)NULL, (Cardinal *)NULL);
+ }
+}
+
+
+/* ARGSUSED */
+static Bool
+SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *num_args)
+{
+ SimpleWidget s_old = (SimpleWidget) current;
+ SimpleWidget s_new = (SimpleWidget) new;
+ Boolean new_cursor = FALSE;
+
+ UNUSED(request);
+ UNUSED(args);
+ UNUSED(num_args);
+ /* this disables user changes after creation*/
+ s_new->simple.international = s_old->simple.international;
+
+ if ( XtIsSensitive(current) != XtIsSensitive(new) )
+ (*((SimpleWidgetClass)XtClass(new))->
+ simple_class.change_sensitive) ( new );
+
+ if (s_old->simple.cursor != s_new->simple.cursor) {
+ new_cursor = TRUE;
+ }
+
+ /*
+ * We are not handling the string cursor_name correctly here.
+ */
+
+ if ( (s_old->simple.pointer_fg != s_new->simple.pointer_fg) ||
+ (s_old->simple.pointer_bg != s_new->simple.pointer_bg) ||
+ (s_old->simple.cursor_name != s_new->simple.cursor_name) ) {
+ ConvertCursor(new);
+ new_cursor = TRUE;
+ }
+
+ if (new_cursor && XtIsRealized(new))
+ XDefineCursor(XtDisplay(new), XtWindow(new), s_new->simple.cursor);
+
+ return False;
+}
+
+
+static Bool ChangeSensitive(Widget w)
+{
+ if (XtIsRealized(w)) {
+ if (XtIsSensitive(w))
+ if (w->core.border_pixmap != XtUnspecifiedPixmap)
+ XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w),
+ w->core.border_pixmap );
+ else
+ XSetWindowBorder( XtDisplay(w), XtWindow(w),
+ w->core.border_pixel );
+ else {
+ if (((SimpleWidget)w)->simple.insensitive_border == None)
+ ((SimpleWidget)w)->simple.insensitive_border =
+ XmuCreateStippledPixmap(XtScreen(w),
+ w->core.border_pixel,
+ w->core.background_pixel,
+ w->core.depth);
+ XSetWindowBorderPixmap( XtDisplay(w), XtWindow(w),
+ ((SimpleWidget)w)->
+ simple.insensitive_border );
+ }
+ }
+ return False;
+}
+
+/*
+ ======================================================================
+ end copy from Simple.c
+ ======================================================================
+*/
+
+
+/* following function copied from XawInit.c */
+void XawInitializeWidgetSet ()
+{
+ static int firsttime = 1;
+
+ if (firsttime) {
+ firsttime = 0;
+ XtInitializeWidgetClass (vendorShellWidgetClass);
+ }
+}
+
+static char defaultTranslations[] =
+"<Btn1Down>: start() \n\
+ <Btn1Motion>: move() \n\
+ <Btn1Up>: notify() stop() \n\
+ <Btn2Down>: abort() \n\
+ :<Key>KP_Enter: set(rubberband,toggle) \n\
+ <Key>space: page(+1p,+1p) \n\
+ <Key>Delete: page(-1p,-1p) \n\
+ :<Key>KP_Delete: page(-1p,-1p) \n\
+ <Key>BackSpace: page(-1p,-1p) \n\
+ <Key>Left: page(-.5p,+0) \n\
+ :<Key>KP_Left: page(-.5p,+0) \n\
+ <Key>Right: page(+.5p,+0) \n\
+ :<Key>KP_Right: page(+.5p,+0) \n\
+ <Key>Up: page(+0,-.5p) \n\
+ :<Key>KP_Up: page(+0,-.5p) \n\
+ <Key>Down: page(+0,+.5p) \n\
+ :<Key>KP_Down: page(+0,+.5p) \n\
+ <Key>Home: page(0,0) \n\
+ :<Key>KP_Home: page(0,0)";
+
+
+static void ActionStart(), ActionStop(), ActionAbort(), ActionMove();
+static void ActionPage(), ActionNotify(), ActionSet();
+
+static XtActionsRec actions[] = {
+ { "start", ActionStart }, /* start tmp graphics */
+ { "stop", ActionStop }, /* stop tmp graphics */
+ { "abort", ActionAbort }, /* punt */
+ { "move", ActionMove }, /* move tmp graphics on Motion event */
+ { "page", ActionPage }, /* page around usually from keyboard */
+ { "notify", ActionNotify }, /* callback new position */
+ { "set", ActionSet }, /* set various parameters */
+};
+
+
+/*
+ * resources for the panner
+ */
+static XtResource panner_resources[] = {
+#define poff(field) XtOffsetOf(PannerRec, panner.field)
+ { XtNallowOff, XtCAllowOff, XtRBoolean, sizeof(Boolean),
+ poff(allow_off), XtRImmediate, (XtPointer) FALSE },
+ { XtNresize, XtCResize, XtRBoolean, sizeof(Boolean),
+ poff(resize_to_pref), XtRImmediate, (XtPointer) TRUE },
+ { XtNreportCallback, XtCReportCallback, XtRCallback, sizeof(XtPointer),
+ poff(report_callbacks), XtRCallback, (XtPointer) NULL },
+ { XtNdefaultScale, XtCDefaultScale, XtRDimension, sizeof(Dimension),
+ poff(default_scale), XtRImmediate, (XtPointer) PANNER_DEFAULT_SCALE },
+ { XtNrubberBand, XtCRubberBand, XtRBoolean, sizeof(Boolean),
+ poff(rubber_band), XtRImmediate, (XtPointer) FALSE },
+ { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+ poff(foreground), XtRString, (XtPointer) XtDefaultBackground },
+ { XtNinternalSpace, XtCInternalSpace, XtRDimension, sizeof(Dimension),
+ poff(internal_border), XtRImmediate, (XtPointer) 4 },
+ { XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension),
+ poff(line_width), XtRImmediate, (XtPointer) 0 },
+ { XtNcanvasWidth, XtCCanvasWidth, XtRDimension, sizeof(Dimension),
+ poff(canvas_width), XtRImmediate, (XtPointer) 0 },
+ { XtNcanvasHeight, XtCCanvasHeight, XtRDimension, sizeof(Dimension),
+ poff(canvas_height), XtRImmediate, (XtPointer) 0 },
+ { XtNsliderX, XtCSliderX, XtRPosition, sizeof(Position),
+ poff(slider_x), XtRImmediate, (XtPointer) 0 },
+ { XtNsliderY, XtCSliderY, XtRPosition, sizeof(Position),
+ poff(slider_y), XtRImmediate, (XtPointer) 0 },
+ { XtNsliderWidth, XtCSliderWidth, XtRDimension, sizeof(Dimension),
+ poff(slider_width), XtRImmediate, (XtPointer) 0 },
+ { XtNsliderHeight, XtCSliderHeight, XtRDimension, sizeof(Dimension),
+ poff(slider_height), XtRImmediate, (XtPointer) 0 },
+ { XtNshadowColor, XtCShadowColor, XtRPixel, sizeof(Pixel),
+ poff(shadow_color), XtRString, (XtPointer) XtDefaultForeground },
+ { XtNshadowThickness, XtCShadowThickness, XtRDimension, sizeof(Dimension),
+ poff(shadow_thickness), XtRImmediate, (XtPointer) 2 },
+ { XtNbackgroundStipple, XtCBackgroundStipple, XtRString, sizeof(String),
+ poff(stipple_name), XtRImmediate, (XtPointer) NULL },
+#undef poff
+};
+
+
+/*
+ * widget class methods used below
+ */
+static void Initialize(); /* create gc's */
+static void PannerRealize(); /* create window */
+static void Destroy(); /* clean up widget */
+static void Resize(); /* need to rescale ourselves */
+static void Redisplay(); /* draw ourselves */
+static Boolean PannerSetValues(); /* set all of the resources */
+static void SetValuesAlmost(); /* deal with failed setval geom req */
+static XtGeometryResult QueryGeometry(); /* say how big we would like to be */
+
+PannerClassRec pannerClassRec = {
+ { /* core fields */
+ /* superclass */ (WidgetClass) &simpleClassRec,
+ /* class_name */ "Panner",
+ /* widget_size */ sizeof(PannerRec),
+ /* class_initialize */ XawInitializeWidgetSet,
+ /* class_part_initialize */ NULL,
+ /* class_inited */ FALSE,
+ /* initialize */ Initialize,
+ /* initialize_hook */ NULL,
+ /* realize */ PannerRealize,
+ /* actions */ actions,
+ /* num_actions */ XtNumber(actions),
+ /* resources */ panner_resources,
+ /* num_resources */ XtNumber(panner_resources),
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ TRUE,
+ /* compress_exposure */ TRUE,
+ /* compress_enterleave */ TRUE,
+ /* visible_interest */ FALSE,
+ /* destroy */ Destroy,
+ /* resize */ Resize,
+ /* expose */ Redisplay,
+ /* set_values */ PannerSetValues,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ SetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ NULL,
+ /* version */ XtVersion,
+ /* callback_private */ NULL,
+ /* tm_table */ defaultTranslations,
+ /* query_geometry */ QueryGeometry,
+ /* display_accelerator */ XtInheritDisplayAccelerator,
+ /* extension */ NULL
+ },
+ { /* simple fields */
+ /* change_sensitive */ XtInheritChangeSensitive
+#ifndef HAVE_OLD_XAW
+ , NULL
+#endif
+ },
+ { /* panner fields */
+ /* ignore */ 0
+ }
+};
+
+WidgetClass pannerWidgetClass = (WidgetClass) &pannerClassRec;
+
+
+/*****************************************************************************
+ * *
+ * panner utility routines *
+ * *
+ *****************************************************************************/
+
+static void reset_shadow_gc (pw) /* used when resources change */
+ PannerWidget pw;
+{
+ XtGCMask valuemask = GCForeground;
+ XGCValues values;
+ unsigned long pixels[3];
+
+ if (pw->panner.shadow_gc) XtReleaseGC ((Widget) pw, pw->panner.shadow_gc);
+
+ pixels[0] = pw->panner.foreground;
+ pixels[1] = pw->core.background_pixel;
+ pixels[2] = pw->panner.shadow_color;
+ if (!pw->panner.stipple_name &&
+ !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
+ pixels, 3) &&
+ XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
+ pixels, 2))
+ {
+ valuemask = GCTile | GCFillStyle;
+ values.fill_style = FillTiled;
+ values.tile = XmuCreateStippledPixmap(XtScreen((Widget)pw),
+ pw->panner.foreground,
+ pw->core.background_pixel,
+ pw->core.depth);
+ }
+ else
+ {
+ if (!pw->panner.line_width &&
+ !XmuDistinguishablePixels (XtDisplay (pw), pw->core.colormap,
+ pixels, 2))
+ pw->panner.line_width = 1;
+ valuemask = GCForeground;
+ values.foreground = pw->panner.shadow_color;
+ }
+ if (pw->panner.line_width > 0) {
+ values.line_width = pw->panner.line_width;
+ valuemask |= GCLineWidth;
+ }
+
+ pw->panner.shadow_gc = XtGetGC ((Widget) pw, valuemask, &values);
+}
+
+static void reset_slider_gc (pw) /* used when resources change */
+ PannerWidget pw;
+{
+ XtGCMask valuemask = GCForeground;
+ XGCValues values;
+
+ if (pw->panner.slider_gc) XtReleaseGC ((Widget) pw, pw->panner.slider_gc);
+
+ values.foreground = pw->panner.foreground;
+
+ pw->panner.slider_gc = XtGetGC ((Widget) pw, valuemask, &values);
+}
+
+static void reset_xor_gc (pw) /* used when resources change */
+ PannerWidget pw;
+{
+ if (pw->panner.xor_gc) XtReleaseGC ((Widget) pw, pw->panner.xor_gc);
+
+ if (pw->panner.rubber_band) {
+ XtGCMask valuemask = (GCForeground | GCFunction);
+ XGCValues values;
+ Pixel tmp;
+
+ tmp = ((pw->panner.foreground == pw->core.background_pixel) ?
+ pw->panner.shadow_color : pw->panner.foreground);
+ values.foreground = tmp ^ pw->core.background_pixel;
+ values.function = GXxor;
+ if (pw->panner.line_width > 0) {
+ valuemask |= GCLineWidth;
+ values.line_width = pw->panner.line_width;
+ }
+ pw->panner.xor_gc = XtGetGC ((Widget) pw, valuemask, &values);
+ } else {
+ pw->panner.xor_gc = NULL;
+ }
+}
+
+
+static void check_knob (pw, knob)
+ PannerWidget pw;
+ Boolean knob;
+{
+ Position pad = pw->panner.internal_border * 2;
+ Position maxx = (((Position) pw->core.width) - pad -
+ ((Position) pw->panner.knob_width));
+ Position maxy = (((Position) pw->core.height) - pad -
+ ((Position) pw->panner.knob_height));
+ Position *x = (knob ? &pw->panner.knob_x : &pw->panner.tmp.x);
+ Position *y = (knob ? &pw->panner.knob_y : &pw->panner.tmp.y);
+
+ /*
+ * note that positions are already normalized (i.e. internal_border
+ * has been subtracted out)
+ */
+ if (*x < 0) *x = 0;
+ if (*x > maxx) *x = maxx;
+
+ if (*y < 0) *y = 0;
+ if (*y > maxy) *y = maxy;
+
+ if (knob) {
+ pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) /
+ pw->panner.haspect + 0.5);
+ pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) /
+ pw->panner.vaspect + 0.5);
+ pw->panner.last_x = pw->panner.last_y = PANNER_OUTOFRANGE;
+ }
+}
+
+
+static void move_shadow (pw)
+ PannerWidget pw;
+{
+ if (pw->panner.shadow_thickness > 0) {
+ int lw = pw->panner.shadow_thickness + pw->panner.line_width * 2;
+ int pad = pw->panner.internal_border;
+
+ if ((int)pw->panner.knob_height > lw && (int)pw->panner.knob_width > lw) {
+ XRectangle *r = pw->panner.shadow_rects;
+ r->x = (short) (pw->panner.knob_x + pad + pw->panner.knob_width);
+ r->y = (short) (pw->panner.knob_y + pad + lw);
+ r->width = pw->panner.shadow_thickness;
+ r->height = (unsigned short) (pw->panner.knob_height - lw);
+ r++;
+ r->x = (short) (pw->panner.knob_x + pad + lw);
+ r->y = (short) (pw->panner.knob_y + pad + pw->panner.knob_height);
+ r->width = (unsigned short) (pw->panner.knob_width - lw +
+ pw->panner.shadow_thickness);
+ r->height = pw->panner.shadow_thickness;
+ pw->panner.shadow_valid = TRUE;
+ return;
+ }
+ }
+ pw->panner.shadow_valid = FALSE;
+}
+
+static void scale_knob (pw, location, size) /* set knob size and/or loc */
+ PannerWidget pw;
+ Boolean location, size;
+{
+ if (location) {
+ pw->panner.knob_x = (Position) PANNER_HSCALE (pw, pw->panner.slider_x);
+ pw->panner.knob_y = (Position) PANNER_VSCALE (pw, pw->panner.slider_y);
+ }
+ if (size) {
+ Dimension width, height;
+
+ if (pw->panner.slider_width < 1) {
+ pw->panner.slider_width = pw->panner.canvas_width;
+ }
+ if (pw->panner.slider_height < 1) {
+ pw->panner.slider_height = pw->panner.canvas_height;
+ }
+ width = Min (pw->panner.slider_width, pw->panner.canvas_width);
+ height = Min (pw->panner.slider_height, pw->panner.canvas_height);
+
+ pw->panner.knob_width = (Dimension) PANNER_HSCALE (pw, width);
+ pw->panner.knob_height = (Dimension) PANNER_VSCALE (pw, height);
+ }
+ if (!pw->panner.allow_off) check_knob (pw, TRUE);
+ move_shadow (pw);
+}
+
+static void rescale (pw)
+ PannerWidget pw;
+{
+ int hpad = pw->panner.internal_border * 2;
+ int vpad = hpad;
+
+ if (pw->panner.canvas_width < 1)
+ pw->panner.canvas_width = pw->core.width;
+ if (pw->panner.canvas_height < 1)
+ pw->panner.canvas_height = pw->core.height;
+
+ if ((int)pw->core.width <= hpad) hpad = 0;
+ if ((int)pw->core.height <= vpad) vpad = 0;
+
+ pw->panner.haspect = ((double) pw->core.width - hpad) /
+ (double) pw->panner.canvas_width;
+ pw->panner.vaspect = ((double) pw->core.height - vpad) /
+ (double) pw->panner.canvas_height;
+ scale_knob (pw, TRUE, TRUE);
+}
+
+
+static void get_default_size (pw, wp, hp)
+ PannerWidget pw;
+ Dimension *wp, *hp;
+{
+ Dimension pad = pw->panner.internal_border * 2;
+ *wp = PANNER_DSCALE (pw, pw->panner.canvas_width) + pad;
+ *hp = PANNER_DSCALE (pw, pw->panner.canvas_height) + pad;
+}
+
+static Boolean get_event_xy (pw, event, x, y)
+ PannerWidget pw;
+ XEvent *event;
+ int *x, *y;
+{
+ int pad = pw->panner.internal_border;
+
+ switch (event->type) {
+ case ButtonPress:
+ case ButtonRelease:
+ *x = event->xbutton.x - pad;
+ *y = event->xbutton.y - pad;
+ return TRUE;
+
+ case KeyPress:
+ case KeyRelease:
+ *x = event->xkey.x - pad;
+ *y = event->xkey.y - pad;
+ return TRUE;
+
+ case EnterNotify:
+ case LeaveNotify:
+ *x = event->xcrossing.x - pad;
+ *y = event->xcrossing.y - pad;
+ return TRUE;
+
+ case MotionNotify:
+ *x = event->xmotion.x - pad;
+ *y = event->xmotion.y - pad;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static int parse_page_string (s, pagesize, canvassize, relative)
+ char *s;
+ int pagesize, canvassize;
+ Boolean *relative;
+{
+ char *cp;
+ double val = 1.0;
+ Boolean rel = FALSE;
+
+ /*
+ * syntax: spaces [+-] number spaces [pc\0] spaces
+ */
+
+ for (; isascii(*s) && isspace(*s); s++) ; /* skip white space */
+
+ if (*s == '+' || *s == '-') { /* deal with signs */
+ rel = TRUE;
+ if (*s == '-') val = -1.0;
+ s++;
+ }
+ if (!*s) { /* if null then return nothing */
+ *relative = TRUE;
+ return 0;
+ }
+
+ /* skip over numbers */
+ for (cp = s; isascii(*s) && (isdigit(*s) || *s == '.'); s++) ;
+ val *= atof(cp);
+
+ /* skip blanks */
+ for (; isascii(*s) && isspace(*s); s++) ;
+
+ if (*s) { /* if units */
+ switch (s[0]) {
+ case 'p': case 'P':
+ val *= (double) pagesize;
+ break;
+
+ case 'c': case 'C':
+ val *= (double) canvassize;
+ break;
+ }
+ }
+ *relative = rel;
+ return ((int) val);
+}
+
+
+#define DRAW_TMP(pw) \
+{ \
+ XDrawRectangle (XtDisplay(pw), XtWindow(pw), \
+ pw->panner.xor_gc, \
+ (int) (pw->panner.tmp.x + pw->panner.internal_border), \
+ (int) (pw->panner.tmp.y + pw->panner.internal_border), \
+ (unsigned int) (pw->panner.knob_width - 1), \
+ (unsigned int) (pw->panner.knob_height - 1)); \
+ pw->panner.tmp.showing = !pw->panner.tmp.showing; \
+}
+
+#define UNDRAW_TMP(pw) \
+{ \
+ if (pw->panner.tmp.showing) DRAW_TMP(pw); \
+}
+
+#define BACKGROUND_STIPPLE(pw) \
+ XmuLocatePixmapFile (pw->core.screen, pw->panner.stipple_name, \
+ pw->panner.shadow_color, pw->core.background_pixel, \
+ pw->core.depth, NULL, 0, NULL, NULL, NULL, NULL)
+
+#define PIXMAP_OKAY(pm) ((pm) != None && (pm) != XtUnspecifiedPixmap)
+
+
+/*****************************************************************************
+ * *
+ * panner class methods *
+ * *
+ *****************************************************************************/
+
+
+/*ARGSUSED*/
+static void Initialize (greq, gnew, args, num_args)
+ Widget greq, gnew;
+ ArgList args;
+ Cardinal *num_args;
+{
+ PannerWidget req = (PannerWidget) greq, new = (PannerWidget) gnew;
+ Dimension defwidth, defheight;
+
+ UNUSED(args);
+ UNUSED(num_args);
+
+ if (req->panner.canvas_width < 1) new->panner.canvas_width = 1;
+ if (req->panner.canvas_height < 1) new->panner.canvas_height = 1;
+ if (req->panner.default_scale < 1)
+ new->panner.default_scale = PANNER_DEFAULT_SCALE;
+
+ get_default_size (req, &defwidth, &defheight);
+ if (req->core.width < 1) new->core.width = defwidth;
+ if (req->core.height < 1) new->core.height = defheight;
+
+ new->panner.shadow_gc = NULL;
+ reset_shadow_gc (new); /* shadowColor */
+ new->panner.slider_gc = NULL;
+ reset_slider_gc (new); /* foreground */
+ new->panner.xor_gc = NULL;
+ reset_xor_gc (new); /* foreground ^ background */
+
+ rescale (new); /* does a position check */
+ new->panner.shadow_valid = FALSE;
+ new->panner.tmp.doing = FALSE;
+ new->panner.tmp.showing = FALSE;
+}
+
+
+static void PannerRealize (gw, valuemaskp, attr)
+ Widget gw;
+ XtValueMask *valuemaskp;
+ XSetWindowAttributes *attr;
+{
+ PannerWidget pw = (PannerWidget) gw;
+ Pixmap pm = XtUnspecifiedPixmap;
+ Boolean gotpm = FALSE;
+
+ if (pw->core.background_pixmap == XtUnspecifiedPixmap) {
+ if (pw->panner.stipple_name) pm = BACKGROUND_STIPPLE (pw);
+
+ if (PIXMAP_OKAY(pm)) {
+ attr->background_pixmap = pm;
+ *valuemaskp |= CWBackPixmap;
+ *valuemaskp &= ~CWBackPixel;
+ gotpm = TRUE;
+ }
+ }
+ (*pannerWidgetClass->core_class.superclass->core_class.realize)
+ (gw, valuemaskp, attr);
+
+ if (gotpm) XFreePixmap (XtDisplay(gw), pm);
+}
+
+
+static void Destroy (gw)
+ Widget gw;
+{
+ PannerWidget pw = (PannerWidget) gw;
+
+ XtReleaseGC (gw, pw->panner.shadow_gc);
+ XtReleaseGC (gw, pw->panner.slider_gc);
+ XtReleaseGC (gw, pw->panner.xor_gc);
+}
+
+
+static void Resize (gw)
+ Widget gw;
+{
+ rescale ((PannerWidget) gw);
+}
+
+
+/* ARGSUSED */
+static void Redisplay (Widget gw, XEvent *event, Region region)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ Display *dpy = XtDisplay(gw);
+ Window w = XtWindow(gw);
+ int pad = pw->panner.internal_border;
+ Dimension lw = pw->panner.line_width;
+ Dimension extra = pw->panner.shadow_thickness + lw * 2;
+ int kx = pw->panner.knob_x + pad, ky = pw->panner.knob_y + pad;
+
+ UNUSED(event);
+ UNUSED(region);
+
+ pw->panner.tmp.showing = FALSE;
+ XClearArea (XtDisplay(pw), XtWindow(pw),
+ (int) pw->panner.last_x - ((int) lw) + pad,
+ (int) pw->panner.last_y - ((int) lw) + pad,
+ (unsigned int) (pw->panner.knob_width + extra),
+ (unsigned int) (pw->panner.knob_height + extra),
+ False);
+ pw->panner.last_x = pw->panner.knob_x;
+ pw->panner.last_y = pw->panner.knob_y;
+
+ XFillRectangle (dpy, w, pw->panner.slider_gc, kx, ky,
+ pw->panner.knob_width - 1, pw->panner.knob_height - 1);
+
+ if (lw)
+ {
+ XDrawRectangle (dpy, w, pw->panner.shadow_gc, kx, ky,
+ (unsigned int) (pw->panner.knob_width - 1),
+ (unsigned int) (pw->panner.knob_height - 1));
+ }
+
+ if (pw->panner.shadow_valid) {
+ XFillRectangles (dpy, w, pw->panner.shadow_gc,
+ pw->panner.shadow_rects, 2);
+ }
+ if (pw->panner.tmp.doing && pw->panner.rubber_band) DRAW_TMP (pw);
+}
+
+
+/* ARGSUSED */
+static Boolean PannerSetValues (Widget gcur, Widget greq, Widget gnew, ArgList args, Cardinal *num_args)
+{
+ PannerWidget cur = (PannerWidget) gcur;
+ PannerWidget new = (PannerWidget) gnew;
+ Boolean redisplay = FALSE;
+
+ UNUSED(greq);
+ UNUSED(args);
+ UNUSED(num_args);
+
+ if (cur->panner.foreground != new->panner.foreground) {
+ reset_slider_gc (new);
+ if (cur->panner.foreground != cur->core.background_pixel)
+ reset_xor_gc (new);
+ redisplay = TRUE;
+ } else if (cur->panner.line_width != new->panner.line_width ||
+ cur->core.background_pixel != new->core.background_pixel) {
+ reset_xor_gc (new);
+ redisplay = TRUE;
+ }
+ if (cur->panner.shadow_color != new->panner.shadow_color) {
+ reset_shadow_gc (new);
+ if (cur->panner.foreground == cur->core.background_pixel)
+ reset_xor_gc (new);
+ redisplay = TRUE;
+ }
+ if (cur->panner.shadow_thickness != new->panner.shadow_thickness) {
+ move_shadow (new);
+ redisplay = TRUE;
+ }
+ if (cur->panner.rubber_band != new->panner.rubber_band) {
+ reset_xor_gc (new);
+ if (new->panner.tmp.doing) redisplay = TRUE;
+ }
+
+ if ((cur->panner.stipple_name != new->panner.stipple_name ||
+ cur->panner.shadow_color != new->panner.shadow_color ||
+ cur->core.background_pixel != new->core.background_pixel) &&
+ XtIsRealized(gnew)) {
+ Pixmap pm = (new->panner.stipple_name ? BACKGROUND_STIPPLE (new)
+ : XtUnspecifiedPixmap);
+
+ if (PIXMAP_OKAY(pm)) {
+ XSetWindowBackgroundPixmap (XtDisplay (new), XtWindow(new), pm);
+ XFreePixmap (XtDisplay (new), pm);
+ } else {
+ XSetWindowBackground (XtDisplay (new), XtWindow(new),
+ new->core.background_pixel);
+ }
+ redisplay = TRUE;
+ }
+
+ if (new->panner.resize_to_pref &&
+ (cur->panner.canvas_width != new->panner.canvas_width ||
+ cur->panner.canvas_height != new->panner.canvas_height ||
+ cur->panner.resize_to_pref != new->panner.resize_to_pref)) {
+ get_default_size (new, &new->core.width, &new->core.height);
+ redisplay = TRUE;
+ } else if (cur->panner.canvas_width != new->panner.canvas_width ||
+ cur->panner.canvas_height != new->panner.canvas_height ||
+ cur->panner.internal_border != new->panner.internal_border) {
+ rescale (new); /* does a scale_knob as well */
+ redisplay = TRUE;
+ } else {
+ Boolean loc = (cur->panner.slider_x != new->panner.slider_x ||
+ cur->panner.slider_y != new->panner.slider_y);
+ Boolean siz = (cur->panner.slider_width != new->panner.slider_width ||
+ cur->panner.slider_height != new->panner.slider_height);
+ if (loc || siz ||
+ (cur->panner.allow_off != new->panner.allow_off &&
+ new->panner.allow_off)) {
+ scale_knob (new, loc, siz);
+ redisplay = TRUE;
+ }
+ }
+
+ return redisplay;
+}
+
+static void SetValuesAlmost (gold, gnew, req, reply)
+ Widget gold, gnew;
+ XtWidgetGeometry *req, *reply;
+{
+ if (reply->request_mode == 0) { /* got turned down, so cope */
+ Resize (gnew);
+ }
+ (*pannerWidgetClass->core_class.superclass->core_class.set_values_almost)
+ (gold, gnew, req, reply);
+}
+
+static XtGeometryResult QueryGeometry (gw, intended, pref)
+ Widget gw;
+ XtWidgetGeometry *intended, *pref;
+{
+ PannerWidget pw = (PannerWidget) gw;
+
+ pref->request_mode = (CWWidth | CWHeight);
+ get_default_size (pw, &pref->width, &pref->height);
+
+ if (((intended->request_mode & (CWWidth | CWHeight)) ==
+ (CWWidth | CWHeight)) &&
+ intended->width == pref->width &&
+ intended->height == pref->height)
+ return XtGeometryYes;
+ else if (pref->width == pw->core.width && pref->height == pw->core.height)
+ return XtGeometryNo;
+ else
+ return XtGeometryAlmost;
+}
+
+
+/*****************************************************************************
+ * *
+ * panner action procs *
+ * *
+ *****************************************************************************/
+
+/* ARGSUSED */
+static void ActionStart (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ int x, y;
+
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (!get_event_xy (pw, event, &x, &y)) {
+ panBell(XtDisplay(gw), XtWindow(gw), 0); /* should do error message */
+ return;
+ }
+
+ pw->panner.tmp.doing = TRUE;
+ pw->panner.tmp.startx = pw->panner.knob_x;
+ pw->panner.tmp.starty = pw->panner.knob_y;
+ pw->panner.tmp.dx = (((Position) x) - pw->panner.knob_x);
+ pw->panner.tmp.dy = (((Position) y) - pw->panner.knob_y);
+ pw->panner.tmp.x = pw->panner.knob_x;
+ pw->panner.tmp.y = pw->panner.knob_y;
+ if (pw->panner.rubber_band) DRAW_TMP (pw);
+}
+
+/* ARGSUSED */
+static void ActionStop (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ int x, y;
+
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (get_event_xy (pw, event, &x, &y)) {
+ pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx;
+ pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy;
+ if (!pw->panner.allow_off) check_knob (pw, FALSE);
+ }
+ if (pw->panner.rubber_band) UNDRAW_TMP (pw);
+ pw->panner.tmp.doing = FALSE;
+}
+
+/* ARGSUSED */
+static void ActionAbort (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (!pw->panner.tmp.doing) return;
+
+ if (pw->panner.rubber_band) UNDRAW_TMP (pw);
+
+ if (!pw->panner.rubber_band) { /* restore old position */
+ pw->panner.tmp.x = pw->panner.tmp.startx;
+ pw->panner.tmp.y = pw->panner.tmp.starty;
+ ActionNotify (gw, event, params, num_params);
+ }
+ pw->panner.tmp.doing = FALSE;
+}
+
+
+/* ARGSUSED */
+static void ActionMove (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ int x, y;
+
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (!pw->panner.tmp.doing) return;
+
+ if (!get_event_xy (pw, event, &x, &y)) {
+ panBell(XtDisplay(gw), XtWindow(gw), 0); /* should do error message */
+ return;
+ }
+
+ if (pw->panner.rubber_band) UNDRAW_TMP (pw);
+ pw->panner.tmp.x = ((Position) x) - pw->panner.tmp.dx;
+ pw->panner.tmp.y = ((Position) y) - pw->panner.tmp.dy;
+
+ if (!pw->panner.rubber_band) {
+ ActionNotify (gw, event, params, num_params); /* does a check */
+ } else {
+ if (!pw->panner.allow_off) check_knob (pw, FALSE);
+ DRAW_TMP (pw);
+ }
+}
+
+
+/* ARGSUSED */
+static void ActionPage (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ Cardinal zero = 0;
+ Boolean isin = pw->panner.tmp.doing;
+ int x, y;
+ Boolean relx, rely;
+ int pad = pw->panner.internal_border * 2;
+
+ UNUSED(event);
+ UNUSED(num_params);
+
+ if (*num_params != 2) {
+ panBell (XtDisplay(gw), XtWindow(gw), 0);
+ return;
+ }
+
+ x = parse_page_string (params[0], (int) pw->panner.knob_width,
+ ((int) pw->core.width) - pad, &relx);
+ y = parse_page_string (params[1], (int) pw->panner.knob_height,
+ ((int) pw->core.height) - pad, &rely);
+
+ if (relx) x += pw->panner.knob_x;
+ if (rely) y += pw->panner.knob_y;
+
+ if (isin) { /* if in, then use move */
+ XEvent ev;
+ ev.xbutton.type = ButtonPress;
+ ev.xbutton.x = x;
+ ev.xbutton.y = y;
+ ActionMove (gw, &ev, (String *) NULL, &zero);
+ } else { /* else just do it */
+ pw->panner.tmp.doing = TRUE;
+ pw->panner.tmp.x = x;
+ pw->panner.tmp.y = y;
+ ActionNotify (gw, event, (String *) NULL, &zero);
+ pw->panner.tmp.doing = FALSE;
+ }
+}
+
+
+/* ARGSUSED */
+static void ActionNotify (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (!pw->panner.tmp.doing) return;
+
+ if (!pw->panner.allow_off) check_knob (pw, FALSE);
+ pw->panner.knob_x = pw->panner.tmp.x;
+ pw->panner.knob_y = pw->panner.tmp.y;
+ move_shadow (pw);
+
+ pw->panner.slider_x = (Position) (((double) pw->panner.knob_x) /
+ pw->panner.haspect + 0.5);
+ pw->panner.slider_y = (Position) (((double) pw->panner.knob_y) /
+ pw->panner.vaspect + 0.5);
+ if (!pw->panner.allow_off) {
+ Position tmp;
+
+ if (pw->panner.slider_x >
+ (tmp = (((Position) pw->panner.canvas_width) -
+ ((Position) pw->panner.slider_width))))
+ pw->panner.slider_x = tmp;
+ if (pw->panner.slider_x < 0) pw->panner.slider_x = 0;
+ if (pw->panner.slider_y >
+ (tmp = (((Position) pw->panner.canvas_height) -
+ ((Position) pw->panner.slider_height))))
+ pw->panner.slider_y = tmp;
+ if (pw->panner.slider_y < 0) pw->panner.slider_y = 0;
+ }
+
+ if (pw->panner.last_x != pw->panner.knob_x ||
+ pw->panner.last_y != pw->panner.knob_y) {
+ XawPannerReport rep;
+
+ Redisplay (gw, (XEvent*) NULL, (Region) NULL);
+ rep.changed = (XawPRSliderX | XawPRSliderY);
+ rep.slider_x = pw->panner.slider_x;
+ rep.slider_y = pw->panner.slider_y;
+ rep.slider_width = pw->panner.slider_width;
+ rep.slider_height = pw->panner.slider_height;
+ rep.canvas_width = pw->panner.canvas_width;
+ rep.canvas_height = pw->panner.canvas_height;
+ XtCallCallbackList (gw, pw->panner.report_callbacks, (XtPointer) &rep);
+ }
+}
+
+/* ARGSUSED */
+static void ActionSet (Widget gw, XEvent *event, String *params, Cardinal *num_params)
+{
+ PannerWidget pw = (PannerWidget) gw;
+ Boolean rb;
+
+ UNUSED(event);
+
+ if (*num_params < 2 ||
+ XmuCompareISOLatin1 (params[0], "rubberband") != 0) {
+ panBell (XtDisplay(gw), XtWindow(gw), 0);
+ return;
+ }
+
+ if (XmuCompareISOLatin1 (params[1], "on") == 0) {
+ rb = TRUE;
+ } else if (XmuCompareISOLatin1 (params[1], "off") == 0) {
+ rb = FALSE;
+ } else if (XmuCompareISOLatin1 (params[1], "toggle") == 0) {
+ rb = !pw->panner.rubber_band;
+ } else {
+ panBell (XtDisplay(gw), XtWindow(gw), 0);
+ return;
+ }
+
+ if (rb != pw->panner.rubber_band) {
+ Arg args[1];
+ XtSetArg (args[0], XtNrubberBand, rb);
+ XtSetValues (gw, args, (Cardinal) 1);
+ }
+}
+
+#endif /* MOTIF && USE_PANNER */
diff --git a/Build/source/texk/xdvik/gui/Panner.h b/Build/source/texk/xdvik/gui/Panner.h
new file mode 100644
index 00000000000..7ced64ebcad
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/Panner.h
@@ -0,0 +1,108 @@
+/*
+ * $XConsortium: Panner.h,v 1.22 94/04/17 20:12:32 rws Exp $
+ *
+Copyright (c) 1989 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ */
+
+#ifndef _XawPanner_h
+#define _XawPanner_H
+
+#include <X11/Xaw/Reports.h>
+
+/*****************************************************************************
+ *
+ * Panner Widget (subclass of Simple)
+ *
+ * This widget is used to represent navigation in a 2d coordinate system.
+ *
+ * Parameters:
+ *
+ * Name Class Type Default
+ * ---- ----- ---- -------
+ *
+ * allowOff AllowOff Boolean FALSE
+ * background Background Pixel XtDefaultBackground
+ * backgroundStipple BackgroundStipple String NULL
+ * canvasWidth CanvasWidth Dimension 0
+ * canvasHeight CanvasHeight Dimension 0
+ * defaultScale DefaultScale Dimension 8 percent
+ * foreground Foreground Pixel XtDefaultBackground
+ * internalSpace InternalSpace Dimension 4
+ * lineWidth LineWidth Dimension 0
+ * reportCallback ReportCallback XtCallbackList NULL
+ * resize Resize Boolean TRUE
+ * rubberBand RubberBand Boolean FALSE
+ * shadowColor ShadowColor Pixel XtDefaultForeground
+ * shadowThickness ShadowThickness Dimension 2
+ * sliderX SliderX Position 0
+ * sliderY SliderY Position 0
+ * sliderWidth SliderWidth Dimension 0
+ * sliderHeight SliderHeight Dimension 0
+ *
+ *****************************************************************************/
+
+ /* new instance and class names */
+#ifndef _XtStringDefs_h_
+#define XtNresize "resize"
+#define XtCResize "Resize"
+#endif
+
+#define XtNallowOff "allowOff"
+#define XtCAllowOff "AllowOff"
+#define XtNbackgroundStipple "backgroundStipple"
+#define XtCBackgroundStipple "BackgroundStipple"
+#define XtNdefaultScale "defaultScale"
+#define XtCDefaultScale "DefaultScale"
+#define XtNcanvasWidth "canvasWidth"
+#define XtCCanvasWidth "CanvasWidth"
+#define XtNcanvasHeight "canvasHeight"
+#define XtCCanvasHeight "CanvasHeight"
+#define XtNinternalSpace "internalSpace"
+#define XtCInternalSpace "InternalSpace"
+#define XtNlineWidth "lineWidth"
+#define XtCLineWidth "LineWidth"
+#define XtNrubberBand "rubberBand"
+#define XtCRubberBand "RubberBand"
+#define XtNshadowThickness "shadowThickness"
+#define XtCShadowThickness "ShadowThickness"
+#define XtNshadowColor "shadowColor"
+#define XtCShadowColor "ShadowColor"
+#define XtNsliderX "sliderX"
+#define XtCSliderX "SliderX"
+#define XtNsliderY "sliderY"
+#define XtCSliderY "SliderY"
+#define XtNsliderWidth "sliderWidth"
+#define XtCSliderWidth "SliderWidth"
+#define XtNsliderHeight "sliderHeight"
+#define XtCSliderHeight "SliderHeight"
+
+ /* external declarations */
+extern WidgetClass pannerWidgetClass;
+
+typedef struct _PannerClassRec *PannerWidgetClass;
+typedef struct _PannerRec *PannerWidget;
+
+#endif /* _XawPanner_h */
diff --git a/Build/source/texk/xdvik/gui/PannerP.h b/Build/source/texk/xdvik/gui/PannerP.h
new file mode 100644
index 00000000000..5c8fbc8cee5
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/PannerP.h
@@ -0,0 +1,104 @@
+/*
+ * $XConsortium: PannerP.h,v 1.19 94/04/17 20:12:33 jim Exp $
+ *
+Copyright (c) 1989 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ */
+
+#ifndef _XawPannerP_h
+#define _XawPannerP_h
+
+#include "Panner.h"
+#include <X11/Xaw/SimpleP.h> /* parent */
+
+typedef struct { /* new fields in widget class */
+ int dummy;
+} PannerClassPart;
+
+typedef struct _PannerClassRec { /* Panner widget class */
+ CoreClassPart core_class;
+ SimpleClassPart simple_class;
+ PannerClassPart panner_class;
+} PannerClassRec;
+
+typedef struct { /* new fields in widget */
+ /* resources... */
+ XtCallbackList report_callbacks; /* callback/Callback */
+ Boolean allow_off; /* allowOff/AllowOff */
+ Boolean resize_to_pref; /* resizeToPreferred/Boolean */
+ Pixel foreground; /* foreground/Foreground */
+ Pixel shadow_color; /* shadowColor/ShadowColor */
+ Dimension shadow_thickness; /* shadowThickness/ShadowThickness */
+ Dimension default_scale; /* defaultScale/DefaultScale */
+ Dimension line_width; /* lineWidth/LineWidth */
+ Dimension canvas_width; /* canvasWidth/CanvasWidth */
+ Dimension canvas_height; /* canvasHeight/CanvasHeight */
+ Position slider_x; /* sliderX/SliderX */
+ Position slider_y; /* sliderY/SliderY */
+ Dimension slider_width; /* sliderWidth/SliderWidth */
+ Dimension slider_height; /* sliderHeight/SliderHeight */
+ Dimension internal_border; /* internalBorderWidth/BorderWidth */
+ String stipple_name; /* backgroundStipple/BackgroundStipple */
+ /* private data... */
+ GC slider_gc; /* background of slider */
+ GC shadow_gc; /* edge of slider and shadow */
+ GC xor_gc; /* for doing XOR tmp graphics */
+ double haspect, vaspect; /* aspect ratio of core to canvas */
+ Boolean rubber_band; /* true = rubber band, false = move */
+ struct {
+ Boolean doing; /* tmp graphics in progress */
+ Boolean showing; /* true if tmp graphics displayed */
+ Position startx, starty; /* initial position of slider */
+ Position dx, dy; /* offset loc for tmp graphics */
+ Position x, y; /* location for tmp graphics */
+ } tmp;
+ Position knob_x, knob_y; /* real upper left of knob in canvas */
+ Dimension knob_width, knob_height; /* real size of knob in canvas */
+ Boolean shadow_valid; /* true if rects are valid */
+ XRectangle shadow_rects[2]; /* location of shadows */
+ Position last_x, last_y; /* previous location of knob */
+} PannerPart;
+
+typedef struct _PannerRec {
+ CorePart core;
+ SimplePart simple;
+ PannerPart panner;
+} PannerRec;
+
+#define PANNER_HSCALE(pw,val) ((pw)->panner.haspect * ((double) (val)))
+#define PANNER_VSCALE(pw,val) ((pw)->panner.vaspect * ((double) (val)))
+
+#define PANNER_DSCALE(pw,val) (Dimension) \
+ ((((unsigned long) (val)) * (unsigned long) pw->panner.default_scale) / 100L)
+#define PANNER_DEFAULT_SCALE 8 /* percent */
+
+#define PANNER_OUTOFRANGE -30000
+
+/*
+ * external declarations
+ */
+extern PannerClassRec pannerClassRec;
+
+#endif /* _XawPannerP_h */
diff --git a/Build/source/texk/xdvik/gui/Tip.c b/Build/source/texk/xdvik/gui/Tip.c
new file mode 100644
index 00000000000..eb0d29c9c6a
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/Tip.c
@@ -0,0 +1,607 @@
+/*
+ * Copyright (c) 2001-2004 Marcin Dalecki and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "Tip.h"
+#include "xdvi-debug.h"
+#include "util.h"
+
+#ifdef MOTIF /* needed for `make depend' */
+
+#ifndef UNUSED
+#define UNUSED(x) ((void)(x))
+#endif
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <Xm/XmP.h>
+
+#include <Xm/PushB.h>
+#include <X11/ShellP.h>
+
+#define TIP_NUM 1024 /* FIXME: remove this hard-coded value */
+
+typedef struct {
+ int __empty;
+} TipClassPart;
+
+/* Full class record declaration */
+typedef struct _TipClassRec {
+ CoreClassPart core_class;
+ CompositeClassPart composite_class;
+ ShellClassPart shell_class;
+ OverrideShellClassPart override_shell_class;
+ TipClassPart tip_class;
+} TipClassRec;
+
+/* keep information about each widget we are keeping track of */
+struct tip_context {
+ Widget watched; /* the widget we are watching */
+ Window window; /* Window of the object we are monitoring */
+ TipWidget tw; /* pointer back to the tip widget */
+ Position abs_x, abs_y;
+ Boolean active; /* if False, tip is suppressed */
+ char *text; /* text to display */
+ short size; /* its size */
+};
+
+/* New fields for the widget record */
+typedef struct {
+ /* resources */
+ Pixel foreground;
+ XFontSet fontset; /* the font for text in box */
+ int waitPeriod; /* the delay resource - pointer must be
+ * in watched widget this long before
+ * help is popped up - in millisecs
+ */
+ unsigned int cwp; /* after help is popped down - normal
+ * wait period is cancelled for this
+ * period - in millisecs
+ */
+
+ /* private state */
+ struct tip_context twl[TIP_NUM]; /* list of widgets we are liteClue-ing */
+ Cardinal nr_twl; /* number of widgets we have attached */
+ Dimension font_width; /* width of '1' character */
+ Dimension font_height; /* height of font, rows are spaced using this */
+ Dimension font_baseline; /* relative displacement to baseline from top */
+ GC text_GC; /* for drawing text */
+ XtIntervalId tid; /* holds timer id */
+ Widget isup; /* the help popup is up on this widget */
+ Time HelpPopDownTime; /* the time at which help popup
+ was popped down */
+} TipPart;
+
+/*
+ * Full instance record declaration
+ */
+typedef struct _TipRec {
+ CorePart core;
+ CompositePart composite;
+ ShellPart shell;
+ OverrideShellPart override;
+ TipPart tip;
+} TipRec;
+
+#define CheckWidgetClass(routine) \
+ if (XtClass(w) != tipWidgetClass) \
+ wrong_widget(routine)
+
+static void initialize(Widget, Widget, ArgList, Cardinal *);
+static Boolean set_values(Widget, Widget, Widget, ArgList, Cardinal *);
+static void destroy(Widget);
+
+/*
+ * Widget resources: eg to set tip box background: *tipShell.background: yellow.
+ */
+
+#define offset(field) XtOffsetOf(TipRec, field)
+static XtResource resources[] = {
+ {XtNforeground, XtCForeground,
+ XtRPixel, sizeof(Pixel), offset(tip.foreground),
+ XtRString, "black"},
+ {XtNfontSet, XtCFontSet,
+ XtRFontSet, sizeof(XFontSet), offset(tip.fontset),
+ XtRString, "fixed"},
+ {XmNwaitPeriod, XmCWaitPeriod,
+ XtRInt, sizeof(int), offset(tip.waitPeriod),
+ XtRImmediate, (XtPointer)(ptrdiff_t)800},
+ {XmNcancelWaitPeriod, XmCCancelWaitPeriod,
+ XtRInt, sizeof(int), offset(tip.cwp),
+ XtRImmediate, (XtPointer)(ptrdiff_t)250},
+};
+#undef offset
+
+TipClassRec tipClassRec = {
+ {
+ /* superclass */ (WidgetClass) & overrideShellClassRec,
+ /* class_name */ "Tip",
+ /* widget size */ (Cardinal) sizeof(TipRec),
+ /* class_init */ NULL,
+ /* class_part_init */ (XtWidgetClassProc) NULL,
+ /* class_inited */ (XtEnum) FALSE,
+ /* initialize */ (XtInitProc) initialize,
+ /* init_hook */ (XtArgsProc) NULL,
+ /* realize */ XtInheritRealize,
+ /* actions */ (XtActionList) 0,
+ /* num_actions */ (Cardinal) 0,
+ /* resources */ (XtResourceList) resources,
+ /* num_resources */ (Cardinal) XtNumber(resources),
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ TRUE,
+ /* compress_exposur */ (XtEnum) FALSE,
+ /* compress enterleave */ TRUE,
+ /* visibility_interest */ FALSE,
+ /* destroy */ destroy,
+ /* resize */ XtInheritResize,
+ /* expose, */ XtInheritExpose,
+ /* set_values */ (XtSetValuesFunc) set_values,
+ /* set_values_hook */ (XtArgsFunc) NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ (XtArgsProc) NULL,
+ /* accept_focus */ XtInheritAcceptFocus,
+ /* version */ XtVersion,
+ /* callback_private */ (XtPointer) NULL,
+ /* translations */ XtInheritTranslations,
+ /* query_geometry */ XtInheritQueryGeometry,
+ /* display_accelerator */ XtInheritDisplayAccelerator,
+ /* extension */ (XtPointer) 0,
+ },
+ /* composite part */
+ {
+ /* geometry_manager */ XtInheritGeometryManager,
+ /* change_managed */ XtInheritChangeManaged,
+ /* insert_child */ XtInheritInsertChild,
+ /* delete_child */ XtInheritDeleteChild,
+ /* extension */ NULL
+ },
+ /* Shell */
+ {
+ (XtPointer) NULL,
+ },
+ /* Override Shell */
+ {
+ 0,
+ },
+ /* tip */
+ {
+ 0,
+ }
+};
+
+WidgetClass tipWidgetClass = (WidgetClass) & tipClassRec;
+
+/*
+ * The font_information is derived.
+ */
+static void compute_font_info(TipWidget cw)
+{
+ XRectangle ink;
+ XRectangle logical;
+
+ if (!cw->tip.fontset)
+ return;
+ XmbTextExtents(cw->tip.fontset, "1", 1, &ink, &logical);
+
+ cw->tip.font_baseline = -logical.y; /* y offset from top to baseline, don't
+ know why this is returned as
+ negative */
+
+ cw->tip.font_width = logical.width; /* the width and height of the object */
+
+ cw->tip.font_height = logical.height;
+ TRACE_GUI((stderr, "baseline: %d, width: %d, height: %d\n",
+ cw->tip.font_baseline, cw->tip.font_width, cw->tip.font_height));
+}
+
+/*
+ * Creates the various graphic contexts we will need.
+ */
+static void create_GC(TipWidget cw)
+{
+ XtGCMask valuemask;
+ XGCValues myXGCV;
+
+ valuemask = GCForeground | GCBackground | GCFillStyle;
+ myXGCV.foreground = cw->tip.foreground;
+ myXGCV.background = cw->core.background_pixel;
+ myXGCV.fill_style = FillSolid;
+
+ if (cw->tip.text_GC)
+ XtReleaseGC((Widget) cw, cw->tip.text_GC);
+ cw->tip.text_GC = XtGetGC((Widget) cw, valuemask, &myXGCV);
+}
+
+/*
+ * A routine to halt execution and force a core dump for debugging analysis
+ * when a public routine is called with the wrong class of widget.
+ */
+
+static void wrong_widget(char *routine)
+{
+ XDVI_ABORT((stderr, "Wrong class of widget passed to %s", routine));
+}
+
+/*
+ * Global list of shells for tips that are in use.
+ */
+
+static TipWidget *shells = NULL;
+static int nr_shells = 0;
+
+/****************************************************************************
+ * Widget Methods
+ */
+
+static void initialize(Widget treq, Widget tnew, ArgList args,
+ Cardinal * nargs)
+{
+ TipWidget tw = (TipWidget) tnew;
+
+ UNUSED(treq);
+ UNUSED(args);
+ UNUSED(nargs);
+
+ tw->tip.text_GC = NULL;
+ tw->tip.isup = NULL;
+ tw->tip.HelpPopDownTime = 0;
+ tw->tip.tid = (XtIntervalId) 0;
+ tw->tip.nr_twl = 0;
+ compute_font_info(tw);
+ create_GC(tw);
+
+ /* Add to our list of tip shells.
+ */
+ if (!shells)
+ shells = (TipWidget *)XtMalloc(sizeof(TipWidget));
+ else
+ shells = (TipWidget *)XtRealloc((char *)shells,
+ sizeof(TipWidget) * (nr_shells + 1));
+
+ shells[nr_shells++] = tw;
+}
+
+static Boolean set_values(Widget _current, Widget _request, Widget _new,
+ ArgList args, Cardinal * nargs)
+{
+ TipWidget cw_new = (TipWidget) _new;
+ TipWidget cw_cur = (TipWidget) _current;
+
+ UNUSED(_request);
+ UNUSED(args);
+ UNUSED(nargs);
+
+ /* values of cw_new->tip.cwp and
+ cw_new->tip.waitPeriod are accepted without checking */
+
+ if (cw_new->tip.foreground != cw_cur->tip.foreground
+ || cw_new->core.background_pixel !=
+ cw_cur->core.background_pixel) {
+ create_GC(cw_new);
+ }
+ return FALSE;
+}
+
+static void destroy(Widget w)
+{
+ TipWidget tw = (TipWidget) w;
+ int i;
+ Boolean copy = False;
+
+ /* Remove this tip shell from our global list.
+ */
+ for (i = 0; i < nr_shells; ++i) {
+ if (shells[i] == tw) {
+ copy = True;
+ --nr_shells;
+ }
+ if (copy && nr_shells)
+ shells[i] = shells[i + 1];
+ }
+ if (!nr_shells) {
+ XtFree((char *) shells);
+ shells = NULL;
+ }
+}
+
+/****************************************************************************
+ * Event handlers
+ */
+
+/* callback to popup the tip window
+ */
+static void timeout_event(XtPointer client_data, XtIntervalId *id)
+{
+#define HBorderPix 3
+#define VBorderPix 3
+ struct tip_context *obj = (struct tip_context *) client_data;
+ TipWidget tw = obj->tw;
+ Position abs_x, abs_y;
+ int ptr_x, ptr_y;
+
+ XRectangle ink;
+ XRectangle logical;
+ Position w_height, w_width;
+ Widget w;
+
+ UNUSED(id);
+
+ TRACE_GUI((stderr, "timeout called!"));
+
+ if (tw->tip.tid == (XtIntervalId) 0)
+ return; /* timeout was removed but callback happened
+ anyway */
+
+ tw->tip.tid = (XtIntervalId) 0;
+ if (obj->active == False)
+ return;
+
+ w = obj->watched;
+
+ if (!XtIsManaged(w))
+ return;
+
+ { /* perform additional check that pointer is really still over the widget;
+ else, tooltips will sometimes pop up if window had received an Enter
+ event before (for some reason, not all Enters are followed by Leaves).
+ This is especially apparent when running xdvi from a remote display over
+ a slow connection.
+ */
+ Window root, child;
+ int root_x, root_y;
+ unsigned int keys_buttons;
+ if (!XQueryPointer(DISP, RootWindowOfScreen(SCRN), &root, &child,
+ &root_x, &root_y, &ptr_x, &ptr_y, &keys_buttons))
+ return;
+
+ TRACE_GUI((stderr, "Pointerlocate: %d, %d", root_x, root_y));
+
+ XtVaGetValues(w, XtNheight, &w_height, XtNwidth, &w_width, NULL);
+ XtTranslateCoords(w, 0, 0, &abs_x, &abs_y);
+
+ TRACE_GUI((stderr, "Window: %d,%d - %d,%d",
+ abs_x, abs_y, abs_x + w_width, abs_y + w_height));
+
+ if (root_x < abs_x || root_x > abs_x + w_width
+ || root_y < abs_y || root_y > abs_y + w_height) {
+ TRACE_GUI((stderr, "not really over toolbutton - returning!"));
+ return;
+ }
+ }
+
+ /* position just below the pointer
+ * (NOT the widget, in case the widget is large!)
+ */
+ ptr_y += 20;
+ /* abs_x += w_width / 2; */
+ /* abs_y += w_height; */
+
+ XmbTextExtents(tw->tip.fontset, obj->text, obj->size, &ink, &logical);
+
+ XtRealizeWidget((Widget)tw); /* so that setting the size etc. works */
+
+ XtResizeWidget((Widget) tw,
+ 2 * HBorderPix + logical.width,
+ 2 * VBorderPix + tw->tip.font_height,
+ tw->core.border_width);
+ TRACE_GUI((stderr, "Popup size: %d x %d (hborder: %d, vborder: %d)\n",
+ 2 * HBorderPix + logical.width, 2 * VBorderPix + tw->tip.font_height,
+ HBorderPix, VBorderPix));
+ XtMoveWidget((Widget)tw, ptr_x, ptr_y);
+
+ XtPopup((Widget) tw, XtGrabNone);
+ tw->tip.isup = obj->watched;
+
+ XmbDrawImageString(XtDisplay((Widget) tw),
+ XtWindow((Widget) tw),
+ tw->tip.fontset,
+ tw->tip.text_GC,
+ HBorderPix,
+ VBorderPix + tw->tip.font_baseline,
+ obj->text, obj->size);
+}
+
+/*
+ * Pointer enters watched widget, set a timer to popup the help.
+ */
+static void enter(struct tip_context *obj, XEvent * xevent,
+ XtAppContext app)
+{
+ TipWidget tw = obj->tw;
+ XEnterWindowEvent *event = &xevent->xcrossing;
+ int current_waitPeriod;
+
+ /* this doesn't help against the Enter/Leave problem mentioned above,
+ so it's not related to Widget creation ... */
+ if (!XtIsManaged(obj->watched)) {
+ TRACE_GUI((stderr, "%s:%d: Not yet managed!", __FILE__, __LINE__));
+ return;
+ }
+
+ TRACE_GUI((stderr, "%s:%d: Enter!", __FILE__, __LINE__));
+
+ if (obj->active == False)
+ return;
+
+ /* check for two enters in a row - happens when widget is
+ exposed under a pop-up */
+ if (tw->tip.tid != (XtIntervalId) 0)
+ return;
+
+ if (event->mode != NotifyNormal)
+ return;
+
+ /* it seems that this makes the tooltips somewhat unpredictable (they
+ don't show when hovering fast over several buttons, then staying on
+ one button); disabled this for the time being. */
+ /* if ((event->time - tw->tip.HelpPopDownTime) > tw->tip.cwp) */
+ /* current_waitPeriod = tw->tip.waitPeriod; */
+ /* else */
+ /* current_waitPeriod = 0; */
+
+ /* current_waitPeriod = tw->tip.waitPeriod; */
+ current_waitPeriod = resource.tooltips_wait_period;
+ if (current_waitPeriod >= 0) {
+ tw->tip.tid = XtAppAddTimeOut(app, current_waitPeriod, timeout_event,
+ (XtPointer) obj);
+ }
+}
+
+/*
+ * Remove timer if its pending. Then popdown help.
+ */
+static void leave(struct tip_context *obj, XEvent * xevent)
+{
+ TipWidget tw = obj->tw;
+ XEnterWindowEvent *event = &xevent->xcrossing;
+
+ TRACE_GUI((stderr, "%s:%d: Leave!", __FILE__, __LINE__));
+
+ if (tw->tip.tid != (XtIntervalId) 0) {
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: removing timeout %ld\n", __FILE__, __LINE__, tw->tip.tid);
+ XtRemoveTimeOut(tw->tip.tid);
+ tw->tip.tid = (XtIntervalId) 0;
+ }
+
+ if (obj->active == False)
+ return;
+
+ if (tw->tip.isup) {
+ XtPopdown((Widget) tw);
+ tw->tip.isup = NULL;
+ tw->tip.HelpPopDownTime = event->time;
+ }
+}
+
+/****************************************************************************
+ * Public interface implementation.
+ */
+
+void TipAppHandle(XtAppContext app, XEvent *event)
+{
+ int i;
+
+ if (!(event->type == EnterNotify
+ || event->type == MotionNotify
+ || event->type == LeaveNotify
+ || event->type == ButtonPress)) {
+ return;
+ }
+
+ for (i = 0; i < nr_shells; ++i) {
+ unsigned int j;
+
+ for (j = 0; j < shells[i]->tip.nr_twl; ++j) {
+ if (event->xany.window == shells[i]->tip.twl[j].window) {
+ if (event->type == EnterNotify)
+ enter(shells[i]->tip.twl + j, event, app);
+ if (event->xany.type == LeaveNotify
+ || event->xany.type == MotionNotify /* FIXME: this doesn' work? */
+ /* might be useful to popdown tip when mouse is moved */
+ || event->xany.type == ButtonPress) {
+ leave(shells[i]->tip.twl + j, event);
+ }
+ }
+ }
+ }
+}
+
+/*
+ * This has to replace the XtAppMainLoop in the application using
+ * tooltips.
+ */
+void TipAppMainLoop(XtAppContext app)
+{
+ XEvent event;
+
+ for (;;) {
+ XtAppNextEvent(app, &event);
+ TipAppHandle(app, &event);
+ XtDispatchEvent(&event);
+ }
+}
+
+/*
+ * Add a widget to be watched for tooltips.
+ *
+ * This function must be called after the widget has been realized!
+ * Further on please make sure that this function will not be called twice
+ * for one button!
+ *
+ * w - tip widget
+ * watch - the widget to give tips for
+ * text - pointer to tip text
+ */
+void TipAddWidget(Widget w, Widget watch, const String text)
+{
+#define ROUTINE "TipAddWidget"
+ TipWidget tw = (TipWidget) w;
+ int i;
+
+ CheckWidgetClass(ROUTINE); /* make sure we are called with a tip widget */
+
+ /* Make internal resource available via resource.tooltips_wait_period(_bak) and
+ * resource.show_tooltips.
+ */
+ resource.tooltips_wait_period_bak = resource.tooltips_wait_period = ABS(tw->tip.waitPeriod);
+ if (tw->tip.waitPeriod < 0) {
+ resource.show_tooltips = False;
+ }
+ else if (!resource.show_tooltips) {
+ if (resource.tooltips_wait_period == 0)
+ resource.tooltips_wait_period = -1;
+ else
+ resource.tooltips_wait_period = -resource.tooltips_wait_period;
+ }
+
+ for (i = 0; i < nr_shells; ++i)
+ if (shells[i] == tw) {
+ struct tip_context *obj;
+
+ if (tw->tip.nr_twl >= TIP_NUM) {
+ XDVI_FATAL((stderr, "Too many tip widgets, cannot add new tip"));
+ return;
+ }
+ obj = tw->tip.twl + tw->tip.nr_twl;
+ obj->text = XtNewString(text);
+ obj->size = strlen(text);
+ obj->watched = watch;
+ obj->window = XtWindow(watch);
+ obj->active = True;
+ obj->tw = tw;
+ tw->tip.nr_twl++;
+ }
+#undef ROUTINE
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/Tip.h b/Build/source/texk/xdvik/gui/Tip.h
new file mode 100644
index 00000000000..b4cb8a957c0
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/Tip.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2001-2004 Marcin Dalecki and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef TIP_H_
+#define TIP_H_
+
+#ifdef MOTIF
+/* Tooltip widget handling. This has somewhat of a library character,
+ * but we don't want to go into the trouble of making a library for just
+ * one function.
+ */
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+
+/* New resource names
+ */
+#define XmNcancelWaitPeriod "cancelWaitPeriod"
+#define XmNwaitPeriod "waitPeriod"
+
+/* New resource classes
+ */
+#define XmCCancelWaitPeriod "CancelWaitPeriod"
+#define XmCWaitPeriod "WaitPeriod"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+ extern WidgetClass tipWidgetClass;
+ typedef struct _TipClassRec *TipWidgetClass;
+ typedef struct _TipRec *TipWidget;
+
+ extern void TipAddWidget(Widget, Widget, const String);
+ extern void TipAppMainLoop(XtAppContext);
+ extern void TipAppHandle(XtAppContext, XEvent *);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* MOTIF */
+#endif /* TIP_H_ */
diff --git a/Build/source/texk/xdvik/gui/TipP.h b/Build/source/texk/xdvik/gui/TipP.h
new file mode 100644
index 00000000000..5c2f7daea24
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/TipP.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2001-2004 Marcin Dalecki and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef TIPP_h
+#define TIPP_h
+
+#include <X11/ShellP.h>
+
+#include "Tip.h"
+
+/* Doubly Linked List Processing.
+ */
+struct list_thread_str {
+ struct list_thread_str *forw;
+ struct list_thread_str *back;
+};
+typedef struct list_thread_str ListThread;
+
+typedef struct {
+ int __empty;
+} TipClassPart;
+
+/* Full class record declaration.
+ */
+typedef struct _TipClassRec {
+ CoreClassPart core_class;
+ CompositeClassPart composite_class;
+ ShellClassPart shell_class;
+ OverrideShellClassPart override_shell_class;
+ TipClassPart tip_class;
+} TipClassRec;
+
+extern TipClassRec xmTipClassRec;
+
+/* New fields for the widget record.
+ */
+typedef struct {
+ /* resources */
+ Pixel foreground;
+ XFontSet fontset; /* the font for text in box */
+ int waitPeriod; /* the delay resource - pointer must be
+ in watched widget this long before
+ tooltip is displayed - in milliseconds
+ */
+ int cancelWaitPeriod; /* after help is popped-down - normal
+ wait period is cancelled for this
+ period - in milliseconds
+ */
+
+ /* -------- private state --------- */
+ ListThread widget_list; /* list of widgets we are liteClue-ing */
+ Dimension font_width; /* width of '1' character */
+ Dimension font_height; /* height of font, rows are spaced using this */
+ Dimension font_baseline; /* relative displacement to baseline from top */
+ GC text_GC; /* for drawing text */
+ XtIntervalId tid; /* holds timer id */
+ XtIntervalId pid; /* holds pooler id for insensitive widgets */
+ Widget parent;
+ Widget isup; /* the help popup is up on this widget */
+ Time HelpPopDownTime; /* the time at which help popup was popped down */
+} TipPart;
+
+
+/*
+ * Full instance record declaration
+ */
+typedef struct _TipRec {
+ CorePart core;
+ CompositePart composite;
+ ShellPart shell;
+ OverrideShellPart override;
+ TipPart tip;
+} TipRec;
+
+#endif
diff --git a/Build/source/texk/xdvik/gui/help-window.c b/Build/source/texk/xdvik/gui/help-window.c
new file mode 100644
index 00000000000..1f0124d7fe6
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/help-window.c
@@ -0,0 +1,1110 @@
+/*
+ * Copyright (c) 2004-2013 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Help window for xdvik, using the `topics' window framework.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "version.h"
+
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+#if MOTIF
+# include <Xm/Xm.h>
+# include <Xm/Form.h>
+# include <Xm/Frame.h>
+# include <Xm/Text.h>
+# include <Xm/Protocols.h>
+#else /* MOTIF */
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/AsciiText.h>
+#endif /* MOTIF */
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "message-window.h"
+#include "util.h"
+#include "x_util.h"
+#include "string-utils.h"
+#include "topic-window.h"
+#include "help-window.h"
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XdviBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define XdviBell(display, window, percent) XBell(display, percent)
+#endif
+
+/* missing features that will be listed in the help window */
+#if !XDVI_XT_TIMER_HACK
+#define HAVE_MISSING_FEATURES 1
+#endif
+
+#if !HAVE_REGEX_H
+#define HAVE_MISSING_FEATURES 1
+#endif
+
+/*
+ * The number of help topics - must larger or equal to actual number of items,
+ * also keep in sync with elements resource.help_* !!!
+ */
+#define NUM_HELP_TOPICS 16
+
+/*
+ * helper routines
+ */
+
+static Widget
+create_help_text(Widget parent, const char *name, const char *value)
+{
+ Widget text;
+#if MOTIF
+ Arg args[20];
+ int n = 0;
+
+ XtSetArg(args[n], XmNeditable, False); n++;
+ XtSetArg(args[n], XmNcursorPositionVisible, False); n++;
+ XtSetArg(args[n], XmNvalue, value); n++;
+ XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
+ XtSetArg(args[n], XmNwordWrap, True); n++;
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
+ /* XtSetArg(args[n], XmNtopWidget, top_widget); n++; */
+ /* XtSetArg(args[n], XmNtopOffset, 10); n++; */
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
+ XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
+
+ text = XmCreateScrolledText(parent, (char *)name, args, n);
+
+ XtManageChild(text);
+#else /* MOTIF */
+ text = XtVaCreateManagedWidget(name, asciiTextWidgetClass, parent,
+ /* XtNfromVert, top_widget, */
+ /* XtNvertDistance, 10, */
+ XtNstring, value,
+ XtNheight, 400,
+ XtNwidth, 500,
+ /* resizing of pane by user isn't needed */
+ XtNshowGrip, False,
+ XtNscrollVertical, XawtextScrollAlways,
+ XtNscrollHorizontal, XawtextScrollNever,
+ XtNeditType, XawtextRead,
+ XtNleftMargin, 5,
+ NULL);
+ XawTextDisplayCaret(text, False);
+#endif /* MOTIF */
+ return text;
+}
+
+
+static void
+get_title_and_summary(const char *str, int len, char **title, char **summary)
+{
+ char *tmp = xmalloc(len + 1);
+ char *ptr;
+
+ memcpy(tmp, str, len);
+ tmp[len] = '\0';
+
+ if ((ptr = strchr(tmp, '\t')) == NULL) {
+ XDVI_WARNING((stderr, "Help resource label `%s' doesn't contain a tab character - ignoring it.", tmp));
+ *title = tmp;
+ *summary = NULL;
+ }
+ else {
+ *ptr++ = '\0';
+ *title = tmp;
+ *summary = ptr;
+ }
+
+ TRACE_GUI((stderr, "Title, Summary: |%s|%s|", *title, *summary));
+}
+
+static void
+init_item(const char *resource, const char **resource_default,
+ struct topic_info *info, size_t idx, Dimension *width)
+{
+ const char *ptr = NULL;
+ char *widget_text = NULL;
+ Widget help_form;
+ Widget text;
+ struct topic_item *item = &(info->items[idx]);
+ char *translation_str = get_string_va("#override \n"
+ "<Key>q:close-topic-window(%p)\n"
+#ifdef MOTIF
+ "<Key>osfCancel:close-topic-window(%p)\n"
+#else
+ "<Key>Escape:close-topic-window(%p)\n"
+#endif
+ "<Key>Return:close-topic-window(%p)",
+ info, info, info);
+
+ if (resource != NULL) {
+ if ((ptr = strchr(resource, '\n')) == NULL) {
+ XDVI_WARNING((stderr, "Help resource text `%s' doesn't contain a newline character.", resource));
+ ptr = resource;
+ }
+ else
+ ptr++;
+ get_title_and_summary(resource, ptr - resource - 1,
+ &(item->topic), &(item->title));
+ }
+ else { /* resource not set; copy resource_default into malloc()ed widget_text: */
+ size_t size = 0, alloc_len = 0, offset;
+ const size_t alloc_step = 1024;
+ int i;
+
+ for (i = 0; resource_default[i] != NULL; i++) {
+ if (i == 0) { /* special case */
+ get_title_and_summary(resource_default[i], strlen(resource_default[i]) - 1,
+ &(item->topic), &(item->title));
+ }
+ else {
+ offset = size;
+ size += strlen(resource_default[i]);
+ /*
+ * allocate chunks of `alloc_step' to avoid frequent calls to malloc.
+ * `alloc_len' is always 1 more than `size', for the terminating NULL character.
+ */
+ while (size + 1 > alloc_len) {
+ alloc_len += alloc_step;
+ widget_text = xrealloc(widget_text, alloc_len);
+ }
+ memcpy(widget_text + offset, resource_default[i], size - offset);
+ }
+ }
+ /* null-terminate string */
+ widget_text[size] = '\0';
+ }
+
+ help_form = XtVaCreateManagedWidget("help_form",
+#if MOTIF
+ xmFormWidgetClass, info->right_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+#else
+ formWidgetClass, info->right_form,
+ XtNborderWidth, 0,
+ XtNdefaultDistance, 0,
+#endif
+ NULL);
+ item->widget = help_form;
+ if (ptr != NULL) {
+ text = create_help_text(help_form, "help_text", ptr);
+ }
+ else {
+ text = create_help_text(help_form, "help_text", widget_text);
+ free(widget_text);
+ }
+ XtOverrideTranslations(text, XtParseTranslationTable(translation_str));
+ free(translation_str);
+#if !MOTIF
+ {
+ Dimension w;
+ XtVaGetValues(text, XtNwidth, &w, NULL);
+ if (w > *width)
+ *width = w;
+ }
+#else
+ UNUSED(width);
+#endif
+}
+
+static void
+initialize_items(struct topic_info *info)
+{
+ size_t k;
+ Dimension width;
+
+ /*
+ * Define fallbacks: default_xyz is used as fallback text if
+ * X resource xyz isn't specified.
+ *
+ * We use arrays of strings rather than simple strings because of C's
+ * limitations on maximum string length; but since the resource needs to
+ * be a simple `char *', these have to be copied into larger buffers
+ * later on (which is a bit wasteful to space). OTOH, splitting the
+ * strings into smaller pieces would make them hard to deal with as
+ * X resources. They are defined as static so that they are initialized
+ * only once.
+ *
+ * Last elem of each array is NULL for ease of looping through it.
+ *
+ * Advantages of this method vs. putting the help texts into a file:
+ * - couldn't use #ifdef's as easily
+ * - would need to invent our own file format
+ * - file searching is more error-prone (needs to be installed etc.)
+ */
+
+ static const char *default_help_general[] = {
+ "Introduction\tAbout this version of xdvi\n",
+ "This is xdvik, version ",
+ XDVI_TERSE_VERSION_INFO
+ ".\nThe program's homepage is located at:\n",
+ "http://sourceforge.net/projects/xdvi\n",
+ "where you can find updates, report bugs and submit feature requests.\n",
+ "\n",
+ "\n",
+ "Xdvi has many command-line options, too numerous to be listed here;\n",
+ "see the man page for a full description.\n",
+ "\n",
+ "The most important key bindings are listed in the help sections shown\n",
+ "in the left window.\n",
+ "\n",
+ "Note: Unless a key binding also has an uppercase version,\n",
+ "all bindings are case-insensitive.\n\n",
+ "\n",
+ "The major parts of Xdvik are licensed under the X Consortium license.\n",
+ "Parts (encoding.c) are licensed under the GNU General Public License.\n",
+ "Xdvik uses the following libraries:\n",
+ "- The kpathsea library, licensed in part under the GNU General Public\n",
+ " License, in part under the GNU Library General Public License.\n",
+ "- freetype2, licensed under the GNU General Public License.\n",
+ "There is NO WARRANTY of anything.\n",
+ "\n",
+ "Built using these configure options:\n",
+#if MOTIF
+ "- Motif toolkit (",
+ XmVERSION_STRING,
+ ")\n",
+#else
+ "- Athena toolkit\n",
+#endif
+#ifdef A4
+ "- paper: a4, units cm\n",
+#else
+ "- paper: letter, units inches\n",
+#endif
+#ifdef GREY
+ "- anti-aliasing (grey) enabled\n",
+#endif
+#if FREETYPE
+ "- freetype2 (direct rendering of PS fonts) enabled\n",
+#endif
+#if HAVE_ICONV_H
+ "- Iconv support compiled in\n",
+#if USE_LANGINFO
+ "- Langinfo support compiled in\n",
+#else
+ "- Langinfo support not compiled in\n",
+#endif
+#else
+ "- Iconv/langinfo support not compiled in\n",
+#endif
+#ifdef TEXXET
+ "- left-to-right typesetting (TeXXeT) support enabled\n",
+#endif
+#ifdef USE_GF
+ "- gf file support enabled\n",
+#endif
+#if HAVE_MISSING_FEATURES
+ "\n",
+ "Features not available on this platform:\n",
+#if !XDVI_XT_TIMER_HACK
+ "- Could not redefine XtAppAddTimeOut(); some widgets may\n",
+ " not be updated until the mouse is moved.\n",
+#endif
+#if !HAVE_REGEX_H
+ "- regex.h header not available, regular expression support\n",
+ " in string search is disabled.\n",
+#endif
+#endif /* HAVE_MISSING_FEATURES */
+ NULL
+ };
+
+ static const char *default_help_hypertex[] = {
+ "Hyperlinks\tNavigating links\n",
+ "Whenever the mouse is positioned on a link, the cursor changes\n",
+ "to a `hand' shape and the target of the link is displayed\n",
+ "in the statusline at the bottom of the window.\n",
+ "\n",
+ "The following keybindings are pre-configured:\n",
+ "\n",
+ "Mouse-1\n",
+ " Follow the link at the cursor position.\n",
+ " If the link target is not a DVI file, try to launch\n",
+ " an application to view the file.\n",
+ "Mouse-2\n",
+ " Open a new xdvi window displaying the link\n",
+ " at the cursor position if the link is a DVI file;\n",
+ " else, try to launch an application to view the file.\n",
+ "B\n",
+ " Go back to the previous hyperlink in the history.\n",
+ "F\n",
+ " Go forward to the next hyperlink in the history.\n",
+ "\n",
+ "By default, the hyperlinks are displayed in the colors \n",
+ "`linkColor' and `visitedLinkColor' (for visited links) and \n",
+ "underlined in the same colors. This can be customized \n",
+ "by setting the resource or command-line option `linkstyle' \n",
+ "to a value between 0 and 3, which have the following meaning:\n",
+ " 0: no highlighting of links,\n",
+ " 1: underline links,\n",
+ " 2: color links,\n",
+ " 3: color and underline links.\n\n",
+ NULL
+ };
+
+ static const char *default_help_othercommands[] = {
+ "Other Commands\tMiscellaneous other commands\n",
+ "Ctrl-f",
+#if MOTIF
+ ", toolbar button 12\n",
+#else
+ "\n",
+#endif
+ " Opens a dialog window to search for a text string\n",
+ " in the DVI file.\n",
+ "\n",
+ "Ctrl-g\n",
+ " Search for the next string match.\n",
+ "\n",
+ "Ctrl-l\n",
+ " Toggles fullscreen mode (which may not work with your\n",
+ " window manager/desktop).\n",
+ "\n",
+ "Ctrl-o",
+#if MOTIF
+ ", toolbar button 1\n",
+#else
+ "\n",
+#endif
+ " Opens a popup window to select another DVI file.\n",
+ " With a prefix argument `n', the `n'th file from the file history\n",
+ " is opened instead.\n",
+ "\n",
+ "Ctrl-p",
+#if MOTIF
+ ", toolbar button 11\n",
+#else
+ "\n",
+#endif
+ " Opens a popup window for printing the DVI file, or parts of it.\n",
+ "\n",
+ "Ctrl-r or Clear\n",
+ " Redisplays the current page.\n",
+ "\n",
+ "Ctrl-s\n",
+ " Opens a popup window for saving the DVI file, or parts of it.\n",
+ "\n",
+ "G\n",
+ " Toggles the use of greyscale anti-aliasing for\n",
+ " displaying shrunken bitmaps. In addition, the key\n",
+ " sequences `0G' and `1G' clear and set this flag,\n",
+ " respectively. See also the -nogrey option.\n",
+ "\n",
+ "k\n",
+ " Normally when xdvi switches pages, it moves to the home\n",
+ " position as well. The `k' keystroke toggles a `keep-\n",
+ " position' flag which, when set, will keep the same\n",
+ " position when moving between pages. Also `0k' and `1k'\n",
+ " clear and set this flag, respectively. See also the\n",
+ " -keep option.\n",
+ "\n",
+ "M\n",
+ " Sets the margins so that the point currently under the\n",
+ " cursor is the upper left-hand corner of the text in the\n",
+ " page. Note that this command itself does not move the\n",
+ " image at all. For details on how the margins are used,\n",
+ " see the -margins option.\n",
+ "\n",
+ "P\n",
+ " ``This is page number n.'' This can be used to make\n",
+ " the `g' keystroke refer to a different page number.\n",
+ " (See also `Options->Use TeX Page Numbers' and the\n",
+ " `T' keystroke).\n",
+ "\n",
+ "R",
+#if MOTIF
+ ", toolbar button 2\n",
+#else
+ "\n",
+#endif
+ " Forces the DVI file to be reread.\n",
+ "\n",
+ "s\n",
+ " Changes the shrink factor to the given number.\n",
+ " If no number is given, the smallest factor that makes the\n",
+ " entire page fit in the window will be used. (Margins\n",
+ " are ignored in this computation.)\n",
+ "\n",
+ "S\n",
+ " Sets the density factor to be used when shrinking\n",
+ " bitmaps. This should be a number between 0 and 100;\n",
+ " higher numbers produce lighter characters.\n",
+ "\n",
+ "t\n",
+ " Switches to the next unit in a sorted list of TeX dimension\n",
+ " units for the popup magnifier ruler and `Ruler mode' (see the\n",
+ " section `Modes').\n"
+ "\n",
+ "V\n",
+ " Toggles Ghostscript anti-aliasing. Also `0V' and `1V' clear\n",
+ " and enables this mode, respectively. See also the the\n",
+ " -gsalpha option.\n",
+ "\n",
+ "\n",
+ "v\n",
+ " Toggles between several modes of displaying postscript specials:\n",
+ " Display specials, display specials with their bounding box\n",
+ " (if available), and display bounding boxes only (if available).\n",
+ " The prefix arguments 1, 2 and 0 also allow you to select one of\n"
+ " these states directly.\n",
+ "\n",
+ "x\n",
+ " Toggles expert mode (in which ",
+#if MOTIF
+ "the menu bar, the toolbar\n",
+#else
+ "the menu buttons,\n",
+#endif
+ " the page list and the statusline do not appear).\n",
+ " `1x' toggles the display of the statusline at the bottom of the window.\n",
+ " `2x' toggles the scrollbars,\n",
+#if MOTIF
+ " `3x' toggles the page list,\n",
+ " `4x' toggles the toolbar,\n",
+ " `5x' toggles the menu bar.\n",
+#else
+ " `3x' toggles the page list and menu buttons.\n",
+#endif
+ "\n",
+ "Ctrl-+",
+#if MOTIF
+ ", toolbar button 9\n",
+#else
+ "\n",
+#endif
+ " Makes the display of the page larger (zooms in).\n",
+ "\n",
+ "Ctrl--",
+#if MOTIF
+ ", toolbar button 10\n",
+#else
+ "\n",
+#endif
+ " Makes the display of the page smaller (zooms out).\n",
+ "\n",
+ "Alt-Ctrl-+",
+#if MOTIF
+ ", toolbar button 17\n",
+#else
+ "\n",
+#endif
+ " Makes the fonts darker (by adding to the gamma value).\n",
+ "\n",
+ "Alt-Ctrl--",
+#if MOTIF
+ ", toolbar button 18\n",
+#else
+ "\n",
+#endif
+ " Makes the fonts lighter (by subtracting from the gamma\n",
+ " value).\n",
+ "\n",
+ NULL
+ };
+
+ static const char *default_help_marking[] = {
+ "Printing and Saving\tMarking, printing and saving pages\n",
+ "The `Save' and `Print' dialogs allow you to save or print all,\n",
+ "pages, a range of pages, or all marked pages from a DVI file.\n",
+ "\n",
+ "Note that the page numbers for the `From ... to ...' range\n",
+ "refer to physical pages, not TeX pages (compare the option\n",
+ "`Use TeX Page Numbers' and the `T' keystroke).\n",
+ "\n",
+ "To mark a page or a range of pages, use one of the folllowing\n",
+ "methods:\n",
+ "- Click on the page in the page list with Mouse Button 2 to mark\n",
+ " a single page, or drag the mouse while holding down Button 2\n",
+ " to mark a range of pages.\n",
+ "- Use one of the following key combinations:\n",
+ " m: toggle the mark of the current page,\n",
+ " 1m toggle the marks of all odd pages,\n",
+ " 2m toggle the marks of all even pages,\n",
+ " 0m: unmark all pages,\n",
+ " Ctrl-n: toggle mark of current page, then move one page forward,\n",
+ " Ctrl-u: move one page back, then toggle mark of that page.\n",
+#if MOTIF
+ "- Use the toobar buttons 13 to 16 to toggle the marks\n",
+ " of odd pages, toggle the marks of even pages, toggle the mark\n",
+ " of the current page, or unmark all pages, respectively.\n",
+#endif
+ "\n",
+ "If the X resource or command line option `paper' has been used,\n",
+ "its value is inserted into the `Dvips Options' field of the printing\n",
+ "dialog so that the appropriate options can be passed to dvips.\n",
+ "This doesn't happen if the paper size has been specified explicitly\n",
+ "in the DVI file (e.g. by using the LaTeX `geometry' package).\n",
+ "Note that not all of the paper options used by xdvi\n",
+ "may be understood by dvips; dvips will ignore the option\n",
+ "in that case, and will use its default paper setting.\n",
+ NULL
+ };
+
+ static const char *default_help_pagemotion[] = {
+ "Page Motion\tMoving around in the document\n",
+ "\n",
+ "[",
+#if MOTIF
+ ", toolbar button 7\n",
+#else
+ "\n",
+#endif
+ " Moves back one item in the page history. With a prefix\n",
+ " argument n, move back n history items.\n"
+ "\n",
+ "]",
+#if MOTIF
+ ", toolbar button 8\n",
+#else
+ "\n",
+#endif
+ " Moves forward one item in the page history. With a prefix\n",
+ " argument n, move forward n history items.\n"
+ "\n",
+ "Ctr-[\n",
+ " Deletes current item in the page history and move\n",
+ " to the history item before the deleted one. With a prefix\n",
+ " argument n, delete n previous history items.\n",
+ "\n",
+ "Ctr-]\n",
+ " Deletes current item in the page history and move\n",
+ " to the history item after the deleted one. With a prefix\n",
+ " argument n, delete n next history items.\n",
+ "\n",
+ "n or f or Return or LineFeed or PgDn",
+#if MOTIF
+ ", toolbar button 5\n",
+#else
+ "\n",
+#endif
+ " Moves to the next page (or to the nth next page if a\n",
+ " number is given).\n",
+ "\n",
+ "Space key\n",
+ " Moves down or to the next page.",
+ "\n",
+ "p or b or Ctrl-h or BackSpace or PgUp",
+#if MOTIF
+ ", toolbar button 4\n",
+#else
+ "\n",
+#endif
+ " Moves to the previous page (or back n pages).\n",
+ "\n",
+ "Del key\n",
+ " Moves up on the page or to the previous page.",
+ "\n",
+ "Up-arrow\n",
+ " Scrolls page up.\n",
+ "\n",
+ "Down-arrow\n",
+ " Scrolls page down.\n",
+ "u\n",
+ " Moves page up two thirds of a window-full.\n",
+ "\n",
+ "d\n",
+ " Moves page down two thirds of a window-full.\n",
+ "\n",
+ "Left-arrow\n",
+ " Scrolls page left.\n",
+ "\n",
+ "Right-arrow\n",
+ " Scrolls page right.\n",
+ "\n",
+ "l\n",
+ " Moves page left two thirds of a window-full.\n",
+ "\n",
+ "r\n",
+ " Moves page right two thirds of a window-full.\n",
+ "\n",
+ "T\n",
+ " Toggle the use of TeX page numbers instead of physical\n",
+ " pages for the page list and the `g' command.\n",
+ " (See also the `Options -> Use TeX Pages' menu.)\n",
+ "\n",
+ "g\n",
+ " Moves to the page with the given number. Initially,\n",
+ " the first page is assumed to be page number 1, but this\n",
+ " can be changed with the `P' keystroke, described in the\n",
+ " section `Other Commands'. If no page number is given,\n",
+ " it moves to the last page.\n",
+ "\n",
+ "<, Ctrl-Home",
+#if MOTIF
+ ", toolbar button 3\n",
+#else
+ "\n",
+#endif
+ " Moves to first page in the document.\n",
+ "\n",
+ ">, Ctrl-End",
+#if MOTIF
+ ", toolbar button 6\n",
+#else
+ "\n",
+#endif
+ " Moves to last page in the document.\n",
+ "\n",
+ "^\n",
+ " Move to the ``home'' position of the page. This is\n",
+ " normally the upper left-hand corner of the page,\n",
+ " depending on the margins set via the -margins option.\n",
+ "\n",
+ "Home\n",
+ " Move to the ``home'' position of the page (the upper\n",
+ " left-hand corner), or to the top of the page if the `keep'\n",
+ " flag is set.\n",
+ "\n",
+ "End\n",
+ " Move to the end position of the page (the lower\n",
+ " right-hand corner), or to the bottom of the page if the\n",
+ " `keep' flag is set.\n",
+ "\n",
+ "c\n",
+ " Moves the page so that the point currently beneath the\n",
+ " cursor is moved to the middle of the window. It also\n",
+ " warps the cursor to the same place.\n",
+ "\n",
+ NULL
+ };
+
+
+ static const char *default_help_mousebuttons[] = {
+ "Mouse Buttons\tActions bound to the mouse buttons\n",
+ "The mouse buttons can be customized just like the keys;\n",
+ "however the bindings cannot be intermixed (since\n",
+ "a mouse event always requires the cursor location\n",
+ "to be present, which a key event doesn't).\n",
+ "The default bindings are as follows:\n"
+ "\n",
+ "Buttons 1-3\n",
+ " Pops up magnifier windows of different sizes.\n",
+ " When the mouse is over a hyperlink, the link overrides\n",
+ " the magnifier. In that case, Button 1 jumps to the link\n",
+ " in the current xdvi window, Button 2 opens the link target\n",
+ " in a new instance of xdvi.\n",
+ " In `Ruler Mode', Button1 shows/drags the ruler instead;\n",
+ " in `Text Selection Mode', Button1 can be used to select\n",
+ " a rectangular region of text from the DVI file.\n",
+ "\n",
+ "Shift-Button1 to Shift-Button3\n",
+ " Drag the page in each direction (Button 1), vertically\n",
+ " only (Button 2) or horizontally only (Button 3).\n",
+ "\n",
+ "Ctrl-Button1\n",
+ " Invoke a reverse search for the text on the cursor\n",
+ " location (see the section SOURCE SPECIALS for more\n",
+ " information on this).\n",
+ "\n",
+ "The buttons 4 and 5 (wheel up and down for wheel mice)\n",
+ "scroll the page up and down respectively, or jump to the\n",
+ "next/previous page when the mouse is over the page list.",
+ "\n",
+ "In the page list, Button 2 toggles the mark a page (see\n",
+ "section `Marking Pages'); moving the mouse while holding\n",
+ "Button 2 lets you toggle a range of pages.\n",
+ "\n",
+ NULL
+ };
+
+ static const char *default_help_sourcespecials[] = {
+ "Source Specials\tNavigating between the TeX and the DVI file\n",
+ "Some TeX implementations have an option to automatically\n",
+ "include so-called `source specials' into a DVI file. These\n",
+ "contain the line number and the filename of the TeX source\n",
+ "and make it possible to go from a DVI file to the\n",
+ "(roughly) corresponding place in the TeX source and back\n",
+ "(this is also called `reverse search' and `forward search').\n",
+ "\n",
+ "On the TeX side, you need a TeX version that supports the `-src'\n",
+ "option (e.g. teTeX >= 2.0) or a macro package like srcltx.sty\n",
+ "to insert the specials into the DVI file.\n",
+ "\n",
+ "Source special mode can be customized for various editors\n",
+ "by using the command line option \"-editor\" or one of the\n",
+ "environment variables \"XEDITOR\", \"VISUAL\" or \"EDITOR\".\n",
+ "See the xdvi man page on the \"-editor\" option for details\n",
+ "and examples.\n",
+ "\n",
+ "Forward search can be performed by a program (i.e. your editor)\n",
+ "invoking xdvi with the \"-sourceposition\" option like this:\n",
+ "xdvi -sourceposition \"<line> <filename>\" <main file>\n",
+ "If there is already an instance of xdvi running that displays\n",
+ "<main file>, it will try to open the page specified by\n",
+ "<line> and <filename> an highlight this location on the page.\n",
+ "Else, a new instance of xdvi will be started that will try to\n",
+ "do the same.\n",
+ "\n",
+ "The following keybindings are pre-configured:\n",
+ "\n",
+ "Ctrl-Mouse1\n",
+ " [source-special()] Invoke the editor (the value\n",
+ " of the \"editor\" resource ) to display the line in the\n",
+ " TeX file corresponding to special at cursor position.\n",
+ "\n",
+ "Ctrl-v\n",
+ " [show-source-specials()] Show bounding boxes for every\n",
+ " source special on the current page, and print the strings\n",
+ " contained in these specials to stderr. With prefix 1,\n",
+ " show every bounding box on the page (for debugging purposes).\n",
+ "\n",
+ "Ctrl-x\n",
+ " [source-what-special()] Display information about the\n",
+ " source special next to the cursor, similar to\n",
+ " \"source-special()\", but without actually invoking\n",
+ " the editor (for debugging purposes).\n",
+ "\n",
+ NULL
+ };
+
+ static const char *default_help_modes[] = {
+ "Mouse Modes\tMagnifier Mode, Ruler Mode and Text Selection Mode\n",
+ "The keystroke Ctrl-m [switch-mode()] switches between\n",
+ "three different bindings for Mouse-1, which can also be\n",
+ "activated via the Modes menu (in Motif, this is a submenu\n",
+ "of the Options menu). The default mode at startup can be\n",
+ "customized via the X resource `mouseMode' or the command-line\n",
+ "option `-mousemode'. The default startup mode is Magnifier Mode.\n",
+ "\n",
+ "Note: The modes are activated by changing the magnifier()\n",
+ "action. Switching the mode will not work if Mouse-1 has\n",
+ "been customized to an action sequence that does not contain\n",
+ "the magnifier() action.\n",
+ "\n",
+ "Magnifier Mode\n",
+ "\n",
+ " In this mode, the mouse buttons 1 to 5 will pop up a\n",
+ " ``magnifying glass'' that shows an unshrunken image of\n",
+ " the page (i.e. an image at the resolution determined by\n",
+ " the option/X resource pixels or mfmode) at varying sizes.\n",
+ " When the magnifier is moved, small ruler-like tick marks\n",
+ " are displayed at the edges of the magnifier (unless\n",
+ " the X resource delayRulers is set to false, in which case\n",
+ " the tick marks are always displayed).\n",
+ "\n",
+ " The unit of the marks is determined by the X resource\n",
+ " `tickUnits' (mm by default). This unit can be changed at\n",
+ " runtime via the action `switch-magnifier-units()', by\n",
+ " default bound to the keystroke `t' (see the description\n",
+ " of that key, and of `switch-magnifier-units()' for more\n",
+ " details on the units available). The length of the tick\n",
+ " marks can be changed via the X resource `tickLength'\n",
+ " (4 by default). A zero or negative value suppresses the\n",
+ " tick marks.\n",
+ "\n",
+ "\n",
+ "Text Selection Mode\n",
+ "\n",
+ " This mode allows you to select a rectangular region of\n",
+ " text in the DVI file by holding down Mouse-1 and moving\n",
+ " the mouse. The text is put into the X primary selection\n",
+ " so that it can be pasted into other X applications with\n",
+ " Mouse-2.\n",
+ "\n",
+ " If xdvi has been compiled with locale, nl_langinfo() and\n",
+ " iconv support, the selected text is converted into the\n",
+ " character set of the current locale (see the output of\n",
+ " `locale -a' for a list of locale settings available on\n",
+ " your system). If nl_langinfo() is not available, but\n",
+ " iconv is, you can specify the input encoding for iconv\n",
+ " via the X resource `textEncoding' (see the output of\n",
+ " `iconv -l' for a list of valid encodings). If iconv support\n",
+ " is not available, only the encodings ISO-8859-1 and UTF-8\n",
+ " are supported (these names are case-insensitive).\n",
+ "\n",
+ " Note that UTF-8 is the only encoding that can render all\n",
+ " characters (e.g. mathematical symbols). If ISO-8859-1 is\n",
+ " active, characters that cannot be displayed are replaced\n",
+ " by `\' followed by the hexadecimal character code. If a\n",
+ " character is not recognized at all, it is replaced by\n",
+ " `?'. For other encodings, such characters may trigger\n",
+ " iconv error messages.\n",
+ "\n",
+ " If you want to extract larger portions of text, you\n",
+ " can also save selected pages or the entire file in\n",
+ " text format from the `File > Save as ...' menu.\n",
+ "\n",
+ "\n",
+ "Ruler Mode\n",
+ "\n",
+ " This mode provides a simple way of measuring distances\n",
+ " on the page. When this mode is activated, the mouse\n",
+ " cursor changes into a thin cross, and a larger, cross-\n",
+ " shaped ruler is drawn in the highlight color at the\n",
+ " mouse location. The ruler doesn't have units attached\n",
+ " to it; instead, the current distance between the ruler\n",
+ " and the mouse cursor is continously printed to the\n",
+ " statusline.\n",
+ "\n",
+ " When activating Ruler Mode, the ruler is at first\n",
+ " attached to the mouse and can be moved around. It can\n",
+ " then be positioned at a fixed place by clicking Mouse-1.\n",
+ " After that, the mouse cursor can be moved to measure the\n",
+ " horizontal (dx), vertical (dy) and direct (shortest)\n",
+ " (dr) distance between the ruler center point and the\n",
+ " mouse.\n",
+ "\n",
+ " Clicking Mouse-1 again will move the ruler to the\n",
+ " current mouse position, and holding down Mouse-1 will\n",
+ " drag the ruler around.\n",
+ "\n",
+ " In Ruler Mode, the following special keybindings extend\n",
+ " or replace the default bindings:\n",
+ "\n",
+ " o [ruler-snap-origin()] Snap the ruler back to\n",
+ " the origin coordinate (0,0).\n",
+ "\n",
+ " t [overrides switch-magnifier-units()] Toggle\n",
+ " between various ruler units, which can be\n",
+ " specified by the X resource tickUnits (`mm'\n",
+ " by default).\n",
+ "\n",
+ " P [overrides declare-page-number()] Print the\n",
+ " distances shown in the statusline to standard\n",
+ " output.\n",
+ NULL
+ };
+
+ static const char *default_help_search[] = {
+ "String Search\tSearching for strings in the DVI file\n",
+ "The keystroke Ctrl-f or the menu entry File->Find ...\n",
+ "opens a dialog window to search for a text string or a\n",
+ "regular expression in the DVI file. The keystroke Ctrl-g\n",
+ "jumps to the next match.\n",
+#ifdef MOTIF
+ "(With Motif, you can also click on the `Binoculars' symbol\n",
+ "in the toolbar.)\n",
+#endif
+ "\n",
+#if HAVE_ICONV_H
+#if USE_LANGINFO
+ "The search term is converted from the character set specified\n",
+ "by the current locale into UTF-8. (See the output of `locale -a'\n",
+ "for a list of locale settings available on your system).\n",
+#else /* USE_LANGINFO */
+ "Since langinfo() support is not available on this platform,\n",
+ "the character set of the search string should be specified\n",
+ "via the X resource/command-line option textEncoding if the\n",
+ "encoding is different from iso_8859-1.\n",
+#endif /* USE_LANGINFO */
+#else /* HAVE_ICONV_H */
+ "Since iconv() support is not available on this platform,\n",
+ "the search term should be a string in the encoding specified\n",
+ "by the X resource/command-line option textEncoding;\n",
+ "currently, only the values iso_8859-1 and utf-8 are suported.\n",
+#endif
+ "Internally, the text in the DVI file is represented in\n",
+ "UTF-8 encoding (you can view the text by saving the DVI\n",
+ "file to a text file in UTF-8 encoding via the `File -> Save As ...'\n",
+ "dialog).\n",
+ "\n",
+ "Ideographic characters from CJKV fonts are treated specially:\n",
+ "All white space (spaces and newlines) before and after such\n",
+ "characters is ignored in the search string and in the DVI file.\n",
+ "\n",
+ "To match a newline character, use `\\n' in the search string;\n",
+ "to match the string `\\n', use `\\\\n'.\n",
+ "\n",
+ "If the checkbox Regular Expression is activated, the\n",
+ "string is teated as a regular expression in extended POSIX\n",
+ "format, with the following properties:\n",
+ "\n",
+ " a? matches a zero or one times\n",
+ "\n",
+ " a* matches a zero or more times\n",
+ "\n",
+ " a+ matches a one or more times. Note that * and + are\n",
+ " greedy, i.e. they match the longest possible\n",
+ " sub string.\n",
+ "\n",
+ " a{n} matches a exactly n times\n",
+ "\n",
+ " a{n,m} matches a at least n and no more than m times\n",
+ "\n",
+ " a|b matches a or b. Brackets can be used for grouping,\n",
+ " e.g.: (a|b)|c.\n",
+ "\n",
+ " The string matched by the nth group can be referenced\n",
+ " by \\n, e.g. \\1 refers to the first match.\n",
+ "\n",
+ " The characters ^ and $ match the beginning and the end\n",
+ " of a line, respectively.\n",
+ "\n",
+ " [abc] matches any of the letters a, b, c, and [a-z]\n",
+ " matches all characters from a to z.\n",
+ "\n",
+ " The patterns . and [...] without an explicit newline\n",
+ " don't match a newline character.\n",
+ "\n",
+ " Each item in a regular expression can also be one of\n",
+ " the following POSIX character classes:\n",
+ " [[:alnum:]] [[:alpha:]] [[:blank:]] [[:cntrl:]] [[:digit:]]\n",
+ " [[:graph:]] [[:lower:]] [[:print:]] [[:space:]] [[:upper:]]\n",
+ "\n",
+ " These can be negated by inserting a ^ symbol after the\n",
+ " first bracket: [^[:alpha:]]\n",
+ "\n",
+ " For more details on POSIX regular expressions, see\n",
+ " e.g. the IEEE Std 1003.1 available online from:\n",
+ "\n",
+ " http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap09.html\n",
+ "\n",
+ " As a non-standard extension, the following Perl-like\n",
+ " abbreviations can be used instead of the POSIX classes:\n",
+ "\n",
+ "\n",
+ " Symbol Meaning POSIX Class\n",
+ "\n",
+ " \\w an alphanumeric character [[:alnum:]]\n",
+ " \\W a non-alphanumeric character [^[:alnum:]]\n",
+ " \\d a digit character [[:digit:]]\n",
+ " \\D a non-digit character [^[:digit:]]\n",
+ " \\s a whitespace character [[:space:]]\n",
+ " \\S a non-whitespace character [^[:space:]]\n",
+ "\n",
+ " The following characters are special symbols; they\n",
+ " need to be escaped with \\ in order to match them\n",
+ " literally: ( ) [ ] . * ? + ^ $ \\.\n",
+ "\n",
+ "The dialog also provides checkboxes to search backwards,\n",
+ "to match in a case-sensitive manner (the default is to\n",
+ "ignore case, i.e. a search string Test will match both\n",
+ "the strings test and TEST in the DVI file) and to ignore\n",
+ "newlines and hyphens in the DVI file.\n",
+ "\n",
+ NULL
+ };
+
+ k = width = 0;
+
+ init_item(resource.help_general, default_help_general, info, k++, &width);
+ init_item(resource.help_pagemotion, default_help_pagemotion, info, k++, &width);
+ init_item(resource.help_othercommands, default_help_othercommands, info, k++, &width);
+ init_item(resource.help_hypertex, default_help_hypertex, info, k++, &width);
+ init_item(resource.help_mousebuttons, default_help_mousebuttons, info, k++, &width);
+ init_item(resource.help_modes, default_help_modes, info, k++, &width);
+ init_item(resource.help_search, default_help_search, info, k++, &width);
+ init_item(resource.help_pagemotion, default_help_marking, info, k++, &width);
+ init_item(resource.help_sourcespecials, default_help_sourcespecials, info, k++, &width);
+
+ ASSERT(k < NUM_HELP_TOPICS, "Too many elements in help topics!");
+
+ /* NULL-terminate items info */
+ info->items[k].widget = 0;
+ info->items[k].topic = info->items[k].title = NULL;
+
+ /* adjust width of topics label to longest text */
+#if !MOTIF
+ XtVaSetValues(info->topic_label, XtNwidth, width, NULL);
+#endif
+}
+
+
+
+/*
+ * Pops up the help window. If topic != NULL, also selects the topic.
+ */
+void
+show_help(Widget toplevel, const char *topic)
+{
+ size_t i;
+ static Widget help_shell = 0;
+ static struct topic_info info;
+ static struct topic_item items[NUM_HELP_TOPICS];
+ static Boolean first_time = True;
+
+ if (help_shell == 0) { /* called 1st time; create widget */
+
+ /* no special callbacks for OK/Cancel buttons */
+ info.ok_callback = NULL;
+ info.cancel_callback = NULL;
+ info.items = items;
+ /* info.items_size = NUM_HELP_TOPICS; */
+
+ help_shell = create_topic_window(toplevel,
+ "xdvik: Help",
+ "help_window",
+ &info,
+ initialize_items,
+ "Close",
+ /* no Cancel button needed */
+ NULL);
+ info.shell = help_shell;
+
+ center_window(help_shell, globals.widgets.top_level);
+ }
+
+#if MOTIF
+ { /* check if resources are set properly */
+ Dimension w, h;
+ XtVaGetValues(help_shell, XtNwidth, &w, XtNheight, &h, NULL);
+ if (h < 200 || w < 400) {
+ XDVI_WARNING((stderr, "Initial help window size too small (%dx%d); overriding size.\n"
+ "Please check/update your application defaults file, and set both of\n"
+ "`XDvi*help_text.rows' and `XDvi*help_text.columns' to a realistic value.",
+ h, w));
+ XtVaSetValues(help_shell, XtNwidth, 620, XtNheight, 520, NULL);
+ }
+ }
+#endif
+ XtPopup(help_shell, XtGrabNone);
+
+ if (topic != NULL) {
+ Boolean matched = False;
+ for (i = 0; info.items[i].topic != NULL; i++) {
+ if (strcmp(info.items[i].topic, topic) == 0) { /* match */
+ select_topic(&info, i);
+ matched = True;
+ }
+ }
+ if (!matched) {
+ XdviBell(DISP, XtWindow(help_shell), 0);
+ popup_message(help_shell,
+ MSG_WARN,
+ NULL,
+ "Shouldn't happen: Could not find topic `%s' in help list!\n"
+ REPORT_XDVI_BUG_TEMPLATE,
+ topic);
+ }
+ }
+ else if (first_time) {
+ first_time = False;
+ select_topic(&info, 0);
+ }
+}
diff --git a/Build/source/texk/xdvik/gui/help-window.h b/Build/source/texk/xdvik/gui/help-window.h
new file mode 100644
index 00000000000..5464756395f
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/help-window.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef HELP_WINDOW_H_
+#define HELP_WINDOW_H_
+
+extern void show_help(Widget parent, const char *topic);
+
+#endif /* HELP_WINDOW_H_ */
diff --git a/Build/source/texk/xdvik/gui/mag.c b/Build/source/texk/xdvik/gui/mag.c
new file mode 100644
index 00000000000..ea494f32519
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/mag.c
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 1990-2004 Paul Vojta and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * NOTE: xdvi is based on prior work, as noted in the modification history in
+ * xdvi.c.
+ *
+ */
+
+/*
+ * Implementation of the magnifier window.
+ */
+
+#include "xdvi-config.h"
+#include <math.h>
+
+/* one of the following should define OPEN_MAX: */
+#include <limits.h>
+#include "c-openmx.h"
+
+#include "xdvi.h"
+
+#ifdef MOTIF
+#include <Xm/Xm.h>
+#endif
+
+#include "events.h"
+#include "dvi-draw.h"
+#include "dvi-init.h"
+#include "statusline.h"
+#include "hypertex.h"
+#include "mag.h"
+#include "xm_toolbar.h"
+#include "xm_menu.h" /* for get_last_ungrab() */
+#include "util.h"
+#include "pagesel.h"
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XdviBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define XdviBell(display, window, percent) XBell(display, percent)
+#endif
+
+/* to measure distance of pointer from ruler in ruler mode */
+static int g_ruler_pos_x = 0, g_ruler_pos_y = 0;
+
+struct WindowRec magnifier = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 };
+
+/*
+ * Mechanism to keep track of the magnifier window. The problems are,
+ *
+ * - if the button is released while the window is being drawn, this could
+ * cause an X error if we continue drawing in it after it is destroyed, and
+ *
+ * - creating and destroying the window too quickly confuses the window
+ * manager, which is avoided by waiting for an expose event before destroying
+ * it.
+ */
+
+short magnifier_stat; /* 1 = wait for expose, -1 = destroy upon expose */
+
+static Position main_x;
+static Position main_y;
+
+static Position mag_x = 0;
+static Position mag_y = 0;
+
+/* Under Motif the following two remain always constant */
+static int mag_conv_x = 0;
+static int mag_conv_y = 0;
+
+static Position new_mag_x = 0;
+static Position new_mag_y = 0;
+
+
+/* default magnifier dimensions */
+static struct mg_size_rec {
+ int w;
+ int h;
+} mg_size[] = {
+ {200, 150}, {400, 250}, {700, 500}, {1000, 800}, {1200, 1200}
+};
+
+size_t get_magglass_items(void) {
+ return XtNumber(mg_size);
+}
+
+int get_magglass_width(int idx) {
+ return mg_size[idx].w;
+}
+
+int get_magglass_height(int idx) {
+ return mg_size[idx].h;
+}
+
+void set_magglass_widht(int idx, int w) {
+ mg_size[idx].w = w;
+}
+
+void set_magglass_height(int idx, int h) {
+ mg_size[idx].h = h;
+}
+
+
+static void
+can_exposures(struct WindowRec *windowrec)
+{
+ windowrec->min_x = windowrec->min_y = MAXDIM;
+ windowrec->max_x = windowrec->max_y = 0;
+}
+
+static void
+mag_motion(XEvent * event)
+{
+ MYTRACE((stderr, "mag_motion!\n"));
+ new_mag_x = event->xmotion.x + mag_conv_x;
+ main_x = event->xmotion.x_root - new_mag_x;
+ new_mag_y = event->xmotion.y + mag_conv_y;
+ main_y = event->xmotion.y_root - new_mag_y;
+
+ if (new_mag_x != mag_x || new_mag_y != mag_y)
+ globals.ev.flags |= EV_MAG_MOVE;
+ else
+ globals.ev.flags &= ~EV_MAG_MOVE;
+}
+
+void
+mag_release(XEvent * event)
+{
+ UNUSED(event);
+ if (magnifier.win != (Window) 0) {
+ if (magnifier_stat) {
+ magnifier_stat = -1; /* destroy upon expose */
+ }
+ else {
+ XDestroyWindow(DISP, magnifier.win);
+ if (drawing_mag) {
+ globals.ev.flags |= EV_MAG_GONE;
+ }
+ magnifier.win = (Window) 0;
+ mouse_motion = mouse_release = null_mouse;
+ globals.ev.flags &= ~EV_MAG_MOVE;
+ globals.cursor.flags &= ~CURSOR_MAG;
+ globals.ev.flags |= EV_CURSOR;
+ can_exposures(&magnifier);
+ /*
+ Workaround for bug #703304:
+ For obscure reasons, XFree 3.3.5 (and apparently also Solaris 8)
+ doesn't generate an expose event after the magnifier has beed
+ destroyed. But only a redraw() event caused by expose would reset
+ currwin.win back to mane.win, which is needed e.g. for getting the
+ hyperlink info updated (otherwise, the mouse will not become active
+ over a hyperlink).
+
+ Forcing a redraw with
+ redraw(&mane);
+ may cause a `BadDrawable' X error with color material (e.g. from #702288),
+ or a `draw_part: shouldn't happen: POST encountered' error. Neither do
+ the following work:
+ globals.ev.flags |= EV_EXPOSE; (doesn't fix the bug)
+ draw_page(); (same effect as redraw(&mane))
+ globals.ev.flags |= EV_NEWPAGE; (works, but is crude and causes flicker)
+
+ So I decided to use expose() for the time being, which
+ sets mane.min_x to the current x point (which doesn't happen
+ with EV_EXPOSE; this causes the test for `mane.min_x < MAXDIM'
+ to fail in events.c; look for `see comment in mag.c').
+ */
+ /* fprintf(stderr, "========triggering expose!\n"); */
+ expose(&mane, event->xbutton.x_root, event->xbutton.y_root, 10, 10);
+ }
+ }
+}
+
+static int
+tick_scale(int k)
+{
+ if (k == 0)
+ return 3;
+ else if ((k % 1000) == 0)
+ return 7;
+ else if ((k % 500) == 0)
+ return 6;
+ else if ((k % 100) == 0)
+ return 5;
+ else if ((k % 50) == 0)
+ return 4;
+ else if ((k % 10) == 0)
+ return 3;
+ else if ((k % 5) == 0)
+ return 2;
+ else
+ return 1;
+}
+
+static void
+draw_ticks(unsigned int width, unsigned int height, GC ourGC)
+{
+ int k; /* tick counter */
+ double old_pixels_per_tick;
+ double pixels_per_tick;
+ int scale;
+ int tick_offset; /* offset along axes */
+ int x; /* coordinates of top-left popup */
+ int y; /* window corner */
+ double xx; /* coordinates of tick */
+ double yy; /* coordinates of tick */
+ static char *last_tick_units = ""; /* memory of last tick units */
+
+ if (resource.tick_length <= 0) /* user doesn't want tick marks */
+ return;
+
+ x = 0; /* the pop-up window always has origin (0,0) */
+ y = 0;
+
+ /* We need to clear the existing window to remove old rulers. I think
+ that this could be avoided if draw_ticks() could be invoked earlier.
+ The expose argument in XClearArea() must be True to force redrawing
+ of the text inside the popup window. Also, it would be better to draw
+ the rulers before painting the text, so that rulers would not
+ overwrite the text, but I haven't figured out yet how to arrange
+ that. */
+
+ XClearArea(DISP, magnifier.win, x, y, width, height, True);
+
+ /* The global resource.pixels_per_inch tells us how to find the ruler
+ scale. For example, 300dpi corresponds to these TeX units:
+
+ 1 TeX point (pt) = 4.151 pixels
+ 1 big point (bp) = 4.167 pixels
+ 1 pica (pc) = 49.813 pixels
+ 1 cicero (cc) = 53.501 pixels
+ 1 didot point (dd) = 4.442 pixels
+ 1 millimeter (mm) = 11.811 pixels
+ 1 centimeter (cm) = 118.110 pixels
+ 1 inch (in) = 300.000 pixels
+ 1 scaled point (sp) = 0.00006334 pixels
+
+ The user can select the units via a resource (e.g. XDvi*tickUnits: bp),
+ or a command-line option (e.g. -xrm '*tickUnits: cm'). The length of
+ the ticks can be controlled by a resource (e.g. XDvi*tickLength: 10), or
+ a command-line option (e.g. -xrm '*tickLength: 10000'). Zero, or negative,
+ tick length completely suppresses rulers. */
+
+ pixels_per_tick = (double)resource.pixels_per_inch;
+ if (strcmp(resource.tick_units, "pt") == 0)
+ pixels_per_tick /= 72.27;
+ else if (strcmp(resource.tick_units, "bp") == 0)
+ pixels_per_tick /= 72.0;
+ else if (strcmp(resource.tick_units, "in") == 0)
+ /* NO-OP */ ;
+ else if (strcmp(resource.tick_units, "cm") == 0)
+ pixels_per_tick /= 2.54;
+ else if (strcmp(resource.tick_units, "mm") == 0)
+ pixels_per_tick /= 25.4;
+ else if (strcmp(resource.tick_units, "dd") == 0)
+ pixels_per_tick *= (1238.0 / 1157.0) / 72.27;
+ else if (strcmp(resource.tick_units, "cc") == 0)
+ pixels_per_tick *= 12.0 * (1238.0 / 1157.0) / 72.27;
+ else if (strcmp(resource.tick_units, "pc") == 0)
+ pixels_per_tick *= 12.0 / 72.27;
+ else if (strcmp(resource.tick_units, "sp") == 0)
+ pixels_per_tick /= (65536.0 * 72.27);
+ else if (strcmp(resource.tick_units, "px") == 0)
+ pixels_per_tick = 10;
+ else {
+ XDVI_WARNING((stderr, "Unrecognized tickUnits [%s]: defaulting to TeX points [pt]",
+ resource.tick_units));
+ resource.tick_units = "pt";
+ pixels_per_tick /= 72.27;
+ }
+
+ /* To permit accurate measurement in the popup window, we can reasonably
+ * place tick marks about 3 to 10 pixels apart, so we scale the computed
+ * pixels_per_tick by a power of ten to bring it into that range.
+ */
+
+ old_pixels_per_tick = pixels_per_tick; /* remember the original scale */
+ while (pixels_per_tick < 3.0)
+ pixels_per_tick *= 10.0;
+ while (pixels_per_tick > 30.0)
+ pixels_per_tick /= 10.0;
+
+ /* tell user what the ruler scale is, but only when it changes */
+ if (strcmp(last_tick_units, resource.tick_units) != 0) {
+ if (old_pixels_per_tick != pixels_per_tick)
+ printf("Ruler tick interval adjusted to represent %.2f%s\n",
+ pixels_per_tick / old_pixels_per_tick, resource.tick_units);
+ else if (globals.debug & DBG_EVENT)
+ printf("Ruler tick interval represents 1%s\n", resource.tick_units);
+ }
+
+ /* In order to make the ruler as accurate as possible, given the coarse
+ * screen resolution, we compute tick positions in floating-point
+ * arithmetic, then round to nearest integer values.
+ */
+
+ /* draw vertical ticks on top and bottom */
+ for (k = 0, xx = 0.0; xx < (double)width; k++, xx += pixels_per_tick) {
+ tick_offset = (int)(0.5 + xx); /* round to nearest pixel */
+ scale = tick_scale(k);
+ XDrawLine(DISP, magnifier.win, ourGC,
+ x + tick_offset, y, x + tick_offset, y + scale * resource.tick_length);
+ XDrawLine(DISP, magnifier.win, ourGC,
+ x + tick_offset, y + height,
+ x + tick_offset, y + height - scale * resource.tick_length);
+ }
+
+ /* draw horizontal ticks on left and right */
+ for (k = 0, yy = 0.0; yy < (double)height; k++, yy += pixels_per_tick) {
+ tick_offset = (int)(0.5 + yy); /* round to nearest pixel */
+ scale = tick_scale(k);
+ XDrawLine(DISP, magnifier.win, ourGC,
+ x, y + tick_offset, x + scale * resource.tick_length, y + tick_offset);
+ XDrawLine(DISP, magnifier.win, ourGC,
+ x + width, y + tick_offset,
+ x + width - scale * resource.tick_length, y + tick_offset);
+ }
+
+ last_tick_units = resource.tick_units;
+
+ XFlush(DISP); /* bring window up-to-date */
+}
+
+static void
+compute_mag_pos(int *xp, int *yp)
+{
+ int t;
+
+ t = mag_x + main_x - magnifier.width / 2;
+ if (t > WidthOfScreen(SCRN) - (int)magnifier.width - 2 * MAGBORD)
+ t = WidthOfScreen(SCRN) - (int)magnifier.width - 2 * MAGBORD;
+ if (t < 0)
+ t = 0;
+ *xp = t;
+ t = mag_y + main_y - magnifier.height / 2;
+ if (t > HeightOfScreen(SCRN) - (int)magnifier.height - 2 * MAGBORD)
+ t = HeightOfScreen(SCRN) - (int)magnifier.height - 2 * MAGBORD;
+ if (t < 0)
+ t = 0;
+ *yp = t;
+}
+
+static void
+scroll_window(struct WindowRec *windowrec, int x0, int y0)
+{
+ int x, y;
+ int x2 = 0, y2 = 0;
+ int ww, hh;
+
+ x = x0 - windowrec->base_x;
+ y = y0 - windowrec->base_y;
+ ww = windowrec->width - x;
+ hh = windowrec->height - y;
+ windowrec->base_x = x0;
+ windowrec->base_y = y0;
+ if (currwin.win == windowrec->win) {
+ currwin.base_x = x0;
+ currwin.base_y = y0;
+ }
+ windowrec->min_x -= x;
+ if (windowrec->min_x < 0)
+ windowrec->min_x = 0;
+ windowrec->max_x -= x;
+ if ((unsigned int)windowrec->max_x > windowrec->width)
+ windowrec->max_x = windowrec->width;
+ windowrec->min_y -= y;
+ if (windowrec->min_y < 0)
+ windowrec->min_y = 0;
+ windowrec->max_y -= y;
+ if ((unsigned int)windowrec->max_y > windowrec->height)
+ windowrec->max_y = windowrec->height;
+ if (x < 0) {
+ x2 = -x;
+ x = 0;
+ ww = windowrec->width - x2;
+ }
+ if (y < 0) {
+ y2 = -y;
+ y = 0;
+ hh = windowrec->height - y2;
+ }
+ if (ww <= 0 || hh <= 0) {
+ XClearWindow(DISP, windowrec->win);
+ windowrec->min_x = windowrec->min_y = 0;
+ windowrec->max_x = windowrec->width;
+ windowrec->max_y = windowrec->height;
+ }
+ else {
+ XCopyArea(DISP, windowrec->win, windowrec->win, globals.gc.copy,
+ x, y, (unsigned int)ww, (unsigned int)hh, x2, y2);
+ if (x > 0)
+ clearexpose(windowrec, ww, 0, (unsigned int)x, windowrec->height);
+ if (x2 > 0)
+ clearexpose(windowrec, 0, 0, (unsigned int)x2, windowrec->height);
+ if (y > 0)
+ clearexpose(windowrec, 0, hh, windowrec->width, (unsigned int)y);
+ if (y2 > 0)
+ clearexpose(windowrec, 0, 0, windowrec->width, (unsigned int)y2);
+ }
+}
+
+static void
+do_movemag(int x, int y)
+{
+ int xx, yy;
+
+ mag_x = x;
+ mag_y = y;
+ if (mag_x == new_mag_x && mag_y == new_mag_y)
+ globals.ev.flags &= ~EV_MAG_MOVE;
+ compute_mag_pos(&xx, &yy);
+ XMoveWindow(DISP, magnifier.win, xx, yy);
+ scroll_window(&magnifier,
+ (x + mane_base_x) * mane.shrinkfactor - (int)magnifier.width / 2,
+ (y + mane_base_y) * mane.shrinkfactor - (int)magnifier.height / 2);
+ draw_ticks(magnifier.width, magnifier.height, globals.gc.ruler);
+}
+
+extern jmp_buf next_env;
+
+void
+show_distance_from_ruler(XEvent *event, Boolean to_stdout)
+{
+ int loc_x, loc_y;
+ int precision = 2;
+ double factor;
+
+ if (event == NULL) /* when option is toggled */
+ return;
+
+ loc_x = event->xbutton.x;
+ loc_y = event->xbutton.y;
+ if (event->xbutton.window != mane.win) {
+ Window ww;
+ (void)XTranslateCoordinates(DISP,
+ RootWindowOfScreen(SCRN), mane.win,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ &loc_x,
+ &loc_y,
+ &ww); /* throw away last argument */
+ }
+
+ /* map everything below 0 to the origin */
+ if (loc_x < 0)
+ loc_x = 0;
+ if (loc_y < 0)
+ loc_y = 0;
+
+ if (strcmp(resource.tick_units, "pt") == 0) {
+ factor = 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "bp") == 0) {
+ factor = 72.0 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "in") == 0) {
+ factor = currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "cm") == 0) {
+ factor = 2.54 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ precision = 3;
+ }
+ else if (strcmp(resource.tick_units, "mm") == 0) {
+ factor = 25.4 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "dd") == 0) {
+ factor = 72.27 / (1238.0 / 1157.0) * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "cc") == 0) {
+ factor = 72.27 / (12.0 * (1238.0 / 1157.0)) * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "pc") == 0) {
+ factor = 72.27 / 12.0 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+ else if (strcmp(resource.tick_units, "sp") == 0) {
+ factor = 65536.0 * 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ precision = 1;
+ }
+ else if (strcmp(resource.tick_units, "px") == 0) { /* pixel units */
+ factor = 1;
+ }
+ else {
+ XDVI_WARNING((stderr, "Unrecognized tickUnits [%s]: defaulting to TeX points [pt]",
+ resource.tick_units));
+ resource.tick_units = "pt";
+ factor = 72.27 * currwin.shrinkfactor / (double)resource.pixels_per_inch;
+ }
+
+ if (mouse_release != null_mouse) {
+ if (to_stdout) {
+ XDVI_INFO((stdout, "Ruler/Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s",
+ loc_x, loc_y,
+ precision, 0.000, resource.tick_units,
+ precision, 0.000, resource.tick_units,
+ precision, 0.000, resource.tick_units));
+ }
+ else {
+ statusline_info(STATUS_FOREVER,
+ "Ruler/Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dt: %.*f %s",
+ loc_x, loc_y,
+ precision, 0.000, resource.tick_units,
+ precision, 0.000, resource.tick_units,
+ precision, 0.000, resource.tick_units);
+ }
+ }
+ else {
+ int d_x = loc_x - g_ruler_pos_x;
+ int d_y = loc_y - g_ruler_pos_y;
+ double d_z = sqrt((double)d_x * d_x + (double)d_y * d_y);
+ double unit_x = (double)d_x * factor;
+ double unit_y = (double)d_y * factor;
+ double unit_z = d_z * factor;
+ if (to_stdout) {
+ XDVI_INFO((stdout, "Ruler: %d,%d, Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s",
+ g_ruler_pos_x, g_ruler_pos_y, loc_x, loc_y,
+ precision, unit_x, resource.tick_units,
+ precision, unit_y, resource.tick_units,
+ precision, unit_z, resource.tick_units));
+ }
+ else {
+ statusline_info(STATUS_FOREVER,
+ "Ruler: %d,%d, Point: %d,%d, dx: %.*f %s, dy: %.*f %s, dr: %.*f %s",
+ g_ruler_pos_x, g_ruler_pos_y, loc_x, loc_y,
+ precision, unit_x, resource.tick_units,
+ precision, unit_y, resource.tick_units,
+ precision, unit_z, resource.tick_units);
+ }
+ }
+}
+
+void
+move_magnifier(void)
+{
+ if (magnifier.win == (Window) 0)
+ globals.ev.flags &= ~EV_MAG_MOVE;
+ else if (abs(new_mag_x - mag_x) > 2 * abs(new_mag_y - mag_y))
+ do_movemag(new_mag_x, mag_y);
+ else if (abs(new_mag_y - mag_y) > 2 * abs(new_mag_x - mag_x))
+ do_movemag(mag_x, new_mag_y);
+ else
+ do_movemag(new_mag_x, new_mag_y);
+}
+
+
+void
+clear_ruler(void)
+{
+ /* maybe we should do this only for mouse-1? */
+ clearexpose(&mane, 0, g_ruler_pos_y,
+ ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, 1);
+ clearexpose(&mane, g_ruler_pos_x, 0,
+ 1, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2);
+}
+
+void
+show_ruler(XEvent *event)
+{
+ if (mouse_release == null_mouse) {
+ if (mouse_release != null_mouse && mouse_release != drag_ruler_release)
+ return;
+ if (mouse_release == null_mouse) {
+ mouse_motion = drag_ruler_motion;
+ mouse_release = drag_ruler_release;
+ }
+ drag_ruler_motion(event);
+ }
+}
+
+static void
+draw_ruler(int x, int y)
+{
+ /* don't draw if outside page region (will be clipped automatically by Motif,
+ but not by Xaw, where draw widget is entire window) */
+ if (x > (int)ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 1
+ || y > (int)ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 1)
+ return;
+
+ XFillRectangle(DISP, mane.win, globals.gc.high,
+ 0, y,
+ ROUNDUP(pageinfo_get_page_width(current_page), currwin.shrinkfactor) + 2, 1);
+ XFillRectangle(DISP, mane.win, globals.gc.high,
+ x, 0,
+ 1, ROUNDUP(pageinfo_get_page_height(current_page), currwin.shrinkfactor) + 2);
+}
+
+
+/* snap ruler back to origing (0,0) */
+void
+ruler_snap_origin(XEvent *event)
+{
+ clear_ruler();
+ g_ruler_pos_x = g_ruler_pos_y = 0;
+ draw_ruler(g_ruler_pos_x, g_ruler_pos_y);
+ /* deactivate mouse dragging */
+ mouse_motion = mouse_release = null_mouse;
+ show_distance_from_ruler(event, False);
+}
+
+void
+redraw_ruler(void)
+{
+ draw_ruler(g_ruler_pos_x, g_ruler_pos_y);
+}
+
+void magnifier_move(String params, XEvent *event)
+{
+ int x, y;
+ XSetWindowAttributes attr;
+#ifndef MOTIF
+ Window throwaway;
+#endif
+ const char *p = params;
+
+ if (*p == '*') {
+ int n = atoi(p + 1) - 1;
+
+ if (n < 0 || n >= (int)get_magglass_items() || get_magglass_width(n) <= 0) {
+ XdviBell(DISP, event->xany.window, 0);
+ return;
+ }
+ magnifier.width = get_magglass_width(n);
+ magnifier.height = get_magglass_height(n);
+ }
+ else {
+ magnifier.width = magnifier.height = atoi(p);
+ p = strchr(p, 'x');
+ if (p != NULL) {
+ magnifier.height = atoi(p + 1);
+ if (magnifier.height == 0)
+ magnifier.width = 0;
+ }
+ if (magnifier.width == 0) {
+ XdviBell(DISP, event->xany.window, 0);
+ return;
+ }
+ }
+#ifndef MOTIF
+ XTranslateCoordinates(DISP, event->xbutton.window, mane.win,
+ 0, 0, &mag_conv_x, &mag_conv_y, &throwaway);
+#endif
+
+ mag_x = event->xbutton.x + mag_conv_x;
+ mag_y = event->xbutton.y + mag_conv_y;
+ main_x = event->xbutton.x_root - mag_x;
+ main_y = event->xbutton.y_root - mag_y;
+ compute_mag_pos(&x, &y);
+ magnifier.base_x = (mag_x + mane_base_x) * mane.shrinkfactor - magnifier.width / 2;
+ magnifier.base_y = (mag_y + mane_base_y) * mane.shrinkfactor - magnifier.height / 2;
+ attr.save_under = True;
+ attr.border_pixel = resource.rule_pixel;
+#if COLOR
+ attr.background_pixel = bg_current->pixel;
+#else
+ attr.background_pixel = resource.back_Pixel;
+#endif
+ attr.override_redirect = True;
+#ifdef GREY
+ attr.colormap = G_colormap;
+#endif
+ magnifier.win = XCreateWindow(DISP, RootWindowOfScreen(SCRN),
+ x, y, magnifier.width, magnifier.height, MAGBORD,
+ G_depth, InputOutput, G_visual,
+ CWSaveUnder | CWBorderPixel | CWBackPixel |
+#ifdef GREY
+ CWColormap |
+#endif
+ CWOverrideRedirect, &attr);
+ XSelectInput(DISP, magnifier.win, ExposureMask);
+ XMapWindow(DISP, magnifier.win);
+
+ /*
+ * This call will draw the point rulers when the magnifier first pops up,
+ * if the XDvi*delayRulers resource is false. Some users may prefer rulers
+ * to remain invisible until the magnifier is moved, so the default is
+ * true. Rulers can be suppressed entirely by setting the XDvi*tickLength
+ * resource to zero or negative.
+ */
+
+ if (!resource.delay_rulers)
+ draw_ticks(magnifier.width, magnifier.height, globals.gc.ruler);
+
+ globals.cursor.flags |= CURSOR_MAG;
+ globals.ev.flags |= EV_CURSOR;
+
+ magnifier_stat = 1; /* waiting for exposure */
+ mouse_motion = mag_motion;
+ mouse_release = mag_release;
+}
+
+void
+drag_ruler_motion(XEvent *event)
+{
+ int loc_x, loc_y;
+ if (event == NULL) { /* toggled via menu */
+ /* hack to avoid redrawing ruler at last g_* positions when mode is
+ toggled on via menu, then off via keystroke */
+ g_ruler_pos_x = g_ruler_pos_y = 0;
+ return;
+ }
+
+ loc_x = event->xbutton.x;
+ loc_y = event->xbutton.y;
+
+ if (event->xbutton.window != mane.win) {
+ Window dummy;
+ (void)XTranslateCoordinates(DISP,
+ RootWindowOfScreen(SCRN), mane.win,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ &loc_x,
+ &loc_y,
+ &dummy);
+ }
+
+ /* map everything below 0 to the origin */
+ if (loc_x < 0)
+ loc_x = 0;
+ if (loc_y < 0)
+ loc_y = 0;
+
+ clear_ruler();
+ draw_ruler(loc_x, loc_y);
+ g_ruler_pos_x = loc_x;
+ g_ruler_pos_y = loc_y;
+}
+
+void
+drag_ruler_release(XEvent *event)
+{
+ UNUSED(event);
+ mouse_motion = mouse_release = null_mouse;
+}
+
+/* XtActionsRec mag_actions[] = { */
+/* {"magnifier", Act_magnifier}, */
+/* {"do-href", Act_href}, */
+/* {"do-href-newwindow", Act_href_newwindow}, */
+/* {"switch-magnifier-units", Act_switch_magnifier_units}, */
+/* }; */
+
+/*
+ * This isn't creating the actual magnifier. It is created lazily on demand
+ * if one of the corresponding actions is taken. Therefore we are here
+ * just adding the record of actions related to magnifier handling to the
+ * application.
+ */
+
+/* void */
+/* create_magnifier(void) */
+/* { */
+/* XtAppAddActions(globals.app, mag_actions, XtNumber(mag_actions)); */
+/* } */
diff --git a/Build/source/texk/xdvik/gui/mag.h b/Build/source/texk/xdvik/gui/mag.h
new file mode 100644
index 00000000000..f09ea35f9c6
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/mag.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1990-2004 Paul Vojta and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * NOTE: xdvi is based on prior work, as noted in the modification history in
+ * xdvi.c.
+ *
+ */
+
+#ifndef MAG_H_
+#define MAG_H_
+
+#define MAGBORD 1 /* border size for magnifier */
+
+
+extern size_t get_magglass_items(void);
+extern int get_magglass_width(int idx);
+extern int get_magglass_height(int idx);
+extern void set_magglass_widht(int idx, int w);
+extern void set_magglass_height(int idx, int h);
+
+extern void show_distance_from_ruler(XEvent *event, Boolean to_stdout);
+extern void drag_ruler_motion(XEvent *event);
+extern void drag_ruler_release(XEvent *event);
+extern void clear_ruler(void);
+extern void show_ruler(XEvent *event);
+extern void redraw_ruler(void);
+extern void ruler_snap_origin(XEvent *event);
+
+extern void magnifier_move(String params, XEvent *event);
+extern void mag_release(XEvent * event);
+extern void move_magnifier(void);
+extern void create_magnifier(void);
+
+#endif /* MAG_H_ */
+
diff --git a/Build/source/texk/xdvik/gui/menu.c b/Build/source/texk/xdvik/gui/menu.c
new file mode 100644
index 00000000000..6e305f2e8b4
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/menu.c
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Common code for Xaw and Motif menu bar creation.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "events.h"
+#include "menu.h"
+#include "util.h"
+
+#ifdef MOTIF
+# include <Xm/RowColumn.h>
+# include <Xm/ToggleB.h>
+#else
+# include <X11/Intrinsic.h>
+# include <X11/Xatom.h>
+# include <X11/StringDefs.h>
+# include <X11/Xaw/Label.h>
+#endif
+
+
+/* translate string argument into corresponding buttonTypeT */
+static buttonTypeT
+get_type(const char *str)
+{
+ if (strcmp(str, "PUSH") == 0)
+ return BT_PUSH;
+ else if (strcmp(str, "RADIO") == 0)
+ return BT_RADIO;
+ else if (strcmp(str, "CHECK") == 0)
+ return BT_CHECK;
+ else if (strcmp(str, "SEP") == 0)
+ return BT_SEP;
+ else
+ return BT_INVALID;
+}
+
+static struct button_info *m_button_info = NULL; /* toplevel node of pulldown menu structure */
+
+
+static void
+set_menu_info(void *val, XtActionProc proc, Boolean (*cmp)(), struct button_info *item)
+{
+ size_t i;
+ ASSERT(item != NULL, "item in set_menu_info musn't be NULL!");
+ for (i = 0; i < item->size; i++) {
+ if ((item->elems[i].type == BT_RADIO || item->elems[i].type == BT_CHECK)
+ && item->elems[i].action != NULL
+ && item->elems[i].action->proc != NULL
+ && item->elems[i].action->proc == proc
+ && item->elems[i].action->num_params > 0
+ && item->elems[i].action->params[0] != NULL) {
+ Boolean state;
+ ASSERT(cmp != NULL, "comparison function musn't be NULL!");
+ state = cmp(val, item->elems[i].action->params[0]);
+#ifdef MOTIF
+ ASSERT(item->elems[i].widget != 0, "Widget musn't be NULL!");
+ XmToggleButtonSetState(item->elems[i].widget, state, False);
+#else
+ if (item->elems[i].widget == 0) {
+ XDVI_WARNING((stderr, "Widget for menu `%s' is null!", item->elems[i].title));
+ continue;
+ }
+ xaw_set_button_state(item->elems + i, state);
+#endif
+ }
+ if (item->elems[i].submenu != NULL) { /* invoke it recursively */
+ set_menu_info(val, proc, cmp, item->elems[i].submenu);
+ }
+ }
+}
+
+
+/* set a menu according to val and the compare function cmp */
+void
+set_menu(void *val, XtActionProc proc, Boolean (*cmp)())
+{
+ /* removed following since cast from function pointer to void pointer is not supported by ANSI C */
+ /* TRACE_GUI((stderr, "set_menu_info: %d, %p, %p", *(int *)val, (void *)proc, (void *)cmp)); */
+ set_menu_info(val, proc, cmp, m_button_info);
+}
+
+static void
+initialize_menus(void)
+{
+ int use_gs;
+ int shrinkval;
+
+ /* initialize tickmarks for all possible actions */
+ use_gs = resource.postscript;
+#ifdef PS_GS
+ if (!resource.useGS)
+ use_gs = 0;
+#endif
+
+ set_menu(&use_gs, Act_set_ps, check_int);
+#ifdef PS_GS
+ set_menu(&resource.gs_alpha, Act_set_gs_alpha, check_toggle);
+#endif
+ set_menu(&resource.keep_flag, Act_set_keep_flag, check_toggle);
+ shrinkval = resource.pixels_per_inch / mane.shrinkfactor;
+ set_menu(&shrinkval, Act_shrink_to_dpi, check_int);
+ set_menu(&mane.shrinkfactor, Act_set_shrink_factor, check_int);
+ set_menu(&resource.use_tex_pages, Act_use_tex_pages, check_toggle);
+#if 0
+ set_menu((char *)resource.paper, Act_set_paper_landscape, check_paper_landscape);
+ set_menu((char *)resource.paper, Act_set_papersize, check_papersize);
+#endif /* 0 */
+ set_menu(&resource.mouse_mode, Act_switch_mode, check_int);
+ set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
+}
+
+static void
+free_items(char **items, size_t len)
+{
+ size_t curr = 0;
+ while(curr < len) {
+ free(items[curr++]);
+ }
+ free(items);
+}
+
+#if 0
+static void
+show_items(char *descr, char **items, size_t len)
+{
+ size_t i;
+ for (i = 0; i < len; i++) {
+ fprintf(stderr, "%s %d: |%s|\n", descr, i, items[i]);
+ }
+}
+#endif
+
+static void
+add_info(struct button_info **info, buttonTypeT bt_type,
+ char mnemonic, const char *title,
+ const char *accelerator, struct xdvi_action *action)
+{
+ size_t idx = (*info)->size++;
+ (*info)->elems = xrealloc((*info)->elems, (*info)->size * sizeof *((*info)->elems));
+ (*info)->elems[idx].title = xstrdup(title);
+ (*info)->elems[idx].type = bt_type;
+ if (accelerator == NULL || accelerator[0] == '\0')
+ (*info)->elems[idx].accelerator = NULL;
+ else
+ (*info)->elems[idx].accelerator = xstrdup(accelerator);
+ (*info)->elems[idx].mnemonic = mnemonic;
+ (*info)->elems[idx].action = action;
+ (*info)->elems[idx].widget = 0;
+ (*info)->elems[idx].submenu = NULL;
+}
+
+static void
+insert_items(struct button_info **info, char **items, size_t num_items,
+ const char *button_type, const char *accelerator, const char *action)
+{
+ const char ENTRY_SEP = '|';
+ size_t i = 0;
+ size_t entry_len;
+ size_t entry_count = 0;
+ char **entry_items = NULL;
+ size_t idx;
+
+ Boolean found = False;
+ Boolean have_error = False;
+
+ if (*items == NULL) {
+ /* should be a separator, which is treated as a special case since
+ there's no menu title: */
+ if (strcmp (button_type, "SEP") == 0)
+ add_info(info, BT_SEP, '\0', "SEP", NULL, NULL);
+ else
+ XDVI_WARNING((stderr, "Shouldn't happen: items == NULL!"));
+ return;
+ }
+
+ entry_len = strlen(items[0]);
+ entry_items = split_line(items[0], ENTRY_SEP, 0, entry_len, &entry_count);
+
+ if (entry_count < 2) {
+ XDVI_WARNING((stderr, "Missing Mnemonic in button info `%s'", items[0]));
+ entry_count++;
+ entry_items = xrealloc(entry_items, entry_count * sizeof *entry_items);
+ entry_items[1] = xstrdup("");
+ entry_items[2] = NULL;
+ }
+
+ for (i = 0; i < (*info)->size; i++) {
+ if (strcmp(entry_items[0], (*info)->elems[i].title) == 0) {
+ found = true;
+ break;
+ }
+ }
+
+ idx = i;
+
+ if (!found) { /* new item, resize info and add this item */
+ struct xdvi_action *my_action = NULL;
+ buttonTypeT my_type = BT_NONE;
+
+ /* if it's a `leaf' in the menu hierarchy, compile the action and set the button type */
+ if (num_items == 1) {
+ char *fmt = strchr(entry_items[0], '$');
+ if (fmt != NULL
+ && (fmt == entry_items[0] || (fmt > entry_items[0] && *(fmt - 1) != '\\'))
+ && (fmt[1] == '#' || fmt[1] == '%' ||fmt[1] == '_')) {
+ XDVI_WARNING((stderr, "Xdvik doesn't support format characters in button labels; "
+ "skipping button \"%s\"", items[0]));
+ have_error = True;
+ }
+
+ if (strlen(action) == 0 || (!compile_action(action, &my_action))) {
+ XDVI_WARNING((stderr, "Invalid action \"%s\" for button \"%s\" (skipping this line).",
+ action, items[0]));
+ have_error = True;
+ }
+
+ if ((my_type = get_type(button_type)) == BT_INVALID) {
+ XDVI_WARNING((stderr, "Invalid type \"%s\" for button \"%s\" (skipping this line).",
+ button_type, items[0]));
+ have_error = True;
+ }
+ }
+
+ if (!have_error) {
+ add_info(info, my_type, entry_items[1][0], entry_items[0], accelerator, my_action);
+ }
+ }
+ free_items(entry_items, entry_count);
+
+ if (num_items > 1 || (num_items == 1 && strcmp(button_type, "SEP") == 0)) { /* not a leaf, invoke recursivly for next level */
+ if ((*info)->elems[idx].submenu == NULL) { /* submenu didn't exist yet, create it */
+ struct button_info *new_submenu = xmalloc(sizeof *new_submenu);
+ new_submenu->elems = NULL;
+ new_submenu->size = 0;
+ (*info)->elems[idx].submenu = new_submenu;
+ }
+ insert_items(&((*info)->elems[idx].submenu), items + 1, num_items - 1, button_type, accelerator, action);
+ }
+}
+
+static void
+show_button_info(int depth, struct button_info *info)
+{
+ size_t i;
+ for (i = 0; i < info->size; i++) {
+ TRACE_GUI((stderr, "%*c-->%s; type=%d; mnemonic=%c; accel=%s; submenu=%p; w=%lu; action: %p",
+ depth, ' ',
+ info->elems[i].title,
+ info->elems[i].type,
+ info->elems[i].mnemonic,
+ info->elems[i].accelerator ? info->elems[i].accelerator : "<NULL>",
+ (void *)info->elems[i].submenu,
+ (unsigned long)info->elems[i].widget,
+ (void *)info->elems[i].action));
+ if (info->elems[i].submenu != NULL) {
+ show_button_info(depth + 3, info->elems[i].submenu);
+ }
+ }
+}
+
+static void
+parse_button_translations(struct button_info **info)
+{
+ const char *curr_p, *end_p;
+
+ const char LINE_SEP = ':';
+ const char MENU_SEP = '>';
+
+ for (curr_p = resource.menu_translations;
+ curr_p != NULL && *curr_p != '\0';
+ curr_p = end_p + 1) {
+ end_p = strchr(curr_p, '\n');
+ if (end_p != NULL) {
+ size_t line_len = end_p - curr_p;
+ size_t line_count = 0;
+ char **line_items;
+ line_items = split_line(curr_p, LINE_SEP, 0, line_len, &line_count);
+ /* fprintf(stderr, "length of line: %d; %d items\n", line_len, line_count); */
+ /* show_items("LINE", line_items, line_count); */
+ if (line_count != 4) { /* error */
+ XDVI_WARNING((stderr, "Wrong number of items (%lu) in translations line:\n\"%.*s\" "
+ "(skipping this line).\n",
+ (unsigned long)line_count, (int)line_len, curr_p));
+ free_items(line_items, line_count);
+ continue;
+ }
+ else { /* split first elem into menu description */
+ size_t menu_len = strlen(line_items[0]);
+ size_t menu_count = 0;
+ char **menu_items;
+ if (menu_len == 0) { /* error */
+ XDVI_WARNING((stderr, "Menu description (first item) mustn't be empty:\n\"%.*s\" "
+ "(skipping this line).\n",
+ (int)line_len, curr_p));
+ free_items(line_items, line_count);
+ continue;
+ }
+ menu_items = split_line(line_items[0], MENU_SEP, 0, menu_len, &menu_count);
+ /* show_items(" MENU", menu_items, menu_count); */
+
+ insert_items(info, menu_items, menu_count, line_items[1], line_items[2], line_items[3]);
+ free_items(menu_items, menu_count);
+ }
+ free_items(line_items, line_count);
+ }
+ }
+ show_button_info(0, *info);
+}
+
+/*
+ Top-level routine: creates the pulldown menu buttons for Motif and Xaw.
+ For Motif, sets `*menu_bar' to the address of the new widget created,
+ for Xaw, sets *width to the width of the button panel created.
+*/
+void
+create_menu_buttons(Widget parent,
+#ifdef MOTIF
+ Widget *menu_bar
+#else
+ int *width
+#endif
+ )
+{
+#ifdef MOTIF
+ Widget menu = 0;
+ size_t i;
+#else /* MOTIF */
+ Widget panel = 0;
+#endif
+
+ m_button_info = xmalloc(sizeof *m_button_info);
+ m_button_info->elems = NULL;
+ m_button_info->size = 0;
+
+#ifdef MOTIF
+ *menu_bar = XmCreateMenuBar(parent, "menuBar", NULL, 0);
+ parse_button_translations(&m_button_info);
+
+ for (i = 0; i < m_button_info->size; i++) {
+ menu = xm_create_menu(*menu_bar,
+ m_button_info->elems[i].title,
+ m_button_info->elems[i].mnemonic,
+ m_button_info->elems[i].submenu);
+ }
+ if (menu != 0) {
+ XtVaSetValues(*menu_bar, XmNmenuHelpWidget, menu, NULL);
+ }
+#else /* MOTIF */
+ xaw_initialize_menu_bitmaps();
+ panel = xaw_create_menu_widgets(parent);
+ parse_button_translations(&m_button_info);
+ xaw_create_menu(m_button_info, panel, width);
+#endif /* MOTIF */
+ initialize_menus();
+}
+
diff --git a/Build/source/texk/xdvik/gui/menu.h b/Build/source/texk/xdvik/gui/menu.h
new file mode 100644
index 00000000000..97c38cccb0d
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/menu.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Common code for Xaw and Motif menu bar creation.
+ */
+#ifndef MENU_H_
+#define MENU_H_
+
+#include "events.h"
+#include "xdvi.h"
+
+typedef enum {
+ BT_INVALID = -1, /* error code */
+ BT_NONE = 0,
+ BT_PUSH, /* pushbutton */
+ BT_RADIO, /* radio button (1 of n) */
+ BT_CHECK, /* check button (m of n) */
+ BT_SEP /* separator */
+} buttonTypeT;
+
+
+/* structures for menu data */
+struct button_elems {
+ char *title; /* menu item label string */
+ buttonTypeT type; /* button type */
+ char mnemonic; /* 0 if none */
+ char *accelerator; /* NULL if none */
+ struct button_info *submenu;/* submenu, or NULL */
+ Widget widget; /* the widget in this item, for later use, or 0 */
+ struct xdvi_action *action; /* translated action, for later use, or NULL */
+};
+
+struct button_info {
+ size_t size;
+ struct button_elems *elems;
+};
+
+#include "xm_menu.h"
+#include "xaw_menu.h"
+
+extern void create_menu_buttons(Widget parent,
+#ifdef MOTIF
+ Widget *child
+#else
+ int *ret_panel_width
+#endif
+ );
+
+extern void set_menu(void *val, XtActionProc proc, Boolean (*cmp)());
+
+#endif /* MENU_H_ */
diff --git a/Build/source/texk/xdvik/gui/message-window.c b/Build/source/texk/xdvik/gui/message-window.c
new file mode 100644
index 00000000000..98c4b7efadc
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/message-window.c
@@ -0,0 +1,1203 @@
+/*------------------------------------------------------------
+ message-window.c: message popups for xdvi.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ ------------------------------------------------------------*/
+
+
+
+/*
+
+============================================
+Suggested Policy for using the GUI messages:
+============================================
+
+- Use the statusline for shorter messages, a message window for more
+important messages or such where you'd like to give further help info
+(see the `helptext' argument of popup_message()). When in doubt,
+prefer the statusline (excessive use of popup windows is a nuisance
+for the user).
+
+- Don't use any of the GUI messages to report internal workings of
+the program; for important internal information, there should be a
+debugging setting to print it to stderr. Use the GUI messages
+only in situations such as the following:
+
+- to give the user feedback on actions that (s)he initiated
+
+- to indicate that an internal action causes a delay perceptible
+by the user (as a rough guide: a delay of more than half a second)
+
+- to report situations that might require new actions by the user.
+
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "string-utils.h"
+
+#include <ctype.h>
+
+ /* Xaw specific stuff */
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#ifdef MOTIF
+# include <Xm/DialogS.h>
+# include <Xm/MessageB.h>
+# include <Xm/PushB.h>
+# include <Xm/Label.h>
+# include <Xm/Form.h>
+# include <Xm/MenuShell.h>
+# include <Xm/Protocols.h>
+# include <Xm/AtomMgr.h>
+#else
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/MenuButton.h>
+# include <X11/Xaw/SimpleMenu.h>
+# include <X11/Xaw/Sme.h>
+# include <X11/Xaw/SmeBSB.h>
+# include <X11/Xaw/AsciiText.h>
+# include <X11/Xaw/Dialog.h>
+#endif
+
+#include <stdarg.h>
+#include "xdvi.h"
+#include "util.h"
+#include "string-utils.h"
+#include "x_util.h"
+#include "message-window.h"
+
+ /* have no more than MAX_POPUPS open simultaneously */
+#define MAX_POPUPS 10
+
+ /* offset for cascading popups */
+#define POPUP_OFFSET ((my_popup_num * 20))
+
+#ifdef MOTIF
+ /* wrap messages after MSG_WRAP_LEN characters at whitespace */
+#define MSG_WRAP_LEN 60
+#endif
+
+ /* array of active popups: */
+ static int g_popup_array[MAX_POPUPS];
+
+static Atom WM_DELETE_WINDOW;
+
+/* arrays for saving the widgets of multiple popups;
+ * same index as in g_popup_array:
+ */
+#ifdef MOTIF
+static Widget popup_window[MAX_POPUPS], dialog[MAX_POPUPS];
+#else
+static Widget popup_window[MAX_POPUPS], message_box[MAX_POPUPS],
+ message_text[MAX_POPUPS], message_paned[MAX_POPUPS],
+ message_ok[MAX_POPUPS], message_help[MAX_POPUPS], message_not_ok[MAX_POPUPS];
+#endif
+
+/* map popupMessageT's to strings/motif dialog elements */
+static const struct message_map {
+ const char *window_title;
+#ifdef MOTIF
+ int motif_msg_type;
+#endif
+} my_msg_map[] = {
+ { "Xdvi Question"
+#ifdef MOTIF
+ , XmDIALOG_QUESTION
+#endif
+ },
+ { "Xdvi Help"
+#ifdef MOTIF
+ , XmDIALOG_INFORMATION
+#endif
+ },
+ { "Xdvi Info"
+#ifdef MOTIF
+ , XmDIALOG_INFORMATION
+#endif
+ },
+ { "Xdvi Warning"
+#ifdef MOTIF
+ , XmDIALOG_WARNING
+#endif
+ },
+ { "Xdvi Error"
+#ifdef MOTIF
+ , XmDIALOG_ERROR
+#endif
+ },
+};
+
+struct ok_or_cancel_cb {
+ message_cbT callback; /* callback function */
+ XtPointer arg; /* arg for callback function */
+};
+
+struct pre_ok_or_cancel_cb {
+ pre_message_cbT callback; /* callback function */
+ XtPointer arg; /* arg for callback function */
+};
+
+static struct ok_or_cancel_cb yes_callbacks[MAX_POPUPS];
+static struct ok_or_cancel_cb no_callbacks[MAX_POPUPS];
+static struct ok_or_cancel_cb cancel_callbacks[MAX_POPUPS];
+static struct pre_ok_or_cancel_cb pre_callbacks[MAX_POPUPS];
+
+
+static void
+popdown_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ size_t idx;
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ ASSERT(*num_params == 1, "Wrong number of parameters in callback");
+ idx = strtoul(*params, (char **)NULL, 10);
+
+ /* First call pre_message_cb with window widget ID
+ * as additional parameter.
+ */
+ if (pre_callbacks[idx].callback != NULL) {
+ pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg);
+ }
+
+ /* Then pop down window and mark its position as free, then
+ * invoke the OK callback. The reason for this is that the callback
+ * may need to wait for open windows.
+ */
+ XtPopdown(popup_window[idx]);
+ XtDestroyWidget(popup_window[idx]);
+ g_popup_array[idx] = 0;
+ XSync(DISP, True);
+
+ /* invoke the callback if present */
+ if (cancel_callbacks[idx].callback != NULL) {
+ cancel_callbacks[idx].callback(cancel_callbacks[idx].arg);
+ }
+}
+
+#ifndef MOTIF
+static void
+xaw_popdown(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ size_t idx;
+
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ ASSERT(*num_params == 1, "Wrong number of parameters in callback");
+ idx = strtoul(*params, (char **)NULL, 10);
+
+ /*
+ NOTE: first pop down window and mark its position as free, then
+ invoke the callback. The reason for this is that the callback
+ may need to wait for open windows.
+ */
+ XtPopdown(popup_window[idx]);
+ XtDestroyWidget(popup_window[idx]);
+ g_popup_array[idx] = 0;
+ XSync(DISP, True);
+}
+
+#endif
+
+static XtActionsRec popdown_actions[] = {
+ {"close-popup-cancel", popdown_cancel },
+#if !MOTIF
+ {"WM_popdown", popdown_cancel },
+ {"close-popup", xaw_popdown },
+#endif
+};
+
+static void
+ok_action(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ XtPointer p;
+ ptrdiff_t idx = -1;
+
+ UNUSED(call_data);
+
+#if MOTIF
+ UNUSED(client_data);
+ XtVaGetValues(w, XmNuserData, &p, NULL);
+ idx = (ptrdiff_t)p;
+ ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!");
+#else
+ UNUSED(p);
+ UNUSED(w);
+ idx = (ptrdiff_t)client_data;
+#endif
+
+#if DEBUG
+ fprintf(stderr, "ok_action called for popup %ld\n", idx);
+#endif
+ ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in ok_action()");
+
+ /* First call pre_message_cb with window widget ID
+ * as additional parameter.
+ */
+ if (pre_callbacks[idx].callback != NULL) {
+ pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg);
+ }
+
+ /* Then pop down window and mark its position as free, then
+ * invoke the OK callback. The reason for this is that the callback
+ * may need to wait for open windows.
+ */
+ XtPopdown(popup_window[idx]);
+ XtDestroyWidget(popup_window[idx]);
+ g_popup_array[idx] = 0;
+ XSync(DISP, True);
+
+ if (yes_callbacks[idx].callback != NULL) {
+ yes_callbacks[idx].callback(yes_callbacks[idx].arg);
+ }
+}
+
+/*------------------------------------------------------------
+ * help_action
+ *
+ * Arguments:
+ * Widget w, XtPointer call_data
+ * - (ignored)
+ * XtPointer client_data
+ * - the help string
+ *
+ * Returns:
+ * void
+ *
+ * Purpose:
+ * Callback for the `Help' button; opens another window
+ * containing the help text. The new window won't have
+ * another `Help' button.
+ *------------------------------------------------------------*/
+
+static void
+help_action(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(call_data);
+
+ /* open another window with the help text */
+ popup_message(get_matching_parent(w, globals.widgets.top_level,
+ "message_popup", NULL), MSG_HELP, NULL, "%s", client_data);
+}
+
+
+/*
+ * Callback for cancel button in choice_dialog.
+ */
+static void
+cancel_action(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ XtPointer p;
+ ptrdiff_t idx = -1;
+
+ UNUSED(call_data);
+
+#if MOTIF
+ /* for motif, the index is in XmNuserData */
+ UNUSED(client_data);
+ if (strcmp(XtName(w), Xdvi_MESSAGE_SHELL_NAME) == 0) {
+ /* invoked by the WM, get the messagebox child */
+ Widget child;
+ if (get_widget_by_name(&child, w, Xdvi_MESSAGE_DIALOG_NAME, True)) {
+ XtVaGetValues(child, XmNuserData, &p, NULL);
+ idx = (ptrdiff_t)p;
+ }
+ }
+ else {
+ XtVaGetValues(w, XmNuserData, &p, NULL);
+ idx = (ptrdiff_t)p;
+ }
+ ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!");
+#else
+ UNUSED(p);
+ UNUSED(w);
+ idx = (ptrdiff_t)client_data;
+#endif
+ ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in cancel_action()");
+
+ /* First call pre_message_cb with window widget ID
+ * as additional parameter.
+ */
+ if (pre_callbacks[idx].callback != NULL) {
+ pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg);
+ }
+
+ /* Then pop down window and mark its position as free, then
+ * invoke the OK callback. The reason for this is that the callback
+ * may need to wait for open windows.
+ */
+ XtPopdown(popup_window[idx]);
+ XtDestroyWidget(popup_window[idx]);
+ g_popup_array[idx] = 0;
+ XSync(DISP, True);
+
+ /* invoke the callback if present */
+ if (cancel_callbacks[idx].callback != NULL) {
+ cancel_callbacks[idx].callback(cancel_callbacks[idx].arg);
+ }
+}
+
+#if MOTIF
+static void
+not_ok_action(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ /* Note: unmanages the parent of the button */
+ XtPointer p;
+ ptrdiff_t idx = -1;
+
+ UNUSED(client_data);
+
+ UNUSED(call_data);
+ XtVaGetValues(w, XmNuserData, &p, NULL);
+ idx = (ptrdiff_t)p;
+ ASSERT(idx >= 0, "Couldn't get idx from XmNuserData!");
+ ASSERT(idx >= 0 && idx < MAX_POPUPS, "Invalid widget index in ok_action()");
+
+ /* First call pre_message_cb with window widget ID
+ * as additional parameter.
+ */
+ if (pre_callbacks[idx].callback != NULL) {
+ pre_callbacks[idx].callback(popup_window[idx], pre_callbacks[idx].arg);
+ }
+
+ /* Then pop down window and mark its position as free, then
+ * invoke the OK callback. The reason for this is that the callback
+ * may need to wait for open windows.
+ */
+ XtPopdown(popup_window[idx]);
+ XtDestroyWidget(popup_window[idx]);
+ g_popup_array[idx] = 0;
+ XSync(DISP, True);
+
+ if (no_callbacks[idx].callback != NULL) {
+ no_callbacks[idx].callback(no_callbacks[idx].arg);
+ }
+}
+#endif /* MOTIF */
+
+/*------------------------------------------------------------
+ * create_dialogs
+ *
+ * Arguments:
+ * Widget toplevel - parent for the dialog window
+ *
+ * helptext - if not-NULL, create an additional
+ * `help' button
+ *
+ * cnt - number of current popup dialog
+ *
+ * Returns:
+ * void
+ *
+ * Purpose:
+ * Create message dialog widgets
+ *------------------------------------------------------------*/
+
+static Widget
+create_dialogs(popupMessageSizeHintT size,
+ Widget parent,
+ int cnt,
+ const char *helptext,
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *yes_button, message_cbT yes_cb, XtPointer yes_arg,
+ const char *no_button, message_cbT no_cb, XtPointer no_arg,
+ const char *cancel_button, message_cbT cancel_cb, XtPointer cancel_arg)
+{
+ Widget new_popup_window;
+ char *translations_str = NULL;
+#ifdef MOTIF
+ Widget new_dialog;
+ UNUSED(size);
+#else
+ char *key_translations_str = NULL;
+ int msg_w = 400, msg_h = 100;
+ Widget new_message_paned, new_message_text, new_message_box, new_message_ok,
+ new_message_help = 0, new_message_not_ok;
+ XtTranslations wm_translations, key_translations;
+#endif
+
+ /* save callbacks to global arrays */
+ pre_callbacks[cnt].callback = pre_cb;
+ pre_callbacks[cnt].arg = arg;
+
+ yes_callbacks[cnt].callback = yes_cb;
+ yes_callbacks[cnt].arg = yes_arg;
+
+ no_callbacks[cnt].callback = no_cb;
+ no_callbacks[cnt].arg = no_arg;
+
+ cancel_callbacks[cnt].callback = cancel_cb;
+ cancel_callbacks[cnt].arg = cancel_arg;
+
+ XtAddActions(popdown_actions, XtNumber(popdown_actions));
+
+#ifndef MOTIF
+ /* get index into WM_popdown arg */
+ translations_str = get_string_va("<Message>WM_PROTOCOLS: WM_popdown(%d)", cnt);
+ wm_translations = XtParseTranslationTable(translations_str);
+ free(translations_str);
+#endif
+
+ if (!XtIsRealized(globals.widgets.top_level)) {
+ /* If toplevel window hasn't been realized yet, create a new toplevel shell
+ (otherwise, setting visual/color map wouldn't work); use same application names
+ so that resource settings will also apply to this window.
+ */
+ new_popup_window = XtVaAppCreateShell("xdvi", "Xdvi",
+ transientShellWidgetClass, DISP,
+ NULL);
+ }
+ else {
+ new_popup_window = XtVaCreatePopupShell(Xdvi_MESSAGE_SHELL_NAME,
+#ifdef MOTIF
+ xmDialogShellWidgetClass, parent,
+ XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */
+#else
+ transientShellWidgetClass, parent,
+ XtNx, 60,
+ XtNy, 80,
+ XtNtranslations, wm_translations,
+ XtNaccelerators, G_accels_cr,
+#endif
+ XtNtransientFor, parent,
+ XtNmappedWhenManaged, False,
+ NULL);
+ }
+
+#ifdef MOTIF
+
+ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(new_popup_window), "WM_DELETE_WINDOW", False);
+ XmAddWMProtocolCallback(new_popup_window, WM_DELETE_WINDOW, cancel_action, NULL);
+
+ /* We also need to override the default ESC binding to use our internal
+ housekeeping functions */
+ translations_str = get_string_va("#override\n<Key>osfCancel:close-popup-cancel(%d)", cnt);
+ /* { */
+ /* XtTranslations xlats; */
+ /* char *translation_str = get_string_va("<Key>osfCancel:close-popup-cancel(%d)", cnt); */
+ /* xlats = XtParseTranslationTable(translation_str); */
+ /* free(translation_str); */
+ /* XtOverrideTranslations(new_dialog, xlats); */
+ /* } */
+
+ new_dialog = XtVaCreateWidget(Xdvi_MESSAGE_DIALOG_NAME, xmMessageBoxWidgetClass, new_popup_window,
+ XmNdialogType, XmDIALOG_WARNING, /* default */
+ XmNtraversalOn, True,
+ XmNhighlightOnEnter, True,
+ XmNuserData, cast_int_to_XtPointer(cnt),
+ XmNtranslations, XtParseTranslationTable(translations_str),
+ NULL);
+ free(translations_str);
+ XtAddCallback(new_dialog, XmNokCallback, ok_action, NULL);
+
+ if (no_button != NULL) {
+ Arg args[4];
+ Widget b;
+ XmString b_str = XmStringCreateLocalized((char *)no_button);
+ XtSetArg(args[0], XmNlabelString, b_str);
+ b = XmCreatePushButton(new_dialog, "no_button", args, 1);
+ XtAddCallback(b, XmNactivateCallback, not_ok_action, NULL);
+ XtManageChild(b);
+ }
+
+ if (cancel_button != NULL) {
+ XmString cancel_label = XmStringCreateLtoR((char *)cancel_button, G_charset);
+ XtVaSetValues(XmMessageBoxGetChild(new_dialog, XmDIALOG_CANCEL_BUTTON),
+ XmNlabelString, cancel_label, NULL);
+ XmStringFree(cancel_label);
+ XtAddCallback(new_dialog, XmNcancelCallback, cancel_action, NULL);
+ }
+ else {
+ XtUnmanageChild(XmMessageBoxGetChild(new_dialog, XmDIALOG_CANCEL_BUTTON));
+ }
+ XtInstallAllAccelerators(new_dialog,
+ XmMessageBoxGetChild(new_dialog, XmDIALOG_OK_BUTTON));
+
+ if (helptext != NULL) {
+ XtAddCallback(new_dialog, XmNhelpCallback, help_action, (XtPointer)helptext);
+ }
+ else {
+ XtUnmanageChild(XmMessageBoxGetChild(new_dialog, XmDIALOG_HELP_BUTTON));
+ }
+
+ if (yes_button != NULL) { /* change `OK' button label */
+ XmString yes_label;
+ yes_label = XmStringCreateLtoR((char *)yes_button, G_charset);
+ XtVaSetValues(XmMessageBoxGetChild(new_dialog, XmDIALOG_OK_BUTTON),
+ XmNlabelString, yes_label, NULL);
+ XmStringFree(yes_label);
+ }
+
+ /* insert the new widgets into the global arrays */
+ dialog[cnt] = new_dialog;
+
+#else /* MOTIF */
+ switch (size) {
+ case SIZE_SMALL:
+ msg_w = 300;
+ msg_h = 100;
+ break;
+ case SIZE_MEDIUM:
+ msg_w = 430;
+ msg_h = 160;
+ break;
+ case SIZE_LARGE:
+ msg_w = 450;
+ msg_h = 180;
+ break;
+ }
+ WM_DELETE_WINDOW = XInternAtom(XtDisplay(new_popup_window), "WM_DELETE_WINDOW", False);
+
+ new_message_paned = XtVaCreateManagedWidget("message_paned", panedWidgetClass, new_popup_window,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+
+ new_message_text = XtVaCreateManagedWidget("message_text", asciiTextWidgetClass, new_message_paned,
+ /* XtNheight, 100, */
+ /* XtNwidth, 400, */
+ XtNwidth, msg_w,
+ XtNheight, msg_h,
+ /* wrap horizontally instead of scrolling
+ * TODO: this won't work for the first widget instance?
+ */
+ XtNwrap, XawtextWrapWord,
+ XtNscrollVertical, XAW_SCROLL_ALWAYS,
+ XtNeditType, XawtextRead,
+ XtNinput, True,
+ XtNdisplayCaret, False,
+ XtNleftMargin, 5,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+
+ /* box for the OK/Cancel button */
+ new_message_box = XtVaCreateManagedWidget("message_box", formWidgetClass, new_message_paned,
+ /* resizing by user isn't needed */
+ XtNshowGrip, False,
+ XtNdefaultDistance, 6, /* some padding */
+ /* resizing the window shouldn't influence this box,
+ * but only the text widget
+ */
+ XtNskipAdjust, True,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+
+ new_message_ok = XtVaCreateManagedWidget(yes_button == NULL ? "OK" : yes_button,
+ commandWidgetClass, new_message_box,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ XtNleft, XtChainLeft,
+ XtNright, XtChainLeft,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+ /* add quit_action callback for the "OK" button */
+ /* FIXME: how to make accelerators be accepted by new_popup_window as well? */
+ key_translations_str = get_string_va("<Key>q:close-popup-cancel(%d)\n"
+ "<Key>Return:close-popup-cancel(%d)\n"
+ "<Key>Escape:close-popup-cancel(%d)\n",
+ cnt, cnt, cnt);
+ key_translations = XtParseTranslationTable(key_translations_str);
+ free(key_translations_str);
+ XtOverrideTranslations(new_popup_window, key_translations);
+ XtOverrideTranslations(new_message_paned, key_translations);
+ XtOverrideTranslations(new_message_text, key_translations);
+
+ XtInstallAllAccelerators(new_message_box, new_message_ok);
+ XtAddCallback(new_message_ok, XtNcallback, ok_action, cast_int_to_XtPointer(cnt));
+
+ /* we create additional buttons in any case,
+ to make the sizing more consistent */
+ new_message_help = XtVaCreateManagedWidget("Help", commandWidgetClass, new_message_box,
+ XtNtop, XtChainTop,
+ XtNfromHoriz, new_message_ok,
+ XtNbottom, XtChainBottom,
+ XtNleft, XtChainRight,
+ XtNright, XtChainRight,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+ message_help[cnt] = new_message_help;
+
+ /* add cancel button */
+ new_message_not_ok = XtVaCreateManagedWidget(cancel_button == NULL ? "Cancel" : cancel_button,
+ commandWidgetClass, new_message_box,
+ XtNtop, XtChainTop,
+ XtNfromHoriz, new_message_ok,
+ XtNbottom, XtChainBottom,
+ XtNleft, helptext == NULL ? XtChainRight : XtChainLeft,
+ XtNright, helptext == NULL ? XtChainRight : XtChainLeft,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+ message_not_ok[cnt] = new_message_not_ok;
+
+ if (no_button != NULL) {
+ ASSERT(0, "third button not yet implemented in Xaw!!!");
+ }
+
+ adjust_width_to_max(new_message_ok, new_message_help, new_message_not_ok, NULL);
+
+ /* if helptext argument is not-NULL, add help_action callback,
+ else unmanage help button */
+ if (helptext != NULL) {
+ XtAddCallback(new_message_help, XtNcallback, help_action, (XtPointer)helptext);
+ }
+ else {
+ XtUnmanageChild(new_message_help);
+ }
+
+ if (cancel_button != NULL) {
+ XtAddCallback(new_message_not_ok, XtNcallback, cancel_action, cast_int_to_XtPointer(cnt));
+ }
+ else {
+ XtUnmanageChild(new_message_not_ok);
+ }
+ /* insert the new widgets into the global arrays */
+ message_box[cnt] = new_message_box;
+ message_paned[cnt] = new_message_paned;
+ message_text[cnt] = new_message_text;
+ message_ok[cnt] = new_message_ok;
+
+#endif /* MOTIF */
+ popup_window[cnt] = new_popup_window;
+
+ return new_popup_window;
+}
+
+
+/*
+ * Popup a window with wrapped text in it.
+ * For Motif, the text is explicitly wrapped inside this method.
+ */
+static Widget
+internal_popup_window(Widget parent,
+ popupMessageSizeHintT size,
+ popupMessageT type,
+ int x_coord, int y_coord,
+ const char *helptext,
+ char *msg_buf,
+#ifndef MOTIF
+ const char *xaw_ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *yes_button, message_cbT yes_cb, XtPointer yes_arg,
+ const char *no_button, message_cbT no_cb, XtPointer no_arg,
+ const char *cancel_button, message_cbT cancel_cb, XtPointer cancel_arg)
+{
+ int my_popup_num = 0;
+#ifdef MOTIF
+ XmString str;
+#endif
+ Widget ret;
+
+ ASSERT(type < (sizeof my_msg_map / sizeof my_msg_map[0]), "too few elements in my_msg_map");
+
+#if DEBUG
+ fprintf(stderr, "internal_popup_window called with prompt: \"%s\"\n", msg_buf);
+#endif
+
+ if (globals.widgets.top_level == 0) {
+ /* If toplevel window hasn't been created yet, dump messages to STDERR
+ and return.
+ */
+ fprintf(stderr, "\n%s:\n%s\n", my_msg_map[type].window_title, msg_buf);
+ if (helptext) {
+ fputs("---------- helptext ----------\n", stderr);
+ fputs(helptext, stderr);
+ fputs("\n---------- end of helptext ----------\n", stderr);
+ }
+ return NULL;
+ }
+ /* search for first free position in g_popup_array */
+ while (my_popup_num < MAX_POPUPS && (g_popup_array[my_popup_num] == 1)) {
+ my_popup_num++;
+ }
+ if (my_popup_num == MAX_POPUPS) {
+ /* already enough popups on screen, just dump it to stderr */
+ fprintf(stderr, "%s: %s\n", my_msg_map[type].window_title, msg_buf);
+ /* Note: If a mad function continues to open popups, this will
+ * stop after MAX_POPUPS, but open a new window for each
+ * window the user pops down. Maybe we ought to do something
+ * about this.
+ */
+ return NULL;
+ }
+ else {
+ /* mark it as non-free */
+ g_popup_array[my_popup_num] = 1;
+ }
+#if DEBUG
+ fprintf(stderr, "first free position in g_popup_array: %d\n", my_popup_num);
+#endif
+
+ /* just to make sure ... */
+ if (parent == NULL)
+ parent = globals.widgets.top_level;
+
+ /* create a new set of widgets for the additional popup. */
+ ret = create_dialogs(size, parent,
+ my_popup_num,
+ helptext,
+ pre_cb, arg,
+ yes_button, yes_cb, yes_arg,
+ no_button, no_cb, no_arg,
+ cancel_button, cancel_cb, cancel_arg);
+#ifdef MOTIF
+ XtVaSetValues(popup_window[my_popup_num], XmNtitle,
+ my_msg_map[type].window_title, NULL);
+ XtVaSetValues(dialog[my_popup_num], XmNdialogType,
+ my_msg_map[type].motif_msg_type, NULL);
+ { /* wrap message at space before MSG_WRAP_LEN */
+ char *testwrap = msg_buf;
+ int ctr;
+ for (ctr = 0; *testwrap++; ctr++) {
+ if (*testwrap == '\n') {
+ ctr = 0;
+ }
+ else if (ctr > MSG_WRAP_LEN) {
+ size_t before_len = 0, after_len = 0;
+ char *before_ptr, *after_ptr;
+ before_ptr = after_ptr = testwrap;
+ /* try to find shortest sequence before or after point to wrap at;
+ this seems to give the most pleasing results.
+ */
+ while (before_ptr > msg_buf && !isspace((int)*--before_ptr)) {
+ before_len++;
+ }
+ while (*after_ptr != '\0' && !isspace((int)*++after_ptr)) {
+ after_len++;
+ }
+
+ if (before_len < after_len && isspace((int)*before_ptr)) {
+ /* use last in sequence of multiple spaces */
+ while (isspace((int)*++before_ptr)) { ; }
+ /* back up, and wrap */
+ *--before_ptr = '\n';
+ ctr = 0;
+ }
+ else if (isspace((int)*after_ptr)) {
+ /* use last in sequence of multiple spaces */
+ while (isspace((int)*++after_ptr)) { ; }
+ /* back up, and wrap */
+ *--after_ptr = '\n';
+ ctr = 0;
+ }
+ }
+ }
+ }
+ str = XmStringCreateLtoR((char *)msg_buf, G_charset);
+ XtVaSetValues(dialog[my_popup_num],
+ XmNmessageString, str,
+ XmNtraversalOn, True,
+ XmNhighlightOnEnter, True,
+ NULL);
+ XmStringFree(str);
+
+ XtManageChild(dialog[my_popup_num]);
+
+ if (x_coord > 0 && y_coord > 0) {
+ position_window(XtParent(dialog[my_popup_num]), (Position)x_coord, (Position)y_coord);
+ }
+
+ XtPopup(XtParent(dialog[my_popup_num]), XtGrabNone);
+ /* XtPopup(XtParent(dialog[my_popup_num]), XtGrabExclusive); */
+
+#else /* MOTIF */
+
+ /* add a binding of xaw_ret_action_str to <Return> to relevant widgets.
+ The callbacks (xaw_ret_action_str) are responsible for parsing the
+ passed arguments (pointers, or empty arguments).
+ */
+ if (xaw_ret_action_str != NULL) {
+ XtTranslations xlats;
+ char *translation_str;
+
+ if (yes_arg != NULL)
+ translation_str = get_string_va("<Key>Return:close-popup(%d)%s(%p)",
+ my_popup_num, xaw_ret_action_str, yes_arg);
+ else
+ translation_str = get_string_va("<Key>Return:close-popup(%d)%s()",
+ my_popup_num, xaw_ret_action_str);
+
+ xlats = XtParseTranslationTable(translation_str);
+ free(translation_str);
+ XtOverrideTranslations(popup_window[my_popup_num], xlats);
+ XtOverrideTranslations(message_paned[my_popup_num], xlats);
+ XtOverrideTranslations(message_text[my_popup_num], xlats);
+ }
+
+ XtVaSetValues(popup_window[my_popup_num], XtNtitle,
+ my_msg_map[type].window_title, NULL);
+ XtVaSetValues(message_text[my_popup_num], XtNstring, msg_buf, NULL);
+ XtRealizeWidget(popup_window[my_popup_num]);
+
+ XSetWMProtocols(XtDisplay(popup_window[my_popup_num]), XtWindow(popup_window[my_popup_num]),
+ &WM_DELETE_WINDOW, 1);
+
+ if (x_coord <= 0 || y_coord <= 0)
+ center_window(popup_window[my_popup_num], parent);
+ else
+ position_window(popup_window[my_popup_num], (Position)x_coord, (Position)y_coord);
+
+ if (my_popup_num > 0) {
+ /* some window managers position new windows exactly above the
+ existing one; to prevent this, move it with some offset
+ from the previous one: */
+ Position x = 0, y = 0;
+ XtVaGetValues(popup_window[my_popup_num-1], XtNx, &x, XtNy, &y, NULL);
+ XtVaSetValues(popup_window[my_popup_num], XtNx, x + POPUP_OFFSET, XtNy, y + POPUP_OFFSET, NULL);
+
+ }
+ XtPopup(popup_window[my_popup_num], XtGrabNone);
+ /* XtPopup(XtParent(popup_window[my_popup_num]), XtGrabExclusive); */
+ if (XtIsManaged(message_not_ok[my_popup_num]) && XtIsManaged(message_help[my_popup_num])) {
+ /* center the help button. This is something of a sham, since it won't
+ survive resizing; but in general most users won't resize dialogs ;-) */
+ Position x1, x2, bw;
+ int w, dist;
+
+ XtVaGetValues(message_ok[my_popup_num], XtNx, &x1, XtNwidth, &w, XtNborderWidth, &bw, NULL);
+ XtVaGetValues(message_help[my_popup_num], XtNx, &x2, NULL);
+ /* following formula is measured, not calculated -
+ I have no idea why it's e.g. 2 * w, not 1.5 * w ... */
+ dist = (x2 - x1 - 2 * w) / 2 - 2 * bw;
+ XtVaSetValues(message_not_ok[my_popup_num], XtNhorizDistance, dist, NULL);
+ }
+
+#endif /* MOTIF */
+ return ret;
+}
+
+
+/*------------------------------------------------------------
+ * popup_message
+ *
+ * Arguments:
+ * popupMessageT - info, warning, error etc; see message-window.h for details
+ *
+ * char *helptext
+ * - if not-null, this will add a `Help'
+ * button to the message widget that pops
+ * up another message widget containing
+ * <helptext>.
+ *
+ *
+ * char *msg, ...
+ * - format string followed by a variable
+ * number of arguments to be formatted.
+ *
+ * Returns:
+ * void
+ *
+ * Purpose:
+ * Pop up a message window containing <msg>.
+ * If there are already n popups open, will open
+ * a new one unless n >= MAX_POPUPS.
+ *------------------------------------------------------------*/
+
+Widget
+popup_message(Widget parent, popupMessageT type, const char *helptext, const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ SIZE_SMALL,
+ type,
+ -1, -1, /* just center it */
+ helptext, msg_buf,
+#ifndef MOTIF
+ NULL,
+#endif
+ /* no special callbacks here */
+ NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL);
+ free(msg_buf);
+ return w;
+}
+
+#if 0 /* This function is currently unused. */
+Widget
+popup_message_sized(Widget parent,
+ popupMessageT type,
+ popupMessageSizeHintT sizehint,
+ const char *helptext,
+ const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ sizehint,
+ type,
+ -1, -1, /* just center it */
+ helptext, msg_buf,
+#ifndef MOTIF
+ NULL,
+#endif
+ /* empty callbacks */
+ NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL);
+ free(msg_buf);
+ return w;
+}
+#endif
+
+Widget
+positioned_popup_message(Widget parent,
+ popupMessageT type,
+ int x, int y,
+ const char *helptext, const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ SIZE_SMALL,
+ type,
+ x, y, /* position at these coordinates */
+ helptext, msg_buf,
+#ifndef MOTIF
+ NULL,
+#endif
+ /* empty callbacks */
+ NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL);
+ free(msg_buf);
+ return w;
+}
+
+Widget
+choice_dialog(Widget parent,
+ popupMessageT type,
+ const char *helptext,
+#ifndef MOTIF
+ const char *xaw_ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_arg,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg,
+ const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ SIZE_SMALL,
+ type,
+ -1, -1, /* just center it */
+ helptext, msg_buf,
+#ifndef MOTIF
+ xaw_ret_action_str,
+#endif
+ pre_cb, arg,
+ ok_label, ok_cb, ok_arg,
+ NULL, NULL, NULL,
+ cancel_label, cancel_cb, cancel_arg);
+ free(msg_buf);
+ return w;
+}
+
+#if MOTIF
+Widget
+choice3_dialog(Widget parent,
+ popupMessageT type,
+ const char *helptext,
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *yes_label, message_cbT yes_cb, XtPointer yes_arg,
+ const char *no_label, message_cbT no_cb, XtPointer no_arg,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg,
+ const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ SIZE_SMALL,
+ type,
+ -1, -1, /* just center it */
+ helptext, msg_buf,
+ pre_cb, arg,
+ yes_label, yes_cb, yes_arg,
+ no_label, no_cb, no_arg,
+ cancel_label, cancel_cb, cancel_arg);
+ free(msg_buf);
+ return w;
+}
+#endif
+
+Widget
+choice_dialog_sized(Widget parent,
+ popupMessageT type,
+ popupMessageSizeHintT sizehint,
+ const char *helptext,
+#ifndef MOTIF
+ const char *xaw_ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_arg,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg,
+ const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ sizehint,
+ type,
+ -1, -1, /* just center it */
+ helptext, msg_buf,
+#ifndef MOTIF
+ xaw_ret_action_str,
+#endif
+ pre_cb, arg,
+ ok_label, ok_cb, ok_arg,
+ NULL, NULL, NULL,
+ cancel_label, cancel_cb, cancel_arg);
+ free(msg_buf);
+ return w;
+}
+
+Widget
+positioned_choice_dialog(Widget parent,
+ popupMessageT type,
+ int x_pos, int y_pos,
+ const char *helptext,
+#ifndef MOTIF
+ const char *xaw_ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_arg,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_arg,
+ const char *format, ...)
+{
+ char *msg_buf = NULL;
+ Widget w;
+
+ XDVI_GET_STRING_ARGP(msg_buf, format);
+
+ w = internal_popup_window(parent,
+ SIZE_SMALL,
+ type,
+ x_pos, y_pos,
+ helptext, msg_buf,
+#ifndef MOTIF
+ xaw_ret_action_str,
+#endif
+ pre_cb, arg,
+ ok_label, ok_cb, ok_arg,
+ NULL, NULL, NULL,
+ cancel_label, cancel_cb, cancel_arg);
+ free(msg_buf);
+ return w;
+}
+
+void
+warn_overstrike(void)
+{
+ static Boolean warned_overstrike = False;
+
+ if (!warned_overstrike) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ /* helptext */
+ "Greyscaling is running in copy mode; this will cause overstrike characters to "
+ "appear incorrectly, and may result in poor display quality. "
+ "Possible fixes are:\n"
+ "- Use the ``-thorough'' command-line option.\n"
+ "- Quit some other color-hungry applications (e.g. Netscape).\n"
+ "- Use the ``-install'' command-line option.\n"
+ "See the section ``GREYSCALING AND COLORMAPS'' in the "
+ "xdvi manual page for more details.",
+ /* text */
+ "Couldn't allocate enough colors - expect low display quality.");
+ warned_overstrike = True;
+ }
+}
+
+Boolean
+is_message_window(Widget w)
+{
+ int i;
+ for (i = 0; i < MAX_POPUPS; i++) {
+ if (w == popup_window[i])
+ return True;
+ }
+ return False;
+}
+
+Boolean
+kill_message_window(Widget w)
+{
+ int i;
+ for (i = 0; i < MAX_POPUPS; i++) {
+ if (g_popup_array[i] != 0 && XtIsRealized(popup_window[i]) && w == popup_window[i]) {
+ g_popup_array[i] = 0;
+ XtPopdown(popup_window[i]);
+ XtDestroyWidget(popup_window[i]);
+ XSync(DISP, True);
+ return True;
+ }
+ }
+ return False;
+}
+
+/*
+ Raise any popups that currently exist; return True iff such popups
+ exist, else False.
+*/
+Boolean
+raise_message_windows(void)
+{
+ int i;
+ Boolean have_popups = False;
+
+ for (i = 0; i < MAX_POPUPS; i++) {
+ if (g_popup_array[i] != 0 && XtIsRealized(popup_window[i])) {
+ XRaiseWindow(DISP, XtWindow(popup_window[i]));
+ have_popups = True;
+ }
+ }
+
+ return have_popups;
+}
diff --git a/Build/source/texk/xdvik/gui/message-window.h b/Build/source/texk/xdvik/gui/message-window.h
new file mode 100644
index 00000000000..61a4509edff
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/message-window.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef MESSAGE_WINDOW_H_
+#define MESSAGE_WINDOW_H_
+
+#define Xdvi_MESSAGE_DIALOG_NAME "dialog"
+#define Xdvi_MESSAGE_SHELL_NAME "message_popup"
+
+
+/*
+ * Callback before the message window is closed. It is passed
+ * the message window widget ID, and the next XtPointer argument
+ * in the message dialog calls.
+ */
+typedef void (*pre_message_cbT)(Widget w, XtPointer arg);
+/*
+ * Additional callbacks passed in as argument. It is passed
+ * the next XtPointer argument in the message dialog calls.
+ */
+typedef void (*message_cbT)(XtPointer arg);
+
+/* preferred size of dialogs, only used for Xaw ... not really hints, but
+ hard-coded values ;-) */
+typedef enum popupMessageSizeHintT_ { SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE } popupMessageSizeHintT;
+typedef enum popupMessageT_ { MSG_QUESTION, MSG_HELP, MSG_INFO, MSG_WARN, MSG_ERR } popupMessageT;
+
+extern Widget popup_message(Widget parent,
+ popupMessageT type,
+ const char *helptext,
+ const char *format, ...);
+
+#if 0 /* This function is currently unused. */
+extern Widget popup_message_sized(Widget parent,
+ popupMessageT type,
+ popupMessageSizeHintT size,
+ const char *helptext,
+ const char *format, ...);
+#endif
+
+extern Widget positioned_popup_message(Widget parent,
+ popupMessageT type,
+ int x, int y,
+ const char *helptext, const char *format, ...);
+
+extern Widget choice_dialog(Widget parent,
+ popupMessageT type,
+ const char *helptext,
+#ifndef MOTIF
+ const char *ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_args,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args,
+ const char *format, ...);
+
+#if MOTIF
+/* 3 buttons currently only implemented for Motif */
+extern Widget choice3_dialog(Widget parent,
+ popupMessageT type,
+ const char *helptext,
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *yes_label, message_cbT yes_cb, XtPointer yes_args,
+ const char *no_label, message_cbT no_cb, XtPointer no_args,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args,
+ const char *format, ...);
+#endif
+
+extern Widget choice_dialog_sized(Widget parent,
+ popupMessageT type,
+ popupMessageSizeHintT size,
+ const char *helptext,
+#ifndef MOTIF
+ const char *ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_args,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args,
+ const char *format, ...);
+
+extern Widget positioned_choice_dialog(Widget parent,
+ popupMessageT type,
+ int x_pos, int y_pos,
+ const char *helptext,
+#ifndef MOTIF
+ const char *ret_action_str,
+#endif
+ pre_message_cbT pre_cb, XtPointer arg,
+ const char *ok_label, message_cbT ok_cb, XtPointer ok_args,
+ const char *cancel_label, message_cbT cancel_cb, XtPointer cancel_args,
+ const char *format, ...);
+extern void warn_overstrike(void);
+extern Boolean raise_message_windows(void);
+extern Boolean is_message_window(Widget w);
+extern Boolean kill_message_window(Widget w);
+
+#endif /* MESSAGE_WINDOW_H_ */
diff --git a/Build/source/texk/xdvik/gui/pagesel.c b/Build/source/texk/xdvik/gui/pagesel.c
new file mode 100644
index 00000000000..945ae760fad
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/pagesel.c
@@ -0,0 +1,1520 @@
+/*
+ * Page selector for xdvi
+ *
+ * Copyright (c) 2001-2004 xdvik development team
+ *
+ * This code is derived from the page selector in xdvik-j, and
+ * parts of it are Copyright (c) 1993, 1995
+ * MATSUURA Syun syun@fuka.info.waseda.ac.jp
+ * HIRAHARA Atsushi hirahara@fuka.info.waseda.ac.jp
+ * ONO Kouichi onono@fuka.info.waseda.ac.jp
+ * All rights reserved.
+ *
+ *
+ * (SU: I was unsure how to interpret the `All rights reserved' in the
+ * previous line, so emailed Ono Kouichi about this. Here's a
+ * verbatim quote of the relevant part of his answer (which was CC'ed
+ * to Hirahara Atsushi - all three of them had left Waseda university
+ * around '95):
+ *
+ * You can modify, embed, copy and distribute a part of or the
+ * entire of our source code when you specify our copyright in your
+ * xdvik version.
+ *
+ * IANAL, but I think this is compatible with the X consortium
+ * license, which follows.)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ BUGS:
+
+ - with Xaw, the highlighting for the selected page (XawListHighlight)
+ vanishes when mouse is dragged outside the widget and then released
+ (but the respective page is selected, which is IMHO the desired behaviour).
+
+ - with Xaw, scrolling the list with PgUp/PgDown until the current page
+ gets `out of focus' should un-highlight the current page number
+
+ - The ASCII-based marks are *ugly*. Pixmaps (for the marked state)
+ would be better. The viewer gv has one (but it's Xaw only). Some
+ file directory widgets like
+ e.g. http://ftp.xfree86.org/pub/X.Org/contrib/widgets/ListTree-3.0b3.tar.gz
+ also have facilities for that, but most suffer from other
+ inadequacies (e.g. no such ting as browseSelection) and all kinds
+ of bitrot ... Another alternative would be using XmContainer
+ (see e.g. the `filemanager' example in demos/programs/filemanagers
+ in the openmotif distribution), but that's available for Motif >= 2.1 only.
+
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+
+#include "xm_toolbar.h"
+#include "xm_menu.h"
+#include "xaw_menu.h"
+
+#include "x_util.h"
+
+#ifdef MOTIF
+# include <Xm/Xm.h>
+# include <Xm/List.h>
+# include <Xm/ScrollBar.h> /* for XmScrollBarGetValues */
+#else /* MOTIF */
+# include <X11/Xaw/Dialog.h>
+# include <X11/Xaw/Cardinals.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/List.h>
+# include <X11/Xaw/Viewport.h>
+#endif /* MOTIF */
+
+#include "message-window.h"
+#include "pagesel.h"
+#include "util.h"
+#include "string-utils.h"
+#include "dvi-init.h"
+#include "statusline.h"
+#include "events.h"
+#include "print-dialog.h"
+#include "search-internal.h"
+#include "pagehist.h"
+
+#define PAGENUMLEN 128
+#define SCROLL_LIST_SCROLLBAR 0
+
+#ifndef MAX_PAGE
+# define MAX_PAGE (1024)
+#endif /* MAX_PAGE */
+
+#define LONGESTPAGENUM 55
+
+
+/* for saving the GC of the pagelist widget
+ (when un-highlighting items in highlight_page_callback, and
+ drawing the `current' marker)
+*/
+static struct page_gc {
+ GC fore;
+ GC back;
+} m_page_gc;
+
+#define MOTIF_IDX_OFFSET 1 /* motif index starts at 1, not 0 */
+#if !defined(LESSTIF_VERSION)
+static Boolean my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h);
+static void refresh_highlight_marker(Widget widget, GC gc, Position x, Position y, Dimension w, Dimension h);
+#endif /* !defined(LESSTIF_VERSION) */
+
+
+
+#ifdef MOTIF
+
+/* make button2 mark instead of drag&drop */
+static void xm_list_set_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params);
+static void xm_list_drag_mark(Widget widget, XEvent *event, String *params, Cardinal *num_params);
+static XtActionsRec CustomListActions[] = {
+ { "ListSetMark", xm_list_set_mark },
+ { "ListDragMark", xm_list_drag_mark },
+};
+static char *motif_custom_translations =
+"#override \n"
+"s <Btn2Down>: ListDragMark(ListButtonMotion)\n"
+"<Btn2Motion>: ListSetMark(ListButtonMotion)\n"
+"<Btn2Up>: ListSetMark(ListButtonMotion)\n"
+"<Btn2Down>: ListSetMark(ListButtonMotion)\n"
+"<Btn4Down>,<Btn4Up>: scroll-list-up()\n"
+"<Btn5Down>,<Btn5Up>: scroll-list-down()\n"
+/* /\* "s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginExtend)\n" *\/ */
+/* /\* "s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndExtend)\n" *\/ */
+/* /\* "~c ~s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginSelect)\n" *\/ */
+/* /\* "~c ~s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndSelect)\n" *\/ */
+/* /\* "c ~s ~m ~a <Btn2Down>: ListMyProcessBtn2(ListBeginToggle)\n" *\/ */
+/* /\* "c ~s ~m ~a <Btn2Up>: ListMyProcessBtn2(ListEndToggle)\n" *\/ */
+/* /\* "c ~s ~m a <Btn2Down>: ListProcessDrag()\n" *\/ */
+/* /\* "~c s ~m a <Btn2Down>: ListProcessDrag()\n" *\/ */
+;
+
+#define LIST_WIDGET page_list
+/* motif pagenumber is a string */
+static const char* const pageno_format = "%c %s ";
+
+#else /* MOTIF */
+
+static int view_y;
+extern Widget panel_widget;
+static Widget list_widget = NULL;
+static Widget viewport = NULL;
+#define LIST_WIDGET list_widget
+/* Xaw pagenumber is an integer, and we need to left-pad it */
+static const char* const pageno_format = "%c %*d ";
+
+static int xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int old);
+
+#define REDRAW_CURRENT_MARKER_HACK 1
+
+
+/*
+ The following hack tries to address the following 2 bugs with the
+ self-made page highlighting marker:
+
+ - the marker overlaps with the ordinary XawListHighlight marker;
+ when un-highlighting a page, 1 pixel (vertically) at the edge of
+ the ordinary marker is overdrawn.
+
+ - When the XawListHighlight crosses the self-drawn rectangle,
+ the vertical bars remain visible, but the horizontal bars
+ are erased.
+
+ The hack just redraws the appropriate items whenever one of
+ the above can happen, i.e. when the two markers are 2 or less
+ pages apart from each other.
+*/
+#if REDRAW_CURRENT_MARKER_HACK
+/* Store index of currently marked (with our own marker) list
+ item, or -1 if none is marked. */
+static int g_current_highlighted = -1;
+
+/* redraw the default Xaw list highlight (XawListHighlight()) */
+static void
+xaw_maybe_redraw_highlight(int idx)
+{
+ XawListReturnStruct *ret;
+ int high;
+
+ if (LIST_WIDGET == NULL)
+ return;
+
+ ret = XawListShowCurrent(LIST_WIDGET);
+ high = ret->list_index;
+ if (high != XAW_LIST_NONE && abs(idx - (high + MOTIF_IDX_OFFSET)) <= 2) {
+ /* re-highlight it */
+ XawListHighlight(LIST_WIDGET, high);
+ }
+ g_current_highlighted = -1;
+}
+
+/* redraw our own rectangle highlight marker: */
+static void
+xaw_maybe_redraw_current_marker(int idx)
+{
+ Position x, y;
+ Dimension w, h;
+
+ /* fprintf(stderr, "idx: %d, high: %d; diff: %d\n", idx + MOTIF_IDX_OFFSET, g_current_highlighted, */
+ /* abs(idx + MOTIF_IDX_OFFSET - g_current_highlighted)); */
+ if (abs((idx + MOTIF_IDX_OFFSET) - g_current_highlighted) <= 2
+ && my_list_pos_to_bounds(LIST_WIDGET, g_current_highlighted, &x, &y, &w, &h)) {
+ refresh_highlight_marker(LIST_WIDGET, m_page_gc.fore, x, y, w, h);
+ }
+}
+#endif /* REDRAW_CURRENT_MARKER_HACK */
+
+#endif /* MOTIF */
+
+/*
+ * Table of page offsets in DVI file, indexed by page number - 1,
+ * marked pages, and page sizes.
+ * Initialized in prepare_pages().
+ */
+struct page_index {
+ long offset;
+ int number;
+ Boolean marked;
+ unsigned int pw, ph; /* page size */
+ unsigned int ww, wh; /* window size */
+};
+
+struct page_index_info {
+ struct page_index *index; /* above struct */
+ size_t index_size; /* size of currently allocated index */
+ char **page_labels; /* label strings */
+};
+
+static struct page_index_info page_info;
+
+/* access functions used by dvi-draw.c and dvi-init.c */
+long
+pageinfo_get_offset(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ /* fprintf(stderr, "offset for page %d is %ld\n", page, page_info.index[page].offset); */
+ return page_info.index[page].offset;
+}
+
+/* access functions used by dvi-draw.c and dvi-init.c */
+unsigned int
+pageinfo_get_page_width(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ return page_info.index[page].pw;
+}
+
+unsigned int
+pageinfo_get_page_height(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ return page_info.index[page].ph;
+}
+
+unsigned int
+pageinfo_get_window_width(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ return page_info.index[page].ww;
+}
+
+unsigned int
+pageinfo_get_window_height(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ return page_info.index[page].wh;
+}
+
+void
+pageinfo_set_page_width(int page, unsigned int width)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ page_info.index[page].pw = width;
+}
+
+void
+pageinfo_set_page_height(int page, unsigned int height)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ page_info.index[page].ph = height;
+}
+
+void
+pageinfo_set_window_width(int page, unsigned int width)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ page_info.index[page].ww = width;
+}
+
+void
+pageinfo_set_window_height(int page, unsigned int height)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ page_info.index[page].wh = height;
+}
+
+int
+pageinfo_get_number(int page)
+{
+ ASSERT(page >= 0 && page < (int)page_info.index_size, "Page number out of range");
+ return page_info.index[page].number;
+}
+
+/* search for page with TeX number `number', and return its index, or -1 if it's not found. */
+int
+pageinfo_get_index_of_number(int number)
+{
+ size_t i;
+ for (i = 0; i < page_info.index_size - 1; i++) {
+ if (number == page_info.index[i].number)
+ return i;
+ }
+ return -1;
+}
+
+void
+pageinfo_set_offset(int index, long offset)
+{
+ ASSERT(index >= 0 && index < (int)page_info.index_size, "");
+ page_info.index[index].offset = offset;
+}
+
+void
+pageinfo_set_number(int index, int number)
+{
+ ASSERT(index >= 0 && index < (int)page_info.index_size, "");
+ page_info.index[index].number = number;
+}
+
+void
+pageinfo_allocate(int total_pages)
+{
+ int i;
+ page_info.index = xmalloc(total_pages * sizeof *(page_info.index));
+ for (i = 0; i < total_pages; i++) {
+ page_info.index[i].marked = False;
+ }
+ /* following initializations are handled by the respective Motif/Xaw functions */
+ page_info.page_labels = NULL;
+ page_info.index_size = total_pages;
+}
+
+/*
+ Deallocate page_info. NOTE: We mustn't free the page_labels here,
+ since the page list might survive quite some time (e.g. while fonts
+ for the new file are being generated) and needs the labels.
+*/
+void
+pageinfo_deallocate(void)
+{
+ free(page_info.index);
+ page_info.index_size = 0;
+ page_info.index = NULL;
+}
+
+#ifdef MOTIF
+void
+toggle_pagelist(void)
+{
+ Dimension curr_w, curr_x;
+ XtVaGetValues(globals.widgets.main_window,
+ XmNwidth, &curr_w,
+ XmNx, &curr_x,
+ NULL);
+
+ if ((resource.expert_mode & XPRT_SHOW_PAGELIST) != 0) {
+ XtManageChild(XtParent(page_list));
+ XtManageChild(page_list);
+
+ curr_x += resource.pagelist_width;
+ curr_w -= resource.pagelist_width;
+ XtVaSetValues(globals.widgets.main_window,
+ XtNwidth, curr_w,
+ XtNx, curr_x,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, XtParent(page_list),
+ NULL);
+ }
+ else {
+ XtUnmanageChild(XtParent(page_list));
+ XtUnmanageChild(page_list);
+
+ curr_x -= resource.pagelist_width;
+ curr_w += resource.pagelist_width;
+ XtVaSetValues(globals.widgets.main_window,
+ XmNwidth, curr_w,
+ XmNx, curr_x,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ }
+
+ set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
+}
+#endif
+
+
+Boolean
+pageinfo_have_marked_pages(void)
+{
+ int i;
+ for (i = 0; i < total_pages; i++) {
+ if (page_info.index[i].marked) {
+ return True;
+ }
+ }
+ return False;
+}
+
+
+/* return True if page i is marked, False else */
+Boolean
+pageinfo_is_marked(int i)
+{
+ ASSERT(i <= (int)page_info.index_size, "");
+ return page_info.index[i].marked;
+}
+
+
+typedef enum { SCROLL_UP, SCROLL_DOWN, CLICK } saveCmdT;
+
+
+static void internal_process_button2(Widget widget, XEvent *event);
+static int get_item_index(Widget w, int mouse_y);
+
+static int
+get_page_size(void)
+{
+ int offset = 0;
+ int min_page = 0;
+ int max_page = 0;
+ int min_pageno_len = 0;
+ int max_pageno_len = 0;
+ int i;
+
+ if (globals.dvi_file.bak_fp == NULL)
+ return 0;
+
+ for (i = 0; i < total_pages; i++) {
+ max_page = MAX(page_info.index[i].number, max_page);
+ min_page = MIN(page_info.index[i].number, min_page);
+ }
+
+ if (min_page >= 0) {
+ offset = 0; /* plus symbol is hidden */
+ } else {
+ offset = 1; /* offset for minus symbol */
+ min_page = -min_page;
+ }
+ for (min_pageno_len = offset; min_page > 0;
+ min_page /= 10, min_pageno_len++);
+
+ if (max_page >= 0) {
+ offset = 0; /* plus symbol is hidden */
+ } else {
+ offset = 1; /* offset for minus symbol */
+ max_page = -max_page;
+ }
+ for (max_pageno_len = offset; max_page > 0;
+ max_page /= 10, max_pageno_len++);
+
+ return MAX(min_pageno_len, max_pageno_len);
+ /* Plus 1 for minus symbol */
+}
+
+#if !defined(LESSTIF_VERSION)
+/* draw or erase highlight marker at position x, y with widht w an height h,
+ using suitable offsets (for sake of consistency of the latter, and because
+ of the differences Xaw/Motif, this is a separate function).
+*/
+static void
+refresh_highlight_marker(Widget widget, GC gc,
+ Position x, Position y, Dimension w, Dimension h)
+{
+ XDrawRectangle(XtDisplay(widget), XtWindow(widget), gc,
+#ifdef MOTIF
+ x + 1, y + 1, w - 3, h - 3
+#else
+ x + 2, y, w - 1, h - 1
+#endif
+ );
+}
+#endif /* !defined(LESSTIF_VERSION) */
+
+#ifndef MOTIF
+
+/* update (redisplay) the list, saving the currently highlighted item.
+ * This is invoked whenever marking the page, and the re-construction of the
+ * entire list causes considerable flicker; but I guess that's unavoidable
+ * with the current simplistic labelling scheme (with changing the list items
+ * themselves). Gv does this considerably better (using custom widgets).
+ */
+static void
+xaw_update_list(void)
+{
+ static int pagelist_width = -1;
+ static int total_pages_bak = -1;
+
+ XawListReturnStruct *ret;
+ int idx, button_width;
+
+ if (pagelist_width == -1 || total_pages != total_pages_bak) {
+ pagelist_width = xaw_get_pagelist_size();
+ total_pages_bak = total_pages;
+ }
+
+ /* save selected item */
+ ret = XawListShowCurrent(LIST_WIDGET);
+ idx = ret->list_index;
+ button_width = get_panel_width() - 2 * (resource.btn_side_spacing + resource.btn_border_width);
+ /* delete and re-create list */
+ ASSERT(total_pages <= (int)page_info.index_size, "");
+ XawListChange(LIST_WIDGET, page_info.page_labels, 0,
+ MAX(button_width, pagelist_width), False);
+ /* restore selected item */
+ if (idx != XAW_LIST_NONE) {
+ XawListHighlight(LIST_WIDGET, idx);
+ }
+}
+
+/*
+ return height of a row in the list widget, and the initial offset of XtNinternalHeight
+ in parameters row_height and internal_h
+*/
+static void
+xaw_get_row_height(Widget w, Dimension *row_height, Dimension *internal_h)
+{
+ Dimension row_space;
+ XFontStruct *font;
+ Arg arglist[5];
+ int i = 0;
+
+ if (w == NULL || !XtIsRealized(w))
+ return;
+
+ XtSetArg(arglist[i], XtNfont, &font); ++i;
+ XtSetArg(arglist[i], XtNrowSpacing, &row_space); ++i;
+ XtSetArg(arglist[i], XtNinternalHeight, internal_h); i++;
+ XtGetValues(w, arglist, i);
+ *row_height = font->max_bounds.ascent + font->max_bounds.descent + row_space;
+}
+
+/*
+ * Get pagelist width.
+ */
+int
+xaw_get_pagelist_size(void)
+{
+ Widget w;
+ XFontStruct *font;
+
+ w = XtVaCreateWidget("list", listWidgetClass, globals.widgets.top_level, NULL);
+ XtVaGetValues(w, XtNfont, &font, NULL);
+ XtDestroyWidget(w);
+
+ /* have space for max. pageno + space + current-marker,
+ plus a few pixels for right margin */
+ return (get_page_size() + 2) * get_avg_font_width(font) + 6;
+}
+
+/* auto-scroll pagelist when mouse-1 is down and moved above top or below bottom of
+ page list.
+*/
+static void
+xaw_drag_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont)
+{
+ int y, idx, actual_idx = 0;
+
+ UNUSED(data);
+ UNUSED(cont);
+
+ if (event->xany.type == ButtonPress || ((event->xbutton.state & Button1Mask) == 0))
+ return;
+ if (event->xany.type == MotionNotify)
+ y = (int)event->xmotion.y;
+ else
+ y = (int)event->xbutton.y;
+
+ idx = get_item_index(widget, y);
+
+ if (idx <= 0) {
+ idx = 1;
+ }
+ else if (idx > total_pages) {
+ idx = total_pages;
+ }
+
+ actual_idx = xaw_maybe_scroll_pagelist(idx, False, actual_idx);
+ XawListHighlight(LIST_WIDGET, idx - MOTIF_IDX_OFFSET);
+
+ /* if (event->xany.type == ButtonRelease) { */
+ /* fprintf(stderr, "1\n"); */
+ /* page_history_insert(idx - MOTIF_IDX_OFFSET); */
+ /* goto_page(idx - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home); */
+ /* search_signal_page_changed(); */
+ /* } */
+}
+
+static void
+xaw_SendReportProc(Widget w, XtPointer closure, XtPointer call_data)
+{
+ XawPannerReport *rep = (XawPannerReport *) call_data;
+
+ UNUSED(w);
+ UNUSED(closure);
+
+ view_y = rep->slider_y;
+}
+
+#endif /* not MOTIF */
+
+
+
+/* returns the index of the current item in `Motif'-style, i.e. first item has index 1, not 0 */
+static int
+get_item_index(Widget w, int mouse_y)
+{
+#ifdef MOTIF
+ return XmListYToPos(w, mouse_y);
+#else
+ Dimension row_height, internal_height;
+
+ xaw_get_row_height(w, &row_height, &internal_height);
+ return (mouse_y - internal_height) / row_height + MOTIF_IDX_OFFSET;
+#endif
+}
+
+#if !defined(LESSTIF_VERSION)
+/* idx is Motif-style index, i.e. 1 for 1st item, not 0 */
+static Boolean
+my_list_pos_to_bounds(Widget widget, int idx, Position *x, Position *y, Dimension *w, Dimension *h)
+{
+#ifdef MOTIF
+ Position x1, y1;
+ Dimension w1, h1;
+ if (XmListPosToBounds(widget, idx, &x1, &y1, &w1, &h1)) {
+ *x = x1;
+ *y = y1;
+ *w = w1;
+ *h = h1;
+ return True;
+ }
+ return False;
+#else
+ Dimension row_height, internal_height;
+ /* FIXME: Remove this hard-coded offset! */
+ const int X_OFFSET = 9;
+ const int RULE_OFFSET = 2;
+
+ if (idx <= 0 || idx > total_pages) {
+ return False;
+ }
+
+ if (viewport != NULL && XtIsRealized(viewport))
+ XtVaGetValues(viewport, XtNx, x, NULL);
+ xaw_get_row_height(widget, &row_height, &internal_height);
+ XtVaGetValues(widget, XtNwidth, w, NULL);
+
+ *x -= X_OFFSET;
+ *y = row_height * idx + internal_height - row_height - 1;
+ *w -= RULE_OFFSET;
+ *h = row_height + RULE_OFFSET;
+
+ return True;
+#endif
+}
+
+
+/* draw a hightlight rectangle around the page the mouse is currently over, to
+ make e.g. marking easier.
+*/
+static void
+highlight_page_callback(Widget widget, XtPointer data, XEvent *event, Boolean *cont)
+{
+ int curr_idx = get_item_index(widget, event->xmotion.y);
+ Position x, y;
+ Dimension w, h;
+ static int idx_bak = -1;
+
+ UNUSED(data);
+ UNUSED(cont);
+
+ switch(event->xany.type) {
+ case ButtonPress:
+ case ButtonRelease:
+ case MotionNotify:
+ /* might need to un-highlight previous one */
+ if (idx_bak >= 0 && idx_bak != curr_idx
+ && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h)) {
+ /* fprintf(stderr, "index: %d, %d, h: %d, w: %d\n", x, y, h, w); */
+ refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h);
+#if REDRAW_CURRENT_MARKER_HACK
+ xaw_maybe_redraw_highlight(curr_idx);
+#endif
+ }
+ idx_bak = curr_idx;
+ /* redraw unless out of bounds (when pagelist is shorter than view area) */
+ if (my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) {
+ refresh_highlight_marker(widget, m_page_gc.fore, x, y, w, h);
+#if REDRAW_CURRENT_MARKER_HACK
+ g_current_highlighted = curr_idx;
+#endif
+ }
+ break;
+ case LeaveNotify:
+ /* this might look overly complicated, but is neccessary to cover all
+ cases of 1-pixel movement up/down before leaving the list, or no
+ movement at all before leaving it. */
+ if ((idx_bak >= 0 && idx_bak != curr_idx && my_list_pos_to_bounds(widget, idx_bak, &x, &y, &w, &h))
+ || my_list_pos_to_bounds(widget, curr_idx, &x, &y, &w, &h)) {
+ refresh_highlight_marker(widget, m_page_gc.back, x, y, w, h);
+#if REDRAW_CURRENT_MARKER_HACK
+ xaw_maybe_redraw_highlight(curr_idx);
+#endif
+ }
+ break;
+ default:
+ break;
+ }
+}
+#endif /* !defined(LESSTIF_VERSION) */
+
+/*
+ * invoked on Button-1 Down.
+ */
+static void
+select_page_callback(Widget w, XtPointer closure, XtPointer call_data)
+{
+#ifdef MOTIF
+ XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data;
+ int new = cbs->item_position;
+
+ UNUSED(w);
+ UNUSED(closure);
+
+ maybe_scroll_pagelist(new - MOTIF_IDX_OFFSET, False);
+ page_history_insert(new - MOTIF_IDX_OFFSET);
+ goto_page(new - MOTIF_IDX_OFFSET, resource.keep_flag ? NULL : home, False);
+#else
+ XawListReturnStruct *item = (XawListReturnStruct *) call_data;
+ int new = item->list_index;
+
+ UNUSED(w);
+ UNUSED(closure);
+
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "got: button-1 for `%d'\n", new);
+
+#if 0
+ fprintf(stderr, "select page: %d\n", new);
+#endif
+ maybe_scroll_pagelist(new, False);
+ page_history_insert(new);
+ goto_page(new, resource.keep_flag ? NULL : home, False);
+ statusline_erase("Page history:");
+#endif
+ search_signal_page_changed();
+}
+
+
+static void
+init_pagelabels(int start, int end)
+{
+ int i;
+ char s[PAGENUMLEN];
+#if 0
+ fprintf(stderr, "===== init_pagelabels from %d to %d\n", start, end);
+#endif
+ ASSERT(end < (int)page_info.index_size, "");
+
+ page_info.page_labels = xrealloc(page_info.page_labels, sizeof *(page_info.page_labels) * (end + 2));
+ for (i = start; i < end; i++) {
+ if (page_info.index[i].marked)
+ sprintf(s, "* %*d ", get_page_size(),
+ resource.use_tex_pages ? page_info.index[i].number : i + 1);
+ else
+ sprintf(s, " %*d ", get_page_size(),
+ resource.use_tex_pages ? page_info.index[i].number : i + 1);
+
+ page_info.page_labels[i] = xstrdup(s);
+ }
+ page_info.page_labels[i] = NULL; /* terminate - important for creating the widget. */
+}
+
+
+#ifdef MOTIF
+
+
+static int
+xm_get_top_visible(int start)
+{
+ int top = start;
+ while (top < total_pages && !XmListPosToBounds(LIST_WIDGET, top, NULL, NULL, NULL, NULL))
+ top++;
+ return top;
+}
+
+static int
+xm_get_bottom_visible(int start)
+{
+ int bot = start;
+ while (bot < total_pages && XmListPosToBounds(LIST_WIDGET, bot, NULL, NULL, NULL, NULL))
+ bot++;
+ bot--;
+ return bot;
+}
+
+/* Scroll pagelist down or up if needed, and update top_visible and
+ bot_visible. List is always scrolled so that 1 element is still
+ visible below or above pointer, to make it possible to flip through
+ document by repeatedly clicking on first/last.
+*/
+static void
+xm_maybe_scroll_pagelist(int current, saveCmdT curr_cmd, int *top_visible, int *bot_visible)
+{
+#if 0
+ fprintf(stderr, "topmost visible: %d, bottom: %d, current: %d, total: %d\n",
+ top_visible, bottom_visible, current, total_pages);
+#endif
+
+ if (current < *top_visible && curr_cmd != SCROLL_DOWN) {
+ XmListSetPos(LIST_WIDGET,
+ current < 1
+ ? 1
+ : current);
+ (*top_visible)--;
+ (*bot_visible)--;
+ }
+ else if (current + MOTIF_IDX_OFFSET >= *bot_visible && curr_cmd != SCROLL_UP) {
+ XmListSetBottomPos(LIST_WIDGET,
+ current + MOTIF_IDX_OFFSET >= total_pages
+ ? current + MOTIF_IDX_OFFSET
+ : current + MOTIF_IDX_OFFSET + 1);
+ (*top_visible)++;
+ (*bot_visible)++;
+ }
+}
+
+static void
+xm_set_page_labels(void)
+{
+ int i;
+ char buf[PAGENUMLEN];
+
+ XmString *motif_page_labels = xmalloc((total_pages + 2) * sizeof *motif_page_labels);
+
+ for (i = 0; i < total_pages; ++i) {
+ sprintf(buf, pageno_format, ' ', page_info.page_labels[i]);
+ motif_page_labels[i] = XmStringCreateLocalized(buf);
+ }
+ XmListDeleteAllItems(LIST_WIDGET);
+ XmListAddItems(LIST_WIDGET, motif_page_labels, total_pages, 0);
+
+ XmListSelectPos(LIST_WIDGET, current_page + MOTIF_IDX_OFFSET, False);
+ for (i = 0; i < total_pages; ++i) {
+ XmStringFree(motif_page_labels[i]);
+ }
+ free(motif_page_labels);
+}
+
+static void
+xm_toggle_label(Widget widget, int idx, Boolean update)
+{
+ /* TODO: use `update' to update all labels at once when toggling multiple */
+ XmString str;
+ char *mark_font, buf[128];
+
+ if (widget == NULL)
+ return;
+
+ UNUSED(update);
+
+ /* ensure_labelinfo_size(idx); */
+ ASSERT(idx < (int)page_info.index_size, "");
+ if (!page_info.index[idx].marked) {
+ sprintf(buf, pageno_format, '*', page_info.page_labels[idx]);
+ mark_font = "MARKED";
+ page_info.index[idx].marked = True;
+ }
+ else {
+ sprintf(buf, pageno_format, ' ', page_info.page_labels[idx]);
+ mark_font = "UNMARKED";
+ page_info.index[idx].marked = False;
+ }
+ /* str = XmStringCreateLocalized(buf); */
+ str = XmStringCreateLtoR(buf, mark_font);
+ XmListReplaceItemsPos(widget, &str, 1, idx + MOTIF_IDX_OFFSET);
+ XmStringFree(str);
+}
+
+
+#else /* MOTIF */
+
+static void
+mark_page_callback(Widget w, XtPointer data, XEvent *event, Boolean *cont)
+{
+ UNUSED(data);
+ UNUSED(cont);
+
+ /* moving button2 generates MotionNotify events for button0 */
+ if (event->type == MotionNotify || event->xbutton.button == Button2)
+ internal_process_button2(w, event);
+
+ if (event->type != ButtonPress)
+ notify_print_dialog_have_marked();
+}
+
+void
+xaw_create_pagelist_widgets(Dimension height, Dimension width, Position y, Widget parent)
+{
+ viewport = XtVaCreateWidget("viewport",
+ viewportWidgetClass, parent,
+ XtNallowVert, True,
+ /* this is not related to the scroll bar: */
+ /* XtNforceBars, True, */
+ XtNx, resource.btn_side_spacing,
+ XtNy, y,
+ XtNheight, height,
+ XtNwidth, width,
+ NULL);
+ LIST_WIDGET = XtVaCreateWidget("list",
+ listWidgetClass, viewport,
+ XtNlist, page_info.page_labels,
+ XtNdefaultColumns, 1,
+ XtNforceColumns, True,
+ XtNx, 10,
+ XtNy, 10,
+ XtNheight, height,
+ XtNwidth, width - 10,
+ XtNlongest, LONGESTPAGENUM,
+ XtNverticalList, True,
+ NULL);
+ XtManageChild(LIST_WIDGET);
+ XtManageChild(viewport);
+ XtAddCallback(LIST_WIDGET, XtNcallback, select_page_callback,
+ (XtPointer) NULL);
+ /* for scrolling the list */
+ XtAddCallback(viewport, XtNreportCallback, xaw_SendReportProc,
+ (XtPointer) NULL);
+ XtAddEventHandler(LIST_WIDGET,
+ ButtonPressMask | ButtonReleaseMask | Button2MotionMask,
+ False, mark_page_callback, (XtPointer)NULL);
+
+ if (resource.pagelist_highlight_current)
+ XtAddEventHandler(LIST_WIDGET,
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask,
+ False, highlight_page_callback, (XtPointer)NULL);
+
+
+ {
+ Widget y_bar;
+ XtTranslations xlats = XtParseTranslationTable(
+ "<Btn4Down>,<Btn4Up>: scroll-list-up()\n"
+ "<Btn5Down>,<Btn5Up>: scroll-list-down()\n");
+
+ XtOverrideTranslations(LIST_WIDGET, xlats);
+
+ y_bar = XtNameToWidget(viewport, "vertical");
+ if (y_bar != NULL)
+ XtOverrideTranslations(y_bar, xlats);
+ }
+
+ XtAddEventHandler(LIST_WIDGET,
+ /* FIXME: We should add PointerMotionMask here, but handling PointerMotionMask
+ currently doesn't work with the Xaw list widget: the auto-scrolling code doesn't
+ realize when the mouse direction of the pointer movement changes, and continues
+ to scroll into the same direction. This will be rather annoying for users, so
+ we disabled PointerMotionMask for the time being.
+ */
+ ButtonReleaseMask /* | PointerMotionMask */ | Button1MotionMask,
+ False, xaw_drag_page_callback, (XtPointer)NULL);
+}
+
+static void
+xaw_toggle_label(Widget w, int idx, Boolean update)
+{
+ if (w == NULL)
+ return;
+
+ /* ensure_labelinfo_size(idx); */
+ ASSERT(idx < (int)page_info.index_size, "");
+ if (!page_info.index[idx].marked) {
+ /* sprintf(toc[idx], "* %*d ", get_page_size(), page_index[idx].number); */
+ sprintf(page_info.page_labels[idx], pageno_format, '*', get_page_size(),
+ resource.use_tex_pages ? page_info.index[idx].number : idx + 1);
+ page_info.index[idx].marked = True;
+ }
+ else {
+ sprintf(page_info.page_labels[idx], pageno_format, ' ', get_page_size(),
+ resource.use_tex_pages ? page_info.index[idx].number : idx + 1);
+ /* sprintf(toc[idx], " %*d ", get_page_size(), page_index[idx].number); */
+ page_info.index[idx].marked = False;
+ }
+
+ if (update)
+ xaw_update_list();
+}
+
+static int
+xaw_maybe_scroll_pagelist(int new_page, Boolean force_recenter, int idx_bak)
+{
+ Position x;
+ Position y, new_y, bot_y;
+ Dimension view_height, row_height, internal_height;
+ /* Dimension clip_height; */
+ /* static Widget list_clip = 0; */
+
+ if (LIST_WIDGET == NULL || (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0)
+ return idx_bak;
+
+ /* if (list_clip == 0) { */
+ /* list_clip = XtNameToWidget(viewport, "clip"); */
+ /* } */
+ /* if (XtIsRealized(list_clip)) */
+ /* XtVaGetValues(list_clip, XtNheight, &clip_height, XtNx, &cx, XtNy, &y1, NULL); */
+ if (viewport != NULL && XtIsRealized(viewport))
+ XtVaGetValues(viewport, XtNheight, &view_height, XtNx, &x, NULL);
+ /* fprintf(stderr, "diff: %d, %d, %d, %d, %d\n", cx - x, clip_height, view_height, y1, (int)y2); */
+ xaw_get_row_height(LIST_WIDGET, &row_height, &internal_height);
+ y = row_height * new_page;
+
+#if DEBUG
+ fprintf(stderr, "###### xaw_maybe_scroll_pagelist: y %d, view_y %d, view_height %d, row_height %d, internal_height %d; actual %d\n",
+ y, view_y, view_height, row_height, internal_height, idx_bak);
+#endif
+ /*FIXME: when page list is destroyed, view_y will be 0 until user scrolls page list */
+ bot_y = view_y + view_height;
+ if (force_recenter || ((y >= bot_y - row_height))) {
+#if DEBUG
+ fprintf(stderr, "scrolled below bottom; incrementing %d to %d\n", view_y, view_y + row_height);
+#endif
+ y += row_height;
+ XawViewportSetCoordinates(viewport, x, y - view_height > 0 ? y - view_height : 0);
+ return new_page + 1;
+ }
+ else if (force_recenter || ((y <= view_y + row_height + internal_height))) {
+#if DEBUG
+ fprintf(stderr, "scrolled over top; new_y: %d\n", y - row_height);
+#endif
+ new_y = y - 2 * row_height;
+ XawViewportSetCoordinates(viewport, x, new_y);
+ return new_page - 1;
+ }
+ /* not scrolled */
+ return -2;
+}
+
+#endif /* MOTIF */
+
+
+/* idx is C-style index (0-based), not Motif one (1-based) */
+static void
+toggle_label(Widget widget, int idx, Boolean update)
+{
+ if (idx >= total_pages)
+ return;
+ ASSERT(idx < total_pages, "");
+ ASSERT(idx >= 0, "");
+#ifdef MOTIF
+ xm_toggle_label(widget, idx, update);
+#else
+ xaw_toggle_label(widget, idx, update);
+#endif
+}
+
+
+void
+list_toggle_marks(int arg)
+{
+ int i;
+
+ if (arg < 0) { /* mark all */
+ for (i = 0; i < total_pages; i++) {
+ ASSERT(i < (int)page_info.index_size, "");
+ /* ensure_labelinfo_size(i); */
+ if (!page_info.index[i].marked) {
+ toggle_label(LIST_WIDGET, i, False);
+ }
+ }
+ }
+ else if (arg == 0) { /* unmark all */
+ for (i = 0; i < total_pages; i++) {
+ ASSERT(i < (int)page_info.index_size, "");
+ /* ensure_labelinfo_size(i); */
+ if (page_info.index[i].marked) {
+ toggle_label(LIST_WIDGET, i, False);
+ }
+ }
+ }
+ else { /* toggle odd/even */
+ if (arg == 2) /* toggle even */
+ arg = 0;
+ for (i = 0; i < total_pages; i++) {
+ if ((i + 1) % 2 == arg) {
+ toggle_label(LIST_WIDGET, i, False);
+ }
+ }
+ }
+ /* TODO: update widget once for Motif as well! */
+#ifndef MOTIF
+ xaw_update_list();
+#endif
+ notify_print_dialog_have_marked();
+}
+
+static Boolean PagelistInitialized = False;
+
+#ifndef MOTIF
+void
+handle_pagelist_resize(void)
+{
+ /* TODO: the following will mess up the geometry of the list
+ (doesn't increase height, and incrementally decreases width):
+ if (list_widget) {
+ Dimension height;
+ --- without the (un)manage, I get an X Error:
+ XtMakeGeometryRequest - parent has no geometry manager
+ ---
+ XtUnmanageChild(viewport);
+ XtUnmanageChild(LIST_WIDGET);
+ XtVaGetValues(globals.widgets.clip_widget, XtNheight, &height, NULL);
+ height -= resource.btn_top_spacing + resource.btn_border_width + global_y_pos;
+ XtVaSetValues(viewport, XtNheight, height, NULL);
+ XtManageChild(LIST_WIDGET);
+ XtManageChild(viewport);
+ }
+ ... so we use brute force instead: */
+ handle_destroy_pagelist(LIST_WIDGET, NULL, NULL);
+ create_pagelist();
+}
+
+void
+handle_destroy_pagelist(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ if (viewport != NULL) {
+ XtDestroyWidget(viewport);
+ viewport = NULL;
+ LIST_WIDGET = NULL;
+ }
+ PagelistInitialized = False;
+}
+#endif /* MOTIF */
+
+void
+create_pagelist(void)
+{
+ Pixel background, foreground;
+#ifdef MOTIF
+
+ /* items = xrealloc(items, sizeof *items * (total_pages + 2)); */
+ init_pagelabels(0, total_pages);
+ xm_set_page_labels();
+ if (!PagelistInitialized) {
+ XtAppContext app;
+
+ XtVaGetValues(LIST_WIDGET, XmNforeground, &foreground, XmNbackground, &background, NULL);
+ m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground);
+ m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background);
+ XtManageChild(LIST_WIDGET);
+
+ XtAddCallback(LIST_WIDGET, XmNbrowseSelectionCallback, select_page_callback, NULL);
+#if !defined(LESSTIF_VERSION)
+ /*
+ Don't use the highlighting hack with LessTif, since its XmListPosToBounds()
+ is too broken to be usable (as of 0.93.36):
+ - it returns generally too low values, apparently it doesn't take
+ XmNlistSpacing into account;
+ - it doesn't take scrollbar position into account.
+ */
+ if (resource.pagelist_highlight_current)
+ XtAddEventHandler(LIST_WIDGET,
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask,
+ False, highlight_page_callback, (XtPointer)NULL);
+#endif /* !defined(LESSTIF_VERSION) */
+ app = XtWidgetToApplicationContext(globals.widgets.top_level);
+ XtAppAddActions(app, CustomListActions, XtNumber(CustomListActions));
+ XtOverrideTranslations(LIST_WIDGET, XtParseTranslationTable(motif_custom_translations));
+ PagelistInitialized = True;
+ }
+#else /* MOTIF */
+ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0) {
+ PagelistInitialized = False; /* might need to re-create widgets in this case */
+ return;
+ }
+
+ if (globals.debug & DBG_GUI)
+ fprintf(stderr, "allocating list with %d pages\n", total_pages);
+
+ init_pagelabels(0, total_pages);
+ if (!PagelistInitialized) {
+ xaw_create_pagelist();
+ XtVaGetValues(LIST_WIDGET, XtNforeground, &foreground, XtNbackground, &background, NULL);
+ m_page_gc.back = set_or_make_gc(NULL, GXcopy, background, foreground);
+ m_page_gc.fore = set_or_make_gc(NULL, GXcopy, foreground, background);
+ PagelistInitialized = True;
+ }
+#endif /* MOTIF */
+ /* scroll to the current page if needed */
+ maybe_scroll_pagelist(current_page, False);
+}
+
+#ifndef MOTIF
+static void
+free_pagelabels(void)
+{
+ int i;
+ for (i = 0; page_info.page_labels != NULL && page_info.page_labels[i] != NULL; i++) {
+ free(page_info.page_labels[i]);
+ }
+ free(page_info.page_labels);
+ page_info.page_labels = NULL;
+}
+#endif /* not MOTIF */
+
+
+void
+refresh_pagelist(int newsize, int newpage)
+{
+ if (
+#ifndef MOTIF
+ (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 ||
+#endif
+ !XtIsRealized(globals.widgets.top_level))
+ return;
+
+#ifdef DEBUG
+ fprintf(stderr, "=== refresh_pagelist: newsize %d, newpage %d\n", newsize, newpage);
+#endif
+#ifdef MOTIF
+ /* items = xrealloc(items, sizeof *items * (newsize + 2)); */
+ init_pagelabels(0, newsize);
+ xm_set_page_labels();
+#else /* MOTIF */
+ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0)
+ return;
+
+ /* FIXME - is this really neccessary?? The alternative:
+ XawListChange(LIST_WIDGET, page_info.page_labels, newsize, 0, True);
+ has problems when freeing the page labels afterwards.
+ */
+ handle_destroy_pagelist(LIST_WIDGET, NULL, NULL);
+
+ free_pagelabels();
+ init_pagelabels(0, newsize);
+
+ xaw_create_pagelist();
+#endif /* MOTIF */
+ /* `True' since the pagelist is newly created */
+ maybe_scroll_pagelist(newpage, True);
+}
+
+void
+maybe_scroll_pagelist(int newpage, Boolean force_recenter)
+{
+#ifdef MOTIF
+ int top_visible, bot_visible;
+ UNUSED(force_recenter);
+#endif
+
+ if (
+#ifndef MOTIF
+ (resource.expert_mode & XPRT_SHOW_BUTTONS) == 0 ||
+#endif
+ !XtIsRealized(globals.widgets.top_level))
+ return;
+
+#ifdef MOTIF
+ XmListSelectPos(LIST_WIDGET, newpage + MOTIF_IDX_OFFSET, False);
+
+ top_visible = xm_get_top_visible(1);
+ bot_visible = xm_get_bottom_visible(top_visible);
+
+ xm_maybe_scroll_pagelist(newpage, CLICK, &top_visible, &bot_visible);
+#if HAVE_XPM
+ tb_check_navigation_sensitivity(current_page);
+#endif
+#else
+
+ if (LIST_WIDGET == NULL)
+ return;
+
+ (void)xaw_maybe_scroll_pagelist(newpage + 1, force_recenter, 0);
+
+ XawListHighlight(LIST_WIDGET, newpage);
+#if REDRAW_CURRENT_MARKER_HACK
+ /* if the XawListHighlight happens adjacent to the page that was
+ last highlighted with our home-made `current selected'
+ rectangle, it might overdraw that rectangle. In this case,
+ restore it:
+ */
+ xaw_maybe_redraw_current_marker(newpage);
+#endif
+#endif
+}
+
+#ifdef MOTIF
+static void
+set_all_marks(int from, int to)
+{
+ int i;
+ for (i = from; i < to; i++) {
+ /* ensure_labelinfo_size(i); */
+ page_info.index[i].marked = True;
+ toggle_label(LIST_WIDGET, i, False);
+ }
+}
+
+static void
+internal_process_button2_drag(Widget widget, XEvent *event)
+{
+ int i, idx, min = total_pages, max = 0;
+ idx = get_item_index(widget, event->xbutton.y);
+
+ for (i = 0; i < total_pages; i++) {
+ /* ensure_labelinfo_size(i); */
+ if (page_info.index[i].marked && i > max)
+ max = i;
+ }
+ for (i = total_pages; i > 0; i--) {
+ /* ensure_labelinfo_size(i); */
+ if (page_info.index[i].marked && i < min)
+ min = i;
+ }
+
+ if (min == total_pages)
+ min = 0;
+ if (max == 0)
+ max = total_pages;
+
+ if (idx < min) {
+ set_all_marks(idx, min);
+ }
+ else if (idx > max) {
+ set_all_marks(max + 1, idx);
+ }
+ else {
+ set_all_marks(0, idx);
+ }
+}
+#endif /* MOTIF */
+
+static void
+internal_process_button2(Widget widget, XEvent *event)
+{
+ int curr_idx;
+ static int prev_idx = 0;
+#ifndef MOTIF
+ static int actual_idx = -2;
+#endif
+ static int top_visible = 0, bot_visible = 0;
+ static int prev_y = 0, curr_y = 0;
+ static saveCmdT prev_cmd = 0; /* previous command (CLICK/SCROLL_UP/SCROLL_DOWN) */
+ static saveCmdT curr_cmd = 0; /* current command (CLICK/SCROLL_UP/SCROLL_DOWN) */
+ static saveCmdT bak_cmd = 0; /* last command that started inside the pagelist (CLICK/SCROLL_UP/SCROLL_DOWN) */
+ static Boolean change_scroll_direction = False;
+
+ switch(event->xany.type) {
+ case ButtonPress:
+ prev_y = event->xbutton.y;
+ prev_idx = curr_idx = get_item_index(widget, prev_y);
+#ifdef MOTIF
+ top_visible = xm_get_top_visible(1);
+ bot_visible = xm_get_bottom_visible(top_visible);
+#endif
+ toggle_label(widget, curr_idx - 1, True);
+ prev_cmd = CLICK;
+#ifdef MOTIF
+ xm_maybe_scroll_pagelist(curr_idx - 1, CLICK, &top_visible, &bot_visible);
+#else
+ actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
+#endif
+ break;
+ case ButtonRelease:
+ prev_cmd = CLICK;
+ break;
+ case MotionNotify:
+ curr_y = (int)event->xmotion.y;
+ curr_idx = get_item_index(widget, event->xmotion.y);
+#ifndef MOTIF
+ if (actual_idx > 0) {
+ curr_idx = actual_idx;
+ }
+#endif
+
+ if (curr_y < prev_y)
+ curr_cmd = SCROLL_UP;
+ else if (curr_y > prev_y)
+ curr_cmd = SCROLL_DOWN;
+ prev_y = curr_y;
+
+ if (prev_cmd != CLICK && curr_cmd != prev_cmd)
+ change_scroll_direction = True;
+
+ if ((curr_idx != prev_idx && !change_scroll_direction)
+ || (change_scroll_direction
+ /* last or first visible are always spared, unless they are really
+ the first or last page; this way, always 1 more page is visible
+ than is currently marked/selected
+ */
+ && !(curr_idx == top_visible) && !(curr_idx == bot_visible))) {
+ if (curr_idx <= 0) {
+ /* When user has scrolled off, mark this by setting curr_idx to 1 more or less
+ than the pagelist has so that the last/first page don't oscillate between
+ marked/unmarked state when user continues to scroll.
+ Also, we continue scrolling as long as user drags in the same direction as
+ the last `real' scrolling event (saved as bak_cmd).
+ */
+ if (curr_cmd == SCROLL_DOWN && bak_cmd == SCROLL_DOWN && prev_idx <= total_pages) {
+ curr_idx = prev_idx + 1;
+ }
+ else if (curr_cmd == SCROLL_UP && bak_cmd == SCROLL_UP && prev_idx > 0) {
+ curr_idx = prev_idx - 1;
+ }
+ }
+
+
+ if (curr_idx > 0 && curr_idx <= total_pages) {
+ toggle_label(widget, curr_idx - 1, True);
+#ifdef MOTIF
+ xm_maybe_scroll_pagelist(curr_idx - 1, curr_cmd, &top_visible, &bot_visible);
+#else
+ actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
+#endif
+ prev_idx = curr_idx;
+ bak_cmd = curr_cmd;
+ change_scroll_direction = False;
+ }
+ else {
+#ifndef MOTIF
+ if (curr_idx > total_pages)
+ actual_idx = -2;
+ else
+ actual_idx = xaw_maybe_scroll_pagelist(curr_idx, False, actual_idx);
+#endif
+ }
+ prev_cmd = curr_cmd;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void
+list_toggle_current(int arg)
+{
+ toggle_label(LIST_WIDGET, arg, True);
+
+ notify_print_dialog_have_marked();
+}
+
+#ifdef MOTIF
+
+static void
+xm_list_set_mark(Widget widget,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ UNUSED(params);
+
+ if ((*num_params != 1) || !XmIsList(widget))
+ return;
+
+ internal_process_button2(widget, event);
+
+ if (event->type != ButtonPress)
+ notify_print_dialog_have_marked();
+}
+
+static void
+xm_list_drag_mark(Widget widget,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ UNUSED(params);
+
+ if ((*num_params != 1) || !XmIsList(widget))
+ return;
+
+ internal_process_button2_drag(widget, event);
+
+ if (event->type != ButtonPress)
+ notify_print_dialog_have_marked();
+}
+
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/pagesel.h b/Build/source/texk/xdvik/gui/pagesel.h
new file mode 100644
index 00000000000..aad1b591456
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/pagesel.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Page selector for xdvi
+ *
+ * Copyright (c) 1993, 1995
+ * MATSUURA Syun syun@fuka.info.waseda.ac.jp
+ * HIRAHARA Atsushi hirahara@fuka.info.waseda.ac.jp
+ * ONO Kouichi onono@fuka.info.waseda.ac.jp
+ *
+ * All rights reserved.
+ */
+
+/* SU: I was unsure how to interpret the `All rights reserved' in the
+ * previous line, so emailed Ono Kouichi about this. Here's (the
+ * relevant part of) his answer (which was CC'ed to Hirahara Atsushi -
+ * all three of them had left Waseda university around '95):
+ *
+ * You can modify, embed, copy and distribute a part of or the
+ * entire of our source code when you specify our copyright in your
+ * xdvik version.
+ *
+ * IANAL, but I think this is compatible with the X consortium
+ * license as specified in the other files.
+ */
+
+#ifndef PAGESEL_H_
+#define PAGESEL_H_
+
+#include "xdvi.h"
+
+extern void refresh_pagelist(int newsize, int newpage);
+extern void maybe_scroll_pagelist(int newpage, Boolean force_recenter);
+extern void create_pagelist(void);
+extern void list_toggle_current(int arg);
+extern void list_toggle_marks(int arg);
+
+# ifdef MOTIF
+extern Widget page_list;
+extern void toggle_pagelist(void);
+# else
+extern int xaw_get_pagelist_size(void);
+extern void xaw_create_pagelist_widgets(Dimension height, Dimension width, Position y, Widget parent);
+extern void handle_destroy_pagelist(Widget w, XtPointer client_data, XtPointer call_data);
+extern void handle_pagelist_resize(void);
+# endif
+
+/* pageinfo access methods */
+extern long pageinfo_get_offset(int page);
+extern int pageinfo_get_number(int page);
+extern int pageinfo_get_index_of_number(int number);
+
+extern unsigned int pageinfo_get_page_width(int page);
+extern unsigned int pageinfo_get_page_height(int page);
+extern unsigned int pageinfo_get_window_width(int page);
+extern unsigned int pageinfo_get_window_height(int page);
+
+extern void pageinfo_set_page_width(int page, unsigned int width);
+extern void pageinfo_set_page_height(int page, unsigned int height);
+extern void pageinfo_set_window_width(int page, unsigned int width);
+extern void pageinfo_set_window_height(int page, unsigned int height);
+
+extern void pageinfo_set_offset(int index, long offset);
+extern void pageinfo_set_number(int index, int number);
+
+extern void pageinfo_allocate(int total_pages);
+extern void pageinfo_deallocate(void);
+extern Boolean pageinfo_is_marked(int i);
+extern Boolean pageinfo_have_marked_pages(void);
+
+#endif /* PAGESEL_H_ */
diff --git a/Build/source/texk/xdvik/gui/print-dialog.c b/Build/source/texk/xdvik/gui/print-dialog.c
new file mode 100644
index 00000000000..2a21077414e
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/print-dialog.c
@@ -0,0 +1,2444 @@
+/*
+ * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ SU: Adapted from non-k xdvi's popups.c and added saving functionality.
+*/
+
+#include "xdvi-config.h"
+#include <string.h>
+#include "xdvi.h"
+#include "my-vsnprintf.h"
+#include <ctype.h>
+
+#include "print-dialog.h"
+#include "print-internal.h"
+#include "print-log.h"
+#include "print-internal.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "string-utils.h"
+#include "util.h"
+#include "x_util.h"
+#include "message-window.h"
+#include "pagesel.h"
+#include "my-snprintf.h"
+#include "sfSelFile.h"
+#include "dvisel.h" /* for select_marked_pages() */
+#include "xlwradio.h"
+#include "statusline.h"
+#include "search-dialog.h"
+#include "search-internal.h"
+#include "special.h"
+
+/* Xlib and Xutil are already included */
+
+
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+
+#ifdef MOTIF
+# include <Xm/BulletinB.h>
+# include <Xm/DialogS.h>
+# include <Xm/PanedW.h>
+# include <Xm/MessageB.h>
+# include <Xm/LabelG.h>
+# include <Xm/Form.h>
+# include <Xm/Frame.h>
+# include <Xm/ToggleBG.h>
+# include <Xm/Text.h>
+# include <Xm/TextF.h>
+# include <Xm/PushB.h>
+# include <Xm/Protocols.h>
+# include <Xm/AtomMgr.h>
+#define XTranslations XmNtranslations
+#else /* MOTIF */
+# include <X11/Shell.h>
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Label.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/Toggle.h>
+# include <X11/Xaw/AsciiText.h>
+# include <X11/Xaw/SimpleMenu.h>
+# include <X11/Xaw/MenuButton.h>
+# include <X11/Xaw/Sme.h>
+# include <X11/Xaw/SmeBSB.h>
+#if 0
+#include "xaw_bitmaps.h"
+static Pixmap menu_double_arrow_bitmap;
+#endif
+#define XTranslations XtNtranslations
+#endif /* MOTIF */
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XBell(dpy, percent) XkbBell(dpy, mane.win, percent, (Atom) None)
+#endif
+
+struct output_format_mapping {
+ const char *fmt_string;
+ outputFormatT fmt;
+ const char *extension;
+} output_format_mapping[] = {
+ { "Postscript", FMT_PS , ".ps" },
+ { "PDF", FMT_PS2PDF, ".pdf" },
+ { "DVI", FMT_DVI, ".dvi" },
+ { "Plain Text (ISO_8859-1)",FMT_ISO_8859_1, ".txt" },
+ { "Plain Text (UTF-8)", FMT_UTF8, ".txt" },
+ { NULL, FMT_NONE, NULL }
+};
+
+/* Widget names that are used in callbacks ... */
+#define Xdvi_SAVE_SHELL_NAME "save_popup"
+#define Xdvi_PRINT_SHELL_NAME "print_popup"
+
+#define Xdvi_PAGE_RANGE_FORM_NAME "page_range_form"
+
+#define Xdvi_PAGES_ALL_RADIO_NAME "pages_all"
+#define Xdvi_PAGES_MARKED_RADIO_NAME "pages_marked"
+#define Xdvi_PAGES_RANGE_RADIO_NAME "pages_range"
+
+#define Xdvi_PAGES_RANGE_FROM_LABEL_NAME "range_from_lab"
+#define Xdvi_PAGES_RANGE_FROM_TEXT_NAME "range_from_text"
+#define Xdvi_PAGES_RANGE_TO_LABEL_NAME "range_to_lab"
+#define Xdvi_PAGES_RANGE_TO_TEXT_NAME "range_to_text"
+#define Xdvi_PAGES_RANGE_OF_LABEL_NAME "range_of_lab"
+
+#define Xdvi_TO_PRINTER_NAME "to_printer"
+#define Xdvi_TO_PRINTER_TEXT "printer_text"
+#define Xdvi_TO_FILE_NAME "to_file"
+#define Xdvi_TO_FILE_TEXT "file_text"
+#define Xdvi_BROWSE_BUTTON "file_button"
+
+#define Xdvi_DVIPS_OPTIONS_NAME "dvips_options_name"
+#define Xdvi_DVIPS_OPTIONS_TEXT "dvips_options_text"
+#define Xdvi_FORMAT_SELECTION_BUTTON_NAME "format_selection_button"
+
+/* number of items in `format' pulldown menu */
+#define FORMAT_SEL_CNT 5
+
+static void print_check_page_values(struct save_or_print_info *info);
+static void print_check_dvi_file(struct save_or_print_info *info);
+static void print_check_target_file(XtPointer info);
+
+#ifndef MOTIF
+static void xaw_print_save_act_go(Widget, XEvent *, String *, Cardinal *);
+#endif /* not MOTIF */
+
+static void wm_cancel(Widget, XEvent *, String *, Cardinal *);
+
+static XtActionsRec print_actions[] = {
+#ifndef MOTIF
+ {"xaw_print_or_save", xaw_print_save_act_go },
+#endif
+ {"WM_cancel", wm_cancel },
+};
+
+/*
+ ============================================================
+ generic utility functions
+ ============================================================
+*/
+
+
+/* return basename of `old_name' with `old_ext' replaced by `new_ext', in fresh memory */
+static char *
+get_new_file_name(const char *old_name, const char *old_ext, const char *new_ext)
+{
+ /* old_name contains the normalized DVI file name, with path and extension */
+ char *basename, *new_name;
+ size_t len;
+
+ basename = strrchr(old_name, DIR_SEPARATOR);
+
+ if (basename != NULL) {
+ basename++;
+ new_name = xmalloc(strlen(basename) + strlen(new_ext) + 1);
+ new_name = strcpy(new_name, basename);
+ }
+ else {
+ new_name = xmalloc(strlen(old_name) + strlen(new_ext) + 1);
+ new_name = strcpy(new_name, old_name);
+ }
+
+ len = strlen(new_name);
+ if (old_ext == NULL) {
+ strcpy(new_name + len, new_ext);
+ }
+ else {
+ strcpy(new_name + len - strlen(old_ext), new_ext);
+ }
+ return new_name;
+}
+
+/*
+ * Translate `non-standard' paper sizes for xdvi into options suitable
+ * for dvips. We don't do this always, since it would override the papersize
+ * specials inserted by e.g.
+ * \usepackage[dvips]{geometry}
+ * which is the preferred way to specify the papersize. If the papersize
+ * has been explicitly set by such a special, this function returns NULL.
+ * Else it returns the value of the `paper' resource, without the trailing
+ * `r', and sets the `landscape' argument to True if a trailing `r' was
+ * present.
+ *
+ * Note that we don't check/warn about whether the current paper
+ * resource is valid for dvips; dvips will ignore invalid paper sizes.
+ */
+static char *
+get_dvips_papersize(Boolean *landscape)
+{
+ char *papersize;
+ if (have_papersize_special())
+ return NULL;
+
+ papersize = xstrdup(resource.paper);
+ /* fprintf(stderr, "PAPERSIZE: |%s|\n", papersize); */
+ *landscape = False;
+ if (papersize[strlen(papersize) - 1] == 'r') { /* landscape size */
+ papersize[strlen(papersize) - 1] = '\0';
+ *landscape = True;
+ }
+ TRACE_GUI((stderr, "Using dvips arguments: `%s', %s", papersize, *landscape ? "landscape" : "portrait"));
+ return papersize;
+}
+
+static void
+update_dvips_options_sensitivity(int idx, Widget top)
+{
+ Widget dvips_label;
+
+#if MOTIF
+ Widget dvips_options;
+
+ if (get_widget_by_name(&dvips_label, top, Xdvi_DVIPS_OPTIONS_NAME, True) &&
+ get_widget_by_name(&dvips_options, top, Xdvi_DVIPS_OPTIONS_TEXT, True)) {
+ if (output_format_mapping[idx].fmt == FMT_PS ||
+ output_format_mapping[idx].fmt == FMT_PS2PDF) {
+ XtSetSensitive(dvips_label, True);
+ XtSetSensitive(dvips_options, True);
+ }
+ else {
+ XtSetSensitive(dvips_label, False);
+ XtSetSensitive(dvips_options, False);
+ }
+ }
+#else
+ if (get_widget_by_name(&dvips_label, top, Xdvi_DVIPS_OPTIONS_NAME, True)) {
+ XtSetSensitive(XtParent(dvips_label),
+ output_format_mapping[idx].fmt == FMT_PS ||
+ output_format_mapping[idx].fmt == FMT_PS2PDF);
+ }
+#endif
+}
+
+/* callbacks */
+
+static void
+cb_select_format(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = NULL;
+ Widget file_text;
+ char *filename;
+ ptrdiff_t i;
+
+#ifndef MOTIF
+ Widget button;
+ char *old_label, *new_label;
+ char tmp_label[1024];
+#endif
+
+ UNUSED(call_data);
+
+#ifdef MOTIF
+ i = (ptrdiff_t) client_data;
+ XtVaGetValues(XtParent(w), XmNuserData, &info, NULL);
+ ASSERT(info != NULL, "Expected struct save_or_print_info * in XmNuserData of button!");
+
+ if (get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True)) {
+ XtVaGetValues(file_text, XmNvalue, &filename, NULL);
+ if (strrchr(filename, '.') != NULL) {
+ char buf[1024];
+ replace_extension(filename, output_format_mapping[i].extension, buf, sizeof buf);
+ XtVaSetValues(file_text, XmNvalue, buf, XmNcursorPosition, strlen(buf), NULL);
+ }
+ }
+#else /* MOTIF */
+ info = (struct save_or_print_info *)client_data;
+
+ i = 0;
+ if (get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True)
+ && get_widget_by_name(&button, info->shell, Xdvi_FORMAT_SELECTION_BUTTON_NAME, True)) {
+
+ XtVaGetValues(file_text, XtNstring, &filename, NULL);
+
+ /* swap title strings */
+ XtVaGetValues(button, XtNlabel, &old_label, NULL);
+ XtVaGetValues(w, XtNlabel, &new_label, NULL);
+ strncpy(tmp_label, old_label, sizeof tmp_label);
+
+ /* update the filename with new format */
+ for (i = 0; output_format_mapping[i].fmt_string != NULL; i++) {
+ if (strcmp(new_label, output_format_mapping[i].fmt_string) == 0) {
+ char buf[1024];
+ replace_extension(filename, output_format_mapping[i].extension, buf, sizeof buf);
+ XtVaSetValues(file_text, XtNstring, buf, NULL);
+ XawTextSetInsertionPoint(file_text, strlen(buf));
+
+ break;
+ }
+ }
+ /* format not found, complain: */
+ if (output_format_mapping[i].fmt_string == NULL) {
+ popup_message(info->shell,
+ MSG_WARN,
+ REPORT_XDVI_BUG_TEMPLATE,
+ "Unrecognized string in format selector: |%s|", new_label);
+ }
+ XtVaSetValues(button, XtNlabel, new_label, NULL);
+ XtVaSetValues(w, XtNlabel, tmp_label, NULL);
+ }
+#endif /* MOTIF */
+
+ update_dvips_options_sensitivity(i, info->shell);
+
+ info->fmt = resource.default_saving_format = output_format_mapping[i].fmt;
+}
+
+static void
+cb_popdown(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ UNUSED(w);
+ UNUSED(call_data);
+
+ ASSERT(info != NULL, "client_data in cb_popdown musn't be NULL!");
+ if (info->message_popup != 0) {
+ kill_message_window(info->message_popup);
+ }
+ /* fprintf(stderr, "Popping down shell: %p\n", (void *)info->shell); */
+ XtPopdown(info->shell);
+}
+
+static void
+cb_print_or_save(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ UNUSED(w);
+ UNUSED(call_data);
+
+ print_check_page_values(info);
+}
+
+/* access from outside the module */
+void
+cancel_saving(struct save_or_print_info *info)
+{
+ cb_popdown(NULL, info, NULL);
+}
+
+
+static void
+wm_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ struct save_or_print_info *info = NULL;
+ void *ptr;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ ASSERT(*num_params > 0, "params in wm_cancel must be > 0!");
+ ASSERT(*params != NULL, "params in wm_cancel mustn't be NULL!");
+
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ cb_popdown(NULL, info, NULL);
+}
+
+/*
+ * Callbacks to enable the corresponding radio button if the user clicks on a text field to
+ * edit it. This is more user-friendly than making the text field insensitive
+ * until the radio button has been clicked. There are 2 separate callbacks, one for
+ * printing vs. saving (only used when actually printing), and one for the page range.
+ */
+static void
+text_print_vs_save_callback(Widget widget, XtPointer closure, XEvent *ev, Boolean *cont)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)closure;
+ Widget to_printer; /* used to check where we have been called from */
+ Widget radio_printer, radio_file;
+
+ UNUSED(ev);
+ UNUSED(cont);
+
+ if (get_widget_by_name(&to_printer, info->shell, Xdvi_TO_PRINTER_TEXT, True)
+ && get_widget_by_name(&radio_printer, info->shell, Xdvi_TO_PRINTER_NAME, True)
+ && get_widget_by_name(&radio_file, info->shell, Xdvi_TO_FILE_NAME, True)) {
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(radio_printer, widget == to_printer, True);
+ XmToggleButtonGadgetSetState(radio_file, widget != to_printer, True);
+#else
+ XawToggleSetCurrent(radio_printer, widget == to_printer ? cast_int_to_XtPointer(TO_PRINTER) : cast_int_to_XtPointer(TO_FILE));
+#endif
+ }
+}
+
+/* This case is slightly simpler, since the callback only needs to enable
+ * the radio button for the page range, never disable it.
+ */
+static void
+text_page_range_callback(Widget widget, XtPointer closure, XEvent *ev, Boolean *cont)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)closure;
+ Widget radio_all, radio_selected, radio_range;
+
+ UNUSED(ev);
+ UNUSED(cont);
+ UNUSED(widget);
+
+ if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True)
+ && get_widget_by_name(&radio_selected, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True)
+ && get_widget_by_name(&radio_range, info->shell, Xdvi_PAGES_RANGE_RADIO_NAME, True)) {
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(radio_all, False, True);
+ XmToggleButtonGadgetSetState(radio_selected, False, True);
+ XmToggleButtonGadgetSetState(radio_range, True, True);
+#else
+ XawToggleSetCurrent(radio_all, cast_int_to_XtPointer(PAGE_RANGE));
+#endif
+ }
+}
+
+#ifdef MOTIF
+
+/* Motif type callbacks for the above. */
+static void
+cb_text_print_vs_save(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(call_data);
+ /* fprintf(stderr, "************ cb_text_print_vs_save!\n"); */
+ text_print_vs_save_callback(w, client_data, NULL, NULL);
+}
+
+static void
+cb_text_page_range(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(call_data);
+ text_page_range_callback(w, client_data, NULL, NULL);
+}
+
+#else /* MOTIF */
+
+static void
+xaw_print_save_act_go(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ struct save_or_print_info *info = NULL;
+ void *ptr;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ ASSERT(*num_params > 0, "params in xaw_print_save_act_go must be > 0!");
+ ASSERT(*params != NULL, "params in xaw_print_save_act_go mustn't be NULL!");
+
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ print_check_page_values(info);
+}
+
+#endif /* MOTIF */
+
+static void
+cb_print_vs_save(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ Widget radio_printer, radio_file;
+ /* Widget file_button; */
+
+ UNUSED(call_data);
+
+ if (get_widget_by_name(&radio_printer, info->shell, Xdvi_TO_PRINTER_NAME, True)
+ && get_widget_by_name(&radio_file, info->shell, Xdvi_TO_FILE_NAME, True)) {
+#ifdef MOTIF
+ Widget text;
+
+ if (radio_printer == w) {
+ XmToggleButtonGadgetSetState(radio_printer, True, False);
+ XmToggleButtonGadgetSetState(radio_file, False, False);
+ if (get_widget_by_name(&text, info->shell, Xdvi_TO_PRINTER_TEXT, True))
+ XmProcessTraversal(text, XmTRAVERSE_CURRENT);
+ }
+ else {
+ XmToggleButtonGadgetSetState(radio_printer, False, False);
+ XmToggleButtonGadgetSetState(radio_file, True, False);
+ if (get_widget_by_name(&text, info->shell, Xdvi_TO_FILE_TEXT, True))
+ XmProcessTraversal(text, XmTRAVERSE_CURRENT);
+ }
+#endif
+ if (radio_printer == w)
+ info->print_target = TO_PRINTER;
+ else
+ info->print_target = TO_FILE;
+ }
+}
+
+static void
+cb_range(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ Widget radio_all, radio_selected, radio_range;
+
+ UNUSED(call_data);
+#ifndef MOTIF
+ UNUSED(w);
+#endif
+
+ if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True)
+ && get_widget_by_name(&radio_selected, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True)
+ && get_widget_by_name(&radio_range, info->shell, Xdvi_PAGES_RANGE_RADIO_NAME, True)) {
+
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(radio_all, radio_all == w, False);
+ XmToggleButtonGadgetSetState(radio_selected, radio_selected == w, False);
+ XmToggleButtonGadgetSetState(radio_range, radio_range == w, False);
+#endif
+ }
+
+ /* update_page_range_sensitivity(info->shell, radio_range == w); */
+}
+
+static void
+set_filename_callback(const char *fname, void *data)
+{
+ /* fprintf(stderr, "Filename: |%s|; widget: %p\n", fname, data); */
+ if (fname != NULL) {
+ Widget w = (Widget)data;
+#ifdef MOTIF
+ XtVaSetValues(w, XmNvalue, fname, XmNcursorPosition, strlen(fname), NULL);
+#else
+ XtVaSetValues(w, XtNstring, fname, NULL);
+ XawTextSetInsertionPoint(w, strlen(fname));
+#endif
+ }
+}
+
+
+static void
+cb_browse(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ printOrSaveActionT act = info->act;
+ Widget file_text;
+ /* static so that we can pass its address */
+ static struct filesel_callback cb[2] = {
+ { NULL, NULL,
+ "xdvik: Save to file", "Save to file:", "OK", "Cancel",
+ NULL, NULL, False, False, NULL, NULL },
+ { NULL, NULL,
+ "xdvik: Print to file", "Print to file:", "OK", "Cancel",
+ NULL, "*.ps", False, False, NULL, NULL }
+ };
+
+ UNUSED(call_data);
+
+ /* switch on `to file' radio button */
+ if (act == FILE_PRINT)
+ text_print_vs_save_callback(w, (XtPointer)info, NULL, NULL);
+
+ if (!get_widget_by_name(&file_text, info->shell, Xdvi_TO_FILE_TEXT, True))
+ return;
+
+ if (act == FILE_SAVE) {
+ if (resource.default_saving_format == FMT_PS)
+ cb[0].filemask = "*.ps";
+ else if (resource.default_saving_format == FMT_PS2PDF)
+ cb[0].filemask = "*.pdf";
+ else if (resource.default_saving_format == FMT_DVI)
+ cb[0].filemask = "*.dvi";
+ else
+ cb[0].filemask = "*.txt";
+ cb[0].func_ptr = set_filename_callback;
+ cb[0].data = file_text;
+ cb[0].browse_fname = xt_strdup(globals.cwd);
+
+ /* fprintf(stderr, "==== text widget save: %p; shell: %p\n", (void *)file_text, (void *)info->shell); */
+ if (cb[0].shell == NULL)
+ cb[0].shell = XsraSelFile(info->shell, &cb[0]);
+ XsraSelFilePopup(&cb[0]);
+ /* fprintf(stderr, "done saving: return widget = %p\n", ret_widget); */
+ }
+ else {
+ cb[1].func_ptr = set_filename_callback;
+ cb[1].data = file_text;
+ cb[1].init_path = globals.cwd;
+
+ /* fprintf(stderr, "==== text widget print: %p; shell: %p\n", (void *)file_text, (void *)info->shell); */
+ /* if (!get_widget_by_name(&parent, globals.widgets.top_level, Xdvi_PRINT_SHELL_NAME, True)) */
+ /* parent = globals.widgets.top_level; */
+ if (cb[1].shell == NULL)
+ cb[1].shell = XsraSelFile(info->shell, &cb[1]);
+ XsraSelFilePopup(&cb[1]);
+ }
+}
+
+/* create a dialog for printing OR saving */
+#ifdef MOTIF
+
+static void
+motif_create_dialog(struct save_or_print_info *info)
+{
+ printOrSaveActionT act = info->act;
+ Atom WM_DELETE_WINDOW;
+ char *ptr;
+ char ofstring[1024];
+
+ Widget form, pane, box;
+ Widget print_or_save_frame, destination_form;
+ Widget dvips_options_label;
+ Widget pages_frame, pages_form;
+ Widget print_to_file_text, to_file_radio_or_label;
+ Widget dvips_options_text;
+ Widget print_to_file_button;
+ Widget range_marked_radio, range_from_to_radio, to_printer_radio = NULL,
+ print_to_printer_text = NULL, format_selection_option = NULL,
+ print_or_save_range_all_radio,
+ page_from_text, to_label, page_to_text, of_label, ok_button, cancel_button;
+ Widget from_label;
+ XmString str;
+ XmString format_selection_texts[FORMAT_SEL_CNT];
+ XtTranslations xlats;
+
+ XtAddActions(print_actions, XtNumber(print_actions));
+
+ ptr = get_string_va("#override \n<Key>osfCancel:WM_cancel(%p)", info);
+ xlats = XtParseTranslationTable(ptr);
+ free(ptr);
+
+ if (globals.pageno_correct == 1)
+ sprintf(ofstring, "of %d physical pages", total_pages);
+ else
+ sprintf(ofstring, "of %d to %d pages", globals.pageno_correct, total_pages + globals.pageno_correct - 1);
+
+ info->shell = XtVaCreatePopupShell(act == FILE_SAVE ? "save_popup" : "print_popup",
+ xmDialogShellWidgetClass, globals.widgets.top_level,
+ XmNtitle, act == FILE_SAVE ? "xdvik: Save File" : "xdvik: Print File",
+ XmNallowShellResize, True,
+ XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */
+ XmNmappedWhenManaged, False, /* so that we can center it first */
+ NULL);
+
+ /* make the window manager destroy action just pop down the dialog */
+ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(info->shell), "WM_DELETE_WINDOW", False);
+
+ XmAddWMProtocolCallback(info->shell, WM_DELETE_WINDOW, cb_popdown, (XtPointer)info);
+
+
+ pane = XtVaCreateWidget(act == FILE_SAVE ? "save_paned" : "print_paned",
+ xmPanedWindowWidgetClass, info->shell,
+ /* make sashes invisible */
+ XmNsashWidth, 1,
+ XmNsashHeight, 1,
+ /* turn separator off, since it gives visual noise with the frames */
+ XmNseparatorOn, False,
+ NULL);
+
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass,
+ pane,
+ XmNhorizontalSpacing, DDIST_MAJOR,
+ XmNverticalSpacing, DDIST_MAJOR,
+ XmNautoUnmanage, False,
+ XTranslations, xlats,
+ NULL);
+
+ if (act == FILE_PRINT) {
+ /* First frame: print to printer or file */
+
+ print_or_save_frame = XtVaCreateWidget("print_to_frame", xmFrameWidgetClass, form,
+ XmNmarginWidth, DDIST,
+ XmNmarginHeight, DDIST,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XTranslations, xlats,
+ NULL);
+
+ str = XmStringCreateLocalized("Print to:");
+ XtVaCreateManagedWidget("title", xmLabelGadgetClass,
+ print_or_save_frame,
+ XmNchildType, XmFRAME_TITLE_CHILD,
+ XmNlabelString, str,
+ NULL);
+ XmStringFree(str);
+
+ destination_form = XtVaCreateWidget("destination_form", xmFormWidgetClass, print_or_save_frame,
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XTranslations, xlats,
+ NULL);
+
+ str = XmStringCreateLocalized("Printer:");
+ to_printer_radio = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_NAME, xmToggleButtonGadgetClass, destination_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmONE_OF_MANY,
+ XmNset, resource.default_printing_target == TO_PRINTER,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 0,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 0,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(to_printer_radio, XmNvalueChangedCallback, cb_print_vs_save, (XtPointer)info);
+
+ XtOverrideTranslations(to_printer_radio, xlats);
+
+ print_to_printer_text = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_TEXT, xmTextFieldWidgetClass, destination_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 0,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftWidget, to_printer_radio,
+ /* XmNsensitive, resource.default_printing_target == TO_PRINTER, */
+ XTranslations, xlats,
+ NULL);
+ XtAddCallback(print_to_printer_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ XtAddCallback(print_to_printer_text, XmNfocusCallback, cb_text_print_vs_save, (XtPointer)info);
+
+ adjust_heights(to_printer_radio, print_to_printer_text, NULL);
+
+ str = XmStringCreateLocalized("PS File:");
+ to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, xmToggleButtonGadgetClass, destination_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmONE_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, print_to_printer_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNset, resource.default_printing_target == TO_FILE,
+ XmNleftOffset, 0,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(to_file_radio_or_label, XmNvalueChangedCallback, cb_print_vs_save, (XtPointer)info);
+
+ str = XmStringCreateLocalized("Browse ...");
+ print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, xmPushButtonWidgetClass, destination_form,
+ XmNlabelString, str,
+ /* XmNsensitive, resource.default_printing_target == TO_FILE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, print_to_printer_text,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+ XmStringFree(str);
+
+ XtOverrideTranslations(to_file_radio_or_label, xlats);
+ XtOverrideTranslations(print_to_file_button, xlats);
+
+ print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, xmTextFieldWidgetClass, destination_form,
+ /* XmNsensitive, resource.default_printing_target == TO_FILE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, print_to_printer_text,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightWidget, print_to_file_button,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, to_file_radio_or_label,
+ XTranslations, xlats,
+ NULL);
+
+ adjust_heights(to_file_radio_or_label, print_to_file_button, print_to_file_text, NULL);
+
+ XtAddCallback(print_to_file_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ XtAddCallback(print_to_file_text, XmNfocusCallback, cb_text_print_vs_save, (XtPointer)info);
+ XtAddCallback(print_to_file_button, XmNactivateCallback, cb_browse, (XtPointer)info);
+
+ XtManageChild(destination_form);
+ XtManageChild(print_or_save_frame);
+
+ /* initial value for printer name */
+ XtVaSetValues(print_to_printer_text,
+ XmNvalue, info->printer_options,
+ XmNcursorPosition, strlen(info->printer_options),
+ NULL);
+ }
+ else { /* saving, not printing */
+ print_or_save_frame = XtVaCreateWidget("save_as_frame", xmFrameWidgetClass, form,
+ XmNmarginWidth, DDIST,
+ XmNmarginHeight, DDIST,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+
+ str = XmStringCreateLocalized("Save as:");
+ XtVaCreateManagedWidget("title", xmLabelGadgetClass,
+ print_or_save_frame,
+ XmNchildType, XmFRAME_TITLE_CHILD,
+ XmNlabelString, str,
+ NULL);
+ XmStringFree(str);
+
+ destination_form = XtVaCreateWidget("destination_form", xmFormWidgetClass, print_or_save_frame,
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XTranslations, xlats,
+ NULL);
+ /* fprintf(stderr, "CHILD: 0x%x\n", (long)destination_form); */
+ str = XmStringCreateLocalized("Format:");
+ format_selection_texts[0] = XmStringCreateLocalized((char *)output_format_mapping[0].fmt_string);
+ format_selection_texts[1] = XmStringCreateLocalized((char *)output_format_mapping[1].fmt_string);
+ format_selection_texts[2] = XmStringCreateLocalized((char *)output_format_mapping[2].fmt_string);
+ format_selection_texts[3] = XmStringCreateLocalized((char *)output_format_mapping[3].fmt_string);
+ format_selection_texts[4] = XmStringCreateLocalized((char *)output_format_mapping[4].fmt_string);
+ format_selection_option
+ = XmVaCreateSimpleOptionMenu(destination_form, "format_selection_option",
+ str, 'F',
+ resource.default_saving_format, /*initial menu selection*/
+ cb_select_format, /* callback */
+ XmVaPUSHBUTTON, format_selection_texts[0], 'P', NULL, NULL,
+ XmVaPUSHBUTTON, format_selection_texts[1], 'F', NULL, NULL,
+ XmVaPUSHBUTTON, format_selection_texts[2], 'D', NULL, NULL,
+ XmVaPUSHBUTTON, format_selection_texts[3], 'T', NULL, NULL,
+ XmVaPUSHBUTTON, format_selection_texts[4], 'U', NULL, NULL,
+ XmNuserData, (XtPointer)info,
+ NULL);
+
+ XmStringFree(str);
+ XmStringFree(format_selection_texts[0]);
+ XmStringFree(format_selection_texts[1]);
+ XmStringFree(format_selection_texts[2]);
+ XmStringFree(format_selection_texts[3]);
+ XmStringFree(format_selection_texts[4]);
+
+ str = XmStringCreateLocalized("File name:");
+ to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, xmLabelGadgetClass, destination_form,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, format_selection_option,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* XmNchildType, XmFRAME_TITLE_CHILD, */
+ XmNlabelString, str,
+ NULL);
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Browse ...");
+ print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, xmPushButtonWidgetClass, destination_form,
+ XmNlabelString, str,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, format_selection_option,
+ XmNrightAttachment, XmATTACH_FORM,
+ XTranslations, xlats,
+ NULL);
+ print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, xmTextFieldWidgetClass, destination_form,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, format_selection_option,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, to_file_radio_or_label,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNrightWidget, print_to_file_button,
+ XTranslations, xlats,
+ NULL);
+
+ adjust_heights(to_file_radio_or_label, print_to_file_button, print_to_file_text, NULL);
+ XtAddCallback(print_to_file_button, XmNactivateCallback, cb_browse, (XtPointer)info);
+ }
+
+ /* initial value for filename */
+ XtVaSetValues(print_to_file_text,
+ XmNvalue, info->finfo->out_file,
+ XmNcursorPosition, strlen(info->finfo->out_file),
+ NULL);
+
+ { /* align left edges of widgets */
+ Dimension w1, w2;
+
+ XtVaGetValues(to_file_radio_or_label, XmNwidth, &w2, NULL);
+ if (act == FILE_PRINT)
+ XtVaGetValues(to_printer_radio, XmNwidth, &w1, NULL);
+ else {
+ Widget w;
+ if (get_widget_by_name(&w, format_selection_option, "OptionLabel", True)) {
+ XtVaGetValues(w, XmNwidth, &w1, NULL);
+ }
+ else {
+ w1 = w2;
+ }
+ }
+
+ if (w1 > w2) {
+ Dimension offset = DDIST;
+ offset += w1 - w2;
+ XtVaSetValues(print_to_file_text, XmNleftOffset, offset, NULL);
+ }
+ else if (w2 > w1) {
+ Dimension offset = DDIST;
+ offset += w2 - w1;
+ if (act == FILE_PRINT)
+ XtVaSetValues(print_to_printer_text, XmNleftOffset, offset, NULL);
+ else {
+ Widget w;
+ if (get_widget_by_name(&w, format_selection_option, "OptionLabel", True)) {
+ /* FIXME: Setting width would be cleaner, but it doesn't work ...?
+ Dimension curr_w;
+ XtVaGetValues(w, XmNwidth, &curr_w, NULL);
+ XtVaSetValues(w, XmNwidth, curr_w + offset, NULL);
+ */
+ /* fprintf(stderr, "Setting width from %d to: %d\n", curr_w, curr_w + offset); */
+ XtVaSetValues(w,
+ XmNmarginRight, offset,
+ XmNalignment, XmALIGNMENT_BEGINNING,
+ NULL);
+ }
+
+ }
+ }
+ }
+
+ if (act == FILE_SAVE) {
+ XtManageChild(format_selection_option);
+ XtManageChild(destination_form);
+ XtManageChild(print_or_save_frame);
+ }
+
+ /* additional dvips options */
+ str = XmStringCreateLocalized("Dvips Options:");
+ dvips_options_label = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_NAME, xmLabelGadgetClass, form,
+ XmNlabelString, str,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, print_or_save_frame,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ XmStringFree(str);
+
+ dvips_options_text = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_TEXT, xmTextFieldWidgetClass, form,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, print_or_save_frame,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftWidget, dvips_options_label,
+ XmNcolumns, 20,
+ XTranslations, xlats,
+ NULL);
+ XtAddCallback(dvips_options_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ adjust_heights(dvips_options_label, dvips_options_text, NULL);
+
+ /* initial value for dvips options */
+ XtVaSetValues(dvips_options_text,
+ XmNvalue, info->dvips_options,
+ XmNcursorPosition, strlen(info->dvips_options),
+ NULL);
+
+ /* page selection */
+ pages_frame = XtVaCreateWidget(act == FILE_PRINT ? "print_page_frame" : "save_page_frame", xmFrameWidgetClass, form,
+ XmNmarginWidth, DDIST,
+ XmNmarginHeight, DDIST,
+ XmNresizable, True,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, dvips_options_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XTranslations, xlats,
+ NULL);
+
+ str = XmStringCreateLocalized("Pages:");
+ XtVaCreateManagedWidget("title", xmLabelGadgetClass, pages_frame,
+ XmNchildType, XmFRAME_TITLE_CHILD,
+ XmNlabelString, str,
+ NULL);
+ XmStringFree(str);
+
+ pages_form = XtVaCreateWidget("pages_form", xmFormWidgetClass, pages_frame,
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNresizable, True,
+ XTranslations, xlats,
+ NULL);
+
+ str = XmStringCreateLocalized("All");
+ print_or_save_range_all_radio = XtVaCreateManagedWidget(Xdvi_PAGES_ALL_RADIO_NAME, xmToggleButtonGadgetClass, pages_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmONE_OF_MANY,
+ XmNset, True,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 0,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 0,
+ XTranslations, xlats,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(print_or_save_range_all_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info);
+
+ str = XmStringCreateLocalized("Marked");
+ range_marked_radio = XtVaCreateManagedWidget(Xdvi_PAGES_MARKED_RADIO_NAME, xmToggleButtonGadgetClass, pages_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmONE_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNsensitive, pageinfo_have_marked_pages(),
+ XmNtopWidget, print_or_save_range_all_radio,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 0,
+ XTranslations, xlats,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(range_marked_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info);
+
+ str = XmStringCreateLocalized("Range:");
+ range_from_to_radio = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_RADIO_NAME, xmToggleButtonGadgetClass, pages_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmONE_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 0,
+ XTranslations, xlats,
+ NULL);
+ XmStringFree(str);
+
+ XtAddCallback(range_from_to_radio, XmNvalueChangedCallback, cb_range, (XtPointer)info);
+
+ str = XmStringCreateLocalized("From");
+ from_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_LABEL_NAME, xmLabelGadgetClass, pages_form,
+ XmNlabelString, str,
+ /* XmNsensitive, info->page_selection == PAGE_RANGE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, range_from_to_radio,
+ NULL);
+ XmStringFree(str);
+
+ page_from_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_TEXT_NAME, xmTextFieldWidgetClass, pages_form,
+ XmNcolumns, 5,
+ /* XmNsensitive, info->page_selection == PAGE_RANGE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, from_label,
+ XTranslations, xlats,
+ NULL);
+ XtAddCallback(page_from_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ XtAddCallback(page_from_text, XmNfocusCallback, cb_text_page_range, (XtPointer)info);
+
+ str = XmStringCreateLocalized("to");
+ to_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_LABEL_NAME, xmLabelGadgetClass, pages_form,
+ XmNlabelString, str,
+ /* XmNsensitive, info->page_selection == PAGE_RANGE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, page_from_text,
+ NULL);
+ XmStringFree(str);
+
+ page_to_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_TEXT_NAME, xmTextFieldWidgetClass, pages_form,
+ XmNcolumns, 5,
+ /* XmNsensitive, info->page_selection == PAGE_RANGE, */
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, to_label,
+ XTranslations, xlats,
+ NULL);
+ XtAddCallback(page_to_text, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ XtAddCallback(page_to_text, XmNfocusCallback, cb_text_page_range, (XtPointer)info);
+
+ str = XmStringCreateLocalized(ofstring);
+ of_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_OF_LABEL_NAME, xmLabelGadgetClass, pages_form,
+ XmNlabelString, str,
+ /* XmNsensitive, info->page_selection == PAGE_RANGE, */
+ XmNresizable, True,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, range_marked_radio,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, page_to_text,
+ NULL);
+ XmStringFree(str);
+
+ adjust_heights(range_from_to_radio,
+ from_label, page_from_text,
+ to_label, page_to_text,
+ of_label,
+ NULL);
+
+ XtManageChild(pages_form);
+ XtManageChild(pages_frame);
+
+ /* box for the OK/Cancel button */
+ box = XtVaCreateManagedWidget("box", xmFormWidgetClass, pane,
+ XmNskipAdjust, True, /* don't resize this area */
+ XTranslations, xlats,
+ NULL);
+
+ str = XmStringCreateLocalized(act == FILE_PRINT ? "Print" : "Save");
+
+ ok_button = XtVaCreateManagedWidget(act == FILE_PRINT ? "print_button" : "save_button", xmPushButtonWidgetClass, box,
+ XmNlabelString, str,
+ XmNshowAsDefault, True,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* to mimick appearance of native dialog buttons: */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNleftOffset, 10,
+ NULL);
+ XmStringFree(str);
+
+ XtAddCallback(ok_button, XmNactivateCallback, cb_print_or_save, (XtPointer)info);
+ XtOverrideTranslations(ok_button, XtParseTranslationTable("<Key>Return:ArmAndActivate()"));
+
+ str = XmStringCreateLocalized("Cancel");
+ cancel_button = XtVaCreateManagedWidget("cancel", xmPushButtonWidgetClass, box,
+ XmNlabelString, str,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ /* to mimick appearance of native dialog buttons: */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNrightOffset, 10,
+ NULL);
+ XmStringFree(str);
+
+ XtOverrideTranslations(print_or_save_range_all_radio, xlats);
+ XtOverrideTranslations(range_marked_radio, xlats);
+ XtOverrideTranslations(range_from_to_radio, xlats);
+ XtOverrideTranslations(ok_button, xlats);
+ XtOverrideTranslations(cancel_button, xlats);
+
+ XtAddCallback(cancel_button, XmNactivateCallback, cb_popdown, (XtPointer)info);
+
+ { /* make the buttons the same size: */
+ Dimension w1, w2;
+ XtVaGetValues(ok_button, XtNwidth, &w1, NULL);
+ XtVaGetValues(cancel_button, XtNwidth, &w2, NULL);
+ if (w1 < w2)
+ XtVaSetValues(ok_button, XtNwidth, w2, NULL);
+ else if (w2 > w1)
+ XtVaSetValues(cancel_button, XtNwidth, w1, NULL);
+ }
+
+ if (pageinfo_have_marked_pages()) {
+ XmToggleButtonGadgetSetState(range_marked_radio, True, True);
+ }
+ else if (info->page_selection == PAGE_MARKED) {
+ XmToggleButtonGadgetSetState(print_or_save_range_all_radio, True, True);
+ }
+
+ XtManageChild(form);
+ XtManageChild(pane);
+ center_window(info->shell, globals.widgets.top_level);
+ XtMapWidget(info->shell);
+ XmProcessTraversal(ok_button, XmTRAVERSE_CURRENT);
+
+ /* if (act == FILE_PRINT) { */
+ /* if (resource.default_printing_target == TO_PRINTER) */
+ /* XmProcessTraversal(print_to_printer_text, XmTRAVERSE_CURRENT); */
+ /* else */
+ /* XmProcessTraversal(print_to_file_text, XmTRAVERSE_CURRENT); */
+ /* } */
+}
+
+#else /* MOTIF */
+
+static void
+xaw_create_dialog(struct save_or_print_info *info)
+{
+ printOrSaveActionT act = info->act;
+ Atom WM_DELETE_WINDOW;
+ char *ptr;
+ char ofstring[1024];
+
+ Widget form, paned, box;
+ Widget dummy_label_form, dummy_pages_form; /* dummy forms to get indentation consistent */
+ Widget save_to_file_form;
+ Widget print_to_printer_form, print_to_file_form, dvips_options_form;
+ Widget dvips_options_label;
+ Widget page_range_form;
+ Widget range_marked_form;
+ Widget range_from_to_form;
+ Widget print_to_file_text, to_file_radio_or_label;
+ Widget dvips_options_text;
+ Widget print_to_file_button;
+ Widget format_selection_menu[FORMAT_SEL_CNT];
+ Widget format_selection_label = NULL, format_selection_button = NULL, format_selection_popup;
+ Widget range_marked_radio, range_from_to_radio, to_printer_radio = NULL, print_to_printer_text = NULL,
+ print_or_save_range_all_radio,
+ page_from_text, to_label, page_to_text, of_label, ok_button, cancel_button;
+
+ XtTranslations xlats, xlats2, wm_translations;
+ XtAccelerators accels2;
+ int ddist;
+
+ static Dimension w_avg = 220;
+ Dimension w_curr;
+
+ /* handy abbrevs */
+#define HORIZONTAL_RESIZING_NO XtNleft, XtChainLeft, XtNright, XtChainLeft
+#define HORIZONTAL_RESIZING_YES XtNleft, XtChainLeft, XtNright, XtChainRight
+#define VERTICAL_RESIZING_NO XtNtop, XtChainTop, XtNbottom, XtChainTop
+
+ XtAddActions(print_actions, XtNumber(print_actions));
+
+ if (globals.pageno_correct == 1)
+ sprintf(ofstring, "of %d physical pages", total_pages);
+ else
+ sprintf(ofstring, "of %d to %d pages", globals.pageno_correct, total_pages + globals.pageno_correct - 1);
+
+ ptr = get_string_va("<Message>WM_PROTOCOLS: WM_cancel(%p)\n"
+ "<Key>Escape:WM_cancel(%p)\n"
+ "<Key>q:WM_cancel(%p)",
+ info, info, info);
+ wm_translations = XtParseTranslationTable(ptr);
+ free(ptr);
+
+ info->shell = XtVaCreatePopupShell(act == FILE_SAVE ? Xdvi_SAVE_SHELL_NAME : Xdvi_PRINT_SHELL_NAME,
+ transientShellWidgetClass, globals.widgets.top_level,
+ XtNtitle, act == FILE_SAVE ? "xdvik: Save File" : "xdvik: Print File",
+ XtNmappedWhenManaged, False,
+ XtNtransientFor, globals.widgets.top_level,
+ XtNallowShellResize, True,
+ XtNtranslations, wm_translations,
+ NULL);
+
+ WM_DELETE_WINDOW = XInternAtom(XtDisplay(info->shell), "WM_DELETE_WINDOW", False);
+
+ paned = XtVaCreateManagedWidget("paned", panedWidgetClass, info->shell, NULL);
+
+ form = XtVaCreateManagedWidget("save_or_print_form", formWidgetClass, paned,
+ XtNallowResize, True,
+ NULL);
+ XtVaGetValues(form, XtNdefaultDistance, &ddist, NULL);
+ /* fprintf(stderr, "form1: %ld\n", (long)form); */
+
+ xlats = XtParseTranslationTable("<EnterWindow>:highlight(Always)\n"
+ "<LeaveWindow>:unhighlight()\n"
+ "<Btn1Down>,<Btn1Up>:set()notify()");
+
+ ptr = get_string_va("<Key>Return:xaw_print_or_save(%p)", info);
+ xlats2 = XtParseTranslationTable(ptr);
+ free(ptr);
+
+ if (act == FILE_PRINT) { /* selection `to printer/to file' */
+ /* FIXME: set real sizes here */
+ /* Dimension w_curr; */
+ dummy_label_form = XtVaCreateManagedWidget("dummy_print_to_label_form", formWidgetClass, form,
+ XtNresizable, True,
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_YES,
+ NULL);
+ XtVaCreateManagedWidget("print_to", labelWidgetClass, dummy_label_form,
+ XtNlabel, "Print to: ",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+
+ print_to_printer_form = XtVaCreateManagedWidget("print_to_printer_form", formWidgetClass, form,
+ XtNresizable, True,
+ XtNborderWidth, 0,
+ XtNvertDistance, 0,
+ XtNfromVert, dummy_label_form,
+ HORIZONTAL_RESIZING_YES,
+ XtNallowResize, True,
+ NULL);
+
+ accels2 = XtParseAcceleratorTable("<Btn1Down>,<Btn1Up>:set()notify()");
+
+ to_printer_radio = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ print_to_printer_form,
+ XtNlabel, "Printer: ",
+ XtNborderWidth, 0,
+ XtNhighlightThickness, 1,
+ XtNradioData, TO_PRINTER,
+ XtNstate, resource.default_printing_target == TO_PRINTER,
+ XtNtranslations, xlats,
+ XtNaccelerators, accels2,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+
+ XtAddCallback(to_printer_radio, XtNcallback, cb_print_vs_save, (XtPointer)info);
+ XtInstallAccelerators(print_to_printer_form, to_printer_radio);
+
+ print_to_printer_text = XtVaCreateManagedWidget(Xdvi_TO_PRINTER_TEXT, asciiTextWidgetClass, print_to_printer_form,
+ XtNwidth, w_avg,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ /* XtNresize, XawtextResizeWidth, */
+ XtNfromHoriz, to_printer_radio,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ /* XtNscrollHorizontal, XawtextScrollAlways, */
+ NULL);
+ XtOverrideTranslations(print_to_printer_text, xlats2);
+ XtAddEventHandler(print_to_printer_text, KeyPressMask | ButtonPressMask, False,
+ text_print_vs_save_callback, (XtPointer)info);
+
+ adjust_vertically(to_printer_radio, print_to_printer_text, ddist);
+
+ print_to_file_form = XtVaCreateManagedWidget("print_to_file_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNvertDistance, -ddist,
+ XtNfromVert, print_to_printer_form,
+ HORIZONTAL_RESIZING_YES,
+ NULL);
+
+ to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ print_to_file_form,
+ XtNhighlightThickness, 1,
+ XtNborderWidth, 0,
+ XtNlabel, "PS File: ",
+ XtNstate, resource.default_printing_target == TO_FILE,
+ XtNradioGroup, to_printer_radio,
+ XtNradioData, TO_FILE,
+ XtNtranslations, xlats,
+ XtNaccelerators, accels2,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtAddCallback(to_file_radio_or_label, XtNcallback, cb_print_vs_save, (XtPointer)info);
+ XtInstallAccelerators(print_to_file_form, to_file_radio_or_label);
+
+ print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, asciiTextWidgetClass, print_to_file_form,
+ XtNwidth, w_avg,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNfromHoriz, to_file_radio_or_label,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtOverrideTranslations(print_to_file_text, xlats2);
+ XtAddEventHandler(print_to_file_text, KeyPressMask | ButtonPressMask, False,
+ text_print_vs_save_callback, (XtPointer)info);
+
+ /* initial value for printer name */
+ XtVaSetValues(print_to_printer_text, XtNstring, info->printer_options, NULL);
+ XawTextSetInsertionPoint(print_to_printer_text, strlen(info->printer_options));
+ }
+ else { /* not printing, but saving */
+ int i;
+ Dimension max_entry_width = 0;
+ dummy_label_form = XtVaCreateManagedWidget("dummy_save_as_form", formWidgetClass, form,
+ XtNresizable, True,
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_YES,
+ NULL);
+ XtVaCreateManagedWidget("save_as", labelWidgetClass, dummy_label_form,
+ XtNlabel, "Save as: ",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+ save_to_file_form = XtVaCreateManagedWidget("save_to_file_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, dummy_label_form,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ /* fprintf(stderr, "formr1: %ld\n", (long)save_to_file_form); */
+#if 0
+ menu_double_arrow_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_double_arrow_bits, MENU_DOUBLE_ARROW_W, MENU_DOUBLE_ARROW_H);
+#endif
+ format_selection_label = XtVaCreateManagedWidget("format_selection_label", labelWidgetClass, save_to_file_form,
+ XtNlabel, "Format: ",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ format_selection_button = XtVaCreateManagedWidget(Xdvi_FORMAT_SELECTION_BUTTON_NAME, menuButtonWidgetClass, save_to_file_form,
+ XtNmenuName, "format_selection_popup",
+ XtNlabel, output_format_mapping[resource.default_saving_format].fmt_string,
+ XtNjustify, XtJustifyLeft,
+ XtNborderWidth, resource.btn_border_width,
+ XtNfromHoriz, format_selection_label,
+#if 0
+ XtNhighlightThickness, 0,
+#endif
+ NULL);
+#if 0 /* Hack for arrow - menuButtonWidget cannot have a XtNrightBitmap!!! */
+ format_selection_b1 = XtVaCreateManagedWidget("format_selection_b1", commandWidgetClass, save_to_file_form,
+ XtNborderWidth, resource.btn_border_width,
+ XtNfromHoriz, format_selection_button,
+ XtNhorizDistance, -1,
+ XtNhighlightThickness, 0,
+ XtNbitmap, menu_double_arrow_bitmap,
+ NULL);
+ adjust_heights(format_selection_button, format_selection_b1, NULL);
+#endif
+ format_selection_popup = XtCreatePopupShell("format_selection_popup", simpleMenuWidgetClass, format_selection_button,
+ /* globals.widgets.top_level, */
+ NULL, 0);
+#if 0
+ XtAddCallback(format_selection_b1, XtNcallback, xaw_popup_menu_cb, format_selection_popup);
+#endif
+ for (i = 1; i < FORMAT_SEL_CNT; i++) {
+ char name[1024];
+ Dimension curr_entry_width;
+ SNPRINTF(name, sizeof name, "format_selection_pulldown_%d", i);
+ format_selection_menu[i] = XtVaCreateManagedWidget(name, smeBSBObjectClass, format_selection_popup,
+ XtNjustify, XtJustifyLeft,
+ XtNlabel,
+ i == resource.default_saving_format
+ ? output_format_mapping[0].fmt_string
+ : output_format_mapping[i].fmt_string,
+ NULL);
+ XtVaGetValues(format_selection_menu[i], XtNwidth, &curr_entry_width, NULL);
+ if (curr_entry_width > max_entry_width)
+ max_entry_width = curr_entry_width;
+ XtAddCallback(format_selection_menu[i], XtNcallback, cb_select_format, (XtPointer)info);
+ }
+ XtVaSetValues(format_selection_button, XtNwidth, max_entry_width, NULL);
+
+ print_to_file_form = XtVaCreateManagedWidget("to_file_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, save_to_file_form,
+ XtNvertDistance, -ddist,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ to_file_radio_or_label = XtVaCreateManagedWidget(Xdvi_TO_FILE_NAME, labelWidgetClass, print_to_file_form,
+ XtNlabel, "File name: ",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ print_to_file_text = XtVaCreateManagedWidget(Xdvi_TO_FILE_TEXT, asciiTextWidgetClass, print_to_file_form,
+ XtNwidth, w_avg,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNfromHoriz, to_file_radio_or_label,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtOverrideTranslations(print_to_file_text, xlats2);
+
+
+ { /* align left edges of format selection pulldown and filename field */
+ Dimension w1, w2, w_max;
+ XtVaGetValues(format_selection_label, XtNwidth, &w1, NULL);
+ XtVaGetValues(to_file_radio_or_label, XtNwidth, &w2, NULL);
+ w_max = MAX(w1, w2);
+ XtVaSetValues(format_selection_button, XtNhorizDistance, ddist + (w_max - w1), NULL);
+ XtVaSetValues(print_to_file_text, XtNhorizDistance, ddist + (w_max - w2), NULL);
+ }
+ }
+
+ /* initial value for filename */
+ XtVaSetValues(print_to_file_text, XtNstring, info->finfo->out_file, NULL);
+ XawTextSetInsertionPoint(print_to_file_text, strlen(info->finfo->out_file));
+
+#define DIST_1 8 /* FIXME */
+ print_to_file_button = XtVaCreateManagedWidget(Xdvi_BROWSE_BUTTON, commandWidgetClass, print_to_file_form,
+ XtNlabel, "Browse ...",
+ XtNfromHoriz, print_to_file_text,
+ XtNhorizDistance, DIST_1,
+ /* XtNsensitive, act == FILE_PRINT ? resource.default_printing_target == TO_FILE : True, */
+ /* attach to right of form, no resizing: */
+ XtNleft, XtChainRight, XtNright, XtChainRight,
+ VERTICAL_RESIZING_NO,
+ NULL);
+
+ XtVaGetValues(print_to_file_button, XtNwidth, &w_curr, NULL);
+ XtVaSetValues(print_to_file_text, XtNwidth, w_avg - w_curr - DIST_1 - 2, NULL);
+#undef DIST_1
+
+ adjust_vertically(to_file_radio_or_label, print_to_file_text, ddist + 5);
+ adjust_vertically(print_to_file_text, to_file_radio_or_label, ddist + 5);
+ adjust_vertically(print_to_file_button, to_file_radio_or_label, ddist + 5);
+
+ XtAddCallback(print_to_file_button, XtNcallback, cb_browse, (XtPointer)info);
+
+ /* other dvips options */
+ dvips_options_form = XtVaCreateManagedWidget("dvips_options_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, print_to_file_form,
+ XtNvertDistance, 3 * ddist,
+ HORIZONTAL_RESIZING_YES,
+ NULL);
+
+ dvips_options_label = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_NAME, labelWidgetClass, dvips_options_form,
+ XtNlabel, "Dvips Options:",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+
+ dvips_options_text = XtVaCreateManagedWidget(Xdvi_DVIPS_OPTIONS_TEXT, asciiTextWidgetClass, dvips_options_form,
+ XtNwidth, w_avg,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNfromHoriz, dvips_options_label,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtOverrideTranslations(dvips_options_text, xlats2);
+
+ { /* align left edges of input fields */
+ Dimension w1, w2, w3, w_max;
+
+ if (act == FILE_PRINT)
+ XtVaGetValues(to_printer_radio, XtNwidth, &w1, NULL);
+ else
+ XtVaGetValues(format_selection_label, XtNwidth, &w1, NULL);
+
+ XtVaGetValues(to_file_radio_or_label, XtNwidth, &w2, NULL);
+ XtVaGetValues(dvips_options_label, XtNwidth, &w3, NULL);
+
+ w_max = MAX(MAX(w1, w2), w3);
+
+ if (act == FILE_PRINT)
+ XtVaSetValues(print_to_printer_text, XtNhorizDistance, ddist + (w_max - w1), NULL);
+ else
+ XtVaSetValues(format_selection_button, XtNhorizDistance, ddist + (w_max - w1), NULL);
+
+ XtVaSetValues(print_to_file_text, XtNhorizDistance, ddist + (w_max - w2), NULL);
+ XtVaSetValues(dvips_options_text, XtNhorizDistance, ddist + (w_max - w3), NULL);
+ }
+
+ /* initial value for dvips options */
+ XtVaSetValues(dvips_options_text, XtNstring, info->dvips_options, NULL);
+ XawTextSetInsertionPoint(dvips_options_text, strlen(info->dvips_options));
+
+ /* page selection */
+ dummy_pages_form = XtVaCreateManagedWidget("dummy_pages_form", formWidgetClass, form,
+ XtNfromVert, dvips_options_form,
+ XtNresizable, True,
+ XtNborderWidth, 0,
+ XtNvertDistance, 3 * ddist,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+
+ XtVaCreateManagedWidget("range_lab", labelWidgetClass, dummy_pages_form,
+ XtNlabel, "Pages:",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+
+ page_range_form = XtVaCreateManagedWidget(Xdvi_PAGE_RANGE_FORM_NAME, formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, dummy_pages_form,
+ XtNvertDistance, 0,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+
+ accels2 = XtParseAcceleratorTable("<Btn1Down>,<Btn1Up>:set()notify()");
+ print_or_save_range_all_radio = XtVaCreateManagedWidget(Xdvi_PAGES_ALL_RADIO_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ page_range_form,
+ XtNlabel, "All ",
+ XtNborderWidth, 0,
+ XtNhighlightThickness, 1,
+ XtNradioData, PAGE_ALL,
+ /* enable this button by default */
+ XtNstate, True,
+ XtNtranslations, xlats,
+ XtNaccelerators, accels2,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtAddCallback(print_or_save_range_all_radio, XtNcallback, cb_range, (XtPointer)info);
+ XtInstallAccelerators(page_range_form, print_or_save_range_all_radio);
+
+ range_marked_form = XtVaCreateManagedWidget("range_marked_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, page_range_form,
+ XtNvertDistance, 0,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+
+ range_marked_radio = XtVaCreateManagedWidget(Xdvi_PAGES_MARKED_RADIO_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+
+ range_marked_form,
+ XtNlabel, "Marked ",
+ XtNsensitive, pageinfo_have_marked_pages(),
+ XtNborderWidth, 0,
+ XtNhighlightThickness, 1,
+ XtNradioGroup, print_or_save_range_all_radio,
+ XtNradioData, PAGE_MARKED,
+ XtNtranslations, xlats,
+ XtNaccelerators, accels2,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtAddCallback(range_marked_radio, XtNcallback, cb_range, (XtPointer)info);
+ XtInstallAccelerators(range_marked_form, range_marked_radio);
+
+ range_from_to_form = XtVaCreateManagedWidget("range_from_to_form", formWidgetClass, form,
+ XtNborderWidth, 0,
+ XtNfromVert, range_marked_form,
+ XtNvertDistance, 0,
+ XtNresizable, True,
+ /* HORIZONTAL_RESIZING_NO, */
+ NULL);
+
+ range_from_to_radio = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_RADIO_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ range_from_to_form,
+ XtNlabel, "From: ",
+ XtNborderWidth, 0,
+ XtNhighlightThickness, 1,
+ XtNradioGroup, print_or_save_range_all_radio,
+ XtNradioData, PAGE_RANGE,
+ XtNtranslations, xlats,
+ XtNaccelerators, accels2,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtAddCallback(range_from_to_radio, XtNcallback, cb_range, (XtPointer)info);
+ XtInstallAccelerators(range_from_to_form, range_from_to_radio);
+
+ page_from_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_FROM_TEXT_NAME, asciiTextWidgetClass, range_from_to_form,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNwidth, 50,
+ XtNfromHoriz, range_from_to_radio,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtOverrideTranslations(page_from_text, xlats2);
+ XtAddEventHandler(page_from_text, KeyPressMask | ButtonPressMask, False,
+ text_page_range_callback, (XtPointer)info);
+
+ to_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_LABEL_NAME, labelWidgetClass, range_from_to_form,
+ XtNlabel, "to: ",
+ XtNborderWidth, 0,
+ XtNfromHoriz, page_from_text,
+ /* XtNsensitive, info->page_selection == PAGE_RANGE, */
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+
+ page_to_text = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_TO_TEXT_NAME, asciiTextWidgetClass, range_from_to_form,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNwidth, 50,
+ XtNfromHoriz, to_label,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+ NULL);
+ XtOverrideTranslations(page_to_text, xlats2);
+ XtAddEventHandler(page_to_text, KeyPressMask | ButtonPressMask, False,
+ text_page_range_callback, (XtPointer)info);
+
+ of_label = XtVaCreateManagedWidget(Xdvi_PAGES_RANGE_OF_LABEL_NAME, labelWidgetClass, range_from_to_form,
+ XtNlabel, ofstring,
+ XtNborderWidth, 0,
+ /* XtNsensitive, info->page_selection == PAGE_RANGE, */
+ XtNresizable, True,
+ XtNfromHoriz, page_to_text,
+ /* HORIZONTAL_RESIZING_NO, */
+ XtNleft, XtChainLeft,
+ VERTICAL_RESIZING_NO,
+ NULL);
+
+ adjust_vertically(range_from_to_radio, page_from_text, ddist);
+ adjust_vertically(to_label, page_from_text, ddist);
+ adjust_vertically(of_label, page_from_text, ddist);
+
+ /* box for the OK/Cancel button */
+ box = XtVaCreateManagedWidget("box", formWidgetClass, paned,
+ /* resizing by user isn't needed */
+ XtNshowGrip, False,
+ XtNdefaultDistance, 6, /* some padding */
+ /* resizing the window shouldn't influence this box,
+ * but only the pane widget
+ */
+ XtNskipAdjust, True,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+
+ ok_button = XtVaCreateManagedWidget(act == FILE_PRINT ? "print_button" : "save_button", commandWidgetClass, box,
+ XtNlabel, act == FILE_PRINT ? "Print" : "Save",
+ XtNaccelerators, G_accels_cr,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ HORIZONTAL_RESIZING_NO,
+ NULL);
+ XtAddCallback(ok_button, XtNcallback, cb_print_or_save, (XtPointer)info);
+
+ XtInstallAccelerators(form, ok_button);
+ if (act == FILE_PRINT)
+ XtInstallAccelerators(print_to_printer_text, ok_button);
+ XtInstallAccelerators(print_to_file_text, ok_button);
+
+ cancel_button = XtVaCreateManagedWidget("cancel", commandWidgetClass, box,
+ XtNlabel, "Cancel",
+ XtNfromHoriz, ok_button,
+ XtNbottom, XtChainBottom,
+ XtNjustify, XtJustifyRight,
+ XtNleft, XtChainRight,
+ XtNright, XtChainRight,
+ NULL);
+ XtAddCallback(cancel_button, XtNcallback, cb_popdown, (XtPointer)info);
+
+ XtManageChild(info->shell);
+ center_window(info->shell, globals.widgets.top_level);
+ XtMapWidget(info->shell);
+ XSetWMProtocols(XtDisplay(info->shell), XtWindow(info->shell), &WM_DELETE_WINDOW, 1);
+
+ if (pageinfo_have_marked_pages()) {
+ XawToggleSetCurrent(print_or_save_range_all_radio, cast_int_to_XtPointer(PAGE_MARKED));
+ }
+ else if (info->page_selection == PAGE_MARKED) {
+ XawToggleSetCurrent(print_or_save_range_all_radio, cast_int_to_XtPointer(PAGE_ALL));
+ }
+#undef HORIZONTAL_RESIZING_NO
+#undef HORIZONTAL_RESIZING_YES
+#undef VERTICAL_RESIZING_NO
+}
+
+#endif /* MOTIF */
+
+static void
+get_initial_values(struct save_or_print_info *info)
+{
+ const char *extension = NULL;
+ char *tmp = NULL;
+
+ info->finfo->tmp_dvi_file = NULL;
+ info->finfo->tmp_ps_file = NULL;
+ info->finfo->tmp_dvi_fp = NULL;
+ /* info->finfo->out_fp = NULL; */
+
+ info->message_popup = NULL;
+
+ info->dvips_options = info->printer_options = NULL;
+
+ /*
+ * dvips options
+ */
+ info->dvips_options = xstrdup(resource.dvips_options_str ? resource.dvips_options_str : "");
+
+ /* add -t options if needed */
+ if (info->dvips_options == NULL || info->dvips_options[0] == '\0' || strstr(info->dvips_options, "-t ") == NULL) {
+ Boolean landscape = False;
+ char *paper = get_dvips_papersize(&landscape);
+ if (paper != NULL) {
+ if (info->dvips_options == NULL)
+ info->dvips_options = xstrdup("-t ");
+ else
+ info->dvips_options = xstrcat(info->dvips_options, " -t ");
+
+ info->dvips_options = xstrcat(info->dvips_options, paper);
+ free(paper);
+ if (landscape) {
+ info->dvips_options = xstrcat(info->dvips_options, " -t landscape");
+ }
+ }
+ }
+
+ /*
+ * printer options
+ */
+ if (resource.dvips_printer_str != NULL)
+ info->printer_options = xstrdup(resource.dvips_printer_str);
+ else {
+ /* initialize with default. We add the $PRINTER environment variable
+ * since dvips otherwise doesn't use it. */
+ char *printer = getenv("PRINTER");
+ info->printer_options = xstrdup("lpr");
+ if (printer != NULL) {
+ info->printer_options = xstrcat(info->printer_options, " -P");
+ info->printer_options = xstrcat(info->printer_options, printer);
+ }
+ }
+
+ info->print_target = resource.default_printing_target;
+ info->fmt = resource.default_saving_format;
+
+ if (pageinfo_have_marked_pages()) {
+ info->page_selection = PAGE_MARKED;
+ }
+ else {
+ info->page_selection = PAGE_ALL;
+ }
+
+ if (info->act == FILE_SAVE)
+ extension = output_format_mapping[resource.default_saving_format].extension;
+ else
+ extension = ".ps";
+
+ tmp = get_new_file_name(globals.dvi_name,
+ get_extension(globals.dvi_name),
+ extension);
+ info->finfo->out_file = xmalloc(strlen(globals.cwd) + strlen(tmp) + 2); /* 1 extra for dir separator */
+ sprintf(info->finfo->out_file, "%s/%s", globals.cwd, tmp);
+ free(tmp);
+ TRACE_FILES((stderr, "OUTFILE: |%s|\n", info->finfo->out_file));
+}
+
+static int
+textfield_to_int(Widget w)
+{
+ char *s, *p;
+ int pageno;
+#ifndef MOTIF
+ XtVaGetValues(w, XtNstring, &s, NULL);
+#else /* MOTIF */
+ s = XmTextFieldGetString(w);
+#endif
+ p = s;
+ if (*p == '-')
+ ++p;
+ if (!isdigit((int)*p)) {
+ return 0;
+ }
+ do {
+ ++p;
+ } while (isdigit((int)*p));
+ if (*p != '\0')
+ return 0;
+
+ pageno = atoi(s) - globals.pageno_correct;
+#ifdef MOTIF
+ XtFree(s);
+#endif
+ return pageno;
+}
+
+/*
+ Return a copy of the text value of Widget w in malloc'ed memory,
+ or NULL if the text is empty.
+*/
+
+static char *
+widgets_get_textfield(Widget w)
+{
+ char *ptr = NULL;
+ XtVaGetValues(w,
+#if MOTIF
+ XmNvalue,
+#else
+ XtNstring,
+#endif
+ &ptr, NULL);
+
+ if (ptr == NULL || *ptr == '\0')
+ return NULL;
+ else
+ return xstrdup(ptr);
+}
+
+static char *
+widgets_get_textfield_by_name(const struct save_or_print_info *info, const char *widget_name)
+{
+ Widget w;
+ if (get_widget_by_name(&w, info->shell, widget_name, True)) {
+ return widgets_get_textfield(w);
+ }
+ return NULL;
+}
+
+static pageRadioT
+widgets_get_page_selection(struct save_or_print_info *info)
+{
+ Widget radio_all;
+#ifdef MOTIF
+ Widget radio_marked;
+#endif
+ if (get_widget_by_name(&radio_all, info->shell, Xdvi_PAGES_ALL_RADIO_NAME, True)
+#ifdef MOTIF
+ && get_widget_by_name(&radio_marked, info->shell, Xdvi_PAGES_MARKED_RADIO_NAME, True)
+#endif
+ ) {
+#ifdef MOTIF
+ if (XmToggleButtonGadgetGetState(radio_all))
+ return PAGE_ALL;
+ else if (XmToggleButtonGadgetGetState(radio_marked))
+ return PAGE_MARKED;
+ else
+ return PAGE_RANGE;
+#else
+ return (pageRadioT)XawToggleGetCurrent(radio_all);
+#endif
+ }
+ return NO_PAGE_VAL; /* dummy */
+}
+
+static int
+widgets_get_from_page(struct save_or_print_info *info)
+{
+ Widget w;
+ if (get_widget_by_name(&w, info->shell, Xdvi_PAGES_RANGE_FROM_TEXT_NAME, True)) {
+ return textfield_to_int(w);
+ }
+ return 0;
+}
+
+static int
+widgets_get_to_page(struct save_or_print_info *info)
+{
+ Widget w;
+ if (get_widget_by_name(&w, info->shell, Xdvi_PAGES_RANGE_TO_TEXT_NAME, True)) {
+ return textfield_to_int(w);
+ }
+ return 0;
+}
+
+static void
+set_check_page_range(struct save_or_print_info *info, Boolean check)
+{
+ Widget text_from, text_to;
+
+ if (get_widget_by_name(&text_from, info->shell, Xdvi_PAGES_RANGE_FROM_TEXT_NAME, True)
+ && get_widget_by_name(&text_to, info->shell, Xdvi_PAGES_RANGE_TO_TEXT_NAME, True)) {
+
+ char page_string[LENGTH_OF_INT];
+
+ if (check) { /* check validity of current values */
+ int curr_from = textfield_to_int(text_from);
+ int curr_to = textfield_to_int(text_to);
+
+ if (curr_from < total_pages && curr_to < total_pages) /* values are OK */
+ return;
+ }
+
+ sprintf(page_string, "%d", current_page + globals.pageno_correct);
+
+#ifdef MOTIF
+ XtVaSetValues(text_from, XmNvalue, page_string, XmNcursorPosition, strlen(page_string), NULL);
+ XtVaSetValues(text_to, XmNvalue, page_string, XmNcursorPosition, strlen(page_string), NULL);
+#else
+ XtVaSetValues(text_from, XtNstring, page_string, NULL);
+ XtVaSetValues(text_to, XtNstring, page_string, NULL);
+ XawTextSetInsertionPoint(text_from, strlen(page_string));
+ XawTextSetInsertionPoint(text_to, strlen(page_string));
+#endif
+ }
+}
+
+static void
+popdown_dialog_and_print_or_save(XtPointer myinfo)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)myinfo;
+
+ cb_popdown(NULL, info, NULL);
+
+ if (globals.dvi_file.bak_fp == NULL) { /* shouldn't happen */
+ info->message_popup = popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL,
+ "No active DVI file");
+ return;
+ }
+
+ ASSERT(info->finfo->in_fp != NULL, "DVI input FILE * must have been set!");
+
+ store_preference(NULL, "dvipsOptionsString", "%s", info->dvips_options ? info->dvips_options : "");
+ if (info->act == FILE_PRINT) {
+ store_preference(NULL, "defaultPrintingTarget", "%d", info->print_target);
+ store_preference(NULL, "dvipsPrinterString", "%s", info->printer_options ? info->printer_options : "");
+ internal_print(info);
+ }
+ else {
+ store_preference(NULL, "defaultSavingFormat", "%d", info->fmt);
+ internal_save(info);
+ }
+}
+
+/* Clean up after user has aborted printing/saving */
+static void
+do_cleanup(XtPointer arg)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)arg;
+
+ cancel_saving(info);
+ if (info->finfo->tmp_dvi_file != NULL) {
+ unlink(info->finfo->tmp_dvi_file);
+ info->finfo->tmp_dvi_file = NULL;
+ }
+ if (info->finfo->tmp_ps_file != NULL) {
+ unlink(info->finfo->tmp_ps_file);
+ info->finfo->tmp_ps_file = NULL;
+ }
+}
+
+
+/*
+ * First round of sanity checks for page range etc.
+ */
+static void
+print_check_page_values(struct save_or_print_info *info)
+{
+ struct select_pages_info *pinfo = info->pinfo;
+
+ /* get current dvips and printer options */
+ free(info->dvips_options);
+ free(info->printer_options);
+ info->dvips_options = info->printer_options = NULL;
+
+ info->dvips_options = widgets_get_textfield_by_name(info, Xdvi_DVIPS_OPTIONS_TEXT);
+ if (info->act == FILE_PRINT)
+ info->printer_options = widgets_get_textfield_by_name(info, Xdvi_TO_PRINTER_TEXT);
+ info->page_selection = widgets_get_page_selection(info);
+
+ /* fprintf(stderr, "page selection: %d\n", info->page_selection); */
+
+ if (info->page_selection == PAGE_ALL) {
+ /* fprintf(stderr, "ALL!!!\n"); */
+ pinfo->callback = NULL;
+ }
+ else if (info->page_selection == PAGE_MARKED) {
+ /* fprintf(stderr, "MARKED!!!\n"); */
+ pinfo->callback = check_marked;
+ }
+ else { /* PAGE_RANGE */
+ /* fprintf(stderr, "RANGE!!!\n"); */
+ pinfo->from = widgets_get_from_page(info);
+ pinfo->to = widgets_get_to_page(info);
+ pinfo->callback = check_pagerange;
+ if (pinfo->from + 1 < 1) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR,
+ "Please specify a valid page range.",
+ "Invalid page range: start (%d) < 1.",
+ pinfo->from + 1);
+ return;
+ }
+ else if (pinfo->from > pinfo->to) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR,
+ "Please specify a valid page range.",
+ "Invalid page range: start (%d) > end (%d).",
+ pinfo->from + 1, pinfo->to + 1);
+ return;
+ }
+ else if (pinfo->to + 1 > total_pages) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR,
+ "Please specify a valid page range.",
+ "Invalid page range: end (%d) > total_pages (%d).",
+ pinfo->to + 1, total_pages);
+ return;
+ }
+ }
+
+ print_check_dvi_file(info);
+}
+
+/*
+ Second round of sanity checks.
+*/
+static void
+print_check_dvi_file(struct save_or_print_info *info)
+{
+ FILE *fin = NULL;
+
+ /* Return if there are active popups; otherwise, the print process
+ may get messed up */
+ if (raise_message_windows()) {
+ XBell(DISP, 0);
+#if 0
+ popup_message(info->shell,
+ MSG_WARN, NULL,
+ "Please close other open message windows first!");
+#endif
+ return;
+ }
+
+ /* If we want to print/save the marked pages, or save to a DVI file,
+ we need to create a temporary DVI file containing the selected or all pages. */
+ if (info->page_selection == PAGE_MARKED || info->fmt == FMT_DVI) {
+ int tmp_fd;
+ free(info->finfo->tmp_dvi_file);
+ info->finfo->tmp_dvi_file = NULL;
+ tmp_fd = xdvi_temp_fd(&(info->finfo->tmp_dvi_file)); /* this allocates info->finfo->tmp_dvi_file */
+
+ if (tmp_fd == -1) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR, NULL,
+ "Couldn't create temporary DVI file for printing: %s", strerror(errno));
+ return;
+ }
+ /* don't use XFOPEN here, since we don't want to treat an error in opening the file as fatal. */
+ /* `b' in mode won't hurt ... */
+ if ((info->finfo->tmp_dvi_fp = try_fdopen(tmp_fd, "wb+")) == NULL) { /* failure */
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR,
+ "Xdvi needs to create a temporary file containing the "
+ "currently marked pages, but creating that file failed. "
+ "Try to fix the cause of the problem, or choose "
+ "\"Print selected pages\" as a workaround.",
+ "Could not open temp file for writing: %s.\n",
+ strerror(errno));
+ return;
+ }
+ }
+ /* We try to use the original DVI file unless it's corrupted, in which case
+ we ask the user if they want to save the cached copy instead */
+ if ((fin = fopen(globals.dvi_name, "rb")) == NULL
+ || !find_postamble(fin, &(info->pinfo->errflag))) {
+ Boolean could_not_open = False;
+ if (fin == NULL)
+ could_not_open = True;
+ if (fin)
+ fclose(fin);
+
+ /* if we can't use the temporary file as source for our copy, this is a fatal error */
+ if (!resource.use_temp_fp) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR, NULL,
+ "Could not copy DVI file %s: The file %s",
+ globals.dvi_name, could_not_open ? "doesn't exist any more" : "seems to be corrupted");
+ return;
+ }
+
+ /* else, we'll try to use the cached copy of the DVI file */
+ if ((fin = fopen(get_tmp_dvi_name(), "rb")) == NULL) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR, NULL,
+ "Something's very wrong here - opening of both the "
+ "original DVI file and the cached copy failed!");
+ return;
+ }
+
+ if (!find_postamble(fin, &(info->pinfo->errflag))) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR, NULL,
+ "Shouldn't happen: Cached copy of the DVI file seems corrupted!");
+ return;
+ }
+ info->finfo->in_fp = fin;
+
+ /* tell user about it */
+ info->message_popup =
+ choice_dialog(info->shell,
+ MSG_QUESTION, NULL,
+#ifndef MOTIF
+ NULL, /* TODO: binding for RET? */
+#endif /* MOTIF */
+ NULL, NULL, /* no pre_callbacks */
+ info->act == FILE_PRINT ? "Print Copy" : "Save Copy",
+ print_check_target_file, (XtPointer)info,
+ "Cancel", do_cleanup, (XtPointer)info,
+ "The DVI file %s %s. Do you want to %s a cached copy of the file?",
+ globals.dvi_name,
+ could_not_open ? "doesn't exist any more" : "seems to be corrupted",
+ info->act == FILE_PRINT ? "print" : "save");
+ }
+ else { /* original DVI file is OK, copy it */
+ info->finfo->in_fp = fin;
+ print_check_target_file((XtPointer)info);
+ }
+}
+
+static void
+print_check_target_file(XtPointer myinfo)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)myinfo;
+ char *filename = widgets_get_textfield_by_name(info, Xdvi_TO_FILE_TEXT);
+ char *expanded_filename;
+
+ /* Return if there are active popups; otherwise, the print process
+ will be messed up. */
+ if (raise_message_windows()) {
+ XBell(DISP, 0);
+ return;
+ }
+
+ /* if we're just printing to printer, go ahead */
+ if (!(info->act == FILE_SAVE || (info->act == FILE_PRINT && info->print_target == TO_FILE))) {
+ popdown_dialog_and_print_or_save(info);
+ return;
+ }
+
+ /* expand and canonicalize filename */
+ if (filename == NULL) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_WARN,
+ NULL,
+ "No filename specified!");
+ return;
+ }
+ expanded_filename = expand_homedir(filename); /* this allocates expanded_filename */
+
+ if (expanded_filename == NULL) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_WARN,
+ "Please specify either a filename or a full path, without using \"~\" or \"~user\".",
+ "Couldn't expand filename \"%s\" to a full path.",
+ filename);
+ free(filename);
+ return;
+ }
+ free(filename);
+ free(info->finfo->out_file);
+ info->finfo->out_file = expanded_filename;
+
+ if (info->act == FILE_SAVE && info->fmt == FMT_DVI) { /* canonicalize filename */
+ char *tmp = expand_filename_append_dvi(info->finfo->out_file, USE_CWD_PATH, False); /* this mallocs tmp */
+ if (strcmp(tmp, globals.dvi_name) == 0) {
+ info->message_popup =
+ popup_message(info->shell,
+ MSG_ERR,
+ NULL,
+ "Cannot overwrite the current DVI file (%s). "
+ "Please choose a different file name.",
+ info->finfo->out_file);
+ free(tmp);
+ free(info->finfo->out_file);
+ info->finfo->out_file = NULL;
+ return;
+ }
+ free(info->finfo->out_file);
+ info->finfo->out_file = tmp;
+ }
+ if (info->act == FILE_SAVE || (info->act == FILE_PRINT && info->print_target == TO_FILE)) {
+ /* check whether to clobber existing file */
+ struct stat statbuf;
+ if (stat(info->finfo->out_file, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) {
+ info->message_popup =
+ choice_dialog(info->shell,
+ MSG_QUESTION, NULL,
+#ifndef MOTIF
+ NULL, /* TODO: binding for RET */
+#endif
+ NULL, NULL, /* no pre_callbacks */
+ "Replace", popdown_dialog_and_print_or_save, (XtPointer)info,
+ /*
+ do nothing if user selects `cancel'; this will return to the
+ printing dialog, since user hasn't changed their mind about
+ printing, but would probably just like to choose another filename
+ */
+ "Cancel", NULL, (XtPointer)NULL,
+ "The file %s already exists.\nDo you want to replace it?",
+ info->finfo->out_file);
+ return;
+ }
+ else {
+ popdown_dialog_and_print_or_save(info);
+ }
+ }
+ else {
+ popdown_dialog_and_print_or_save(info);
+ }
+}
+
+static void
+notify_dialog(Widget w, pageRadioT *value_bak)
+{
+ Widget radio_all, radio_marked;
+#ifdef MOTIF
+ Widget radio_range;
+#endif
+ Boolean have_marked = pageinfo_have_marked_pages();
+ pageRadioT value_curr;
+
+ /* fprintf(stderr, "have_marked: %d\n", have_marked); */
+
+ if (get_widget_by_name(&radio_all, w, Xdvi_PAGES_ALL_RADIO_NAME, True)
+ && get_widget_by_name(&radio_marked, w, Xdvi_PAGES_MARKED_RADIO_NAME, True)
+#ifdef MOTIF
+ && get_widget_by_name(&radio_range, w, Xdvi_PAGES_RANGE_RADIO_NAME, True)
+#endif
+ ) {
+
+ /* get the current value */
+#ifdef MOTIF
+ if (XmToggleButtonGadgetGetState(radio_all))
+ value_curr = PAGE_ALL;
+ else if (XmToggleButtonGadgetGetState(radio_marked))
+ value_curr = PAGE_MARKED;
+ else
+ value_curr = PAGE_RANGE;
+#else
+ value_curr = (pageRadioT)XawToggleGetCurrent(radio_all);
+#endif
+
+ /* fprintf(stderr, "current value: %d\n", value_curr); */
+
+ if (value_curr == PAGE_MARKED && have_marked)
+ return;
+ if (value_curr != PAGE_MARKED && !have_marked) {
+ XtVaSetValues(radio_marked,
+#ifdef MOTIF
+ XmNsensitive,
+#else
+ XtNsensitive,
+#endif
+ False, NULL);
+ return;
+ }
+
+ /* otherwise, if we have marked pages now, we want to switch from
+ the current value to `marked', saving the current value in *value_bak. */
+
+ /* XXX FIXME: There's a bug with OpenMotif 2.1 if the following order is used:
+ - without marked pages, open dialog
+ - mark a page; button `marked' is selected
+ - select button `all'
+ - select button `range'
+ - unmark page; `marked' becomes insensitive
+ - mark page, `marked' becomes sensitive and is selected, `range' is unselected
+ - up to here, everything is as expected, but if you now select `range',
+ it doesn't work, no button changes its state. As a workaround, if you select
+ `marked' again and then `range', it works. Strangely, the callback when unsetting
+ `range' is invoked correctly, so the button should be in the correct internal state ...
+ I think this is an OpenMotif bug.
+ */
+ if (have_marked) {
+ *value_bak = value_curr;
+#ifdef MOTIF
+ if (value_curr == PAGE_ALL) {
+ XmToggleButtonGadgetSetState(radio_all, False, True);
+ }
+ else {
+ XmToggleButtonGadgetSetState(radio_range, False, True);
+ }
+ XmToggleButtonGadgetSetState(radio_marked, True, True);
+ XtVaSetValues(radio_marked, XmNsensitive, True, NULL);
+ XmProcessTraversal(radio_marked, XmTRAVERSE_CURRENT);
+#else
+ XawToggleSetCurrent(radio_all, cast_int_to_XtPointer(PAGE_MARKED));
+ XtVaSetValues(radio_marked, XtNsensitive, True, NULL);
+#endif
+ }
+ else {
+ /* no marked pages now; switch back to the value from *value_bak. */
+ /* fprintf(stderr, "switching back to button %d\n", *value_bak); */
+#ifdef MOTIF
+ if (*value_bak == PAGE_ALL) {
+ XmToggleButtonGadgetSetState(radio_all, True, True);
+ XmProcessTraversal(radio_all, XmTRAVERSE_CURRENT);
+ }
+ else {
+ XmToggleButtonGadgetSetState(radio_range, True, True);
+ XmProcessTraversal(radio_range, XmTRAVERSE_CURRENT);
+ }
+ XmToggleButtonGadgetSetState(radio_marked, False, True);
+ XtVaSetValues(radio_marked, XmNsensitive, False, NULL);
+#else
+ XawToggleSetCurrent(radio_all, (XtPointer)*value_bak);
+ XtVaSetValues(radio_marked, XtNsensitive, *value_bak == PAGE_MARKED, NULL);
+#endif
+ }
+ }
+}
+
+/* access from pagesel.c if user marks or unmarks a page in the page list */
+void
+notify_print_dialog_have_marked(void)
+{
+ Widget print_shell, save_shell;
+ static pageRadioT save_value_bak = PAGE_ALL;
+ static pageRadioT print_value_bak = PAGE_ALL;
+
+ /* notify *both* windows, save and print, but only if they already exist */
+ if (get_widget_by_name(&print_shell, globals.widgets.top_level, Xdvi_PRINT_SHELL_NAME, False))
+ notify_dialog(print_shell, &save_value_bak);
+
+ if (get_widget_by_name(&save_shell, globals.widgets.top_level, Xdvi_SAVE_SHELL_NAME, False))
+ notify_dialog(save_shell, &print_value_bak);
+}
+
+/* main entry point: pop up the dialog */
+void
+save_or_print_callback(struct save_or_print_info *info)
+{
+ if (info->shell != NULL && window_is_mapped(XtWindow(info->shell), DISP)) {
+ XBell(DISP, 0);
+ XRaiseWindow(DISP, XtWindow(info->shell));
+ return;
+ }
+
+ if (info->act == FILE_PRINT && printlog_raise_active(info)) {
+ XBell(DISP, 0);
+ return;
+ }
+
+ if (globals.dvi_file.bak_fp == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Empty or incomplete DVI file. "
+ "Please select a new DVI file via File -> Open.");
+ return;
+ }
+
+ if (info->shell == NULL) { /* first time */
+ get_initial_values(info);
+#ifdef MOTIF
+ motif_create_dialog(info);
+#else
+ xaw_create_dialog(info);
+#endif
+ /* fprintf(stderr, "SHELL IS: %p\n", (void *)info->shell); */
+ set_check_page_range(info, False); /* set initial values */
+
+ if (info->act == FILE_SAVE)
+ update_dvips_options_sensitivity(resource.default_saving_format, info->shell);
+ }
+ else {
+ set_check_page_range(info, False); /* was: True, use False to reset values to current page */
+ }
+
+ /* map the dialog */
+ XtPopup(info->shell, XtGrabNone);
+}
+
diff --git a/Build/source/texk/xdvik/gui/print-dialog.h b/Build/source/texk/xdvik/gui/print-dialog.h
new file mode 100644
index 00000000000..7b7c6ccf4d6
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/print-dialog.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PRINT_DIALOG_H_
+#define PRINT_DIALOG_H_
+
+#include "print-internal.h"
+
+extern void save_or_print_callback(struct save_or_print_info *info);
+extern void cancel_saving(struct save_or_print_info *info);
+extern void notify_print_dialog_have_marked(void);
+
+#endif /* PRINT_DIALOG_H_ */
diff --git a/Build/source/texk/xdvik/gui/print-log.c b/Build/source/texk/xdvik/gui/print-log.c
new file mode 100644
index 00000000000..72905fcefe5
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/print-log.c
@@ -0,0 +1,733 @@
+/*
+ * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ FIXME: The printlog presents too much detail and is confusing for users.
+ Re-implement it using an `printing page n of m' message,
+ i.e. according to the spec on:
+ http://xdvi.sourceforge.net/gui.html#file-print
+ Possible save the detailed log to a different window that can be viewed
+ via `File -> logs', as described on:
+ http://xdvi.sourceforge.net/gui.html#file-logs
+*/
+
+#include "xdvi-config.h"
+#include <string.h>
+#include "xdvi.h"
+
+#include "xdvi-debug.h"
+#include "print-dialog.h"
+#include "print-internal.h"
+#include "print-log.h" /* for adjust_vertically() */
+#include "util.h"
+#include "string-utils.h"
+#include "x_util.h"
+#include "xlwradio.h"
+
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+
+#ifdef MOTIF
+# include <Xm/BulletinB.h>
+# include <Xm/DialogS.h>
+# include <Xm/MessageB.h>
+# include <Xm/LabelG.h>
+# include <Xm/Form.h>
+# include <Xm/Frame.h>
+# include <Xm/ToggleBG.h>
+# include <Xm/PanedW.h>
+# include <Xm/Text.h>
+# include <Xm/TextF.h>
+# include <Xm/PushB.h>
+# include <Xm/Protocols.h>
+# include <Xm/AtomMgr.h>
+#else
+# include <X11/Shell.h>
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Label.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/Toggle.h>
+# include <X11/Xaw/AsciiText.h>
+
+/* XawFmt8Bit is only available starting with X11R6: */
+# if XtSpecificationRelease < 6
+# define XawFmt8Bit FMT8BIT
+# endif
+
+#endif /* MOTIF */
+
+
+static void printlog_act_close(Widget, XEvent *, String *, Cardinal *);
+static void printlog_act_keep(Widget, XEvent *, String *, Cardinal *);
+static void printlog_act_unkeep(Widget, XEvent *, String *, Cardinal *);
+static void printlog_act_cancel(Widget, XEvent *, String *, Cardinal *);
+static void printlog_act_cancel_or_destroy(Widget, XEvent *, String *, Cardinal *);
+
+static Atom WM_DELETE_WINDOW;
+
+static XtActionsRec printlog_actions[] = {
+ {"printlogIntClose", printlog_act_close},
+ {"printlogIntKeep", printlog_act_keep},
+ {"printlogIntUnkeep", printlog_act_unkeep},
+ {"printlogIntCancel", printlog_act_cancel},
+ {"WM_cancel_or_destroy", printlog_act_cancel_or_destroy },
+};
+
+static const char *const PRINTLOG_WINDOW_TRANSLATIONS =
+#ifdef MOTIF
+"<Key>osfCancel:WM_cancel_or_destroy(%p)"
+#else
+"<Key>Escape:WM_cancel_or_destroy(%p)"
+#endif
+;
+
+#ifdef MOTIF
+static const char *const PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS =
+"#override\n"
+"<Key>osfCancel:WM_cancel_or_destroy(%p)";
+#endif
+
+
+static const char *const PRINTLOG_TEXT_TRANSLATIONS =
+#ifdef MOTIF
+"<Key>osfCancel:WM_cancel_or_destroy(%p)\n"
+#else
+"<Key>Escape:WM_cancel_or_destroy(%p)\n"
+#endif
+"<Key>Return:printlogIntClose(%p)\n"
+"^<Key>c:printlogIntCancel(%p)\n"
+"^<Key>s:printlogIntKeep(%p)\n"
+"^<Key>q:printlogIntUnkeep(%p)\n"
+"<Key>q:printlogIntClose(%p)";
+
+#define Xdvi_PRINTLOG_TEXT_NAME "text"
+#define Xdvi_PRINTLOG_CLOSE_NAME "close"
+#define Xdvi_PRINTLOG_KEEP_NAME "keep"
+#define Xdvi_PRINTLOG_CANCEL_NAME "cancel"
+
+static void
+cb_printlog_act_cancel_or_destroy(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+ Widget cancel_button = NULL;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ ASSERT(info->callbacks != NULL && info->callbacks->cb_destroy != NULL, "Callback not initialized");
+
+ /* If the `Cancel' button is still active, cancel printing, else close the window. */
+ if (get_widget_by_name(&cancel_button, info->printlog, Xdvi_PRINTLOG_CANCEL_NAME, True)) {
+ Boolean sensitive = False;
+
+ XtVaGetValues(cancel_button,
+#ifdef MOTIF
+ XmNsensitive,
+#else
+ XtNsensitive,
+#endif
+ &sensitive,
+ NULL);
+ fprintf(stderr, "Sensitive: %d\n", sensitive);
+ if (sensitive)
+ info->callbacks->cb_cancel(w, info, NULL);
+ else
+ info->callbacks->cb_destroy(w, info, NULL);
+ }
+}
+
+
+Boolean
+printlog_raise_active(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+ if (w != NULL && window_is_mapped(XtWindow(w), DISP)) {
+ XRaiseWindow(DISP, XtWindow(w));
+ return True;
+ }
+ return False;
+}
+
+void
+printlog_popup(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+#ifdef MOTIF
+ Widget cancel, text;
+#endif
+
+#ifdef MOTIF
+ char *text_translations = get_string_va(PRINTLOG_TEXT_TRANSLATIONS, info, info, info, info, info, info);
+ char *window_translations = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info);
+#endif
+
+ printlog_reset(info);
+
+ center_window(w, globals.widgets.top_level);
+ XtMapWidget(w);
+ /* XtPopup(w, XtGrabNone); */
+#ifndef MOTIF
+ XSetWMProtocols(XtDisplay(w), XtWindow(w), &WM_DELETE_WINDOW, 1);
+#else
+ XtOverrideTranslations(w, XtParseTranslationTable(window_translations));
+
+ if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True)
+ && get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) {
+
+ /* This breaks PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS??
+ * We don't want it activated on Return anyway ...
+ */
+ /* XmProcessTraversal(cancel, XmTRAVERSE_CURRENT); */
+ XtOverrideTranslations(text, XtParseTranslationTable(text_translations));
+ XtOverrideTranslations(text, XtParseTranslationTable(window_translations));
+ free(text_translations);
+ free(window_translations);
+ }
+#endif
+}
+
+void
+printlog_reset(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+ Widget text;
+
+ if (get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) {
+#ifndef MOTIF
+ XtVaSetValues(text, XtNstring, "", NULL);
+ XawTextSetInsertionPoint(text, 0);
+#else
+ XmTextSetString(text, "");
+ XtVaSetValues(text, XmNcursorPosition, 0, NULL);
+#endif
+ }
+}
+
+
+void
+printlog_create(struct save_or_print_info *info,
+ const char *title,
+ const char *close_label)
+{
+ Widget printlog_text, printlog_close, printlog_keep, printlog_cancel;
+ Widget form, paned, box;
+ char *window_translation_str;
+
+#ifdef MOTIF
+ XmString str;
+ XtTranslations window_override_translations;
+#else
+ char *text_translation_str = NULL;
+ XtTranslations wm_translations;
+ XtTranslations window_translations;
+#endif
+
+#ifdef MOTIF
+ window_translation_str = get_string_va(PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS, info);
+ window_override_translations = XtParseTranslationTable(window_translation_str);
+ free(window_translation_str);
+#else
+ window_translation_str = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info);
+ window_translations = XtParseTranslationTable(window_translation_str);
+ free(window_translation_str);
+#endif
+
+ XtAddActions(printlog_actions, XtNumber(printlog_actions));
+
+#ifndef MOTIF
+
+ wm_translations = XtParseTranslationTable("<Message>WM_PROTOCOLS: WM_cancel_or_destroy()");
+ info->printlog = XtVaCreatePopupShell("printlog",
+ transientShellWidgetClass, globals.widgets.top_level,
+ XtNtitle, title,
+ XtNtransientFor, globals.widgets.top_level,
+ XtNmappedWhenManaged, False,
+ XtNtranslations, wm_translations,
+ XtNtransientFor, globals.widgets.top_level,
+ NULL);
+
+ WM_DELETE_WINDOW = XInternAtom(XtDisplay(info->printlog), "WM_DELETE_WINDOW", False);
+
+ XtOverrideTranslations(info->printlog, window_translations);
+
+ paned = XtVaCreateManagedWidget("paned", panedWidgetClass, info->printlog, NULL);
+
+ form = XtVaCreateManagedWidget("form", formWidgetClass,
+ paned,
+ XtNdefaultDistance, 6,
+ NULL);
+ printlog_text = XtVaCreateManagedWidget(Xdvi_PRINTLOG_TEXT_NAME,
+ asciiTextWidgetClass, form,
+ XtNstring, "",
+ XtNdataCompression, False,
+ XtNeditType, XawtextAppend,
+ XtNscrollHorizontal, XawtextScrollAlways,
+ XtNscrollVertical, XawtextScrollAlways,
+ XtNwidth, 600,
+ XtNheight, 400,
+ XtNleft, XawChainLeft,
+ XtNright, XawChainRight,
+ XtNtop, XawChainTop,
+ XtNbottom, XawChainBottom,
+ NULL);
+ text_translation_str = get_string_va(PRINTLOG_TEXT_TRANSLATIONS, info, info, info, info, info, info);
+ XtOverrideTranslations(printlog_text, XtParseTranslationTable(text_translation_str));
+ free(text_translation_str);
+
+ printlog_keep = XtVaCreateManagedWidget(Xdvi_PRINTLOG_KEEP_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ form,
+ XtNlabel, close_label,
+ XtNborderWidth, 0,
+#ifdef XAW
+ XtNisRadio, False,
+#endif
+ XtNhighlightThickness, 1,
+ XtNfromVert, printlog_text,
+ XtNleft, XawChainLeft,
+ XtNright, XawChainLeft,
+ XtNtop, XawChainBottom,
+ XtNbottom, XawChainBottom,
+ NULL);
+ XtVaSetValues(printlog_keep,
+ XtNstate, resource.dvips_hang > 0 && resource.dvips_fail_hang > 0,
+ NULL);
+ XtAddCallback(printlog_keep, XtNcallback, info->callbacks->cb_keep, (XtPointer)info);
+
+ /* box for the Close/Cancel button */
+ box = XtVaCreateManagedWidget("box", formWidgetClass,
+ paned,
+ /* resizing by user isn't needed */
+ XtNshowGrip, False,
+ XtNdefaultDistance, 6, /* some padding */
+ /* resizing the window shouldn't influence this box,
+ * but only the pane widget
+ */
+ XtNskipAdjust, True,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+
+ printlog_close = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CLOSE_NAME,
+ commandWidgetClass, box,
+ XtNlabel, "Close",
+ XtNsensitive, False,
+ XtNleft, XawChainLeft,
+ XtNright, XawChainLeft,
+ XtNtop, XawChainBottom,
+ XtNbottom, XawChainBottom,
+ NULL);
+ XtAddCallback(printlog_close, XtNcallback, info->callbacks->cb_close, (XtPointer)info);
+
+ printlog_cancel = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CANCEL_NAME,
+ commandWidgetClass, box,
+ XtNlabel, "Cancel",
+ XtNfromHoriz, printlog_keep,
+ XtNleft, XawChainRight,
+ XtNright, XawChainRight,
+ XtNtop, XawChainBottom,
+ XtNbottom, XawChainBottom,
+ NULL);
+ XtAddCallback(printlog_cancel, XtNcallback, info->callbacks->cb_cancel, (XtPointer)info);
+ XtManageChild(info->printlog);
+
+ printlog_enable_cancelbutton(info);
+
+#else /* MOTIF */
+ info->printlog = XtVaCreatePopupShell("printlog",
+ xmDialogShellWidgetClass, globals.widgets.top_level,
+ XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */
+ XmNtitle, title,
+ XtNmappedWhenManaged, False,
+ XmNtranslations, window_override_translations,
+ NULL);
+
+ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(info->printlog), "WM_DELETE_WINDOW", False);
+ XmAddWMProtocolCallback(info->printlog, WM_DELETE_WINDOW, cb_printlog_act_cancel_or_destroy, (XtPointer)info);
+
+ paned = XtVaCreateWidget("printlog_pane", xmPanedWindowWidgetClass, info->printlog,
+ /* make sashes invisible */
+ XmNsashWidth, 1,
+ XmNsashHeight, 1,
+ XmNtranslations, window_override_translations,
+ NULL);
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass, paned,
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNautoUnmanage, False,
+ XmNtranslations, window_override_translations,
+ NULL);
+ /* force vertical scrollbars. Under Motif 2.x (2.1.0 and 2.2.2 at least),
+ XmNeditMode must be set early in order to have an effect. */
+ {
+ Arg args[10];
+ int n = 0;
+ XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
+ XtSetArg(args[n], XmNeditable, False); n++;
+ XtSetArg(args[n], XmNrows, 24); n++;
+ XtSetArg(args[n], XmNcolumns, 80); n++;
+
+ printlog_text = XmCreateScrolledText(form, Xdvi_PRINTLOG_TEXT_NAME, args, n);
+ }
+
+ XtVaSetValues(XtParent(printlog_text),
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtranslations, window_override_translations,
+ NULL);
+
+ XtManageChild(printlog_text);
+
+ str = XmStringCreateLocalized((char *)close_label);
+ printlog_keep = XtVaCreateManagedWidget(Xdvi_PRINTLOG_KEEP_NAME,
+ xmToggleButtonGadgetClass, form,
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNnavigationType, XmTAB_GROUP,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, XtParent(printlog_text),
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtranslations, window_override_translations,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(printlog_keep, XmNvalueChangedCallback, info->callbacks->cb_keep, (XtPointer)info);
+ XmToggleButtonGadgetSetState(printlog_keep, resource.dvips_hang > 0 && resource.dvips_fail_hang > 0, False);
+
+ /* box for Close/Cancel button */
+ box = XtVaCreateManagedWidget("box", xmFormWidgetClass,
+ paned,
+ NULL);
+
+ str = XmStringCreateLocalized("Close");
+ printlog_close = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CLOSE_NAME,
+ xmPushButtonWidgetClass, box,
+ XmNlabelString, str,
+ XmNshowAsDefault, True,
+ XmNsensitive, False,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* mimick appearance of native dialog buttons (better way would be
+ to extend existing dialog with custom widgets, as in search-dialog.c) */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNleftOffset, 10,
+ XmNtranslations, window_override_translations,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(printlog_close, XmNactivateCallback, info->callbacks->cb_close, (XtPointer)info);
+ XtOverrideTranslations(printlog_close, XtParseTranslationTable("<Key>Return:ArmAndActivate()\n"));
+
+
+ str = XmStringCreateLocalized("Cancel");
+ printlog_cancel = XtVaCreateManagedWidget(Xdvi_PRINTLOG_CANCEL_NAME,
+ xmPushButtonWidgetClass, box,
+ XmNlabelString, str,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ /* to mimick appearance of native dialog buttons: */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNrightOffset, 10,
+ XmNtranslations, window_override_translations,
+ NULL);
+ XmStringFree(str);
+ XtAddCallback(printlog_cancel, XmNactivateCallback, info->callbacks->cb_cancel, (XtPointer)info);
+ XtOverrideTranslations(printlog_close, XtParseTranslationTable("<Key>Return:ArmAndActivate()\n"));
+
+ XtManageChild(box);
+ XtManageChild(form);
+ XtManageChild(paned);
+ /* center_window(info->printlog, globals.widgets.top_level); */
+ /* XtMapWidget(info->printlog); */
+ /* this doesn't help */
+ /* XtOverrideTranslations(form, XtParseTranslationTable(text_translation_str)); */
+ /* XtOverrideTranslations(paned, XtParseTranslationTable(text_translation_str)); */
+
+ printlog_enable_cancelbutton(info);
+
+#endif
+ adjust_width(printlog_close, printlog_cancel);
+}
+
+void
+printlog_append(struct save_or_print_info *info, const char *str, size_t len)
+{
+ Widget text;
+ Widget w = info->printlog;
+
+ if (!get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True))
+ return;
+
+#ifndef MOTIF
+ {
+ XawTextPosition point;
+ static XawTextBlock block = {0, 0, NULL, 0};
+
+ block.ptr = (char *) str;
+ block.length = len;
+ block.format = XawFmt8Bit;
+
+ point = XawTextGetInsertionPoint(text);
+ while (XawTextReplace(text, point, point, &block) != XawEditDone) {
+ int length;
+
+ XtVaGetValues(text, XtNlength, &length, NULL);
+ point = length;
+ }
+ point += len;
+ XawTextSetInsertionPoint(text, point);
+ }
+#else /* MOTIF */
+ {
+ XmTextPosition point = XmTextGetInsertionPosition(text);
+ XmTextInsert(text, point, (char *) str);
+ point += len;
+ XtVaSetValues(text, XmNcursorPosition, point, NULL);
+ XmTextShowPosition(text, point);
+ }
+#endif /* MOTIF */
+}
+
+void
+printlog_append_str(struct save_or_print_info *info, const char *str)
+{
+ printlog_append(info, str, strlen(str));
+}
+
+/* enable cancel button, disable close button */
+void
+printlog_enable_cancelbutton(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+ Widget close, cancel;
+
+ if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True)
+ && get_widget_by_name(&close, w, Xdvi_PRINTLOG_CLOSE_NAME, True)) {
+
+ XtSetSensitive(close, False);
+ XtSetSensitive(cancel, True);
+#if MOTIF
+ /* This breaks PRINTLOG_WINDOW_OVERRIDE_TRANSLATIONS??
+ * We don't want it activated on Return anyway ...
+ */
+ /* XmProcessTraversal(cancel, XmTRAVERSE_CURRENT); */
+#endif
+ }
+}
+
+/* disable cancel button, enable close button */
+void
+printlog_enable_closebutton(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+ Widget close, cancel;
+
+ if (get_widget_by_name(&cancel, w, Xdvi_PRINTLOG_CANCEL_NAME, True)
+ && get_widget_by_name(&close, w, Xdvi_PRINTLOG_CLOSE_NAME, True)) {
+#if MOTIF
+ char *window_translations = get_string_va(PRINTLOG_WINDOW_TRANSLATIONS, info);
+#endif
+ XtSetSensitive(close, True);
+ XtSetSensitive(cancel, False);
+#if MOTIF
+ XmProcessTraversal(close, XmTRAVERSE_CURRENT);
+ XtOverrideTranslations(close, XtParseTranslationTable(window_translations));
+ free(window_translations);
+#endif
+ }
+}
+
+static void
+printlog_internal_close(struct save_or_print_info *info)
+{
+ Widget w = info->printlog;
+ Widget text;
+
+ XtUnmapWidget(w);
+
+ if (get_widget_by_name(&text, w, Xdvi_PRINTLOG_TEXT_NAME, True)) {
+#ifndef MOTIF
+ XtVaSetValues(text, XtNstring, "", NULL);
+#else
+ XmTextSetString(text, "");
+#endif
+ }
+}
+
+void
+printlog_popdown(struct save_or_print_info *info, Boolean force)
+{
+ Widget w = info->printlog;
+ Widget keep;
+
+ if (force) { /* user clicked on `Close' */
+ printlog_internal_close(info);
+ }
+ else if (get_widget_by_name(&keep, w, Xdvi_PRINTLOG_KEEP_NAME, True)) { /* timer elapsed */
+#ifndef MOTIF
+ Boolean state;
+ XtVaGetValues(keep, XtNstate, &state, NULL);
+ if (state) {
+ printlog_internal_close(info);
+ }
+#else
+ if (XmToggleButtonGadgetGetState(keep)) {
+ printlog_internal_close(info);
+ }
+#endif
+ }
+}
+
+
+static void
+printlog_act_close(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+ struct save_or_print_info *info;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ ASSERT(info->callbacks != NULL && info->callbacks->cb_close != NULL, "Callback not initialized");
+ info->callbacks->cb_close(w, info, NULL);
+}
+
+static void
+printlog_act_keep(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+ struct save_or_print_info *info;
+ Widget keep;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ ASSERT(info->callbacks != NULL && info->callbacks->cb_keep != NULL, "Callback not initialized");
+ info->callbacks->cb_keep(w, info, NULL);
+
+ if (get_widget_by_name(&keep, info->printlog, Xdvi_PRINTLOG_KEEP_NAME, True)) {
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(keep, False, False);
+#else
+ XtVaSetValues(keep, XtNstate, False, NULL);
+#endif
+ }
+}
+
+
+static void
+printlog_act_unkeep(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+ struct save_or_print_info *info;
+ Widget keep;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ if (get_widget_by_name(&keep, info->printlog, Xdvi_PRINTLOG_KEEP_NAME, True)) {
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(keep, True, False);
+#else
+ XtVaSetValues(keep, XtNstate, True, NULL);
+#endif
+ }
+}
+
+
+static void
+printlog_act_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+ struct save_or_print_info *info;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+ sscanf(*params, "%p", &ptr);
+ info = (struct save_or_print_info *)ptr;
+
+ ASSERT(info->callbacks != NULL && info->callbacks->cb_cancel != NULL, "Callback not initialized");
+ info->callbacks->cb_cancel(w, info, NULL);
+}
+
+
+static void
+printlog_act_cancel_or_destroy(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+ sscanf(*params, "%p", &ptr);
+
+ cb_printlog_act_cancel_or_destroy(w, (XtPointer)ptr, NULL);
+
+ /* ASSERT(info->callbacks != NULL && info->callbacks->cb_cancel != NULL, "Callback not initialized"); */
+ /* info->callbacks->cb_cancel(w, info, NULL); */
+}
diff --git a/Build/source/texk/xdvik/gui/print-log.h b/Build/source/texk/xdvik/gui/print-log.h
new file mode 100644
index 00000000000..53855d8e04e
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/print-log.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PRINT_LOG_H_
+#define PRINT_LOG_H_
+
+struct save_or_print_info *info; /* forward declaration */
+
+/* printlog access functions */
+extern void printlog_create(struct save_or_print_info *info,
+ const char *title,
+ const char *close_label);
+extern Boolean printlog_raise_active(struct save_or_print_info *info);
+extern void printlog_popup(struct save_or_print_info *info);
+extern void printlog_reset(struct save_or_print_info *info);
+extern void printlog_append(struct save_or_print_info *info, const char *str, size_t len);
+extern void printlog_append_str(struct save_or_print_info *info, const char *str);
+extern void printlog_enable_closebutton(struct save_or_print_info *info);
+extern void printlog_enable_cancelbutton(struct save_or_print_info *info);
+extern void printlog_popdown(struct save_or_print_info *info, Boolean override_timer);
+
+#endif /* PRINT_LOG_H_ */
diff --git a/Build/source/texk/xdvik/gui/search-dialog.c b/Build/source/texk/xdvik/gui/search-dialog.c
new file mode 100644
index 00000000000..5e1a69792a0
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/search-dialog.c
@@ -0,0 +1,1399 @@
+/*
+ * Copyright (c) 2003-2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "events.h"
+#include "dvi-init.h"
+#include "search-dialog.h"
+#include "search-internal.h"
+#include "xlwradio.h"
+#include "statusline.h"
+#include "string-utils.h"
+#include "string_list.h"
+#include "util.h"
+#include "message-window.h"
+#include "x_util.h"
+#include "xm_menu.h" /* for popdown_callback() */
+
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+
+#ifdef MOTIF
+# include <Xm/BulletinB.h>
+# include <Xm/DialogS.h>
+# include <Xm/PanedW.h>
+# include <Xm/MessageB.h>
+# include <Xm/LabelG.h>
+# include <Xm/Form.h>
+# include <Xm/Frame.h>
+# include <Xm/ToggleBG.h>
+# include <Xm/Text.h>
+# include <Xm/TextF.h>
+# include <Xm/PushB.h>
+# include <Xm/Protocols.h>
+# include <Xm/AtomMgr.h>
+# if USE_COMBOBOX
+# include <Xm/ComboBox.h>
+# include <Xm/List.h>
+# endif /* USE_COMBOBOX */
+#else /* MOTIF */
+# include <X11/Shell.h>
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Label.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/Toggle.h>
+# include <X11/Xaw/AsciiText.h>
+#endif /* MOTIF */
+
+/* #defines for widgets that are used in common code */
+#ifdef MOTIF
+# define SHELL_WIDGET xmDialogShellWidgetClass
+# define PANED_WIDGET xmPanedWindowWidgetClass
+# define FORM_WIDGET xmFormWidgetClass
+# define LABEL_WIDGET xmLabelGadgetClass
+# define TEXT_WIDGET xmTextFieldWidgetClass
+# define CHECKBOX_WIDGET xmToggleButtonGadgetClass
+# define CHECKBUTTON_IS_SET XmNset
+# define PUSHBUTTON_WIDGET xmPushButtonWidgetClass
+# define VALUE_CALLBACK_NAME XmNvalueChangedCallback
+# define ACTIVATE_CALLBACK_NAME XmNactivateCallback
+#else /* MOTIF */
+# define SHELL_WIDGET transientShellWidgetClass
+# define PANED_WIDGET panedWidgetClass
+# define FORM_WIDGET formWidgetClass
+# define LABEL_WIDGET labelWidgetClass
+# define TEXT_WIDGET asciiTextWidgetClass
+# ifdef XAW
+# define CHECKBOX_WIDGET radioWidgetClass
+# else /* XAW */
+# define CHECKBOX_WIDGET toggleWidgetClass
+# endif /* XAW */
+# define CHECKBUTTON_IS_SET XtNstate
+# define PUSHBUTTON_WIDGET commandWidgetClass
+# define VALUE_CALLBACK_NAME XtNcallback
+# define ACTIVATE_CALLBACK_NAME XtNcallback
+#endif /* MOTIF */
+
+#if defined(MOTIF) && USE_COMBOBOX
+struct search_history {
+ char **char_items;
+ size_t item_cnt;
+ Boolean empty;
+};
+
+#define Xdvi_HISTORY_EMPTY_MARKER "<History empty>"
+
+static void
+search_history_init(struct search_history *hist)
+{
+ if (resource.search_history == NULL) {
+ hist->empty = True;
+ hist->char_items = xmalloc(1 * sizeof *(hist->char_items));
+ hist->char_items[0] = NULL;
+ hist->item_cnt = 0;
+ }
+ else {
+ hist->char_items = get_separated_list(resource.search_history, "\n", False);
+ hist->empty = False;
+ /* count number of items and save to hist->item_cnt */
+ for (hist->item_cnt = 0; hist->char_items[hist->item_cnt] != NULL; hist->item_cnt++) { ; }
+ }
+}
+
+
+static void
+search_history_update(struct search_history *hist, Widget w, const char *str)
+{
+ size_t i;
+ char *tmp;
+ XmString tmp_str = XmStringCreateLocalized((char *)str);
+ Boolean found = False;
+ Widget textfield = NULL;
+
+ TRACE_FIND((stderr, "search_history_update for: |%s|\n", str));
+
+ /* special case if Xdvi_HISTORY_EMPTY_MARKER is present: Replace it with `str' */
+ if (hist->empty) {
+ XmComboBoxDeletePos(w, 0);
+ hist->empty = False;
+ hist->char_items = string_list_prepend(hist->char_items, str);
+ XmComboBoxAddItem(w, tmp_str, 0, True);
+ hist->item_cnt++;
+ XmStringFree(tmp_str);
+ return;
+ }
+
+ XtVaGetValues(w, XmNtextField, &textfield, NULL);
+ if (textfield == NULL) {
+ XDVI_ERROR((stderr, "Could not get text field from combo box!"));
+ XmStringFree(tmp_str);
+ return;
+ }
+
+ /* if str is already in the history, just move it to the first position */
+ for (i = 0; hist->char_items[i] != NULL; i++) {
+ if (strcmp(hist->char_items[i], str) == 0) {
+ found = True;
+ break;
+ }
+ }
+ if (found) {
+ hist->char_items = string_list_move_to_start(hist->char_items, i);
+ XmComboBoxDeletePos(w, i + 1);
+ XmComboBoxAddItem(w, tmp_str, 1, True);
+ XmComboBoxSelectItem(w, tmp_str);
+ XtVaSetValues(textfield, XmNcursorPosition, strlen(hist->char_items[0]), NULL);
+ XmStringFree(tmp_str);
+ return;
+ }
+
+ if ((int)hist->item_cnt >= resource.search_history_size) {
+ /* history has reached its max size, delete the oldest element and
+ put the new element at the beginning */
+
+ XmComboBoxDeletePos(w, hist->item_cnt);
+
+ free(hist->char_items[hist->item_cnt - 1]);
+ hist->char_items[hist->item_cnt - 1] = xstrdup(str);
+ hist->char_items = string_list_rotate_up(hist->char_items);
+
+ XmComboBoxAddItem(w, tmp_str, 1, False);
+ XmComboBoxSelectItem(w, tmp_str);
+ XtVaSetValues(textfield, XmNcursorPosition, strlen(str), NULL);
+ }
+ else { /* add item */
+ hist->char_items = string_list_prepend(hist->char_items, str);
+ XmComboBoxAddItem(w, tmp_str, 1, False);
+ XmComboBoxSelectItem(w, tmp_str);
+ XtVaSetValues(textfield, XmNcursorPosition, strlen(str), NULL);
+
+ hist->item_cnt++;
+ }
+
+ tmp = string_list_to_str(hist->char_items, "\n");
+ TRACE_FIND((stderr, "Saving search history: |%s|\n", tmp));
+ store_preference(NULL, "searchHistory", "%s", tmp);
+ free(tmp);
+
+
+ XmStringFree(tmp_str);
+}
+
+
+/*
+ * User selected an item from seach history list
+ */
+static void
+cb_search_history_select(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ XmComboBoxCallbackStruct *cb = (XmComboBoxCallbackStruct *)call_data;
+ struct search_history *hist = NULL;
+ Widget textfield;
+ int pos;
+ int idx;
+
+ UNUSED(client_data);
+
+ if (cb->event == NULL) /* only browsing, no selection */
+ return;
+
+ pos = cb->item_position;
+ TRACE_FIND((stderr, "POS: %d; reason: %d, event type: %d\n", pos, cb->reason, cb->event->type));
+
+ /* Return if user didn't select from menu, but entered text directly.
+ Strangely, `pos == 0' doesn't indicate this, contrary to what the docs say
+ about XmONE_BASED. */
+ if (pos == 0 || cb->event->type != ButtonRelease)
+ return;
+
+
+ XtVaGetValues(w,
+ XmNuserData, &hist,
+ XmNtextField, &textfield,
+ NULL);
+
+ if (hist == NULL || textfield == NULL) {
+ XDVI_ERROR((stderr, "Couldn't get XmNuserData or XmNtextField from combo box widget!\n"));
+ return;
+ }
+
+ idx = pos - 1;
+
+ if (idx == 0 && hist->char_items[0] == NULL) { /* Xdvi_HISTORY_EMPTY_MARKER selected, do nothing */
+ XtVaSetValues(textfield, XmNvalue, "", NULL);
+ }
+ else {
+ XmString tmp_str;
+
+ TRACE_FIND((stderr, "moving item %d, %s to pos 0\n", idx, hist->char_items[idx]));
+ hist->char_items = string_list_move_to_start(hist->char_items, idx);
+
+ /* same for list in combo box */
+ tmp_str = XmStringCreateLocalized(hist->char_items[0]);
+ XmComboBoxDeletePos(w, pos);
+ XmComboBoxAddItem(w, tmp_str, 1, True);
+ XmComboBoxSelectItem(w, tmp_str);
+ XtVaSetValues(textfield, XmNcursorPosition, strlen(hist->char_items[0]), NULL);
+ XmStringFree(tmp_str);
+ }
+}
+
+#endif /* defined(MOTIF) && USE_COMBOBOX */
+
+static Boolean m_find_popup_active = False;
+
+/* flags for setting single bits in resource.search_window_defaults */
+static const int SETTINGS_USE_REGEXP_FLAG = 1;
+static const int SETTINGS_CASE_SENSITIVE_FLAG = 2;
+static const int SETTINGS_BACKWARDS_FLAG = 4;
+static const int SETTINGS_IGNORE_LINEBREAKS_FLAG = 8;
+static const int SETTINGS_WRAP_FLAG = 16;
+
+
+static void
+cb_search_go(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ Widget find_popup;
+ Position x = 0, y = 0;
+
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(call_data);
+
+ TRACE_FIND((stderr, "cb_search_go: settings: searchterm=|%s|, down = %d, re = %d, case = %d, wrap = %d",
+ settings->term, settings->direction, settings->use_regexp, settings->case_sensitive, settings->wrap));
+
+ if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", True))
+ return;
+
+ XtVaGetValues(find_popup, XtNx, &x, XtNy, &y, NULL);
+ /* add some offsets */
+ settings->x_pos = x + 10;
+ settings->y_pos = y + 10;
+ TRACE_GUI((stderr, "SHELL: %ld; x: %d, y: %d", (unsigned long)w, x, y));
+
+ settings->from_page = current_page;
+ settings->message_window = 0;
+ settings->wrapcnt = 0;
+ TRACE_FIND((stderr, "starting search from page: %d", settings->from_page));
+ search_dvi((XtPointer)settings);
+}
+
+static void
+show_settings(const char *func_name, struct search_settings *settings)
+{
+ TRACE_FIND((stderr, "%s: settings: str=|%s|, down = %d, re = %d, "
+ "case = %d, ignore_hyphens = %d, ignore_linebreaks = %d, wrap = %d\n",
+ func_name,
+ settings->term,
+ settings->direction,
+ settings->use_regexp,
+ settings->case_sensitive,
+ settings->ignore_hyphens,
+ settings->ignore_linebreaks,
+ settings->wrap));
+
+}
+
+
+static void
+cb_regexp_search(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ /* Hack: Since XawToggleUnsetCurrent() will invoke this callback again,
+ return every second time to avoid multiple popups. This is done by
+ setting the flag `do_return'.
+ */
+#if !HAVE_REGEX_H
+ static Boolean do_return = False;
+#endif
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(call_data);
+
+#if !HAVE_REGEX_H
+ if (do_return) {
+ do_return = False;
+ return;
+ }
+
+ xdvi_bell();
+ popup_message(get_matching_parent(w, globals.widgets.top_level, "find_popup", NULL),
+ MSG_ERR,
+ NULL,
+ "Sorry, regular expression support (regex.h) is not available on this platform.");
+ do_return = True;
+#ifdef MOTIF
+ XmToggleButtonGadgetSetState(w, True, False);
+#else
+ XawToggleUnsetCurrent(w);
+#endif
+
+#else
+ UNUSED(w);
+ settings->use_regexp = !(settings->use_regexp);
+
+ /* force re-initialization of search term by resetting utf8_term: */
+ free(settings->utf8_term);
+ settings->utf8_term = NULL;
+
+ show_settings("cb_regexp_search", settings);
+#endif
+
+ if (settings->use_regexp)
+ resource.search_window_defaults |= SETTINGS_USE_REGEXP_FLAG;
+ else
+ resource.search_window_defaults &= ~SETTINGS_USE_REGEXP_FLAG;
+ store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults);
+}
+
+static void
+cb_backwards_search(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(w);
+ UNUSED(call_data);
+
+ switch (settings->direction) {
+ case SEARCH_UP: settings->direction = SEARCH_DOWN; break;
+ case SEARCH_DOWN: settings->direction = SEARCH_UP; break;
+ default: ASSERT(0, "shouldn't happen: settings->direction is neither SEARCH_UP nor SEARCH_DOWN!"); break;
+ }
+
+ show_settings("cb_backwards_search", settings);
+
+ if (settings->direction == SEARCH_UP)
+ resource.search_window_defaults |= SETTINGS_BACKWARDS_FLAG;
+ else
+ resource.search_window_defaults &= ~SETTINGS_BACKWARDS_FLAG;
+ store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults);
+}
+
+static void
+cb_wrap_search(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(w);
+ UNUSED(call_data);
+
+ settings->wrap = !settings->wrap;
+
+ show_settings("cb_wrap_search", settings);
+
+ if (settings->wrap)
+ resource.search_window_defaults |= SETTINGS_WRAP_FLAG;
+ else
+ resource.search_window_defaults &= ~SETTINGS_WRAP_FLAG;
+
+ store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults);
+}
+
+static void
+cb_match_case(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(w);
+ UNUSED(call_data);
+
+ settings->case_sensitive = !(settings->case_sensitive);
+
+ show_settings("cb_match_case", settings);
+
+ if (settings->case_sensitive)
+ resource.search_window_defaults |= SETTINGS_CASE_SENSITIVE_FLAG;
+ else
+ resource.search_window_defaults &= ~SETTINGS_CASE_SENSITIVE_FLAG;
+ store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults);
+}
+
+static void
+cb_linebreaks(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ ASSERT(settings != NULL, "client_data cb_search_go mustn't be NULL!");
+ UNUSED(w);
+ UNUSED(call_data);
+
+ settings->ignore_linebreaks = !(settings->ignore_linebreaks);
+ settings->ignore_hyphens = !(settings->ignore_hyphens);
+
+ show_settings("cb_linebreaks", settings);
+
+ if (settings->ignore_linebreaks)
+ resource.search_window_defaults |= SETTINGS_IGNORE_LINEBREAKS_FLAG;
+ else
+ resource.search_window_defaults &= ~SETTINGS_IGNORE_LINEBREAKS_FLAG;
+ store_preference(NULL, "searchWindowDefaults", "%u", resource.search_window_defaults);
+}
+
+
+static void
+cb_search_cancel(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Widget find_popup;
+ struct search_settings *settings = (struct search_settings *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", True))
+ return;
+
+ /* This flag is checked in the scanning routines, and
+ will be eventually reset by do_pages() in events.c.
+ (The scanning routines musn't reset it, since they
+ might not be called again after this point!) */
+ globals.ev.flags |= EV_FIND_CANCEL;
+
+ search_signal_page_changed(); /* Hack to make search restart anew */
+ search_erase_highlighting(True);
+ if (settings->message_window != 0) {
+ TRACE_GUI((stderr, "kill_message_window: %p\n", (void *)settings->message_window));
+ kill_message_window(settings->message_window);
+ }
+ XtPopdown(find_popup);
+ m_find_popup_active = False;
+}
+
+static void
+cb_search_get_term_button(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ char *searchterm = NULL;
+
+#if defined(MOTIF) && USE_COMBOBOX
+ struct search_history *hist = NULL;
+#endif
+
+ Widget searchbox_input, paned, box;
+ UNUSED(call_data);
+
+ box = XtParent(w);
+ ASSERT(box != 0, "Parent of button widget mustn't be NULL!");
+ paned = XtParent(box);
+ ASSERT(paned != 0, "Parent of box widget mustn't be NULL!");
+
+ if (!get_widget_by_name(&searchbox_input, paned, Xdvi_SEARCHBOX_INPUT_NAME, True))
+ return;
+
+#ifdef MOTIF
+# if USE_COMBOBOX
+ {
+ Widget textfield = NULL;
+ XtVaGetValues(searchbox_input,
+ XmNtextField, &textfield,
+ XmNuserData, &hist,
+ NULL);
+ if (textfield == NULL || hist == NULL) {
+ XDVI_ERROR((stderr, "Couldn't get XmNtextField or XmNuserData from combo box widget!\n"));
+ return;
+ }
+ XtVaGetValues(textfield, XmNvalue, &searchterm, NULL);
+ }
+# else
+ XtVaGetValues(searchbox_input, XmNvalue, &searchterm, NULL);
+# endif
+#else
+ XtVaGetValues(searchbox_input, XtNstring, &searchterm, NULL);
+#endif
+ if (searchterm == NULL) {
+ XDVI_WARNING((stderr, "Searchterm in cb_search_get_term callback shouldn't be NULL!"));
+ return;
+ }
+ TRACE_FIND((stderr, "searchterm1: |%s|", searchterm));
+ settings->term = searchterm;
+
+#if defined(MOTIF) && USE_COMBOBOX
+ search_history_update(hist, searchbox_input, searchterm);
+#endif
+
+ cb_search_go(w, settings, NULL);
+}
+
+static void
+search_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ struct search_settings *settings = NULL;
+ void *ptr;
+ UNUSED(event);
+
+ ASSERT(*num_params > 0, "params in search_cancel must be > 0!");
+ ASSERT(*params != NULL, "params in search_cancel mustn't be NULL!");
+
+ /*
+ * the *params char pointer contains the pointer value (address) of `settings';
+ * convert it back to a pointer:
+ */
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ settings = (struct search_settings *)ptr;
+ TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings));
+ ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer.");
+
+ cb_search_cancel(w, settings, NULL);
+}
+
+#ifdef MOTIF
+
+static void
+cb_search_get_term(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct search_settings *settings = (struct search_settings *)client_data;
+ char *searchterm = NULL;
+ Widget popup, button, textfield;
+ XEvent ev;
+ UNUSED(call_data);
+
+ TRACE_FIND((stderr, "cb_search_get_term!\n"));
+
+#if USE_COMBOBOX
+ UNUSED(w);
+ {
+ Widget combobox;
+ if (!get_widget_by_name(&combobox, globals.widgets.top_level, Xdvi_SEARCHBOX_INPUT_NAME, True)
+ || !get_widget_by_name(&textfield, globals.widgets.top_level, "Text", True))
+ return;
+ }
+#else
+ textfield = w;
+#endif
+
+ /* retrieve the `Find' button widget */
+ if (!get_widget_by_name(&popup, globals.widgets.top_level, Xdvi_SEARCH_POPUP_NAME, True)
+ || !get_widget_by_name(&button, popup, "find_button", True))
+ return;
+
+ if (settings != NULL) {
+ /* retrieve search term from text input field */
+ XtVaGetValues(textfield, XmNvalue, &searchterm, NULL);
+ if (searchterm == NULL) {
+ XDVI_WARNING((stderr, "Searchterm in cb_search_get_term callback shouldn't be NULL!"));
+ return;
+ }
+
+ TRACE_FIND((stderr, "searchterm2: |%s|", searchterm));
+ settings->term = (const char *)searchterm;
+ }
+
+ /* make the `Find' button think it got pushed.
+ Also synthesize an event, just to be sure ... */
+ synthesize_event(&ev, button);
+
+ XtCallActionProc(button, "ArmAndActivate", &ev, NULL, 0);
+ /* the following don't make the button appear visually pressed: */
+ /* XtCallCallbacks(button, XmNarmCallback, NULL); */
+ /* XtCallCallbacks(button, XmNactivateCallback, NULL); */
+}
+
+static void
+xm_search_go(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ struct search_settings *settings = NULL;
+ void *ptr;
+ Widget input;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (params != NULL) { /* re-initialize search term */
+ ASSERT(*num_params == 1, "num_params in xm_search_go should be 1 if *params != NULL");
+ /*
+ * the *params char pointer contains the pointer value (address) of `settings' as a string;
+ * convert it back to a pointer:
+ */
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ settings = (struct search_settings *)ptr;
+ TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings));
+ ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer.");
+ }
+
+ if (get_widget_by_name(&input, globals.widgets.top_level, "searchbox_input", True)) {
+ cb_search_get_term(input, settings, NULL);
+ }
+}
+
+#else /* MOTIF */
+
+static void
+xaw_unset_button(XtPointer client_data, XtIntervalId *id)
+{
+ XEvent ev;
+ Widget button = (Widget)client_data;
+
+ UNUSED(id);
+
+ synthesize_event(&ev, button);
+ XtCallActionProc(button, "unset", &ev, NULL, 0);
+}
+
+static void
+xaw_search_go(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ struct search_settings *settings = NULL;
+ void *ptr;
+ char *searchterm = NULL;
+ Widget button, input;
+
+ UNUSED(w);
+
+ if (!get_widget_by_name(&button, globals.widgets.top_level, "find_button", True)
+ || !get_widget_by_name(&input, globals.widgets.top_level, "searchbox_input", True))
+ return;
+
+ XtVaGetValues(input, XtNstring, &searchterm, NULL);
+ if (searchterm == NULL) {
+ XDVI_WARNING((stderr, "Searchterm in xaw_search_go callback shouldn't be NULL!"));
+ return;
+ }
+
+ if (params != NULL) { /* re-initialize search term */
+ ASSERT(*num_params == 1, "num_params in xaw_search_go should be 1 if *params != NULL");
+ /*
+ * the *params char pointer contains the pointer value (address) of `settings';
+ * convert it back to a pointer:
+ */
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ settings = (struct search_settings *)ptr;
+ TRACE_GUI((stderr, "Pointer address: |%p|", (void *)settings));
+ ASSERT(settings != NULL, "Shouldn't happen: Couldn't get string representation of argument pointer.");
+
+ settings->term = (const char *)searchterm;
+ }
+
+ /*
+ * Again, we want the button to appear activated when <RETURN> is pressed.
+ * For this, we explicitly invoke set()notify(), and unset() after a timeout
+ * of 150 milliseconds, which seems to correspond to the Motif default.
+ */
+ XtCallActionProc(button, "set", event, NULL, 0);
+ XtCallActionProc(button, "notify", event, NULL, 0);
+ XSync(DISP, False);
+ XtAppAddTimeOut(globals.app, 150, xaw_unset_button, (XtPointer)button);
+}
+
+
+/*
+ * Restart search from within another popup (confirmation) window.
+ */
+static void
+xaw_search_restart(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ void *ptr;
+ struct search_settings *settings;
+
+ UNUSED(event);
+ UNUSED(w);
+
+ ASSERT(*num_params > 0, "params in xaw_search_restart must be > 0!");
+ ASSERT(*params != NULL, "params in xaw_search_restart mustn't be NULL!");
+
+ TRACE_GUI((stderr, "Pointer string value: |%s|", *params));
+ sscanf(*params, "%p", &ptr);
+ settings = (struct search_settings *)ptr;
+
+ search_restart((XtPointer)settings);
+}
+
+static XtActionsRec xaw_search_actions[] = {
+ { "do-search-restart", xaw_search_restart },
+ { "do-search", xaw_search_go },
+};
+#endif /* MOTIF */
+
+static XtActionsRec search_actions[] = {
+ { "do-search",
+#ifdef MOTIF
+ xm_search_go
+#else
+ xaw_search_go
+#endif
+ },
+ { "cancel-search", search_cancel },
+};
+
+
+
+static Widget
+create_search_window(struct search_settings *settings)
+{
+ Widget top_level_shell;
+ Atom WM_DELETE_WINDOW;
+ Widget form, find_paned, box;
+ unsigned char curr_state;
+
+#if defined(MOTIF) && USE_COMBOBOX
+ static struct search_history hist = { NULL, 0, True };
+#endif
+
+ Widget searchbox_form, searchbox_label, searchbox_input;
+ /* left and right column */
+ Widget options_left_form, options_right_form;
+ /* checkboxes in left column */
+ Widget regexp_checkbox, matchcase_checkbox, backwards_checkbox, wrap_checkbox;
+ /* checkboxes in right column */
+ Widget linebreaks_checkbox;
+ Widget find_button, cancel_button;
+
+ XtTranslations xlats;
+ char *translation_str = NULL;
+#ifdef MOTIF
+ XmString str;
+#else /* MOTIF */
+ XtTranslations wm_translations;
+ int ddist;
+#endif
+
+ XtAddActions(search_actions, XtNumber(search_actions));
+
+#ifndef MOTIF
+
+ XtAddActions(xaw_search_actions, XtNumber(xaw_search_actions));
+#define HORIZONTAL_RESIZING_NO XtNleft, XtChainLeft, XtNright, XtChainLeft
+#define HORIZONTAL_RESIZING_YES XtNleft, XtChainLeft, XtNright, XtChainRight
+#define VERTICAL_RESIZING_NO XtNtop, XtChainTop, XtNbottom, XtChainTop
+
+ /*
+ * hacky: Since translations can only contain strings, pass
+ * the pointer address as string in the callback. But the only
+ * portability problem should be the size of the pointer
+ * representation, and we deal with that by using VSNPRINTF().
+ */
+ translation_str = get_string_va("<Message>WM_PROTOCOLS: cancel-search(%p)\nCtrl<Key>g:find-next()",
+ (void *)settings);
+ wm_translations = XtParseTranslationTable(translation_str);
+ free(translation_str);
+ translation_str = NULL;
+#endif /* not MOTIF */
+
+ translation_str = get_string_va(
+#ifdef MOTIF
+ "<Key>osfCancel:cancel-search(%p)\n"
+#else
+ "<Key>Escape:cancel-search(%p)\n"
+#endif
+ "<Key>Return:do-search(%p)\n"
+ "Ctrl<Key>g:find-next()",
+ (void *)settings, (void *)settings);
+
+ xlats = XtParseTranslationTable(translation_str);
+ free(translation_str);
+
+ top_level_shell = XtVaCreatePopupShell("find_popup",
+ SHELL_WIDGET,
+ globals.widgets.top_level,
+ XtNtitle, "xdvik: Find in File",
+ XtNmappedWhenManaged, False, /* so that we can center it first */
+ XtNtransientFor, globals.widgets.top_level,
+ XtNallowShellResize, True,
+#ifdef MOTIF
+ XmNdeleteResponse, XmDO_NOTHING, /* we'll take care of that ourselves */
+#else
+ XtNtranslations, wm_translations,
+#endif
+ NULL);
+
+ TRACE_GUI((stderr, "toplevel: %ld", (unsigned long)top_level_shell));
+
+ WM_DELETE_WINDOW = XInternAtom(XtDisplay(top_level_shell), "WM_DELETE_WINDOW", False);
+#ifdef MOTIF
+ XmAddWMProtocolCallback(top_level_shell, WM_DELETE_WINDOW, cb_search_cancel, settings);
+#endif
+
+ find_paned = XtVaCreateWidget("find_paned",
+ PANED_WIDGET,
+ top_level_shell,
+#ifdef MOTIF
+ /* make sashes invisible */
+ XmNsashWidth, 1,
+ XmNsashHeight, 1,
+#endif
+ NULL);
+
+ form = XtVaCreateWidget("form",
+ FORM_WIDGET,
+ find_paned,
+#ifdef MOTIF
+ XmNhorizontalSpacing, DDIST_MAJOR,
+ XmNverticalSpacing, DDIST_MAJOR,
+ XmNautoUnmanage, False,
+#else
+ XtNallowResize, True,
+#endif
+ NULL);
+
+#ifdef MOTIF
+ str = XmStringCreateLocalized("Find:");
+#else
+ XtVaGetValues(form, XtNdefaultDistance, &ddist, NULL);
+#endif
+
+ /* search term input field */
+ searchbox_form = XtVaCreateWidget("searchbox_form",
+ FORM_WIDGET,
+ form,
+#ifdef MOTIF
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+#else
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_YES,
+#endif
+ NULL);
+ searchbox_label = XtVaCreateManagedWidget("searchbox_label",
+ LABEL_WIDGET,
+ searchbox_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNalignment, XmALIGNMENT_BEGINNING,
+#else
+ XtNlabel, "Find:",
+ XtNborderWidth, 0,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+#if defined(MOTIF) && USE_COMBOBOX
+
+ {
+ Widget textfield = NULL;
+ Widget grab_shell = NULL;
+ size_t n;
+ XmStringTable items;
+
+ search_history_init(&hist);
+
+ /* initialize Motif string list */
+ n = hist.item_cnt == 0 ? 1 : hist.item_cnt;
+ items = (XmStringTable)XtMalloc(n * sizeof(XmString *));
+
+ if (hist.item_cnt == 0)
+ items[0] = XmStringCreateLocalized(Xdvi_HISTORY_EMPTY_MARKER);
+ else {
+ for (n = 0; hist.char_items[n] != NULL; n++)
+ items[n] = XmStringCreateLocalized(hist.char_items[n]);
+ }
+
+ searchbox_input = XtVaCreateManagedWidget(Xdvi_SEARCHBOX_INPUT_NAME, xmComboBoxWidgetClass,
+ searchbox_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, searchbox_label,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX,
+ XmNitems, items,
+ XmNitemCount, n,
+ /* XmONE_BASED so that we can distinguish between
+ keyboard entry and selection from popdown list */
+ XmNpositionMode, XmONE_BASED,
+ /* XmNitemCount, hist.item_cnt, */
+ /* XmNvisibleItemCount, hist.item_cnt, */
+ XmNuserData, &hist,
+ XmNarrowSize, Xdvi_COMBO_BOX_ARROW_SIZE,
+ NULL);
+ if (resource.search_history_size < 10) {
+ /* usually the dropdown list shows 10 entries */
+ XtVaSetValues(searchbox_input, XmNvisibleItemCount, resource.search_history_size, NULL);
+ }
+
+ /* free Motif strings */
+ if (hist.item_cnt == 0)
+ XmStringFree(items[0]);
+ else {
+ for (n = 0; hist.char_items[n] != NULL; n++)
+ XmStringFree(items[n]);
+ }
+ XtFree((XtPointer)items);
+
+ /* start with empty search field */
+ XtVaGetValues(searchbox_input, XmNtextField, &textfield, NULL);
+ if (textfield == NULL)
+ XDVI_ERROR((stderr, "Couldn't get textfield from combo box widget!\n"));
+
+ if (settings->term != NULL) {
+ XtVaSetValues(textfield, XmNvalue, settings->term, NULL);
+ }
+ else {
+ XtVaSetValues(textfield, XmNvalue, "", NULL);
+ }
+ XtAddCallback(textfield, XmNactivateCallback, cb_search_get_term, settings);
+ XtAddCallback(searchbox_input, XmNselectionCallback, cb_search_history_select, (XtPointer)settings);
+
+ XtOverrideTranslations(textfield, xlats);
+ /* workaround for pointer grabbing bug (see xm_menu.c) */
+ if (get_widget_by_name(&grab_shell, searchbox_input, "GrabShell", True)) {
+ XtAddCallback(grab_shell, XtNpopdownCallback, popdown_callback, NULL);
+ }
+
+ }
+#else /* defined(MOTIF) && USE_COMBOBOX */
+
+ searchbox_input = XtVaCreateManagedWidget(Xdvi_SEARCHBOX_INPUT_NAME,
+ TEXT_WIDGET,
+ searchbox_form,
+#ifdef MOTIF
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, searchbox_label,
+ XmNbottomAttachment, XmATTACH_FORM,
+#else
+ XtNwidth, 260,
+ XtNdataCompression, False,
+ XtNeditType, XawtextEdit,
+ XtNfromHoriz, searchbox_label,
+ HORIZONTAL_RESIZING_YES,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+#ifdef MOTIF
+ XtAddCallback(searchbox_input, XmNactivateCallback, cb_search_get_term, settings);
+#endif
+
+ if (settings->term != NULL) {
+ XtVaSetValues(searchbox_input,
+#ifdef MOTIF
+ XmNvalue,
+#else
+ XtNstring,
+#endif
+ settings->term, NULL);
+ }
+
+#endif /* defined(MOTIF) && USE_COMBOBOX */
+
+
+ XtManageChild(searchbox_form);
+
+ /* Fix for #1499566: Force input focus for text input field */
+#ifndef MOTIF
+ XtSetKeyboardFocus(find_paned, searchbox_input);
+#endif
+
+ /*
+ * form for left row of options checkbuttons
+ */
+ options_left_form = XtVaCreateManagedWidget("options_left_form",
+ FORM_WIDGET,
+ form,
+#ifdef MOTIF
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNresizable, True,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, searchbox_form,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* XmNrightAttachment, XmATTACH_FORM, */
+ /* XmNbottomAttachment, XmATTACH_FORM, */
+#else
+ XtNborderWidth, 0,
+ XtNfromVert, searchbox_form,
+ HORIZONTAL_RESIZING_NO,
+#endif
+ NULL);
+ /*
+ * form for right row of options checkbuttons
+ */
+ options_right_form = XtVaCreateManagedWidget("options_right_form",
+ FORM_WIDGET,
+ form,
+#ifdef MOTIF
+ XmNhorizontalSpacing, DDIST,
+ XmNverticalSpacing, DDIST,
+ XmNresizable, True,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, searchbox_form,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, options_left_form,
+ XmNrightAttachment, XmATTACH_FORM,
+ /* XmNbottomAttachment, XmATTACH_FORM, */
+#else
+ XtNborderWidth, 0,
+ XtNfromVert, searchbox_form,
+ XtNfromHoriz, options_left_form,
+ HORIZONTAL_RESIZING_NO,
+#endif
+ NULL);
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Regular expression");
+#endif
+
+ regexp_checkbox = XtVaCreateManagedWidget("regexp_checkbox",
+ CHECKBOX_WIDGET,
+ options_left_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+#else
+ XtNlabel, "Regular expression",
+ XtNborderWidth, 0,
+ XtNisRadio, False,
+ XtNhighlightThickness, 1,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+ XtAddCallback(regexp_checkbox, VALUE_CALLBACK_NAME, cb_regexp_search, settings);
+
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Find backwards");
+#endif
+
+ backwards_checkbox = XtVaCreateManagedWidget("backwards_checkbox",
+ CHECKBOX_WIDGET,
+ options_left_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, regexp_checkbox,
+ XmNleftAttachment, XmATTACH_FORM,
+#else
+ XtNlabel, "Find backwards",
+ XtNfromVert, regexp_checkbox,
+ XtNborderWidth, 0,
+ XtNisRadio, False,
+ XtNhighlightThickness, 1,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+ XtAddCallback(backwards_checkbox, VALUE_CALLBACK_NAME, cb_backwards_search, settings);
+
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Wrap search");
+#endif
+
+ wrap_checkbox = XtVaCreateManagedWidget("backwards_checkbox",
+ CHECKBOX_WIDGET,
+ options_left_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, backwards_checkbox,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+#else
+ XtNlabel, "Wrap search",
+ XtNfromVert, backwards_checkbox,
+ XtNborderWidth, 0,
+ XtNisRadio, False,
+ XtNhighlightThickness, 1,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+ XtAddCallback(wrap_checkbox, VALUE_CALLBACK_NAME, cb_wrap_search, settings);
+
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Case sensitive");
+#endif
+
+ matchcase_checkbox = XtVaCreateManagedWidget("matchcase_checkbox",
+ CHECKBOX_WIDGET,
+ options_right_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+#else
+ XtNlabel, "Case sensitive",
+ XtNborderWidth, 0,
+ XtNisRadio, False,
+ XtNhighlightThickness, 1,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+ XtAddCallback(matchcase_checkbox, VALUE_CALLBACK_NAME, cb_match_case, settings);
+
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Ignore newlines/hyphens");
+#endif
+
+ linebreaks_checkbox = XtVaCreateManagedWidget("linebreaks_checkbox",
+ CHECKBOX_WIDGET,
+ options_right_form,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, matchcase_checkbox,
+ XmNleftAttachment, XmATTACH_FORM,
+#else
+ XtNlabel, "Ignore newlines/hyphens",
+ XtNfromVert, matchcase_checkbox,
+ XtNborderWidth, 0,
+ XtNisRadio, False,
+ XtNhighlightThickness, 1,
+ HORIZONTAL_RESIZING_NO,
+ VERTICAL_RESIZING_NO,
+#endif
+ NULL);
+
+ XtAddCallback(linebreaks_checkbox, VALUE_CALLBACK_NAME, cb_linebreaks, settings);
+
+ /*
+ * box for Find/Cancel buttons
+ */
+ box = XtVaCreateManagedWidget("box",
+ FORM_WIDGET,
+ find_paned,
+#ifdef MOTIF
+ XmNskipAdjust, True, /* don't resize this area */
+#else
+ /* resizing by user isn't needed */
+ XtNshowGrip, False,
+ XtNdefaultDistance, 6, /* some padding */
+ /* resizing the window shouldn't influence this box,
+ * but only the pane widget
+ */
+ XtNskipAdjust, True,
+ XtNaccelerators, G_accels_cr,
+#endif
+ NULL);
+
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Find");
+#endif
+
+ find_button = XtVaCreateManagedWidget("find_button",
+ PUSHBUTTON_WIDGET,
+ box,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNshowAsDefault, True,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* to mimick appearance of native dialog buttons: */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNleftOffset, 10,
+#else
+ XtNlabel, "Find",
+ XtNaccelerators, G_accels_cr,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ HORIZONTAL_RESIZING_NO,
+#endif
+ NULL);
+#ifdef MOTIF
+ XmStringFree(str);
+ str = XmStringCreateLocalized("Cancel");
+#endif
+
+ cancel_button = XtVaCreateManagedWidget("cancel_button",
+ PUSHBUTTON_WIDGET,
+ box,
+#ifdef MOTIF
+ XmNlabelString, str,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ /* to mimick appearance of native dialog buttons: */
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ XmNrightOffset, 10,
+#else
+ XtNlabel, "Cancel",
+ XtNfromHoriz, find_button,
+ XtNbottom, XtChainBottom,
+ XtNjustify, XtJustifyRight,
+ XtNleft, XtChainRight,
+ XtNright, XtChainRight,
+#endif
+ NULL);
+
+#ifdef MOTIF
+ XmStringFree(str);
+#endif
+
+ XtAddCallback(cancel_button, ACTIVATE_CALLBACK_NAME, cb_search_cancel, settings);
+ XtAddCallback(find_button, ACTIVATE_CALLBACK_NAME, cb_search_get_term_button, settings);
+
+ XtOverrideTranslations(searchbox_form, xlats);
+ XtOverrideTranslations(options_left_form, xlats);
+ XtOverrideTranslations(options_right_form, xlats);
+ XtOverrideTranslations(regexp_checkbox, xlats);
+ XtOverrideTranslations(matchcase_checkbox, xlats);
+ XtOverrideTranslations(backwards_checkbox, xlats);
+ XtOverrideTranslations(box, xlats);
+ XtOverrideTranslations(find_button, xlats);
+ XtOverrideTranslations(cancel_button, xlats);
+ XtOverrideTranslations(searchbox_input, xlats);
+
+ /* following doesn't help to force input to textbox in xaw: */
+ /* XtInstallAllAccelerators(find_paned, find_paned); */
+ /* XtInstallAllAccelerators(searchbox_input, find_paned); */
+
+ XtManageChild(form);
+ XtManageChild(find_paned);
+
+ { /* set all buttons to same size */
+ Dimension w1, w2, max;
+ XtVaGetValues(find_button, XtNwidth, &w1, NULL);
+ XtVaGetValues(cancel_button, XtNwidth, &w2, NULL);
+ max = MAX(w1, w2);
+ XtVaSetValues(find_button, XtNwidth, max, NULL);
+ XtVaSetValues(cancel_button, XtNwidth, max, NULL);
+ }
+
+ XtManageChild(top_level_shell);
+ /* don't center this one - would just get in the way in this case. */
+ /* center_window(top_level_shell, globals.widgets.top_level); */
+ XtPopup(top_level_shell, XtGrabNone);
+ m_find_popup_active = True;
+
+#ifdef MOTIF
+ XmProcessTraversal(searchbox_input, XmTRAVERSE_CURRENT);
+ /* XmProcessTraversal(find_button, XmTRAVERSE_CURRENT); */
+#endif
+ XSetWMProtocols(XtDisplay(top_level_shell), XtWindow(top_level_shell), &WM_DELETE_WINDOW, 1);
+
+ /* check if we have default values from resource.search_window_defaults */
+ if (resource.search_window_defaults & SETTINGS_USE_REGEXP_FLAG)
+ XtVaSetValues(regexp_checkbox, CHECKBUTTON_IS_SET, True, NULL);
+ if (resource.search_window_defaults & SETTINGS_CASE_SENSITIVE_FLAG)
+ XtVaSetValues(matchcase_checkbox, CHECKBUTTON_IS_SET, True, NULL);
+ if (resource.search_window_defaults & SETTINGS_BACKWARDS_FLAG)
+ XtVaSetValues(backwards_checkbox, CHECKBUTTON_IS_SET, True, NULL);
+ if (resource.search_window_defaults & SETTINGS_IGNORE_LINEBREAKS_FLAG)
+ XtVaSetValues(linebreaks_checkbox, CHECKBUTTON_IS_SET, True, NULL);
+ if (resource.search_window_defaults & SETTINGS_WRAP_FLAG)
+ XtVaSetValues(wrap_checkbox, CHECKBUTTON_IS_SET, True, NULL);
+
+ /* initialize `settings' values according to the checkbox states
+ (in case user has assigned values via X defaults): */
+ XtVaGetValues(regexp_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL);
+ settings->use_regexp = curr_state;
+ XtVaGetValues(matchcase_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL);
+ settings->case_sensitive = curr_state;
+ XtVaGetValues(wrap_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL);
+ settings->wrap = curr_state;
+ XtVaGetValues(backwards_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL);
+ settings->direction = curr_state ? SEARCH_UP : SEARCH_DOWN;
+ XtVaGetValues(linebreaks_checkbox, CHECKBUTTON_IS_SET, &curr_state, NULL);
+ settings->ignore_hyphens = settings->ignore_linebreaks = curr_state;
+
+#ifndef MOTIF
+
+#undef HORIZONTAL_RESIZING_NO
+#undef HORIZONTAL_RESIZING_YES
+#undef VERTICAL_RESIZING_NO
+
+#endif /* MOTIF */
+ return top_level_shell;
+}
+
+void
+dvi_find_string(const char *str, Boolean find_next)
+{
+ /* Synthesize a RET keystroke for the find dialog.
+ * Also pops up the find dialog, to make it easier for user to
+ * edit options, change direction etc. */
+ Widget find_popup;
+ if (!get_widget_by_name(&find_popup, globals.widgets.top_level, "find_popup", False)) {
+ static struct search_settings settings;
+ static struct search_info searchinfo = { False, False, False, 0, 0, 0, 0 };
+ settings.term = str;
+ settings.use_regexp = False;
+ settings.case_sensitive = False;
+ settings.direction = SEARCH_DOWN;
+ settings.ignore_hyphens = False;
+ settings.ignore_linebreaks = False;
+ settings.wrap = False;
+ settings.isearchterm = NULL;
+ settings.wrapcnt = 0;
+ settings.x_pos = -1;
+ settings.y_pos = -1;
+ settings.searchinfo = &searchinfo;
+ settings.hyphen_delta = 0;
+
+ find_popup = create_search_window(&settings);
+
+ if (find_next)
+ return;
+ }
+ else if (str != NULL) { /* change the search term */
+ Widget searchbox_input;
+ if (!get_widget_by_name(&searchbox_input, find_popup, "searchbox_input", True))
+ return;
+ XtVaSetValues(searchbox_input,
+#ifdef MOTIF
+ XmNvalue,
+#else
+ XtNstring,
+#endif
+ str, NULL);
+ }
+ if (m_find_popup_active) {
+ XRaiseWindow(DISP, XtWindow(find_popup));
+ }
+ else {
+ XtPopup(find_popup, XtGrabNone);
+ m_find_popup_active = True;
+ }
+
+ if (str != NULL || find_next) {
+#ifdef MOTIF
+ xm_search_go(NULL, NULL, NULL, NULL);
+#else
+ xaw_search_go(NULL, NULL, NULL, NULL);
+#endif
+ }
+}
+
diff --git a/Build/source/texk/xdvik/gui/search-dialog.h b/Build/source/texk/xdvik/gui/search-dialog.h
new file mode 100644
index 00000000000..c0b8cf07afa
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/search-dialog.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2003-2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef SEARCH_DIALOG_H_
+#define SEARCH_DIALOG_H_
+
+#include "xdvi.h"
+
+typedef enum { SEARCH_UP = 0, SEARCH_DOWN, SEARCH_UNINITIALIZED } searchDirectionT;
+
+/* bounding box info for words. */
+struct bbox {
+ int ulx, uly, lrx, lry;
+};
+
+struct search_info {
+ Boolean have_match;
+ Boolean locked; /* to block multiple searches */
+ Boolean search_wrapped; /* if restarting from start (or end) */
+ int from_pos;
+ int to_pos;
+ int scan_page;
+ int page_offset; /* start of current scan */
+};
+
+
+struct search_settings {
+ const char *term; /* original search term */
+ char *utf8_term; /* term in UTF-8 encoding */
+ char *posix_term; /* utf8_term with Perl abbreviations mapped to POSIX */
+ Boolean use_regexp;
+ Boolean case_sensitive;
+ Boolean ignore_hyphens;
+ Boolean ignore_linebreaks;
+ Boolean wrap;
+ int wrapcnt; /* > 0 if search has wrapped */
+ char *isearchterm; /* non-NULL when doing isearch */
+ searchDirectionT direction;
+ struct search_info *searchinfo;
+ /* internal state management */
+ int x_pos, y_pos; /* position of the search popup window */
+ int from_page; /* page to start search from */
+ int curr_page; /* current page of search */
+ int to_page; /* highest page already scanned */
+ int hyphen_delta; /* difference in offsets when hyphenation is removed */
+ Widget message_window; /* warning popup, or NULL if it doesn't exist */
+};
+
+extern void dvi_find_string(const char *str, Boolean find_next);
+
+#endif /* SEARCH_DIALOG_H_ */
diff --git a/Build/source/texk/xdvik/gui/selection.c b/Build/source/texk/xdvik/gui/selection.c
new file mode 100644
index 00000000000..8fb2347c0d2
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/selection.c
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include <string.h>
+
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+
+#if HAVE_X11_XMU_XMU_H
+#include <X11/Xmu/Atoms.h>
+#include <X11/Xmu/Xmu.h>
+#endif
+
+#include "events.h"
+#include "util.h"
+#include "encodings.h"
+#include "message-window.h"
+#include "selection.h"
+#include "statusline.h"
+
+/*
+ * Set the current X selection (i.e. the primary selection AKA XA_PRIMARY).
+ * Most of this is copied from Asente/Converse/Swick: X Window System Toolkit Manual
+ */
+
+/* This is file scope since deliver_selection_cb() needs access to it.
+ * I guess we could also store it in an Atom, but why bother ...
+ */
+static char *m_selection_text = NULL;
+static char *m_cvt_selection_text = NULL;
+static size_t m_selection_size = 0;
+
+/* helper routine */
+static Atom
+fetch_atom(Widget w, const char *name)
+{
+ Atom a;
+ XrmValue source, dest;
+
+ source.size = strlen(name) + 1;
+ source.addr = (char *)name;
+ dest.size = sizeof a;
+ dest.addr = (caddr_t)&a;
+
+ (void)XtConvertAndStore(w, XtRString, &source, XtRAtom, &dest);
+ return a;
+}
+
+/* Lose the selection */
+static void
+lose_selection_cb(Widget w, Atom *selection)
+{
+ UNUSED(w);
+ UNUSED(selection);
+
+ text_change_region(TEXT_SEL_CLEAR, NULL);
+}
+
+static char *
+utf8_to_native_encoding(const char *utf8)
+{
+ static const char *text_encoding = NULL;
+
+ /* convert to user encoding, similar to search-internal.c */
+ if (text_encoding == NULL) {
+ text_encoding = get_text_encoding();
+ }
+
+ if (memicmp(text_encoding, "iso-8859-1", strlen("iso-8859-1")) == 0
+ || memicmp(text_encoding, "iso8859-1", strlen("iso8859-1")) == 0) {
+ return str_utf8_to_iso_8859_1(utf8);
+ }
+ else if (memicmp(text_encoding, "utf-8", strlen("utf-8")) != 0
+ && memicmp(text_encoding, "utf8", strlen("utf8")) != 0) {
+ /* some other encoding */
+ return iconv_convert_string("utf-8", text_encoding, utf8);
+ }
+ /* fallback */
+ return xstrdup(utf8);
+}
+
+/* Deliver the selection. Only supports XA_STRING. */
+static Boolean
+deliver_selection_cb(Widget w,
+ Atom *selection,
+ Atom *target,
+ Atom *type,
+ XtPointer *value,
+ unsigned long *length,
+ int *format)
+{
+ Atom targets = fetch_atom(w, "TARGETS");
+ Atom utf8_string = fetch_atom(w, "UTF8_STRING");
+
+ TRACE_GUI((stderr, "selection target = %lu (%s)",
+ *target, XGetAtomName(DISP, *target)));
+
+ if (m_selection_text == NULL) /* paranoia */
+ return False;
+
+#if HAVE_X11_XMU_XMU_H
+ if (*target == targets) {
+ /* TARGETS handling copied from xclipboard.c */
+ Atom* targetP;
+ XPointer std_targets; /* was: Atom* */
+ unsigned long std_length;
+ XSelectionRequestEvent* req = XtGetSelectionRequest(w, *selection, (XtRequestId)NULL);
+
+ TRACE_GUI((stderr, "Selection type: targets"));
+ XmuConvertStandardSelection(w, req->time, selection,
+ target, type, &std_targets, &std_length, format);
+ *value = XtMalloc(sizeof(Atom)*(std_length + 2));
+ targetP = *(Atom**)value;
+ *length = std_length + 2;
+ *targetP++ = XA_COMPOUND_TEXT(DISP);
+ *targetP++ = XA_STRING;
+ memcpy((char*)targetP, (char*)std_targets, sizeof(Atom)*std_length);
+ XtFree((char*)std_targets);
+ *type = XA_ATOM;
+ *format = sizeof(Atom) * 8;
+ return True;
+ }
+ else
+#endif
+ {
+ if (*target == utf8_string) {
+ TRACE_GUI((stderr, "Selection type: UTF8_STRING"));
+ *type = *target;
+ *value = (XtPointer)XtNewString(m_selection_text);
+ /* *value = (XtPointer)m_selection_text; */
+ *length = strlen(m_selection_text);
+ *format = 8;
+ return True;
+ }
+ else if (*target == XA_STRING) {
+ char *ptr = utf8_to_native_encoding(m_selection_text);
+ TRACE_GUI((stderr, "Selection type: XA_STRING"));
+ strncpy(m_cvt_selection_text, ptr, m_selection_size);
+ m_cvt_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */
+ free(ptr);
+ *type = *target;
+ *value = (XtPointer)XtNewString(m_cvt_selection_text);
+ /* *value = (XtPointer)m_selection_text; */
+ *length = strlen(m_cvt_selection_text);
+ *format = 8;
+ return True;
+ }
+#if HAVE_X11_XMU_XMU_H
+ else if (*target == XA_COMPOUND_TEXT(DISP) || *target == XA_TEXT(DISP)) {
+ const char *cl[1];
+ char *ptr;
+ int retval;
+
+ XTextProperty ct;
+ XICCEncodingStyle style = XStdICCTextStyle;
+
+ TRACE_GUI((stderr, "Selection type: XA_COMPOUND_TEXT"));
+ ptr = utf8_to_native_encoding(m_selection_text);
+ strncpy(m_cvt_selection_text, ptr, m_selection_size);
+ m_cvt_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */
+ cl[0] = m_cvt_selection_text;
+
+ *type = *target;
+ retval = XmbTextListToTextProperty(DISP, (char **)cl, 1, style, &ct);
+
+ if (retval == XNoMemory || retval == XLocaleNotSupported || retval == XConverterNotFound) {
+ statusline_info(STATUS_MEDIUM, "XmbTextListToTextProperty failed: %d", retval);
+ return False;
+ }
+
+ *value = ct.value;
+ *length = ct.nitems;
+ *format = 8;
+ return True;
+ }
+#endif
+ else {
+#if HAVE_X11_XMU_XMU_H
+ TRACE_GUI((stderr, "Selection type: standard selection"));
+ if (XmuConvertStandardSelection(w, CurrentTime, selection,
+ target, type, (XPointer *)value, length, format))
+ return True;
+ else {
+#endif
+ TRACE_GUI((stderr, "Selection type unsupported: %lu (%s)",
+ (unsigned long)*target, XGetAtomName(DISP, *target)));
+ statusline_error(STATUS_MEDIUM,
+ "X client asked for an unsupported selection target type: %lu (%s)",
+ (unsigned long)*target, XGetAtomName(DISP, *target));
+ return False ;
+#if HAVE_X11_XMU_XMU_H
+ }
+#endif
+ }
+ }
+}
+
+/* do it */
+Boolean
+set_selection(const char *text, Widget w)
+{
+ /* caller should make sure that text is never longer than 4 * XMaxRequestSize(DISP) - 32 */
+ if (m_selection_text == NULL) {
+ m_selection_size = 4 * XMaxRequestSize(DISP);
+ m_selection_text = xmalloc(m_selection_size);
+ m_cvt_selection_text = xmalloc(m_selection_size);
+ }
+ strncpy(m_selection_text, text, m_selection_size);
+ m_selection_text[m_selection_size - 1] = '\0'; /* ensure termination */
+
+ return XtOwnSelection(w, XA_PRIMARY, XtLastTimestampProcessed(XtDisplay(w)),
+ deliver_selection_cb,
+ lose_selection_cb,
+ (XtSelectionDoneProc)NULL);
+}
+
+void
+unset_selection(Widget w)
+{
+ XtDisownSelection(w, XA_PRIMARY, XtLastTimestampProcessed(XtDisplay(w)));
+}
+
diff --git a/Build/source/texk/xdvik/gui/selection.h b/Build/source/texk/xdvik/gui/selection.h
new file mode 100644
index 00000000000..6617338dbc6
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/selection.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef SELECTION_H_
+#define SELECTION_H_
+
+#include "xdvi.h"
+
+Boolean set_selection(const char *text, Widget w);
+void unset_selection(Widget w);
+
+#endif /* SELECTION_H_ */
diff --git a/Build/source/texk/xdvik/gui/sfDir.c b/Build/source/texk/xdvik/gui/sfDir.c
new file mode 100644
index 00000000000..3d2983c18cc
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfDir.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. Software Research Associates
+ * makes no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Erik M. van der Poel
+ * Software Research Associates, Inc., Tokyo, Japan
+ * erik@sra.co.jp
+ */
+
+#include "xdvi-config.h"
+#include "sfDir.h"
+
+#if !defined(MOTIF) /* entire file */
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#undef wchar_t
+
+#include <stdio.h>
+
+#ifdef SEL_FILE_IGNORE_CASE
+#include <ctype.h>
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+
+#ifdef SEL_FILE_IGNORE_CASE
+int
+SFcompareEntries(const void *vp, const void *vq)
+{
+ SFEntry *p = vp;
+ SFEntry *q = vq;
+ char *r, *s;
+ char c1, c2;
+
+ r = p->real;
+ s = q->real;
+
+ c1 = *r++;
+ if (islower(c1)) {
+ c1 = toupper(c1);
+ }
+ c2 = *s++;
+ if (islower(c2)) {
+ c2 = toupper(c2);
+ }
+
+ while (c1 == c2) {
+ if (!c1) {
+ return strcmp(p->real, q->real);
+ }
+ c1 = *r++;
+ if (islower(c1)) {
+ c1 = toupper(c1);
+ }
+ c2 = *s++;
+ if (islower(c2)) {
+ c2 = toupper(c2);
+ }
+ }
+
+ return c1 - c2;
+}
+#else /* def SEL_FILE_IGNORE_CASE */
+int
+SFcompareEntries(const void *vp, const void *vq)
+{
+ const SFEntry *p = vp;
+ const SFEntry *q = vq;
+ return strcmp(p->real, q->real);
+}
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+int
+SFgetDir(SFDir *dir)
+{
+ SFEntry *result = NULL;
+ int alloc = 0;
+ int i;
+ DIR *dirp;
+ struct dirent *dp;
+ char *str;
+ int len;
+ int maxChars;
+ struct stat statBuf;
+
+ maxChars = strlen(dir->dir) - 1;
+
+ dir->entries = NULL;
+ dir->nEntries = 0;
+ dir->nChars = 0;
+
+ result = NULL;
+ i = 0;
+
+ dirp = opendir(".");
+ if (!dirp) {
+ return 1;
+ }
+
+ (void)stat(".", &statBuf);
+ dir->mtime = statBuf.st_mtime;
+
+ (void)readdir(dirp); /* throw away "." */
+
+#ifndef S_IFLNK
+ (void)readdir(dirp); /* throw away ".." */
+#endif /* ndef S_IFLNK */
+
+ while ((dp = readdir(dirp))) {
+ if (i >= alloc) {
+ alloc = 2 * (alloc + 1);
+ result = (SFEntry *) XtRealloc((char *)result,
+ (unsigned)(alloc * sizeof(SFEntry)));
+ }
+ result[i].statDone = 0;
+ str = dp->d_name;
+ len = strlen(str);
+ result[i].real = XtMalloc((unsigned)(len + 2));
+ (void)strcat(strcpy(result[i].real, str), " ");
+ if (len > maxChars) {
+ maxChars = len;
+ }
+ result[i].shown = result[i].real;
+ i++;
+ }
+
+#if defined(SVR4) || defined(SYSV) || defined(USG)
+ qsort((char *)result, (unsigned)i, sizeof(SFEntry), SFcompareEntries);
+#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
+ qsort((char *)result, i, sizeof(SFEntry), SFcompareEntries);
+#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
+
+ dir->entries = result;
+ dir->nEntries = i;
+ dir->nChars = maxChars + 1;
+
+ closedir(dirp);
+
+ return 0;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* !defined(MOTIF) */
diff --git a/Build/source/texk/xdvik/gui/sfDir.h b/Build/source/texk/xdvik/gui/sfDir.h
new file mode 100644
index 00000000000..dfc6797f86f
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfDir.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef SFDIR_H_
+#define SFDIR_H_
+
+#include "kpathsea/c-auto.h"
+#include "kpathsea/config.h"
+#include "kpathsea/c-dir.h"
+#include "kpathsea/c-stat.h"
+
+#ifndef MOTIF
+
+typedef struct {
+ int statDone;
+ char *real;
+ char *shown;
+} SFEntry;
+
+typedef struct {
+ char *dir;
+ char *path;
+ SFEntry *entries;
+ int nEntries;
+ int vOrigin;
+ int nChars;
+ int hOrigin;
+ int changed;
+ int beginSelection;
+ int endSelection;
+ time_t mtime;
+} SFDir;
+
+extern int SFcompareEntries(const void *vp, const void *vq);
+extern int SFgetDir(SFDir *dir);
+
+extern SFDir *SFdirs;
+
+#endif /* MOTIF */
+
+#endif /* SFDIR_H_ */
diff --git a/Build/source/texk/xdvik/gui/sfDraw.c b/Build/source/texk/xdvik/gui/sfDraw.c
new file mode 100644
index 00000000000..d980c2bda13
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfDraw.c
@@ -0,0 +1,820 @@
+/*
+ * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. Software Research Associates
+ * makes no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Erik M. van der Poel
+ * Software Research Associates, Inc., Tokyo, Japan
+ * erik@sra.co.jp
+ */
+
+#include "xdvi-config.h"
+
+#include "kpathsea/c-auto.h"
+#include "kpathsea/config.h"
+#include "kpathsea/c-stat.h"
+#include "xdvi.h"
+#include "x_util.h"
+
+#include "sfDraw.h"
+#include "sfDir.h"
+#include "sfPath.h"
+
+#if !defined(MOTIF) /* for xdvik */
+
+#define SF_DEFAULT_FONT "9x15"
+
+typedef struct {
+ char *font;
+} TextData, *textPtr;
+
+int SFcharWidth, SFcharAscent, SFcharHeight;
+
+int SFcurrentInvert[3] = { -1, -1, -1 };
+
+static GC SFlineGC, SFscrollGC, SFinvertGC, SFtextGC;
+
+static XtResource textResources[] = {
+ {XtNfont, XtCFont, XtRString, sizeof(char *),
+ XtOffset(textPtr, font), XtRString, SF_DEFAULT_FONT},
+};
+
+static XFontStruct *SFfont;
+
+static int SFcurrentListY;
+
+static XtIntervalId SFscrollTimerId;
+
+void
+SFinitFont(void)
+{
+ TextData *data;
+
+ data = XtNew(TextData);
+
+ XtGetApplicationResources(selFileForm, (XtPointer) data, textResources,
+ XtNumber(textResources), (Arg *) NULL, ZERO);
+
+ SFfont = XLoadQueryFont(SFdisplay, data->font);
+ if (!SFfont) {
+ SFfont = XLoadQueryFont(SFdisplay, SF_DEFAULT_FONT);
+ if (!SFfont) {
+ char sbuf[256];
+
+ (void)sprintf(sbuf, "XsraSelFile: can't get font %s",
+ SF_DEFAULT_FONT);
+
+ XtAppError(SFapp, sbuf);
+ }
+ }
+
+ TRACE_GUI((stderr, "FONT: width %d, %d\n", SFfont->max_bounds.width, SFfont->min_bounds.width));
+ SFcharWidth = (SFfont->max_bounds.width + SFfont->min_bounds.width) / 2;
+ SFcharAscent = SFfont->max_bounds.ascent;
+ SFcharHeight = SFcharAscent + SFfont->max_bounds.descent;
+ if (SFcharWidth == 0) {
+ /* if min_bounds.width = -max_bounds.width, we probably
+ have a scalable TT font; try to determine its actual
+ width by measuring the letter `x':
+ */
+ SFcharWidth = XTextWidth(SFfont, "x", 1);
+ }
+ if (SFcharWidth == 0) { /* last resort */
+ SFcharWidth = SFfont->max_bounds.width / 2;
+ }
+ TRACE_GUI((stderr,
+ "Using font measures: charwidth %d, ascent %d, height %d",
+ SFcharWidth, SFcharAscent, SFcharHeight));
+}
+
+void
+SFcreateGC(void)
+{
+ XGCValues gcValues;
+ XRectangle rectangles[1];
+
+ /* XtVaGetValues(selFileLists[0], */
+ /* XtNforeground, &(gcValues.foreground), */
+ /* XtNbackground, &(gcValues.background), */
+ /* NULL); */
+ gcValues.foreground = SFfore;
+
+ SFlineGC = XtGetGC(selFileLists[0], (XtGCMask)
+ GCForeground | 0, &gcValues);
+
+ SFscrollGC = XtGetGC(selFileLists[0], (XtGCMask)
+ 0, &gcValues);
+
+ gcValues.function = GXinvert;
+ /* gcValues.plane_mask = (gcValues.foreground ^ gcValues.background); */
+ gcValues.plane_mask = (SFfore ^ SFback);
+
+ SFinvertGC = XtGetGC(selFileLists[0], (XtGCMask)
+ GCFunction | GCPlaneMask | 0, &gcValues);
+
+ gcValues.foreground = SFfore;
+ gcValues.background = SFback;
+ gcValues.font = SFfont->fid;
+
+ SFtextGC = XCreateGC(SFdisplay, XtWindow(selFileLists[0]), (unsigned long)
+ GCForeground | GCBackground | GCFont | 0, &gcValues);
+
+ rectangles[0].x = SFlineToTextH + SFbesideText;
+ rectangles[0].y = 0;
+ rectangles[0].width = SFcharsPerEntry * SFcharWidth;
+ rectangles[0].height = SFupperY + 1;
+
+ XSetClipRectangles(SFdisplay, SFtextGC, 0, 0, rectangles, 1, Unsorted);
+}
+
+void
+SFclearList(int n, int doScroll)
+{
+ SFDir *dir;
+
+ SFcurrentInvert[n] = -1;
+
+ XClearWindow(SFdisplay, XtWindow(selFileLists[n]));
+
+ XDrawSegments(SFdisplay, XtWindow(selFileLists[n]), SFlineGC, SFsegs, 2);
+
+ if (doScroll) {
+ dir = &(SFdirs[SFdirPtr + n]);
+
+ if ((SFdirPtr + n < SFdirEnd) && dir->nEntries && dir->nChars) {
+ XawScrollbarSetThumb(selFileVScrolls[n],
+ (double)dir->vOrigin / dir->nEntries,
+ (double)(dir->nEntries < SFlistSize
+ ? dir->nEntries
+ : SFlistSize)
+ / dir->nEntries);
+
+ XawScrollbarSetThumb(selFileHScrolls[n],
+ (double)(dir->hOrigin) / dir->nChars,
+ (double)(dir->nChars < SFcharsPerEntry
+ ? dir-> nChars : SFcharsPerEntry)
+ / dir->nChars);
+ }
+ else {
+ XawScrollbarSetThumb(selFileVScrolls[n], 0.0, 1.0);
+ XawScrollbarSetThumb(selFileHScrolls[n], 0.0, 1.0);
+ }
+ }
+}
+
+static void
+SFdeleteEntry(SFDir *dir, SFEntry *entry)
+{
+ SFEntry *e;
+ SFEntry *end;
+ int n;
+ int idx;
+
+ idx = entry - dir->entries;
+
+ if (idx < dir->beginSelection) {
+ dir->beginSelection--;
+ }
+ if (idx <= dir->endSelection) {
+ dir->endSelection--;
+ }
+ if (dir->beginSelection > dir->endSelection) {
+ dir->beginSelection = dir->endSelection = -1;
+ }
+
+ if (idx < dir->vOrigin) {
+ dir->vOrigin--;
+ }
+
+ XtFree(entry->real);
+
+ end = &(dir->entries[dir->nEntries - 1]);
+
+ for (e = entry; e < end; e++) {
+ *e = *(e + 1);
+ }
+
+ if (!(--dir->nEntries)) {
+ return;
+ }
+
+ n = dir - &(SFdirs[SFdirPtr]);
+ if ((n < 0) || (n > 2)) {
+ return;
+ }
+
+ XawScrollbarSetThumb(selFileVScrolls[n],
+ (double)(dir->vOrigin) / dir->nEntries,
+ (double)(dir->nEntries < SFlistSize
+ ? dir->nEntries : SFlistSize)
+ / dir->nEntries);
+}
+
+static void
+SFwriteStatChar(char *name, int last, struct stat *statBuf)
+{
+ name[last] = SFstatChar(statBuf);
+}
+
+static int
+SFstatAndCheck(SFDir *dir, SFEntry *entry)
+{
+ struct stat statBuf;
+ char save;
+ int last;
+ extern int SFchdir();
+
+ /*
+ * must be restored before returning
+ */
+ save = *(dir->path);
+ *(dir->path) = 0;
+
+ if (!SFchdir(SFcurrentPath)) {
+ last = strlen(entry->real) - 1;
+ entry->real[last] = 0;
+ entry->statDone = 1;
+ if ((!stat(entry->real, &statBuf))
+#ifdef S_IFLNK
+ || (!lstat(entry->real, &statBuf))
+#endif /* ndef S_IFLNK */
+ ) {
+ if (SFfunc) {
+ char *shown;
+
+ shown = NULL;
+ if (SFfunc(entry->real, &shown, &statBuf)) {
+ if (shown) {
+ int len;
+
+ len = strlen(shown);
+ entry->shown = XtMalloc((unsigned)(len + 2)
+ );
+ (void)strcpy(entry->shown, shown);
+ SFwriteStatChar(entry->shown, len, &statBuf);
+ entry->shown[len + 1] = 0;
+ }
+ }
+ else {
+ SFdeleteEntry(dir, entry);
+
+ *(dir->path) = save;
+ return 1;
+ }
+ }
+ SFwriteStatChar(entry->real, last, &statBuf);
+ }
+ else {
+ entry->real[last] = ' ';
+ }
+ }
+
+ *(dir->path) = save;
+ return 0;
+}
+
+static void
+SFdrawStrings(Window w, SFDir *dir, int from, int to)
+{
+ int i;
+ SFEntry *entry;
+ int x;
+
+ x = SFtextX - dir->hOrigin * SFcharWidth;
+
+ if (dir->vOrigin + to >= dir->nEntries) {
+ to = dir->nEntries - dir->vOrigin - 1;
+ }
+ for (i = from; i <= to; i++) {
+ entry = &(dir->entries[dir->vOrigin + i]);
+ if (!(entry->statDone)) {
+ if (SFstatAndCheck(dir, entry)) {
+ if (dir->vOrigin + to >= dir->nEntries) {
+ to = dir->nEntries - dir->vOrigin - 1;
+ }
+ i--;
+ continue;
+ }
+ }
+ XDrawImageString(SFdisplay,
+ w,
+ SFtextGC,
+ x,
+ SFtextYoffset + i * SFentryHeight,
+ entry->shown, strlen(entry->shown));
+ if (dir->vOrigin + i == dir->beginSelection) {
+ XDrawLine(SFdisplay,
+ w,
+ SFlineGC,
+ SFlineToTextH + 1,
+ SFlowerY + i * SFentryHeight,
+ SFlineToTextH + SFentryWidth - 2,
+ SFlowerY + i * SFentryHeight);
+ }
+ if (
+ (dir->vOrigin + i >= dir->beginSelection) &&
+ (dir->vOrigin + i <= dir->endSelection)) {
+ SFcompletionSegs[0].y1 = SFcompletionSegs[1].y1 =
+ SFlowerY + i * SFentryHeight;
+ SFcompletionSegs[0].y2 = SFcompletionSegs[1].y2 =
+ SFlowerY + (i + 1) * SFentryHeight - 1;
+ XDrawSegments(SFdisplay, w, SFlineGC, SFcompletionSegs, 2);
+ }
+ if (dir->vOrigin + i == dir->endSelection) {
+ XDrawLine(SFdisplay,
+ w,
+ SFlineGC,
+ SFlineToTextH + 1,
+ SFlowerY + (i + 1) * SFentryHeight - 1,
+ SFlineToTextH + SFentryWidth - 2,
+ SFlowerY + (i + 1) * SFentryHeight - 1);
+ }
+ }
+}
+
+void
+SFdrawList(int n, int doScroll)
+{
+ SFDir *dir;
+ Window w;
+
+ SFclearList(n, doScroll);
+
+ if (SFdirPtr + n < SFdirEnd) {
+ dir = &(SFdirs[SFdirPtr + n]);
+ w = XtWindow(selFileLists[n]);
+ XDrawImageString(SFdisplay,
+ w,
+ SFtextGC,
+ SFtextX - dir->hOrigin * SFcharWidth,
+ SFlineToTextV + SFaboveAndBelowText + SFcharAscent,
+ dir->dir, strlen(dir->dir)
+ );
+ SFdrawStrings(w, dir, 0, SFlistSize - 1);
+ }
+}
+
+void
+SFdrawLists(int doScroll)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ SFdrawList(i, doScroll);
+ }
+}
+
+static void
+SFinvertEntry(int n)
+{
+ XFillRectangle(SFdisplay,
+ XtWindow(selFileLists[n]),
+ SFinvertGC,
+ SFlineToTextH,
+ SFcurrentInvert[n] * SFentryHeight + SFlowerY,
+ SFentryWidth, SFentryHeight);
+}
+
+static unsigned long
+SFscrollTimerInterval(void)
+{
+ static int maxVal = 200;
+ static int varyDist = 50;
+ static int minDist = 50;
+ int t;
+ int dist;
+
+ if (SFcurrentListY < SFlowerY) {
+ dist = SFlowerY - SFcurrentListY;
+ }
+ else if (SFcurrentListY > SFupperY) {
+ dist = SFcurrentListY - SFupperY;
+ }
+ else {
+ return (unsigned long)1;
+ }
+
+ t = maxVal - ((maxVal / varyDist) * (dist - minDist));
+
+ if (t < 1) {
+ t = 1;
+ }
+
+ if (t > maxVal) {
+ t = maxVal;
+ }
+
+ return (unsigned long)t;
+}
+
+static void
+SFscrollTimer(XtPointer p, XtIntervalId *id)
+{
+ SFDir *dir;
+ int save;
+ ptrdiff_t n;
+
+ UNUSED(id);
+
+ n = (ptrdiff_t)p;
+
+ fprintf(stderr, "SFscrollTimer called!\n");
+
+ dir = &(SFdirs[SFdirPtr + n]);
+ save = dir->vOrigin;
+
+ if (SFcurrentListY < SFlowerY) {
+ if (dir->vOrigin > 0) {
+ SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin - 1);
+ }
+ }
+ else if (SFcurrentListY > SFupperY) {
+ if (dir->vOrigin < dir->nEntries - SFlistSize) {
+ SFvSliderMovedCallback(selFileVScrolls[n], n, dir->vOrigin + 1);
+ }
+ }
+
+ if (dir->vOrigin != save) {
+ if (dir->nEntries) {
+ XawScrollbarSetThumb(selFileVScrolls[n],
+ (double)(dir->vOrigin) / dir->nEntries,
+ (double)(dir->nEntries < SFlistSize
+ ? dir-> nEntries : SFlistSize)
+ / dir->nEntries);
+ }
+ }
+
+ if (SFbuttonPressed) {
+ SFscrollTimerId = XtAppAddTimeOut(SFapp,
+ SFscrollTimerInterval(),
+ SFscrollTimer, (XtPointer)n);
+ }
+}
+
+static int
+SFnewInvertEntry(int n, XMotionEvent *event)
+{
+ int x, y;
+ int new;
+ static int SFscrollTimerAdded = 0;
+
+ x = event->x;
+ y = event->y;
+
+ if (SFdirPtr + n >= SFdirEnd) {
+ return -1;
+ }
+ else if ((x >= 0) && (x <= SFupperX) && (y >= SFlowerY) && (y <= SFupperY)
+ ) {
+ SFDir *dir = &(SFdirs[SFdirPtr + n]);
+
+ if (SFscrollTimerAdded) {
+ SFscrollTimerAdded = 0;
+ XtRemoveTimeOut(SFscrollTimerId);
+ }
+
+ new = (y - SFlowerY) / SFentryHeight;
+ if (dir->vOrigin + new >= dir->nEntries) {
+ return -1;
+ }
+ return new;
+ }
+ else {
+ if (SFbuttonPressed) {
+ SFcurrentListY = y;
+ if (!SFscrollTimerAdded) {
+ SFscrollTimerAdded = 1;
+ SFscrollTimerId = XtAppAddTimeOut(SFapp,
+ SFscrollTimerInterval(),
+ SFscrollTimer, cast_int_to_XtPointer(n));
+ }
+ }
+
+ return -1;
+ }
+}
+
+void
+SFenterList(Widget w, int n, XEnterWindowEvent *event)
+{
+ int new;
+
+ UNUSED(w);
+
+ /* sanity */
+ if (SFcurrentInvert[n] != -1) {
+ SFinvertEntry(n);
+ SFcurrentInvert[n] = -1;
+ }
+
+ new = SFnewInvertEntry(n, (XMotionEvent *) event);
+ if (new != -1) {
+ SFcurrentInvert[n] = new;
+ SFinvertEntry(n);
+ }
+}
+
+void
+SFleaveList(Widget w, int n, XEvent *event)
+{
+ UNUSED(w);
+ UNUSED(event);
+
+ if (SFcurrentInvert[n] != -1) {
+ SFinvertEntry(n);
+ SFcurrentInvert[n] = -1;
+ }
+}
+
+void
+SFmotionList(Widget w, int n, XMotionEvent *event)
+{
+ int new;
+
+ UNUSED(w);
+
+ new = SFnewInvertEntry(n, event);
+
+ if (new != SFcurrentInvert[n]) {
+ if (SFcurrentInvert[n] != -1) {
+ SFinvertEntry(n);
+ }
+ SFcurrentInvert[n] = new;
+ if (new != -1) {
+ SFinvertEntry(n);
+ }
+ }
+}
+
+void
+SFvFloatSliderMovedCallback(Widget w, int n, float *fnew)
+{
+ int new;
+
+ new = (*fnew) * SFdirs[SFdirPtr + n].nEntries;
+
+ SFvSliderMovedCallback(w, n, new);
+}
+
+void
+SFvSliderMovedCallback(Widget w, int n, int new)
+{
+ int old;
+ Window win;
+ SFDir *dir;
+
+ UNUSED(w);
+
+ dir = &(SFdirs[SFdirPtr + n]);
+
+ old = dir->vOrigin;
+ dir->vOrigin = new;
+
+ if (old == new) {
+ return;
+ }
+
+ win = XtWindow(selFileLists[n]);
+
+ if (ABS(new - old) < SFlistSize) {
+ if (new > old) {
+ XCopyArea(SFdisplay,
+ win,
+ win,
+ SFscrollGC,
+ SFlineToTextH,
+ SFlowerY + (new - old) * SFentryHeight,
+ SFentryWidth + SFlineToTextH,
+ (SFlistSize - (new - old)) * SFentryHeight,
+ SFlineToTextH, SFlowerY);
+ XClearArea(SFdisplay,
+ win,
+ SFlineToTextH,
+ SFlowerY + (SFlistSize - (new - old)) *
+ SFentryHeight,
+ SFentryWidth + SFlineToTextH,
+ (new - old) * SFentryHeight, False);
+ SFdrawStrings(win, dir, SFlistSize - (new - old), SFlistSize - 1);
+ }
+ else {
+ XCopyArea(SFdisplay,
+ win,
+ win,
+ SFscrollGC,
+ SFlineToTextH,
+ SFlowerY,
+ SFentryWidth + SFlineToTextH,
+ (SFlistSize - (old - new)) * SFentryHeight,
+ SFlineToTextH, SFlowerY + (old - new) * SFentryHeight);
+ XClearArea(SFdisplay,
+ win,
+ SFlineToTextH,
+ SFlowerY,
+ SFentryWidth + SFlineToTextH,
+ (old - new) * SFentryHeight, False);
+ SFdrawStrings(win, dir, 0, old - new);
+ }
+ }
+ else {
+ XClearArea(SFdisplay,
+ win,
+ SFlineToTextH,
+ SFlowerY,
+ SFentryWidth + SFlineToTextH,
+ SFlistSize * SFentryHeight, False);
+ SFdrawStrings(win, dir, 0, SFlistSize - 1);
+ }
+}
+
+void
+SFvAreaSelectedCallback(Widget w, int n, int pnew)
+{
+ SFDir *dir;
+ int new;
+
+ dir = &(SFdirs[SFdirPtr + n]);
+
+ new = dir->vOrigin + ((double)pnew / SFvScrollHeight) * dir->nEntries;
+
+ if (new > dir->nEntries - SFlistSize) {
+ new = dir->nEntries - SFlistSize;
+ }
+
+ if (new < 0) {
+ new = 0;
+ }
+
+ if (dir->nEntries) {
+ float f;
+
+ f = ((double)new) / dir->nEntries;
+
+ XawScrollbarSetThumb(w, f,
+ (double)(dir->nEntries < SFlistSize
+ ? dir->nEntries
+ : SFlistSize)
+ / dir->nEntries);
+ }
+
+ SFvSliderMovedCallback(w, n, new);
+}
+
+void
+SFhSliderMovedCallback(Widget w, int n, float *new)
+{
+ SFDir *dir;
+ int save;
+
+ UNUSED(w);
+
+ dir = &(SFdirs[SFdirPtr + n]);
+ save = dir->hOrigin;
+ dir->hOrigin = (*new) * dir->nChars;
+ if (dir->hOrigin == save) {
+ return;
+ }
+
+ SFdrawList(n, SF_DO_NOT_SCROLL);
+}
+
+void
+SFhAreaSelectedCallback(Widget w, int n, int pnew)
+{
+ SFDir *dir;
+ int new;
+
+ dir = &(SFdirs[SFdirPtr + n]);
+
+ new = dir->hOrigin + (((double)pnew) / SFhScrollWidth) * dir->nChars;
+
+ if (new > dir->nChars - SFcharsPerEntry) {
+ new = dir->nChars - SFcharsPerEntry;
+ }
+
+ if (new < 0) {
+ new = 0;
+ }
+
+ if (dir->nChars) {
+ float f;
+
+ f = (double)new / dir->nChars;
+
+ XawScrollbarSetThumb(w, f,
+ (double)(dir->nChars < SFcharsPerEntry
+ ? dir->nChars
+ : SFcharsPerEntry)
+ / dir->nChars);
+
+ SFhSliderMovedCallback(w, n, &f);
+ }
+}
+
+void
+SFpathSliderMovedCallback(Widget w, XtPointer client_data, float *new)
+{
+ SFDir *dir;
+ int n;
+ XawTextPosition pos;
+ int SFdirPtrSave;
+
+ UNUSED(w);
+ UNUSED(client_data);
+
+ SFdirPtrSave = SFdirPtr;
+ SFdirPtr = (*new) * SFdirEnd;
+ if (SFdirPtr == SFdirPtrSave) {
+ return;
+ }
+
+ SFdrawLists(SF_DO_SCROLL);
+
+ n = 2;
+ while (SFdirPtr + n >= SFdirEnd) {
+ n--;
+ }
+
+ dir = &(SFdirs[SFdirPtr + n]);
+
+ pos = dir->path - SFcurrentPath;
+
+ if (!strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) {
+ pos -= strlen(SFstartDir);
+ if (pos < 0) {
+ pos = 0;
+ }
+ }
+
+ XawTextSetInsertionPoint(selFileField, pos);
+}
+
+void
+SFpathAreaSelectedCallback(Widget w, XtPointer client_data, int pnew)
+{
+ int new;
+ float f;
+
+ UNUSED(client_data);
+
+ new = SFdirPtr + (((double)pnew) / SFpathScrollWidth) * SFdirEnd;
+
+ if (new > SFdirEnd - 3) {
+ new = SFdirEnd - 3;
+ }
+
+ if (new < 0) {
+ new = 0;
+ }
+
+ f = ((double)new) / SFdirEnd;
+
+ XawScrollbarSetThumb(w, f,
+ (double)(SFdirEnd < 3 ? SFdirEnd : 3) / SFdirEnd);
+
+ SFpathSliderMovedCallback(w, (XtPointer) NULL, &f);
+}
+
+Boolean
+SFworkProc(void)
+{
+ SFDir *dir;
+ SFEntry *entry;
+
+ for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) {
+ if (!(dir->nEntries)) {
+ continue;
+ }
+ for (entry = &(dir->entries[dir->nEntries - 1]);
+ entry >= dir->entries; entry--) {
+ if (!(entry->statDone)) {
+ (void)SFstatAndCheck(dir, entry);
+ return False;
+ }
+ }
+ }
+
+ SFworkProcAdded = 0;
+
+ return True;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* !defined(MOTIF) */
diff --git a/Build/source/texk/xdvik/gui/sfDraw.h b/Build/source/texk/xdvik/gui/sfDraw.h
new file mode 100644
index 00000000000..a7bc1a8cfbe
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfDraw.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef SFDRAW_H_
+#define SFDRAW_H_
+
+#if !defined(MOTIF) /* for xdvik */
+
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Scrollbar.h>
+#include <X11/Xaw/Cardinals.h>
+
+#define SF_DO_SCROLL 1
+#define SF_DO_NOT_SCROLL 0
+
+extern Pixel SFfore, SFback;
+
+void SFinitFont(void);
+void SFcreateGC(void);
+void SFclearList(int n, int doScroll);
+void SFdrawList(int n, int doScroll);
+void SFdrawLists(int doScroll);
+void SFenterList(Widget w, int n, XEnterWindowEvent *event);
+void SFleaveList(Widget w, int n, XEvent *event);
+void SFmotionList(Widget w, int n, XMotionEvent *event);
+void SFvFloatSliderMovedCallback(Widget w, int n, float *fnew);
+void SFvSliderMovedCallback(Widget w, int n, int new);
+void SFvAreaSelectedCallback(Widget w, int n, int pnew);
+void SFhSliderMovedCallback(Widget w, int n, float *new);
+void SFhAreaSelectedCallback(Widget w, int n, int pnew);
+void SFpathSliderMovedCallback(Widget w, XtPointer client_data, float *new);
+void SFpathAreaSelectedCallback(Widget w, XtPointer client_data, int pnew);
+Boolean SFworkProc(void);
+extern int (*SFfunc)();
+
+extern Widget selFileField, selFileForm, selFileHScroll, selFileHScrolls[], selFileLists[], selFileVScrolls[];
+extern Display *SFdisplay;
+extern int SFcharWidth, SFcharHeight, SFcharAscent;
+extern XSegment SFsegs[], SFcompletionSegs[];
+extern XawTextPosition SFtextPos;
+
+extern int SFupperX, SFlowerY, SFupperY;
+
+extern int SFtextX, SFtextYoffset;
+
+extern int SFentryWidth, SFentryHeight;
+
+extern int SFlineToTextH, SFlineToTextV;
+
+extern int SFbesideText, SFaboveAndBelowText;
+
+extern int SFcharsPerEntry;
+
+extern int SFlistSize;
+
+extern int SFcurrentInvert[];
+
+extern int SFworkProcAdded;
+
+extern XtAppContext SFapp;
+
+extern int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth;
+
+extern char SFtextBuffer[];
+
+extern int SFbuttonPressed;
+
+extern XtIntervalId SFdirModTimerId;
+
+#endif /* !defined(MOTIF) */
+
+#endif /* SFDRAW_H_ */
diff --git a/Build/source/texk/xdvik/gui/sfPath.c b/Build/source/texk/xdvik/gui/sfPath.c
new file mode 100644
index 00000000000..421a8631bb1
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfPath.c
@@ -0,0 +1,911 @@
+/*
+ * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. Software Research Associates
+ * makes no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Erik M. van der Poel
+ * Software Research Associates, Inc., Tokyo, Japan
+ * erik@sra.co.jp
+ */
+
+#include "xdvi-config.h"
+
+#include "kpathsea/c-auto.h"
+#include "kpathsea/config.h"
+#include "kpathsea/c-stat.h"
+
+#include "xdvi.h"
+#include "sfDir.h"
+#include "sfDraw.h"
+#include "sfPath.h"
+#include "sfSelFile.h"
+
+#if !defined(MOTIF) /* entire file */
+
+#include <stdio.h>
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Scrollbar.h>
+#include <X11/Xaw/Cardinals.h>
+
+
+#ifdef SEL_FILE_IGNORE_CASE
+#include <ctype.h>
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+#ifndef S_IXUSR
+#define S_IXUSR 0100
+#endif
+#ifndef S_IXGRP
+#define S_IXGRP 0010
+#endif
+#ifndef S_IXOTH
+#define S_IXOTH 0001
+#endif
+
+#define S_ISXXX(m) ((m) & (S_IXUSR | S_IXGRP | S_IXOTH))
+
+#include <X11/Xos.h>
+#include <pwd.h>
+#include <X11/Xaw/Scrollbar.h>
+
+typedef struct {
+ const char *name;
+ const char *dir;
+} SFLogin;
+
+SFDir *SFdirs = NULL;
+
+int SFdirEnd;
+
+int SFdirPtr;
+
+int SFbuttonPressed = 0;
+
+static int SFdoNotTouchDirPtr = 0;
+
+static int SFdoNotTouchVorigin = 0;
+
+static SFDir SFrootDir, SFhomeDir;
+
+static SFLogin *SFlogins;
+
+static int SFtwiddle = 0;
+
+int
+SFchdir(const char *path)
+{
+ int result;
+
+ result = 0;
+
+ if (strcmp(path, SFcurrentDir)) {
+ result = chdir(path);
+ if (!result) {
+ (void)strcpy(SFcurrentDir, path);
+ }
+ }
+
+ return result;
+}
+
+static void
+SFfree(int i)
+{
+ SFDir *dir;
+ int j;
+
+ dir = &(SFdirs[i]);
+
+ for (j = dir->nEntries - 1; j >= 0; j--) {
+ if (dir->entries[j].shown != dir->entries[j].real) {
+ XtFree(dir->entries[j].shown);
+ }
+ XtFree(dir->entries[j].real);
+ }
+
+ XtFree((char *)dir->entries);
+
+ XtFree(dir->dir);
+
+ dir->dir = NULL;
+}
+
+static char *
+SFstrdup(const char *s2)
+{
+ char *s1 = strcpy(XtMalloc((unsigned)(strlen(s2) + 1)), s2);
+ return s1;
+}
+
+static void
+SFunreadableDir(SFDir *dir)
+{
+ const char *cannotOpen = "<cannot open> ";
+
+ dir->entries = (SFEntry *) XtMalloc(sizeof(SFEntry));
+ dir->entries[0].statDone = 1;
+ dir->entries[0].real = SFstrdup(cannotOpen);
+ dir->entries[0].shown = dir->entries[0].real;
+ dir->nEntries = 1;
+ dir->nChars = strlen(cannotOpen);
+}
+
+#ifdef SEL_FILE_IGNORE_CASE
+static
+SFstrncmp(char *p, char *q, int n)
+{
+ char c1, c2;
+ char *psave, *qsave;
+ int nsave;
+
+ psave = p;
+ qsave = q;
+ nsave = n;
+
+ c1 = *p++;
+ if (islower(c1)) {
+ c1 = toupper(c1);
+ }
+ c2 = *q++;
+ if (islower(c2)) {
+ c2 = toupper(c2);
+ }
+
+ while ((--n >= 0) && (c1 == c2)) {
+ if (!c1) {
+ return strncmp(psave, qsave, nsave);
+ }
+ c1 = *p++;
+ if (islower(c1)) {
+ c1 = toupper(c1);
+ }
+ c2 = *q++;
+ if (islower(c2)) {
+ c2 = toupper(c2);
+ }
+ }
+
+ if (n < 0) {
+ return strncmp(psave, qsave, nsave);
+ }
+
+ return c1 - c2;
+}
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+static void
+SFreplaceText(SFDir *dir, char *str)
+{
+ int len;
+
+ *(dir->path) = '\0';
+ len = strlen(str);
+
+ if (str[len - 1] == '/') {
+ (void)strcat(SFcurrentPath, str);
+ }
+ else {
+ char *p = SFcurrentPath + strlen(SFcurrentPath);
+
+ (void)memcpy(p, str, len - 1);
+ p[len - 1] = '\0';
+ }
+ /* if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) { */
+ /* SFsetText(SFcurrentPath); */
+ /* } */
+ /* else { */
+ /* SFsetText(&(SFcurrentPath[strlen(SFstartDir)])); */
+ /* } */
+ SFsetText(SFcurrentPath);
+
+ SFtextChanged();
+}
+
+static void
+SFexpand(char *str)
+{
+ int len;
+ int cmp;
+ char *name, *growing;
+ SFDir *dir;
+ SFEntry *entry, *max;
+
+ len = strlen(str);
+
+ dir = &(SFdirs[SFdirEnd - 1]);
+
+ if (dir->beginSelection == -1) {
+ str = SFstrdup(str);
+ SFreplaceText(dir, str);
+ XtFree(str);
+ return;
+ }
+ else if (dir->beginSelection == dir->endSelection) {
+ SFreplaceText(dir, dir->entries[dir->beginSelection].shown);
+ return;
+ }
+
+ max = &(dir->entries[dir->endSelection + 1]);
+
+ name = dir->entries[dir->beginSelection].shown;
+ growing = SFstrdup(name);
+
+ cmp = 0;
+ while (!cmp) {
+ entry = &(dir->entries[dir->beginSelection]);
+ while (entry < max) {
+ if ((cmp = strncmp(growing, entry->shown, len))) {
+ break;
+ }
+ entry++;
+ }
+ len++;
+ }
+
+ /*
+ * SFreplaceText() expects filename
+ */
+ growing[len - 2] = ' ';
+
+ growing[len - 1] = 0;
+ SFreplaceText(dir, growing);
+ XtFree(growing);
+}
+
+static int
+SFfindFile(SFDir *dir, char *str)
+{
+ int i, last, max;
+ char *name, save;
+ SFEntry *entries;
+ int len;
+ int begin, end;
+ int result;
+
+ len = strlen(str);
+
+ if (str[len - 1] == ' ') {
+ SFexpand(str);
+ return 1;
+ }
+ else if (str[len - 1] == '/') {
+ len--;
+ }
+
+ max = dir->nEntries;
+
+ entries = dir->entries;
+
+ i = 0;
+ while (i < max) {
+ name = entries[i].shown;
+ last = strlen(name) - 1;
+ save = name[last];
+ name[last] = 0;
+
+#ifdef SEL_FILE_IGNORE_CASE
+ result = SFstrncmp(str, name, len);
+#else /* def SEL_FILE_IGNORE_CASE */
+ result = strncmp(str, name, len);
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+ name[last] = save;
+ if (result <= 0) {
+ break;
+ }
+ i++;
+ }
+ begin = i;
+ while (i < max) {
+ name = entries[i].shown;
+ last = strlen(name) - 1;
+ save = name[last];
+ name[last] = 0;
+
+#ifdef SEL_FILE_IGNORE_CASE
+ result = SFstrncmp(str, name, len);
+#else /* def SEL_FILE_IGNORE_CASE */
+ result = strncmp(str, name, len);
+#endif /* def SEL_FILE_IGNORE_CASE */
+
+ name[last] = save;
+ if (result) {
+ break;
+ }
+ i++;
+ }
+ end = i;
+
+ if (begin != end) {
+ if ((dir->beginSelection != begin) || (dir->endSelection != end - 1)
+ ) {
+ dir->changed = 1;
+ dir->beginSelection = begin;
+ if (str[strlen(str) - 1] == '/') {
+ dir->endSelection = begin;
+ }
+ else {
+ dir->endSelection = end - 1;
+ }
+ }
+ }
+ else {
+ if (dir->beginSelection != -1) {
+ dir->changed = 1;
+ dir->beginSelection = -1;
+ dir->endSelection = -1;
+ }
+ }
+
+ if (SFdoNotTouchVorigin ||
+ ((begin > dir->vOrigin) && (end < dir->vOrigin + SFlistSize))) {
+ SFdoNotTouchVorigin = 0;
+ return 0;
+ }
+
+ i = begin - 1;
+ if (i > max - SFlistSize) {
+ i = max - SFlistSize;
+ }
+ if (i < 0) {
+ i = 0;
+ }
+
+ if (dir->vOrigin != i) {
+ dir->vOrigin = i;
+ dir->changed = 1;
+ }
+
+ return 0;
+}
+
+static void
+SFunselect(void)
+{
+ SFDir *dir;
+
+ dir = &(SFdirs[SFdirEnd - 1]);
+ if (dir->beginSelection != -1) {
+ dir->changed = 1;
+ }
+ dir->beginSelection = -1;
+ dir->endSelection = -1;
+}
+
+static int
+SFcompareLogins(const void *vp, const void *vq)
+{
+ const SFLogin *p = vp;
+ const SFLogin *q = vq;
+ return strcmp(p->name, q->name);
+}
+
+static void
+SFgetHomeDirs(void)
+{
+ struct passwd *pw;
+ int alloc;
+ int i;
+ SFEntry *entries = NULL;
+ int len;
+ int maxChars;
+
+ {
+ alloc = 1;
+ i = 1;
+ entries = (SFEntry *) XtMalloc(sizeof(SFEntry));
+ SFlogins = (SFLogin *) XtMalloc(sizeof(SFLogin));
+ entries[0].real = XtMalloc(3);
+ (void)strcpy(entries[0].real, "~");
+ entries[0].shown = entries[0].real;
+ entries[0].statDone = 1;
+ SFlogins[0].name = "";
+ pw = getpwuid((int)getuid());
+ SFlogins[0].dir = SFstrdup(pw ? pw->pw_dir : "/");
+ maxChars = 0;
+ }
+
+ (void)setpwent();
+
+ while ((pw = (struct passwd *)getpwent()) && (*(pw->pw_name))) {
+ if (i >= alloc) {
+ alloc *= 2;
+ entries = (SFEntry *) XtRealloc(
+ (char *)entries,
+ (unsigned)(alloc *
+ sizeof(SFEntry)));
+ SFlogins =
+ (SFLogin *) XtRealloc((char *)SFlogins,
+ (unsigned)(alloc * sizeof(SFLogin))
+ );
+ }
+ len = strlen(pw->pw_name);
+ entries[i].real = XtMalloc((unsigned)(len + 3));
+ (void)strcat(strcpy(entries[i].real, "~"), pw->pw_name);
+ entries[i].shown = entries[i].real;
+ entries[i].statDone = 1;
+ if (len > maxChars) {
+ maxChars = len;
+ }
+ SFlogins[i].name = SFstrdup(pw->pw_name);
+ SFlogins[i].dir = SFstrdup(pw->pw_dir);
+ i++;
+ }
+
+ SFhomeDir.dir = XtMalloc(1);
+ SFhomeDir.dir[0] = 0;
+ SFhomeDir.path = SFcurrentPath;
+ SFhomeDir.entries = entries;
+ SFhomeDir.nEntries = i;
+ SFhomeDir.vOrigin = 0; /* :-) */
+ SFhomeDir.nChars = maxChars + 2;
+ SFhomeDir.hOrigin = 0;
+ SFhomeDir.changed = 1;
+ SFhomeDir.beginSelection = -1;
+ SFhomeDir.endSelection = -1;
+
+#if defined(SVR4) || defined(SYSV) || defined(USG)
+ qsort((char *)entries, (unsigned)i, sizeof(SFEntry), SFcompareEntries);
+ qsort((char *)SFlogins, (unsigned)i, sizeof(SFLogin), SFcompareLogins);
+#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
+ qsort((char *)entries, i, sizeof(SFEntry), SFcompareEntries);
+ qsort((char *)SFlogins, i, sizeof(SFLogin), SFcompareLogins);
+#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
+
+ for (i--; i >= 0; i--) {
+ (void)strcat(entries[i].real, "/");
+ }
+}
+
+static int
+SFfindHomeDir(char *begin, char *end)
+{
+ char save;
+ char *theRest;
+ int i;
+
+ save = *end;
+ *end = 0;
+
+ for (i = SFhomeDir.nEntries - 1; i >= 0; i--) {
+ if (!strcmp(SFhomeDir.entries[i].real, begin)) {
+ *end = save;
+ theRest = SFstrdup(end);
+ (void)strcat(strcat(strcpy(SFcurrentPath,
+ SFlogins[i].dir), "/"), theRest);
+ XtFree(theRest);
+ SFsetText(SFcurrentPath);
+ SFtextChanged();
+ return 1;
+ }
+ }
+
+ *end = save;
+
+ return 0;
+}
+
+void
+SFupdatePath(void)
+{
+ static int alloc;
+ static int wasTwiddle = 0;
+ char *begin, *end;
+ int i, j;
+ int prevChange;
+ int SFdirPtrSave, SFdirEndSave;
+ SFDir *dir;
+
+ if (!SFdirs) {
+ SFdirs = (SFDir *) XtMalloc((alloc = 10) * sizeof(SFDir));
+ dir = &(SFdirs[0]);
+ dir->dir = SFstrdup("/");
+ (void)SFchdir("/");
+ (void)SFgetDir(dir);
+ for (j = 1; j < alloc; j++) {
+ SFdirs[j].dir = NULL;
+ }
+ dir->path = SFcurrentPath + 1;
+ dir->vOrigin = 0;
+ dir->hOrigin = 0;
+ dir->changed = 1;
+ dir->beginSelection = -1;
+ dir->endSelection = -1;
+ SFhomeDir.dir = NULL;
+ }
+
+ SFdirEndSave = SFdirEnd;
+ SFdirEnd = 1;
+
+ SFdirPtrSave = SFdirPtr;
+ SFdirPtr = 0;
+
+ begin = NULL;
+
+ if (SFcurrentPath[0] == '~') {
+ if (!SFtwiddle) {
+ SFtwiddle = 1;
+ dir = &(SFdirs[0]);
+ SFrootDir = *dir;
+ if (!SFhomeDir.dir) {
+ SFgetHomeDirs();
+ }
+ *dir = SFhomeDir;
+ dir->changed = 1;
+ }
+ end = SFcurrentPath;
+ SFdoNotTouchDirPtr = 1;
+ wasTwiddle = 1;
+ }
+ else {
+ if (SFtwiddle) {
+ SFtwiddle = 0;
+ dir = &(SFdirs[0]);
+ *dir = SFrootDir;
+ dir->changed = 1;
+ }
+ end = SFcurrentPath + 1;
+ }
+
+ i = 0;
+
+ prevChange = 0;
+
+ while (*end) {
+ while (*end++ == '/') {
+ ;
+ }
+ end--;
+ begin = end;
+ while ((*end) && (*end++ != '/')) {
+ ;
+ }
+ if ((end - SFcurrentPath <= SFtextPos) && (*(end - 1) == '/')) {
+ SFdirPtr = i - 1;
+ if (SFdirPtr < 0) {
+ SFdirPtr = 0;
+ }
+ }
+ if (*begin) {
+ if (*(end - 1) == '/') {
+ char save = *end;
+
+ if (SFtwiddle) {
+ if (SFfindHomeDir(begin, end)) {
+ return;
+ }
+ }
+ *end = 0;
+ i++;
+ SFdirEnd++;
+ if (i >= alloc) {
+ SFdirs = (SFDir *) XtRealloc(
+ (char *)SFdirs,
+ (unsigned)((alloc *= 2) *
+ sizeof(SFDir))
+ );
+ for (j = alloc / 2; j < alloc; j++) {
+ SFdirs[j].dir = NULL;
+ }
+ }
+ dir = &(SFdirs[i]);
+ if ((!(dir->dir)) || prevChange || strcmp(dir->dir, begin)
+ ) {
+ if (dir->dir) {
+ SFfree(i);
+ }
+ prevChange = 1;
+ dir->dir = SFstrdup(begin);
+ dir->path = end;
+ dir->vOrigin = 0;
+ dir->hOrigin = 0;
+ dir->changed = 1;
+ dir->beginSelection = -1;
+ dir->endSelection = -1;
+ (void)SFfindFile(dir - 1, begin);
+ if (SFchdir(SFcurrentPath) || SFgetDir(dir)
+ ) {
+ SFunreadableDir(dir);
+ break;
+ }
+ }
+ *end = save;
+ if (!save) {
+ SFunselect();
+ }
+ }
+ else {
+ if (SFfindFile(&(SFdirs[SFdirEnd - 1]), begin)) {
+ return;
+ }
+ }
+ }
+ else {
+ SFunselect();
+ }
+ }
+
+ if ((end == SFcurrentPath + 1) && (!SFtwiddle)) {
+ SFunselect();
+ }
+
+ for (i = SFdirEnd; i < alloc; i++) {
+ if (SFdirs[i].dir) {
+ SFfree(i);
+ }
+ }
+
+ if (SFdoNotTouchDirPtr) {
+ if (wasTwiddle) {
+ wasTwiddle = 0;
+ SFdirPtr = SFdirEnd - 2;
+ if (SFdirPtr < 0) {
+ SFdirPtr = 0;
+ }
+ }
+ else {
+ SFdirPtr = SFdirPtrSave;
+ }
+ SFdoNotTouchDirPtr = 0;
+ }
+
+ if ((SFdirPtr != SFdirPtrSave) || (SFdirEnd != SFdirEndSave)) {
+ XawScrollbarSetThumb(selFileHScroll,
+ (double)(SFdirPtr) / SFdirEnd,
+ (double)(SFdirEnd < 3 ? SFdirEnd : 3) / SFdirEnd);
+ }
+
+ if (SFdirPtr != SFdirPtrSave) {
+ SFdrawLists(SF_DO_SCROLL);
+ }
+ else {
+ for (i = 0; i < 3; i++) {
+ if (SFdirPtr + i < SFdirEnd) {
+ if (SFdirs[SFdirPtr + i].changed) {
+ SFdirs[SFdirPtr + i].changed = 0;
+ SFdrawList(i, SF_DO_SCROLL);
+ }
+ }
+ else {
+ SFclearList(i, SF_DO_SCROLL);
+ }
+ }
+ }
+}
+
+void
+SFsetText(char *path)
+{
+ XawTextBlock text;
+
+ text.firstPos = 0;
+ text.length = strlen(path);
+ text.ptr = path;
+ text.format = FMT8BIT;
+
+ XawTextReplace(selFileField, 0, strlen(SFtextBuffer), &text);
+ XawTextSetInsertionPoint(selFileField, strlen(SFtextBuffer));
+}
+
+void
+SFbuttonPressList(Widget w, int n, XButtonPressedEvent *event)
+{
+ UNUSED(w);
+ UNUSED(n);
+ UNUSED(event);
+
+ SFbuttonPressed = 1;
+}
+
+void
+SFbuttonReleaseList(Widget w, int n, XButtonReleasedEvent *event)
+{
+ SFDir *dir;
+
+ SFbuttonPressed = 0;
+
+ if (SFcurrentInvert[n] != -1) {
+ if (n < 2) {
+ SFdoNotTouchDirPtr = 1;
+ }
+ SFdoNotTouchVorigin = 1;
+ dir = &(SFdirs[SFdirPtr + n]);
+ SFreplaceText(dir,
+ dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown);
+ SFmotionList(w, n, (XMotionEvent *)event);
+ }
+}
+
+static int
+SFcheckDir(int n, SFDir *dir)
+{
+ struct stat statBuf;
+ int i;
+
+ if ((!stat(".", &statBuf)) && (statBuf.st_mtime != dir->mtime)
+ ) {
+
+ /*
+ * If the pointer is currently in the window that we are about
+ * to update, we must warp it to prevent the user from
+ * accidentally selecting the wrong file.
+ */
+ if (SFcurrentInvert[n] != -1) {
+ XWarpPointer(SFdisplay,
+ None, XtWindow(selFileLists[n]), 0, 0, 0, 0, 0, 0);
+ }
+
+ for (i = dir->nEntries - 1; i >= 0; i--) {
+ if (dir->entries[i].shown != dir->entries[i].real) {
+ XtFree(dir->entries[i].shown);
+ }
+ XtFree(dir->entries[i].real);
+ }
+ XtFree((char *)dir->entries);
+ if (SFgetDir(dir)) {
+ SFunreadableDir(dir);
+ }
+ if (dir->vOrigin > dir->nEntries - SFlistSize) {
+ dir->vOrigin = dir->nEntries - SFlistSize;
+ }
+ if (dir->vOrigin < 0) {
+ dir->vOrigin = 0;
+ }
+ if (dir->hOrigin > dir->nChars - SFcharsPerEntry) {
+ dir->hOrigin = dir->nChars - SFcharsPerEntry;
+ }
+ if (dir->hOrigin < 0) {
+ dir->hOrigin = 0;
+ }
+ dir->beginSelection = -1;
+ dir->endSelection = -1;
+ SFdoNotTouchVorigin = 1;
+ if ((dir + 1)->dir) {
+ (void)SFfindFile(dir, (dir + 1)->dir);
+ }
+ else {
+ (void)SFfindFile(dir, dir->path);
+ }
+
+ if (!SFworkProcAdded) {
+ (void)XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL);
+ SFworkProcAdded = 1;
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static int
+SFcheckFiles(SFDir *dir)
+{
+ int from, to;
+ int result;
+ char old, new;
+ int i;
+ char *str;
+ int last;
+ struct stat statBuf;
+
+ result = 0;
+
+ from = dir->vOrigin;
+ to = dir->vOrigin + SFlistSize;
+ if (to > dir->nEntries) {
+ to = dir->nEntries;
+ }
+
+ for (i = from; i < to; i++) {
+ str = dir->entries[i].real;
+ last = strlen(str) - 1;
+ old = str[last];
+ str[last] = 0;
+ if (stat(str, &statBuf)) {
+ new = ' ';
+ }
+ else {
+ new = SFstatChar(&statBuf);
+ }
+ str[last] = new;
+ if (new != old) {
+ result = 1;
+ }
+ }
+
+ return result;
+}
+
+void
+SFdirModTimer(XtPointer cl, XtIntervalId *id)
+{
+ static int n = -1;
+ static int f = 0;
+ char save;
+ SFDir *dir;
+
+ UNUSED(cl);
+ UNUSED(id);
+
+ if ((!SFtwiddle) && (SFdirPtr < SFdirEnd)) {
+ n++;
+ if ((n > 2) || (SFdirPtr + n >= SFdirEnd)) {
+ n = 0;
+ f++;
+ if ((f > 2) || (SFdirPtr + f >= SFdirEnd)) {
+ f = 0;
+ }
+ }
+ dir = &(SFdirs[SFdirPtr + n]);
+ save = *(dir->path);
+ *(dir->path) = 0;
+ if (SFchdir(SFcurrentPath)) {
+ *(dir->path) = save;
+
+ /*
+ * force a re-read
+ */
+ *(dir->dir) = 0;
+
+ SFupdatePath();
+ }
+ else {
+ *(dir->path) = save;
+ if (SFcheckDir(n, dir) || ((f == n) && SFcheckFiles(dir))
+ ) {
+ SFdrawList(n, SF_DO_SCROLL);
+ }
+ }
+ }
+
+ SFdirModTimerId = XtAppAddTimeOut(SFapp, 1500UL,
+ SFdirModTimer, (XtPointer) NULL);
+}
+
+/* Return a single character describing what kind of file STATBUF is. */
+
+char
+SFstatChar(struct stat *statBuf)
+{
+ if (S_ISDIR(statBuf->st_mode)) {
+ return '/';
+ }
+ else if (S_ISREG(statBuf->st_mode)) {
+ return S_ISXXX(statBuf->st_mode) ? '*' : ' ';
+#ifdef S_ISSOCK
+ }
+ else if (S_ISSOCK(statBuf->st_mode)) {
+ return '=';
+#endif /* S_ISSOCK */
+ }
+ else {
+ return ' ';
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* !defined(MOTIF) */
diff --git a/Build/source/texk/xdvik/gui/sfPath.h b/Build/source/texk/xdvik/gui/sfPath.h
new file mode 100644
index 00000000000..2feba57aeff
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfPath.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef SFPATH_H_
+#define SFPATH_H_
+
+#ifndef MOTIF
+
+extern int SFchdir(const char *path);
+extern void SFupdatePath(void);
+extern void SFsetText(char *path);
+extern void SFbuttonPressList(Widget w, int n, XButtonPressedEvent *event);
+extern void SFbuttonReleaseList(Widget w, int n, XButtonReleasedEvent *event);
+extern void SFdirModTimer(XtPointer cl, XtIntervalId *id);
+extern char SFstatChar(struct stat *statBuf);
+
+extern char SFcurrentPath[], SFstartDir[], SFcurrentDir[];
+extern SFDir *SFdirs;
+extern int SFdirEnd, SFdirPtr;
+
+#endif /* MOTIF */
+
+#endif /* SFPATH_H_ */
diff --git a/Build/source/texk/xdvik/gui/sfSelFile.c b/Build/source/texk/xdvik/gui/sfSelFile.c
new file mode 100644
index 00000000000..7afcc1acedf
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfSelFile.c
@@ -0,0 +1,1042 @@
+/*
+ * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. Software Research Associates
+ * makes no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Erik M. van der Poel
+ * Software Research Associates, Inc., Tokyo, Japan
+ * erik@sra.co.jp
+ */
+
+#include "xdvi-config.h"
+
+#include "xdvi.h"
+#include "dvi-init.h" /* for dviErrFlagT */
+#include "message-window.h"
+
+#include "kpathsea/c-stat.h"
+
+#include <string.h>
+
+#include "sfDir.h"
+#include "sfPath.h"
+#include "sfDraw.h"
+#include "sfSelFile.h"
+#include "util.h"
+#include "xlwradio.h"
+#include "x_util.h"
+
+#include <ctype.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+
+#if !defined(MOTIF) /* entire file */
+
+#include <errno.h>
+
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+#endif
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define sfBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define sfBell(display, window, percent) XBell(display, percent)
+#endif
+
+#define SEL_FILE_CANCEL -1
+#define SEL_FILE_OK 0
+#define SEL_FILE_NULL 1
+#define SEL_FILE_TEXT 2
+
+/*
+ * Author's address:
+ *
+ * erik@sra.co.jp
+ * OR
+ * erik%sra.co.jp@uunet.uu.net
+ * OR
+ * erik%sra.co.jp@mcvax.uucp
+ * OR
+ * try junet instead of co.jp
+ * OR
+ * Erik M. van der Poel
+ * Software Research Associates, Inc.
+ * 1-1-1 Hirakawa-cho, Chiyoda-ku
+ * Tokyo 102 Japan. TEL +81-3-234-2692
+ */
+
+#include <sys/param.h>
+#include <X11/cursorfont.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Composite.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Paned.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/Scrollbar.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/Cardinals.h>
+
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#endif /* ndef MAXPATHLEN */
+
+/* global vars for communication with sfDraw.c */
+char SFstartDir[MAXPATHLEN], SFcurrentPath[MAXPATHLEN], SFcurrentDir[MAXPATHLEN];
+Widget selFileField, selFileForm, selFileHScroll, selFileHScrolls[3], selFileLists[3], selFileVScrolls[3];
+Display *SFdisplay;
+Pixel SFfore, SFback;
+XSegment SFsegs[2], SFcompletionSegs[2];
+XawTextPosition SFtextPos;
+int SFupperX, SFlowerY, SFupperY;
+int SFtextX, SFtextYoffset;
+int SFentryWidth, SFentryHeight;
+int SFlineToTextH = 3;
+int SFlineToTextV = 3;
+int SFbesideText = 3;
+int SFaboveAndBelowText = 2;
+int SFcharsPerEntry = 15;
+int SFlistSize = 10;
+int SFworkProcAdded = 0;
+XtAppContext SFapp;
+int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth;
+char SFtextBuffer[MAXPATHLEN];
+XtIntervalId SFdirModTimerId;
+int (*SFfunc) ();
+
+static int SFstatus = SEL_FILE_NULL;
+
+static Widget selFile, selFileCancel, selFileOK, selFilePrompt;
+/* For file filter. */
+static Widget selFileLabel, selFileMask, selFileHide;
+
+#define MASKWIDTH 16
+static char fileMask[MASKWIDTH + 2] = "*.dvi";
+
+static Atom SFwmDeleteWindow;
+
+static char *oneLineTextEditTranslations =
+"<Key>Return: redraw-display()\n"
+"Ctrl<Key>M: redraw-display()\n";
+
+#if !defined (HAVE_STRERROR) && !defined (strerror)
+static char *
+strerror(int errnum)
+{
+ return 0 < errnum && errnum <= sys_nerr
+ ? sys_errlist[errnum] : "Unknown system error";
+}
+#endif /* not HAVE_STRERROR && not strerror */
+
+void
+raise_file_selector(void)
+{
+ if (selFile != NULL && XtIsManaged(selFile)) {
+ sfBell(DISP, XtWindow(selFile), 10);
+ XRaiseWindow(DISP, XtWindow(selFile));
+ return;
+ }
+}
+
+static void
+SFexposeList(Widget w, XtPointer n, XEvent *event, Boolean *cont)
+{
+ UNUSED(w);
+ UNUSED(cont);
+
+ if ((event->type == NoExpose) || event->xexpose.count) {
+ return;
+ }
+
+ SFdrawList((ptrdiff_t)n, SF_DO_NOT_SCROLL);
+}
+
+
+static void
+cb_open_new_window(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Boolean set;
+
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XtNstate, &set, NULL);
+
+ if (set)
+ resource.filesel_open_new_window = True;
+ else
+ resource.filesel_open_new_window = False;
+ store_preference(NULL, "fileselOpenNewWindow", "%d", resource.filesel_open_new_window);
+}
+
+static void
+SFmodVerifyCallback(Widget w, XtPointer client_data, XEvent *event, Boolean *cont)
+{
+ char buf[2];
+
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(cont);
+
+ if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) &&
+ ((*buf) == '\r')) {
+ SFstatus = SEL_FILE_OK;
+ }
+ else {
+ SFstatus = SEL_FILE_TEXT;
+ }
+}
+
+static void
+SFokCallback(Widget w, XtPointer cl, XtPointer cd)
+{
+ UNUSED(w);
+ UNUSED(cl);
+ UNUSED(cd);
+
+ SFstatus = SEL_FILE_OK;
+}
+
+static XtCallbackRec SFokSelect[] = {
+ {SFokCallback, (XtPointer) NULL},
+ {NULL, (XtPointer) NULL},
+};
+
+static void
+SFcancelCallback(Widget w, XtPointer cl, XtPointer cd)
+{
+ UNUSED(w);
+ UNUSED(cl);
+ UNUSED(cd);
+
+ SFstatus = SEL_FILE_CANCEL;
+}
+
+static XtCallbackRec SFcancelSelect[] = {
+ {SFcancelCallback, (XtPointer) NULL},
+ {NULL, (XtPointer) NULL},
+};
+
+static void
+SFdismissAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (event->type == ClientMessage && (unsigned)(event->xclient.data.l[0]) != SFwmDeleteWindow)
+ return;
+
+ SFstatus = SEL_FILE_CANCEL;
+}
+
+static char *wmDeleteWindowTranslation = "<Message>WM_PROTOCOLS: SelFileDismiss()\n";
+
+static XtActionsRec sf_actions[] = {
+ {"SelFileDismiss", SFdismissAction},
+};
+
+/* Don't show files that don't get through the filter. */
+
+/* return 1 if file is masked (mask does not match filename), 0 otherwise */
+static int
+maskFile(const char *mask, char *filename)
+{
+ int c, c1;
+
+ while ((c = *mask++)) {
+ if (c == '*') {
+ while ((c1 = *mask++)) {
+ if (c1 != '*') {
+ if (!(*filename))
+ return 1;
+ if (c1 != '?') {
+ while ((filename = strchr(filename, c1))) {
+ if (!maskFile(mask, ++filename))
+ return 0;
+ }
+ return 1;
+ }
+ else
+ filename++;
+ }
+ }
+ return 0;
+ }
+ if (c == '?') {
+ if (!*filename)
+ return 1;
+ }
+ else if (c != *filename)
+ return 1;
+ filename++;
+ }
+ return (*filename) ? 1 : 0;
+}
+
+Boolean hideFlag = False;
+static int
+showEntry(char *entryReal, char **entryShown, struct stat *statBuf)
+{
+ UNUSED(entryShown);
+
+ if ((hideFlag && entryReal[0] == '.') || (!S_ISDIR(statBuf->st_mode) && maskFile(fileMask, entryReal)))
+ return 0;
+ entryReal[strlen(entryReal)] = SFstatChar(statBuf);
+ return 1;
+}
+
+static void
+maskChanged(Widget w, XtPointer client_data, XEvent *call_data, Boolean *cont)
+{
+ char buf[2];
+ SFDir *dir;
+
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(cont);
+
+ if ((XLookupString((XKeyPressedEvent *)call_data, buf, 2, NULL, NULL) == 1) && ((*buf) == '\r')) {
+ for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--)
+ *(dir->dir) = 0; /* force a re-read */
+ SFupdatePath();
+ }
+}
+
+static void
+hideFiles(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ SFDir *dir;
+ SFEntry *entry;
+
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ hideFlag = !hideFlag;
+ if (hideFlag) {
+ XtVaSetValues(w, XtNlabel, "hidden", NULL);
+ for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--) {
+ if (!(dir->nEntries))
+ continue;
+ dir->vOrigin = 0;
+ for (entry = &(dir->entries[dir->nEntries - 1]);
+ entry >= dir->entries; entry--)
+ entry->statDone = 0;
+ SFdrawLists(SF_DO_SCROLL);
+ }
+ }
+ else {
+ XtVaSetValues(w, XtNlabel, "shown", NULL);
+ for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--)
+ *(dir->dir) = 0; /* force a re-read */
+ SFupdatePath();
+ }
+}
+
+
+static Widget
+SFcreateWidgets(Widget parent, struct filesel_callback *callback)
+{
+ Widget open_menu = NULL;
+ Cardinal i, n;
+ int listWidth, listHeight;
+ int listSpacing = 10;
+ int scrollThickness = 15;
+ int hScrollX, hScrollY;
+ int vScrollX, vScrollY;
+ Cursor xtermCursor, sbRightArrowCursor, arrowCursor;
+ Arg arglist[20];
+ Widget paned, box;
+
+ i = 0;
+ XtSetArg(arglist[i], XtNtransientFor, parent); i++;
+ XtSetArg(arglist[i], XtNtitle, callback->title); i++;
+
+ selFile = XtAppCreateShell("xdviSelFile", "XdviSelFile",
+ transientShellWidgetClass, SFdisplay,
+ arglist, i);
+
+ /* Add WM_DELETE_WINDOW protocol */
+ XtAppAddActions(XtWidgetToApplicationContext(selFile),
+ sf_actions, XtNumber(sf_actions));
+ XtOverrideTranslations(selFile,
+ XtParseTranslationTable(wmDeleteWindowTranslation));
+
+ paned = XtVaCreateManagedWidget("paned", panedWidgetClass, selFile, NULL);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNdefaultDistance, 6); i++;
+
+ selFileForm = XtCreateManagedWidget("selFileForm",
+ formWidgetClass, paned, arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNlabel, callback->prompt); i++;
+ XtSetArg(arglist[i], XtNresizable, True); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNborderWidth, 0); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 20); i++;
+
+ selFilePrompt = XtCreateManagedWidget("selFilePrompt",
+ labelWidgetClass, selFileForm,
+ arglist, i);
+
+#if 1
+ i = 0;
+ XtSetArg(arglist[i], XtNforeground, &SFfore); i++;
+ XtSetArg(arglist[i], XtNbackground, &SFback); i++;
+ XtGetValues(selFilePrompt, arglist, i);
+#endif
+
+ SFinitFont();
+
+ SFentryWidth = SFbesideText + SFcharsPerEntry * SFcharWidth + SFbesideText;
+ SFentryHeight = SFaboveAndBelowText + SFcharHeight + SFaboveAndBelowText;
+
+ listWidth = SFlineToTextH + SFentryWidth + SFlineToTextH + 1 +
+ scrollThickness;
+ listHeight = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 +
+ SFlineToTextV + SFlistSize * SFentryHeight +
+ SFlineToTextV + 1 + scrollThickness;
+
+ SFpathScrollWidth = 3 * listWidth + 2 * listSpacing + 4;
+
+ hScrollX = -1;
+ hScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 +
+ SFlineToTextV + SFlistSize * SFentryHeight + SFlineToTextV;
+ SFhScrollWidth = SFlineToTextH + SFentryWidth + SFlineToTextH;
+
+ vScrollX = SFlineToTextH + SFentryWidth + SFlineToTextH;
+ vScrollY = SFlineToTextV + SFentryHeight + SFlineToTextV;
+ SFvScrollHeight = SFlineToTextV + SFlistSize * SFentryHeight +
+ SFlineToTextV;
+
+ SFupperX = SFlineToTextH + SFentryWidth + SFlineToTextH - 1;
+ SFlowerY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 +
+ SFlineToTextV;
+ SFupperY = SFlineToTextV + SFentryHeight + SFlineToTextV + 1 +
+ SFlineToTextV + SFlistSize * SFentryHeight - 1;
+
+ SFtextX = SFlineToTextH + SFbesideText;
+ SFtextYoffset = SFlowerY + SFaboveAndBelowText + SFcharAscent;
+
+ SFsegs[0].x1 = 0;
+ SFsegs[0].y1 = vScrollY;
+ SFsegs[0].x2 = vScrollX - 1;
+ SFsegs[0].y2 = vScrollY;
+ SFsegs[1].x1 = vScrollX;
+ SFsegs[1].y1 = 0;
+ SFsegs[1].x2 = vScrollX;
+ SFsegs[1].y2 = vScrollY - 1;
+
+ SFcompletionSegs[0].x1 = SFcompletionSegs[0].x2 = SFlineToTextH;
+ SFcompletionSegs[1].x1 = SFcompletionSegs[1].x2 =
+ SFlineToTextH + SFentryWidth - 1;
+
+ i = 0;
+ XtSetArg(arglist[i], XtNwidth,
+ 3 * listWidth + 2 * listSpacing + 4); i++;
+ XtSetArg(arglist[i], XtNfromVert, selFilePrompt); i++;
+ XtSetArg(arglist[i], XtNresizable, True); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNstring, SFtextBuffer); i++;
+ XtSetArg(arglist[i], XtNlength, MAXPATHLEN); i++;
+ XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++;
+ XtSetArg(arglist[i], XtNwrap, XawtextWrapWord); i++;
+ XtSetArg(arglist[i], XtNresize, XawtextResizeHeight); i++;
+ XtSetArg(arglist[i], XtNuseStringInPlace, True); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 5); i++;
+
+ selFileField = XtCreateManagedWidget("selFileField",
+ asciiTextWidgetClass, selFileForm,
+ arglist, i);
+
+ XtOverrideTranslations(selFileField,
+ XtParseTranslationTable
+ (oneLineTextEditTranslations));
+ /* XtSetKeyboardFocus(selFileForm, selFileField);
+ need focus for selFileMask widget to set the filter */
+
+ i = 0;
+ XtSetArg(arglist[i], XtNorientation, XtorientHorizontal); i++;
+ XtSetArg(arglist[i], XtNwidth, SFpathScrollWidth); i++;
+ XtSetArg(arglist[i], XtNheight, scrollThickness); i++;
+ XtSetArg(arglist[i], XtNfromVert, selFileField); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 30); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+
+ selFileHScroll = XtCreateManagedWidget("selFileHScroll",
+ scrollbarWidgetClass, selFileForm,
+ arglist, i);
+
+ XtAddCallback(selFileHScroll, XtNjumpProc,
+ (XtCallbackProc)SFpathSliderMovedCallback, (XtPointer) NULL);
+ XtAddCallback(selFileHScroll, XtNscrollProc,
+ (XtCallbackProc)SFpathAreaSelectedCallback, (XtPointer) NULL);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNwidth, listWidth); i++;
+ XtSetArg(arglist[i], XtNheight, listHeight); i++;
+ XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 10); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+
+ selFileLists[0] = XtCreateManagedWidget("selFileList1",
+ compositeWidgetClass, selFileForm,
+ arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNwidth, listWidth); i++;
+ XtSetArg(arglist[i], XtNheight, listHeight); i++;
+ XtSetArg(arglist[i], XtNfromHoriz, selFileLists[0]); i++;
+ XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++;
+ XtSetArg(arglist[i], XtNhorizDistance, listSpacing); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 10); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+
+ selFileLists[1] = XtCreateManagedWidget("selFileList2",
+ compositeWidgetClass, selFileForm,
+ arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNwidth, listWidth); i++;
+ XtSetArg(arglist[i], XtNheight, listHeight); i++;
+ XtSetArg(arglist[i], XtNfromHoriz, selFileLists[1]); i++;
+ XtSetArg(arglist[i], XtNfromVert, selFileHScroll); i++;
+ XtSetArg(arglist[i], XtNhorizDistance, listSpacing); i++;
+ XtSetArg(arglist[i], XtNvertDistance, 10); i++;
+ XtSetArg(arglist[i], XtNtop, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNbottom, XtChainTop); i++;
+ XtSetArg(arglist[i], XtNleft, XtChainLeft); i++;
+ XtSetArg(arglist[i], XtNright, XtChainLeft); i++;
+
+ selFileLists[2] = XtCreateManagedWidget("selFileList3",
+ compositeWidgetClass, selFileForm,
+ arglist, i);
+
+ for (n = 0; n < 3; n++) {
+
+ i = 0;
+ XtSetArg(arglist[i], XtNx, vScrollX); i++;
+ XtSetArg(arglist[i], XtNy, vScrollY); i++;
+ XtSetArg(arglist[i], XtNwidth, scrollThickness); i++;
+ XtSetArg(arglist[i], XtNheight, SFvScrollHeight); i++;
+
+ selFileVScrolls[n] = XtCreateManagedWidget("selFileVScroll",
+ scrollbarWidgetClass,
+ selFileLists[n], arglist, i);
+
+ XtAddCallback(selFileVScrolls[n], XtNjumpProc,
+ (XtCallbackProc)SFvFloatSliderMovedCallback, cast_int_to_XtPointer(n));
+ XtAddCallback(selFileVScrolls[n], XtNscrollProc,
+ (XtCallbackProc)SFvAreaSelectedCallback, cast_int_to_XtPointer(n));
+
+ i = 0;
+ XtSetArg(arglist[i], XtNorientation, XtorientHorizontal); i++;
+ XtSetArg(arglist[i], XtNx, hScrollX); i++;
+ XtSetArg(arglist[i], XtNy, hScrollY); i++;
+ XtSetArg(arglist[i], XtNwidth, SFhScrollWidth); i++;
+ XtSetArg(arglist[i], XtNheight, scrollThickness); i++;
+
+ selFileHScrolls[n] = XtCreateManagedWidget("selFileHScroll",
+ scrollbarWidgetClass,
+ selFileLists[n], arglist, i);
+
+ XtAddCallback(selFileHScrolls[n], XtNjumpProc,
+ (XtCallbackProc)SFhSliderMovedCallback, cast_int_to_XtPointer(n));
+ XtAddCallback(selFileHScrolls[n], XtNscrollProc,
+ (XtCallbackProc)SFhAreaSelectedCallback, cast_int_to_XtPointer(n));
+ }
+
+ /* When opening a DVI file, offer to open in new window */
+ if (callback->must_exist) {
+ open_menu = XtVaCreateManagedWidget(Xdvi_NEW_WINDOW_RADIO_NAME,
+#ifdef XAW
+ radioWidgetClass,
+#else
+ toggleWidgetClass,
+#endif
+ selFileForm,
+#ifdef XAW
+ XtNisRadio, False,
+#endif
+ XtNfromVert, selFileLists[0],
+ XtNvertDistance, 30,
+ XtNhighlightThickness, 1,
+ XtNborderWidth, 0,
+ XtNlabel, "Open file in new window",
+ XtNstate, resource.filesel_open_new_window,
+ NULL);
+ XtAddCallback(open_menu, XtNcallback, cb_open_new_window, (XtPointer)NULL);
+ }
+
+ /* Do the file filter stuff. */
+ selFileLabel = XtVaCreateManagedWidget("selFileLabel",
+ labelWidgetClass, selFileForm,
+ XtNfromVert, callback->must_exist ? open_menu : selFileLists[0],
+ XtNvertDistance, callback->must_exist ? 10 : 30,
+ /* XtNfromHoriz, selFileCancel, */
+ /* XtNhorizDistance, 60, */
+ XtNlabel, "File Mask:",
+ XtNborderWidth, 0,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainTop, NULL);
+
+ selFileMask = XtVaCreateManagedWidget("selFileMask",
+ asciiTextWidgetClass, selFileForm,
+ XtNwidth, MASKWIDTH / 2 * SFcharWidth,
+ XtNfromVert, callback->must_exist ? open_menu : selFileLists[0],
+ XtNvertDistance, callback->must_exist ? 10 : 30,
+ XtNfromHoriz, selFileLabel,
+ XtNhorizDistance, 0,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainTop,
+ XtNstring, fileMask,
+ XtNlength, MASKWIDTH,
+ XtNeditType, XawtextEdit,
+ XtNwrap, XawtextWrapNever,
+ XtNuseStringInPlace, True, NULL);
+
+ for (i = 0; i < 3; i++)
+ XtSetKeyboardFocus(selFileLists[i], selFileField);
+
+ XtOverrideTranslations(selFileMask,
+ XtParseTranslationTable
+ (oneLineTextEditTranslations));
+
+ XtAddEventHandler(selFileMask, KeyPressMask, False,
+ (XtEventHandler)maskChanged, (XtPointer) NULL);
+
+ selFileLabel = XtVaCreateManagedWidget("selFileLabel",
+ labelWidgetClass, selFileForm,
+ XtNfromVert, callback->must_exist ? open_menu : selFileLists[0],
+ XtNvertDistance, callback->must_exist ? 10 : 30,
+ XtNfromHoriz, selFileMask,
+ XtNhorizDistance, 40,
+ XtNlabel, "Dot files are:",
+ XtNborderWidth, 0,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainTop, NULL);
+
+ selFileHide = XtVaCreateManagedWidget("selFileHide",
+ commandWidgetClass, selFileForm,
+ /* XtNwidth, 7 * SFcharWidth, */
+ XtNfromVert, callback->must_exist ? open_menu : selFileLists[0],
+ XtNvertDistance, callback->must_exist ? 10 : 30,
+ XtNfromHoriz, selFileLabel,
+ XtNhorizDistance, 2,
+ XtNlabel, hideFlag ? "hidden" : "shown",
+ /* XtNborderWidth, 1, */
+ XtNtop, XtChainTop,
+ /* XtNjustify, XtJustifyLeft, */
+ XtNbottom, XtChainTop,
+ NULL);
+ XtAddCallback(selFileHide, XtNcallback, (XtCallbackProc)hideFiles, NULL);
+
+ box = XtVaCreateManagedWidget("box", formWidgetClass,
+ paned,
+ XtNshowGrip, False,
+ XtNdefaultDistance, 6,
+ XtNskipAdjust, True,
+ XtNaccelerators, G_accels_cr,
+ NULL);
+ selFileOK = XtVaCreateManagedWidget("selFileOK", commandWidgetClass,
+ box,
+ XtNlabel, callback->ok,
+ XtNcallback, SFokSelect,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ XtNleft, XtChainLeft,
+ XtNright, XtChainLeft,
+ NULL);
+ selFileCancel = XtVaCreateManagedWidget("selFileCancel", commandWidgetClass,
+ box,
+ XtNlabel, callback->cancel,
+ XtNcallback, SFcancelSelect,
+ /* XtNborderColor, SFfore, */
+ XtNfromHoriz, selFileOK,
+ XtNbottom, XtChainBottom,
+ XtNleft, XtChainRight,
+ XtNright, XtChainRight,
+ NULL);
+
+ XtSetMappedWhenManaged(selFile, False);
+ XtRealizeWidget(selFile);
+
+ /* Add WM_DELETE_WINDOW protocol */
+ SFwmDeleteWindow = XInternAtom(SFdisplay, "WM_DELETE_WINDOW", False);
+ XSetWMProtocols(SFdisplay, XtWindow(selFile), &SFwmDeleteWindow, 1);
+
+ SFcreateGC();
+
+ xtermCursor = XCreateFontCursor(SFdisplay, XC_xterm);
+
+ sbRightArrowCursor = XCreateFontCursor(SFdisplay, XC_sb_right_arrow);
+ arrowCursor = XCreateFontCursor(SFdisplay, XC_left_ptr);
+
+ XDefineCursor(SFdisplay, XtWindow(selFileForm), arrowCursor);
+ XDefineCursor(SFdisplay, XtWindow(selFileField), xtermCursor);
+
+ for (n = 0; n < 3; n++) {
+ XDefineCursor(SFdisplay, XtWindow(selFileLists[n]), sbRightArrowCursor);
+ }
+ XDefineCursor(SFdisplay, XtWindow(selFileOK), arrowCursor);
+ XDefineCursor(SFdisplay, XtWindow(selFileCancel), arrowCursor);
+
+ for (n = 0; n < 3; n++) {
+ XtAddEventHandler(selFileLists[n], ExposureMask, True,
+ (XtEventHandler)SFexposeList, cast_int_to_XtPointer(n));
+ XtAddEventHandler(selFileLists[n], EnterWindowMask, False,
+ (XtEventHandler)SFenterList, cast_int_to_XtPointer(n));
+ XtAddEventHandler(selFileLists[n], LeaveWindowMask, False,
+ (XtEventHandler)SFleaveList, cast_int_to_XtPointer(n));
+ XtAddEventHandler(selFileLists[n], PointerMotionMask, False,
+ (XtEventHandler)SFmotionList, cast_int_to_XtPointer(n));
+ XtAddEventHandler(selFileLists[n], ButtonPressMask, False,
+ (XtEventHandler)SFbuttonPressList, cast_int_to_XtPointer(n));
+ XtAddEventHandler(selFileLists[n], ButtonReleaseMask, False,
+ (XtEventHandler)SFbuttonReleaseList, cast_int_to_XtPointer(n));
+ }
+
+ XtAddEventHandler(selFileField, KeyPressMask, False,
+ (XtEventHandler)SFmodVerifyCallback, (XtPointer) NULL);
+
+ SFapp = XtWidgetToApplicationContext(selFile);
+ return selFile;
+}
+
+/* position widget under the cursor */
+void
+SFpositionWidget(Widget w)
+{
+ Arg args[3];
+ Cardinal num_args;
+ Dimension width, height, b_width;
+ int x, y, max_x, max_y;
+ Window root, child;
+ int dummyx, dummyy;
+ unsigned int dummymask;
+
+ XQueryPointer(XtDisplay(w), XtWindow(w), &root, &child, &x, &y,
+ &dummyx, &dummyy, &dummymask);
+ num_args = 0;
+ XtSetArg(args[num_args], XtNwidth, &width);
+ num_args++;
+ XtSetArg(args[num_args], XtNheight, &height);
+ num_args++;
+ XtSetArg(args[num_args], XtNborderWidth, &b_width);
+ num_args++;
+ XtGetValues(w, args, num_args);
+
+ width += 2 * b_width;
+ height += 2 * b_width;
+
+ x -= ((Position) width / 2);
+ if (x < 0)
+ x = 0;
+ if (x > (max_x = (Position) (XtScreen(w)->width - width)))
+ x = max_x;
+
+ y -= ((Position) height / 2);
+ if (y < 0)
+ y = 0;
+ if (y > (max_y = (Position) (XtScreen(w)->height - height)))
+ y = max_y;
+
+ num_args = 0;
+ XtSetArg(args[num_args], XtNx, x);
+ num_args++;
+ XtSetArg(args[num_args], XtNy, y);
+ num_args++;
+ XtSetValues(w, args, num_args);
+}
+
+
+FILE *
+SFopenFile(const char *name, const char *mode, const char *prompt, const char *failed)
+{
+ Arg args[1];
+ FILE *fp;
+
+ UNUSED(args);
+ UNUSED(prompt);
+ UNUSED(failed);
+
+ SFchdir(SFstartDir);
+ errno = 0;
+ if (!name || *name == 0 || (fp = XFOPEN(name, mode)) == NULL) {
+ sfBell(DISP,
+ (selFile != NULL && XtIsManaged(selFile))
+ ? XtWindow(selFile) : (Window) NULL, 0);
+ return NULL;
+ }
+ return fp;
+}
+
+void
+SFtextChanged(void)
+{
+ if ((SFtextBuffer[0] == '/') || (SFtextBuffer[0] == '~')) {
+ (void)strcpy(SFcurrentPath, SFtextBuffer);
+
+ SFtextPos = XawTextGetInsertionPoint(selFileField);
+ }
+ else {
+ (void)strcat(strcpy(SFcurrentPath, SFstartDir), SFtextBuffer);
+
+ SFtextPos = XawTextGetInsertionPoint(selFileField) + strlen(SFstartDir);
+ }
+
+ if (!SFworkProcAdded) {
+ (void)XtAppAddWorkProc(SFapp, (XtWorkProc)SFworkProc, NULL);
+ SFworkProcAdded = 1;
+ }
+
+ SFupdatePath();
+}
+
+static void
+SFprepareToReturn(void)
+{
+ SFstatus = SEL_FILE_NULL;
+ /* XtRemoveGrab(selFile); */
+ XtUnmapWidget(selFile);
+
+ if (SFdirModTimerId) {
+ XtRemoveTimeOut(SFdirModTimerId);
+ SFdirModTimerId = 0;
+ }
+ if (SFchdir(SFstartDir)) {
+ XtAppError(SFapp, "XsraSelFile: can't return to current directory");
+ }
+}
+
+Widget
+XsraSelFile(Widget parent, struct filesel_callback *callback)
+{
+ SFdisplay = XtDisplay(parent);
+ return SFcreateWidgets(parent, callback);
+}
+
+void
+XsraSelFilePopup(struct filesel_callback *callback)
+{
+ Cardinal i;
+ Arg arglist[20];
+ XEvent event;
+
+ if (XtIsManaged(callback->shell)) {
+ sfBell(DISP, XtWindow(callback->shell), 10);
+ XRaiseWindow(DISP, XtWindow(callback->shell));
+ return;
+ }
+
+ if (!callback->prompt)
+ callback->prompt = "Pathname:";
+
+ if (!callback->title)
+ callback->title = "xdvik: select filename";
+
+ if (!callback->ok)
+ callback->ok = "OK";
+
+ if (!callback->cancel)
+ callback->cancel = "Cancel";
+
+ /* if (!callback->browse_fname) */
+ /* callback->browse_fname = xt_strdup(xgetcwd()); */
+
+ i = 0;
+ XtSetArg(arglist[i], XtNlabel, callback->prompt); i++;
+ XtSetValues(selFilePrompt, arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNlabel, callback->ok); i++;
+ XtSetValues(selFileOK, arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNtitle, callback->title); i++;
+ XtSetValues(selFile, arglist, i);
+
+ i = 0;
+ XtSetArg(arglist[i], XtNlabel, callback->cancel); i++;
+ XtSetValues(selFileCancel, arglist, i);
+
+
+ SFpositionWidget(selFile);
+ XtMapWidget(selFile);
+
+ {
+ char *cwd = xgetcwd();
+ strcpy(SFstartDir, cwd);
+ free(cwd);
+ }
+ if (SFstartDir[0] == 0) {
+ XtAppError(SFapp, "XsraSelFile: can't get current directory");
+ }
+ (void)strcat(SFstartDir, "/");
+ (void)strcpy(SFcurrentDir, SFstartDir);
+
+ if (callback->init_path) {
+ if (callback->init_path[0] == '/') {
+ (void)strcpy(SFcurrentPath, callback->init_path);
+ if (strncmp(SFcurrentPath, SFstartDir, strlen(SFstartDir))) {
+ SFsetText(SFcurrentPath);
+ }
+ else {
+ SFsetText(&(SFcurrentPath[strlen(SFstartDir)]));
+ }
+ }
+ else {
+ (void)strcat(strcpy(SFcurrentPath, SFstartDir), callback->init_path);
+ SFsetText(&(SFcurrentPath[strlen(SFstartDir)]));
+ }
+ }
+ else {
+ SFsetText(SFcurrentDir);
+ (void)strcpy(SFcurrentPath, SFstartDir);
+ }
+
+ SFfunc = showEntry;
+
+ SFtextChanged();
+
+ /* don't grab the pointer so that warning popups still work */
+ /* XtAddGrab(selFile, True, True); */
+
+ SFdirModTimerId = XtAppAddTimeOut(SFapp, 1200UL,
+ SFdirModTimer, (XtPointer) NULL);
+
+ if (strcmp(fileMask, callback->filemask) != 0) { /* if mask changed */
+ SFDir *dir;
+ strncpy(fileMask, callback->filemask, MASKWIDTH);
+ XtVaSetValues(selFileMask, XtNstring, fileMask, NULL);
+ for (dir = &(SFdirs[SFdirEnd - 1]); dir >= SFdirs; dir--)
+ *(dir->dir) = 0; /* force a re-read */
+ SFupdatePath();
+ }
+
+ while (1) {
+ XtAppNextEvent(SFapp, &event);
+ switch (event.type) {
+ Widget w;
+#if 0 /* DON'T do this, it may send the X server into a busy loop if the File selector
+ is positioned over a window that is `on top' by default */
+ case Expose:
+ if (!raise_message_windows())
+ raise_file_selector();
+ break;
+#endif
+ case KeyPress:
+ case ButtonPress:
+ /* ignore keypress inside the main window (and beep to warn) */
+ w = XtWindowToWidget(DISP, event.xany.window);
+ while ((w != NULL) && (w != selFile)) {
+ /* exception: message windows */
+ if (is_message_window(w))
+ break;
+ w = XtParent(w);
+ }
+ if (w == NULL || w == globals.widgets.top_level) {
+ sfBell(DISP, event.xany.window, 0);
+ continue;
+ }
+ break;
+ }
+
+ XtDispatchEvent(&event);
+
+ switch (SFstatus) {
+ case SEL_FILE_TEXT:
+ SFstatus = SEL_FILE_NULL;
+ SFtextChanged();
+ break;
+ case SEL_FILE_OK:
+ if (callback->must_exist) {
+ FILE *tmp_fp = XFOPEN(SFtextBuffer, "r");
+ dviErrFlagT errflag = NO_ERROR;
+ if (tmp_fp == NULL) {
+ popup_message(selFile,
+ MSG_ERR, NULL, "Could not open %s: %s.\n",
+ SFtextBuffer, strerror(errno));
+ SFstatus = SEL_FILE_NULL;
+ break;
+ }
+ else if (!process_preamble(tmp_fp, &errflag)
+ || !find_postamble(tmp_fp, &errflag)
+ || !read_postamble(tmp_fp, &errflag, False)) {
+ popup_message(selFile,
+ MSG_ERR, NULL, "Error opening %s:\n%s.",
+ SFtextBuffer, get_dvi_error(errflag));
+ fclose(tmp_fp);
+ SFstatus = SEL_FILE_NULL;
+ break;
+ }
+ else { /* file is OK */
+ fclose(tmp_fp);
+ SFprepareToReturn();
+ callback->func_ptr(SFtextBuffer, callback->data);
+ return;
+ /* return xstrdup(SFtextBuffer); */
+ }
+ }
+ else {
+ SFprepareToReturn();
+ callback->func_ptr(SFtextBuffer, callback->data);
+ return;
+ /* return xstrdup(SFtextBuffer); */
+ }
+ case SEL_FILE_CANCEL:
+ SFprepareToReturn();
+ if (callback->exit_on_cancel)
+ exit(0);
+ return;
+ /* return NULL; */
+ case SEL_FILE_NULL:
+ break;
+ }
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* !defined(MOTIF) */
diff --git a/Build/source/texk/xdvik/gui/sfSelFile.h b/Build/source/texk/xdvik/gui/sfSelFile.h
new file mode 100644
index 00000000000..cdda4d7d323
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfSelFile.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef SFSELFILE_H_
+#define SFSELFILE_H_
+
+struct filesel_callback {
+ Widget shell;
+ char *browse_fname;
+ const char *title;
+ const char *prompt;
+ const char *ok;
+ const char *cancel;
+ const char *init_path;
+ const char *filemask;
+ Boolean must_exist;
+ Boolean exit_on_cancel;
+ void (*func_ptr)(const char *filename, void *data);
+ void *data;
+};
+
+#define Xdvi_NEW_WINDOW_RADIO_NAME "new_window_radio"
+
+extern void SFpositionWidget(Widget w);
+extern FILE *SFopenFile(const char *name, const char *mode, const char *prompt, const char *failed);
+extern void SFtextChanged(void);
+extern Widget XsraSelFile(Widget parent, struct filesel_callback *callback);
+extern void XsraSelFilePopup(struct filesel_callback *callback);
+void raise_file_selector(void);
+
+#endif /* SF_SEL_FILE_H_ */
diff --git a/Build/source/texk/xdvik/gui/sfinternal.h b/Build/source/texk/xdvik/gui/sfinternal.h
new file mode 100644
index 00000000000..05a194d8686
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/sfinternal.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
+ * Copyright 2004 the Xdvik development team
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Software Research Associates not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission. Software Research Associates
+ * makes no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Erik M. van der Poel
+ * Software Research Associates, Inc., Tokyo, Japan
+ * erik@sra.co.jp
+ */
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#undef wchar_t
+
+#define SEL_FILE_CANCEL -1
+#define SEL_FILE_OK 0
+#define SEL_FILE_NULL 1
+#define SEL_FILE_TEXT 2
+
+#define SF_DO_SCROLL 1
+#define SF_DO_NOT_SCROLL 0
+
+/* Widget names for get_widget_by_name() */
+#define SfSelFile_FIELD_NAME "selFileField"
+#define SfSelFile_FORM_NAME "selFileForm"
+#define SfSelFile_HSCROLL_BIG_NAME "selFileHScrollBig"
+#define SfSelFile_VSCROLL_BASE_NAME "selFileVScroll"
+#define SfSelFile_HSCROLL_BASE_NAME "selFileHScroll"
+#define SfSelFile_LIST_BASE_NAME "selFileList"
+#define SfSelFile_LIST1_NAME "selFileList1"
+#define SfSelFile_LIST2_NAME "selFileList2"
+#define SfSelFile_LIST3_NAME "selFileList3"
+
+extern void
+ SFenterList(),
+ SFleaveList(),
+ SFmotionList(),
+ SFbuttonPressList(),
+ SFbuttonReleaseList();
+
+extern void
+ SFvSliderMovedCallback(),
+ SFvFloatSliderMovedCallback(),
+ SFhSliderMovedCallback(),
+ SFpathSliderMovedCallback(),
+ SFvAreaSelectedCallback(),
+ SFhAreaSelectedCallback(),
+ SFpathAreaSelectedCallback();
+
+
diff --git a/Build/source/texk/xdvik/gui/statusline.c b/Build/source/texk/xdvik/gui/statusline.c
new file mode 100644
index 00000000000..a612231c05a
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/statusline.c
@@ -0,0 +1,580 @@
+/*------------------------------------------------------------
+ statusline for the xdvi(k) previewer
+
+ written by S. Ulrich (ulrich@cis.uni-muenchen.de) 2000/02/25
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ ------------------------------------------------------------*/
+
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "version.h"
+#include "statusline.h"
+#include "xm_menu.h"
+#include "x_util.h"
+#include "pagehist.h"
+#include "util.h"
+
+#include <stdarg.h>
+#include "my-vsnprintf.h"
+
+#include <ctype.h>
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+
+# ifdef MOTIF
+# include <Xm/Label.h>
+# include <Xm/Frame.h>
+# include <Xm/Text.h>
+# include <Xm/TextF.h>
+# else
+# include <X11/Xaw/Viewport.h>
+# include <X11/Xaw/Label.h>
+# endif
+
+
+Widget statusline;
+
+static Boolean initialized = False;
+
+/*
+ * only print MAX_LEN characters to the statusline
+ * (it's only 1 line after all)
+ */
+#define MAX_LEN 512
+
+/* for saving the statusline string if the statusline is
+ * destroyed and recreated
+ */
+static char g_string_savebuf[MAX_LEN + 2];
+
+static int m_statusline_h = 20;
+
+/* access method */
+int get_statusline_height(void)
+{
+ return m_statusline_h;
+}
+
+#if MOTIF
+static void
+handle_statusline_event(Widget w, XtPointer client_data,
+ XEvent *ev, Boolean *cont)
+{
+ /* const char *text = (const char *)client_data; */
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(cont);
+
+ /* fprintf(stderr, "text: |%s|; event: %p\n", text, ev); */
+ /* only used to do this if page history was already active, but it's probably
+ nicer to be able to get the history by clicking on the statusline ...
+ */
+ if (/* strncmp(text, "Page history:", sizeof "Page history:" - 1) == 0 && */ ev != NULL) {
+ XmTextPosition pos = XmTextGetCursorPosition(statusline);
+ char *ptr1, *ptr2;
+ int diff = 0;
+ /* fprintf(stderr, "pos: %d\n", pos); */
+ if (pos == 0) { /* just display the page history */
+ page_history_move(0);
+ return;
+ }
+ ptr1 = g_string_savebuf + pos;
+ ptr2 = strchr(g_string_savebuf, '[');
+ if (ptr2 == NULL) { /* some other string, also display the page history */
+ page_history_move(0);
+ return;
+ }
+ /* fprintf(stderr, "ptr1: |%s|; ptr2: |%s|\n", ptr1, ptr2); */
+ while (ptr1 < ptr2) {
+ if (*ptr1 == ' ' && *(ptr1 + 1) != '-') /* separator */
+ diff--;
+ ptr1++;
+ }
+
+ while (ptr1 > ptr2) {
+ if (*ptr1 == ' ' && *(ptr1 - 1) != '-') /* separator */
+ diff++;
+ ptr1--;
+ }
+ /* fprintf(stderr, "diff: %d\n", diff); */
+ page_history_move(diff);
+ }
+}
+#endif /* MOTIF */
+
+/*
+ * Create the statusline widget. To be called at the beginning
+ * of the program, and when expert mode is switched off.
+ *
+ * Side effects:
+ * sets <m_statusline_h> to the height of the statusline in pixels.
+ */
+
+Widget
+create_statusline(
+#ifdef MOTIF
+ Widget parent
+#else
+ void
+#endif
+ )
+{
+#ifndef MOTIF
+ Position vport_h;
+ Position clip_x;
+ Position clip_w;
+ static Position my_h = 0;
+#endif
+
+ /*
+ * FIXME: is there a better way to set the y position depending on
+ * the height of the widget?
+ * It doesn't work to change the value of XtNy *after* creating
+ * the widget!
+ */
+
+ if (!initialized) {
+#ifndef MOTIF
+ /*
+ * determine height of statusline (depending on the font used).
+ * This is not changeable at runtime, so it's determined once and
+ * for all at program start.
+ */
+ statusline = XtVaCreateWidget("statusline", labelWidgetClass, globals.widgets.vport_widget,
+ XtNlabel, (XtArgVal) "test",
+ NULL);
+ XtVaGetValues(statusline, XtNheight, &my_h, NULL);
+ m_statusline_h = my_h;
+ XtDestroyWidget(statusline);
+#endif
+ initialized = True;
+ /* initialize g_string_savebuf */
+ sprintf(g_string_savebuf, "This is xdvik %s", XDVI_TERSE_VERSION_INFO);
+ }
+#ifndef MOTIF
+ /* determine position and width of statusline */
+ XtVaGetValues(globals.widgets.clip_widget, XtNx, &clip_x, XtNwidth, &clip_w, NULL);
+ XtVaGetValues(globals.widgets.vport_widget, XtNheight, &vport_h, NULL);
+ if (vport_h - my_h <= 0) {
+ XDVI_FATAL((stderr, "Window height too small for statusline (minimum value: %d).", my_h));
+ return NULL;
+ }
+ statusline = XtVaCreateManagedWidget("statusline",
+ labelWidgetClass, globals.widgets.vport_widget,
+ XtNlabel, (XtArgVal) g_string_savebuf,
+ XtNwidth, clip_w,
+ XtNx, clip_x - 1, /* so that left border becomes invisible */
+ XtNy, vport_h - my_h,
+ XtNjustify, XtJustifyLeft,
+ /* same as for the buttons line */
+ XtNborder, (XtArgVal) resource.fore_Pixel,
+ NULL);
+#else
+ statusline = XtVaCreateManagedWidget("statusline",
+ xmTextFieldWidgetClass, parent,
+ XmNalignment, XmALIGNMENT_END,
+ XmNdepth, (XtArgVal) G_depth,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftOffset, 1,
+ XmNrightOffset, 1,
+ XmNbottomOffset, 1,
+ XmNtopOffset, 0,
+ XmNcursorPositionVisible, False,
+ XmNautoShowCursorPosition, False,
+ XmNmarginWidth, 4,
+ XmNmarginHeight, 1,
+ XmNeditable, False,
+ XmNtraversalOn, False,
+ XmNvalue, g_string_savebuf,
+ NULL);
+
+ /* Block processing of most interactive events on this widget, except
+ * for button events that should navigate the page history.
+ */
+ XtInsertEventHandler(statusline,
+ KeyPressMask | KeyReleaseMask |
+ PointerMotionMask| PointerMotionHintMask |
+ ButtonMotionMask |
+#if !MOTIF
+ ButtonPressMask | ButtonReleaseMask |
+#endif
+ FocusChangeMask,
+ /* ButtonPressMask | ButtonReleaseMask | */
+ /* PointerMotionMask| PointerMotionHintMask | */
+ /* ButtonMotionMask | */
+ True, block_event_callback,
+ (XtPointer)0, 0);
+#if MOTIF
+ XtInsertEventHandler(statusline,
+ /* suboptimal, but needs to be release not press
+ * since we want to query the current cursor position,
+ * and that may not be set yet in the press event(?).
+ */
+ ButtonReleaseMask,
+ True, handle_statusline_event,
+ (XtPointer)g_string_savebuf, XtListTail);
+
+#endif /* MOTIF */
+
+#endif
+
+ return statusline;
+}
+
+
+void
+toggle_statusline(void)
+{
+#ifdef MOTIF
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0)
+ XtUnmanageChild(statusline);
+ else
+ XtManageChild(statusline);
+
+ set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
+#else
+ static Boolean initialized = False;
+ static Boolean statusline_mapped = False;
+
+ Boolean make_statusline_visible = False;
+ Boolean make_statusline_invisible = False;
+
+ if (!initialized) {
+ statusline_mapped = (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0;
+ initialized = True;
+ }
+
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) {
+ if (statusline_mapped)
+ make_statusline_invisible = True;
+ }
+ else {
+ if (!statusline_mapped)
+ make_statusline_visible = True;
+ }
+
+ if (make_statusline_invisible) {
+ XtDestroyWidget(statusline);
+ statusline_mapped = False;
+ }
+ if (make_statusline_visible) {
+ static Dimension window_w, window_h;
+
+ static Arg arg_wh[] = {
+ {XtNwidth, (XtArgVal) &window_w},
+ {XtNheight, (XtArgVal) &window_h},
+ };
+#ifdef MOTIF
+ XtGetValues(globals.widgets.main_window, arg_wh, XtNumber(arg_wh));
+#else
+ XtGetValues(globals.widgets.vport_widget, arg_wh, XtNumber(arg_wh));
+#endif
+ XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)True, NULL);
+ TRACE_GUI((stderr, "statusline: w %d, h %d", window_w, window_h));
+ XtVaSetValues(globals.widgets.vport_widget, XtNwidth, (XtArgVal)window_w, XtNheight, (XtArgVal)window_h, NULL);
+ TRACE_GUI((stderr, "after statusline"));
+ create_statusline();
+ statusline_mapped = True;
+ }
+#endif /* MOTIF */
+}
+
+
+/*------------------------------------------------------------
+ * handle_statusline_resize
+ *
+ * Arguments:
+ * void
+ *
+ * Returns:
+ * void
+ *
+ * Purpose:
+ * Resize the statusline when the total window size changes.
+ *
+ *------------------------------------------------------------*/
+
+void
+handle_statusline_resize(void)
+{
+#ifndef MOTIF
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) {
+ return;
+ }
+
+ if (!statusline)
+ return;
+
+ /* apparently the x,y values of a widget can only be set at creation time, so
+ * the following won't work:
+ */
+
+#if 0
+ /*
+ BROKEN Position vport_h, clip_x, clip_w;
+ BROKEN static Position my_h = 0;
+ BROKEN
+ BROKEN XtVaGetValues(globals.widgets.clip_widget,
+ BROKEN XtNx, &clip_x,
+ BROKEN XtNwidth, &clip_w,
+ BROKEN NULL);
+ BROKEN XtVaGetValues(globals.widgets.vport_widget,
+ BROKEN XtNheight, &vport_h,
+ BROKEN NULL);
+ BROKEN
+ BROKEN XtUnmanageChild(statusline);
+ BROKEN XtVaSetValues(statusline,
+ BROKEN XtNlabel, (XtArgVal) "",
+ BROKEN XtNwidth, clip_w,
+ BROKEN XtNx, clip_x - 1,
+ BROKEN XtNy, vport_h - my_h,
+ BROKEN XtNborderWidth, 1,
+ BROKEN XtNjustify, XtJustifyLeft,
+ BROKEN XtNborder, (XtArgVal) resource.fore_Pixel,
+ BROKEN NULL);
+ BROKEN XtManageChild(statusline);
+ BROKEN XFlush(DISP);
+ */
+#endif
+
+ /* only this will: */
+ XtDestroyWidget(statusline);
+ create_statusline();
+#endif
+}
+
+
+
+
+/*
+ * clear statusline by printing an empty message to it.
+ */
+
+
+static void
+clear_statusline(void)
+{
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) {
+# ifdef MOTIF
+ XmTextFieldSetString(statusline, " ");
+# else
+ XtVaSetValues(statusline, XtNlabel, " ", NULL);
+# endif
+ XFlush(DISP);
+ }
+ strcpy(g_string_savebuf, " ");
+}
+
+
+/* force a statusline update, no matter how busy the application is.
+ Use this with care (only for important messages).
+*/
+void
+force_statusline_update(void)
+{
+#ifdef MOTIF
+ XmUpdateDisplay(globals.widgets.top_level);
+#else
+ XEvent event;
+ XSync(DISP, False);
+ while (XCheckMaskEvent(DISP, ExposureMask, &event))
+ XtDispatchEvent(&event);
+#endif /* MOTIF */
+}
+
+
+/*
+ * timeout - if > 0, timeout in seconds after which the message will
+ * be deleted again. If < 0, message will remain (until
+ * another message overprints it)
+ * fmt - message, a C format string
+ *
+ * If expert mode is off, print <fmt> to the statusline; else, print
+ * <fmt> to stdout, unless the `hushstdout' option is specified.
+ */
+static XtIntervalId clear_timeout_id = 0;
+
+static void
+clear_statusline_timer_proc(XtPointer client_data, XtIntervalId *id)
+{
+ UNUSED(client_data);
+ UNUSED(id);
+
+ if (clear_timeout_id) {
+ clear_statusline();
+ clear_timeout_id = 0;
+ }
+}
+
+static void
+internal_print_statusline(Boolean error,
+ statusTimerT timeout,
+ const char *old_content,
+ const char *fmt,
+ va_list argp)
+{
+ if (!XtIsRealized(globals.widgets.top_level)
+ || !initialized
+ || (resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) {
+
+ /* only print errors to stdout */
+ if (!error)
+ return;
+
+ if (!resource.hush_stdout && strlen(fmt) > 0) { /* check for strlen since sometimes we clear the statusline
+ by printing "" to it, and we don't want that on stdout */
+ fprintf(stdout, "xdvi: ");
+ if (old_content != NULL)
+ (void)fputs(old_content, stdout);
+ (void)vfprintf(stdout, fmt, argp);
+ fputc('\n', stdout);
+ fflush(stdout);
+ }
+ }
+ else {
+ char buf[MAX_LEN + 1];
+ size_t offset = 0;
+
+ if (old_content != NULL && old_content[0] != '\0') {
+ offset += strlen(old_content);
+ strncpy(buf, old_content, MAX_LEN);
+ /* append separating space */
+ if (strlen(old_content) < MAX_LEN - 1) {
+ strcat(buf, " ");
+ offset++;
+ }
+ }
+ VSNPRINTF(buf + offset, MAX_LEN - offset, fmt, argp); /* just throw away strings longer than MAX_LEN */
+ buf[MAX_LEN] = '\0'; /* terminate buf */
+ /*
+ * save current contents of statusline so that toggling the statusline
+ * on and off will display the same text again
+ */
+ strcpy(g_string_savebuf, buf);
+#ifdef MOTIF
+ XmTextFieldSetString(statusline, buf);
+#else
+ XtVaSetValues(statusline, XtNlabel, buf, NULL);
+#endif
+ /* fprintf(stderr, "timeout: %d, id: %ld\n", timeout, clear_timeout_id); */
+ if (timeout > 0) {
+ timeout *= 1000; /* convert to miliseconds */
+
+ if (clear_timeout_id) {
+ /* fprintf(stderr, "clearing!\n"); */
+ if (globals.debug & DBG_EVENT)
+ fprintf(stderr, "%s:%d: removing timeout %ld\n", __FILE__, __LINE__, clear_timeout_id);
+ XtRemoveTimeOut(clear_timeout_id);
+ }
+ clear_timeout_id = XtAppAddTimeOut(globals.app, timeout,
+ clear_statusline_timer_proc, (XtPointer) NULL);
+ }
+ }
+}
+
+/*
+ * Append the varargs-string `fmt' to the currnent contents of the statusline
+ * erasing it after `timeout' seconds if timeout > 0, unless the current statusline
+ * contents matches pattern - in that case, overwrite the contents.
+ */
+void
+statusline_append(statusTimerT timeout, const char *pattern, const char *fmt, ...)
+{
+ const char *buf = NULL;
+ va_list argp;
+
+ if (XtIsRealized(globals.widgets.top_level) && initialized && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) {
+ /* get current statusline contents */
+#ifdef MOTIF
+ XtVaGetValues(statusline, XmNvalue, &buf, NULL);
+#else
+ XtVaGetValues(statusline, XtNlabel, &buf, NULL);
+#endif
+ }
+
+ while (buf != NULL && isspace((int)*buf)) /* skip spaces inserted by statusline appending */
+ buf++;
+ va_start(argp, fmt);
+
+ if (buf != NULL && memcmp(buf, pattern, strlen(pattern)) == 0) {
+ buf = NULL;
+ }
+ internal_print_statusline(false, timeout, buf, fmt, argp);
+ va_end(argp);
+}
+
+/*
+ * Print the varargs-string `fmt' to the currnent contents of the statusline,
+ * erasing it after `timeout' seconds if timeout > 0.
+ */
+
+void
+statusline_info(statusTimerT timeout, const char *fmt, ...)
+{
+ va_list argp;
+ va_start(argp, fmt);
+ /* for the time being, we don't differentiate between info/error
+ * wrt. printing to stdout/stderr. We could probably at some point
+ * remove the printing to stdout altogether (it's a bit un-GUIsh),
+ * but then there's already an option 'hushstdout' to suppress it ...
+ */
+ internal_print_statusline(True, timeout, NULL, fmt, argp);
+ va_end(argp);
+}
+
+void
+statusline_error(statusTimerT timeout, const char *fmt, ...)
+{
+ va_list argp;
+ va_start(argp, fmt);
+ internal_print_statusline(True, timeout, NULL, fmt, argp);
+ va_end(argp);
+}
+
+void
+statusline_clear(void)
+{
+ statusline_info(STATUS_SHORT, "");
+}
+
+/*
+ * Erase the contents of the statusline if it starts with 'pattern'.
+ */
+void
+statusline_erase(const char *pattern)
+{
+ const char *buf = NULL;
+ if (XtIsRealized(globals.widgets.top_level) && initialized && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) {
+ /* get current statusline contents */
+#ifdef MOTIF
+ XtVaGetValues(statusline, XmNvalue, &buf, NULL);
+#else
+ XtVaGetValues(statusline, XtNlabel, &buf, NULL);
+#endif
+
+ if (strncmp(buf, pattern, strlen(pattern)) == 0) {
+ statusline_clear();
+ }
+ }
+}
+
diff --git a/Build/source/texk/xdvik/gui/statusline.h b/Build/source/texk/xdvik/gui/statusline.h
new file mode 100644
index 00000000000..79cd65feb84
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/statusline.h
@@ -0,0 +1,56 @@
+#ifndef STATUSLINE_H_
+#define STATUSLINE_H_
+/*
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#define STAT_BUF_LEN 512
+
+
+/* statusline stuff. The following function and #defines are also
+ * needed when compiling without statusline support.
+ */
+typedef enum statusTimerT_ {
+ STATUS_FOREVER = 0,
+ STATUS_VERYSHORT = 1,
+ STATUS_SHORT = 5,
+ STATUS_MEDIUM = 10,
+ STATUS_LONG = 30
+} statusTimerT;
+
+extern int get_statusline_height(void);
+extern void statusline_clear(void);
+extern void statusline_erase(const char *pattern);
+extern void statusline_info(statusTimerT timeout, const char *fmt, ...);
+extern void statusline_error(statusTimerT timeout, const char *fmt, ...);
+extern void statusline_append(statusTimerT timeout, const char *pattern, const char *fmt, ...);
+#ifdef MOTIF
+extern Widget create_statusline(Widget parent);
+#else
+extern Widget create_statusline(void);
+#endif
+extern void handle_statusline_resize(void);
+
+extern void force_statusline_update(void);
+extern void toggle_statusline(void);
+
+#endif /* STATUSLINE_H_ */
diff --git a/Build/source/texk/xdvik/gui/topic-window.c b/Build/source/texk/xdvik/gui/topic-window.c
new file mode 100644
index 00000000000..6e987d2b0f6
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/topic-window.c
@@ -0,0 +1,650 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * `Topics' window framework used by help and preferences windows.
+ * Contains a list of topics on the left-hand side, and corresponding
+ * contents on the right-hand side.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#if MOTIF
+# include <Xm/Xm.h>
+# include <Xm/Form.h>
+# include <Xm/DialogS.h>
+# include <Xm/PushB.h>
+# include <Xm/Frame.h>
+# include <Xm/PanedW.h>
+# include <Xm/LabelG.h>
+# include <Xm/Label.h>
+# include <Xm/Protocols.h>
+# include <Xm/List.h>
+# include <Xm/AtomMgr.h>
+#else /* MOTIF */
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Cardinals.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/List.h>
+#endif /* MOTIF */
+
+#include "version.h"
+#include "topic-window.h"
+#include "string-utils.h"
+#include "util.h"
+#include "x_util.h"
+
+#if MOTIF
+
+/* special formatting for headings in right window, if desired */
+const char *const TAG_NORMAL = "NORMAL";
+const char *const TAG_TOPIC_HEADING = "TOPIC_HEADING";
+const char *const TAG_TOPIC_LABEL = "TOPIC_LABEL";
+
+# define SHELL_WIDGET_CLASS xmDialogShellWidgetClass
+# define PANED_WIDGET_CLASS xmPanedWindowWidgetClass
+# define FORM_WIDGET_CLASS xmFormWidgetClass
+
+# define FORM_ARGS XmNhorizontalSpacing, 10, \
+ NULL
+# define HELP_SHELL_ARGS XmNdeleteResponse, XmDO_NOTHING, \
+ XtNmappedWhenManaged, False, \
+ NULL
+# define HELP_PANED_ARGS XmNsashWidth, 1, \
+ XmNuserData, info, \
+ XmNsashHeight, 1, \
+ NULL
+# define LEFT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \
+ XmNleftAttachment, XmATTACH_FORM, \
+ XmNbottomAttachment, XmATTACH_FORM, \
+ XmNtopOffset, 9, \
+ XmNbottomOffset, 10, \
+ NULL
+# define RIGHT_FORM_ARGS XmNtopAttachment, XmATTACH_FORM, \
+ XmNleftAttachment, XmATTACH_WIDGET, \
+ XmNleftWidget, left_form, \
+ XmNrightAttachment, XmATTACH_FORM, \
+ XmNbottomAttachment, XmATTACH_FORM, \
+ XmNbottomOffset, 10, \
+ NULL
+# define ACTION_AREA_ARGS NULL
+
+#else /* MOTIF */
+
+# define SHELL_WIDGET_CLASS transientShellWidgetClass
+# define PANED_WIDGET_CLASS panedWidgetClass
+# define FORM_WIDGET_CLASS formWidgetClass
+
+# define FORM_ARGS XtNdefaultDistance, 14, \
+ NULL
+# define HELP_SHELL_ARGS XtNx, 60, \
+ XtNy, 80, \
+ XtNtransientFor, globals.widgets.top_level, \
+ XtNtranslations, xlats, \
+ XtNtransientFor, parent, \
+ XtNallowShellResize, False, \
+ NULL
+# define HELP_PANED_ARGS NULL
+# define LEFT_FORM_ARGS XtNtop, XtChainTop, \
+ XtNbottom, XtChainBottom, \
+ XtNleft, XtChainLeft, \
+ XtNright, XtChainLeft, \
+ XtNborderWidth, 0, \
+ NULL
+# define RIGHT_FORM_ARGS XtNfromHoriz, left_form, \
+ XtNtop, XtChainTop, \
+ XtNbottom, XtChainBottom, \
+ XtNleft, XtChainLeft, \
+ XtNright, XtChainRight, \
+ XtNborderWidth, 0, \
+ NULL
+# define ACTION_AREA_ARGS XtNdefaultDistance, 6, \
+ XtNshowGrip, False, \
+ XtNskipAdjust, True, \
+ NULL
+#endif /* MOTIF */
+
+
+static void
+ok_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ ASSERT(info != NULL, "No info passed to callback!");
+
+ if (info->ok_callback != NULL)
+ info->ok_callback(info);
+ XtPopdown(info->shell);
+}
+
+static void
+cancel_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ ASSERT(info != NULL, "No info passed to callback!");
+
+ if (info->cancel_callback != NULL)
+ info->cancel_callback(info);
+ XtPopdown(info->shell);
+}
+
+#if MOTIF
+/*
+ * We are overriding this since otherwise the Text widget would attempt to
+ * first move the invisible cursor instead of the scroll bars.
+ */
+/* FIXME: This gives a warning:
+ Warning: Actions not found: scroll-one-line-down, scroll-one-line-up
+*/
+/* "<Key>osfUp: scroll-one-line-down()\n" */
+/* "<Key>osfDown: scroll-one-line-up()\n" */
+#endif
+
+#if MOTIF
+static XmString
+#else
+static char *
+#endif
+create_label_string(const char *title, const char *subtitle)
+{
+#if MOTIF
+ XmString label;
+ if (subtitle == NULL) { /* simple bold label */
+ label = XmStringCreate((char *)title, (char *)TAG_TOPIC_LABEL);
+ }
+ else { /* two-part title with subheading */
+ XmString s1, s2, s3, s4;
+ s1 = XmStringCreate((char *)title, (char *)TAG_TOPIC_HEADING);
+ s2 = XmStringCreate((char *)" ", (char *)TAG_NORMAL);
+ s3 = XmStringCreate((char *)subtitle, (char *)TAG_NORMAL);
+ s4 = XmStringConcat(s1, s2);
+ label = XmStringConcat(s4, s3);
+ XmStringFree(s1);
+ XmStringFree(s2);
+ XmStringFree(s3);
+ XmStringFree(s4);
+ }
+#else
+ char *label = xstrdup(title);
+ if (subtitle != NULL && strlen(subtitle) > 0) {
+ label = xstrcat(label, " - ");
+ label = xstrcat(label, subtitle);
+ }
+#endif
+ return label;
+}
+
+static Widget
+create_label_widget(Widget parent, const char *name, struct topic_info *info)
+{
+ Widget label;
+
+#if MOTIF
+
+ XmString label_string = create_label_string(info->items[0].topic, info->items[0].title);
+ label = XtVaCreateWidget(name, xmLabelWidgetClass, parent,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNtopOffset, 14,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNlabelString, label_string,
+ XmNalignment, XmALIGNMENT_BEGINNING,
+ NULL);
+ XmStringFree(label_string);
+
+#else /* MOTIF */
+
+ char *label_string = create_label_string(info->items[0].topic, info->items[0].title);
+ label = XtVaCreateWidget(name, labelWidgetClass, parent,
+ XtNlabel, label_string,
+ XtNborderWidth, 0,
+ /* XtNinternalHeight, 2, */
+ XtNjustify, XtJustifyLeft,
+ NULL);
+ free(label_string);
+
+#endif /* MOTIF */
+
+ return label;
+}
+
+void
+select_topic(struct topic_info *info, size_t idx)
+{
+#if MOTIF
+ XmString label;
+#else
+ char *label;
+#endif
+
+ /* change the heading in right window */
+ label = create_label_string(info->items[idx].topic, info->items[idx].title);
+ XtVaSetValues(info->topic_label,
+#if MOTIF
+ XmNlabelString,
+#else
+ XtNlabel,
+#endif
+ label, NULL);
+
+#if MOTIF
+ XmStringFree(label);
+ XmListSelectPos(info->topics_list, idx + 1, False);
+#else
+ free(label);
+ XawListHighlight(info->topics_list, idx);
+#endif
+
+ if (info->curr_selected != 0) {
+ XtUnmanageChild(info->curr_selected);
+ }
+ else {
+ /* Note: doesn't matter if not managed yet */
+ /* XtUnmanageChild(info->items[0].widget); */
+ }
+
+ XtManageChild(info->items[idx].widget);
+ info->curr_selected = info->items[idx].widget;
+
+#if MOTIF
+ XmUpdateDisplay(info->shell);
+#endif
+}
+
+static void
+select_topic_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ size_t idx;
+
+#if MOTIF
+ idx = ((XmListCallbackStruct *)call_data)->item_position - 1;
+#else
+ idx = ((XawListReturnStruct *)call_data)->list_index;
+#endif
+ UNUSED(w);
+
+ /* ASSERT(idx < info->items_size, "list position exceeds items_size!"); */
+
+ select_topic(info, idx);
+}
+
+static Widget
+create_button(Widget parent, const char *name, Boolean show_as_default, Boolean left_position)
+{
+ Widget button;
+#if MOTIF
+ XmString s1 = XmStringCreateLocalized((char *)name);
+ button = XtVaCreateWidget(name, xmPushButtonWidgetClass, parent,
+ XmNlabelString, s1,
+ XmNdefaultButtonShadowThickness, 1,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNmarginWidth, 6,
+ XmNmarginHeight, 4,
+ XmNtopOffset, 10,
+ XmNbottomOffset, 10,
+ NULL);
+ if (left_position)
+ XtVaSetValues(button,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 10,
+ NULL);
+ else
+ XtVaSetValues(button,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNrightOffset, 10,
+ NULL);
+ if (show_as_default)
+ XtVaSetValues(button, XmNshowAsDefault, True, NULL);
+
+ XtManageChild(button);
+ XmStringFree(s1);
+#else /* MOTIF */
+ UNUSED(show_as_default);
+ button = XtVaCreateManagedWidget(name, commandWidgetClass, parent,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ NULL);
+ if (left_position)
+ XtVaSetValues(button,
+ XtNleft, XtChainLeft,
+ XtNright, XtChainLeft,
+ NULL);
+ else
+ XtVaSetValues(button,
+ XtNleft, XtChainRight,
+ XtNright, XtChainRight,
+ NULL);
+#endif /* MOTIF */
+ return button;
+}
+
+static void
+close_topic_window(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ Widget button;
+ void *ptr;
+ struct topic_info *info;
+
+ UNUSED(w);
+ UNUSED(event);
+
+ if (*num_params < 1) {
+ XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params));
+ return;
+ }
+
+ sscanf(*params, "%p", &ptr);
+ info = (struct topic_info *)ptr;
+
+ /* get a callback to close the button, in decreasing order of preference */
+ if (get_widget_by_name(&button, info->shell, "Cancel", False)
+ || get_widget_by_name(&button, info->shell, "Close", False)
+ || get_widget_by_name(&button, info->shell, "OK", False)) {
+ XtCallCallbacks(button,
+#if MOTIF
+ XmNactivateCallback,
+#else
+ XtNcallback,
+#endif
+ info);
+ }
+ else {
+ XDVI_WARNING((stderr, "No button found for widget %p!\n", (void *)info->shell));
+ }
+}
+
+static XtActionsRec popdown_actions[] = {
+#if !MOTIF
+ { "WM_popdown", close_topic_window },
+#endif
+ { "close-topic-window", close_topic_window },
+};
+
+static Widget
+create_list_widget(Widget parent, const char *w_name, struct topic_info *info)
+{
+ Widget list;
+ size_t tnum;
+#if MOTIF
+ XmString *topics = NULL;
+#else
+ static char **topics = NULL;
+#endif
+
+ for (tnum = 0; info->items[tnum].topic != NULL; tnum++) {
+ /* 1 more for terminating NULL needed for Xaw */
+ topics = xrealloc(topics, (tnum + 2) * sizeof *topics);
+#if MOTIF
+ topics[tnum] = XmStringCreateLocalized(info->items[tnum].topic);
+#else
+ topics[tnum] = xstrdup(info->items[tnum].topic);
+#endif
+ }
+
+#ifndef MOTIF
+ /* list needs to be terminated for Xaw */
+ topics[tnum] = NULL;
+#endif
+
+#if MOTIF
+ {
+ size_t i;
+ Arg args[20];
+ int n = 0;
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNlistSpacing, 4); n++;
+ XtSetArg(args[n], XmNlistMarginHeight, 4); n++;
+ XtSetArg(args[n], XmNlistMarginWidth, 4); n++;
+ XtSetArg(args[n], XmNhighlightThickness, 0); n++;
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+
+ list = XmCreateScrolledList(parent, (char *)w_name, args, n);
+
+#if defined(__GNUC__) && DEVEL_MODE
+#warning TODO: make up/down scroll the list, and PgUp/PgDown scroll help text
+#warning TODO: add wheel mouse bindings
+ /*
+ * also fix bug with arrow keys first moving invisible cursor, then scrollbars
+ */
+#endif
+
+ XmListDeleteAllItems(list);
+ XmListAddItems(list, topics, tnum, 0);
+
+ for (i = 0; i < tnum; ++i) {
+ XmStringFree(topics[i]);
+ }
+ free(topics);
+ }
+ XtAddCallback(list, XmNbrowseSelectionCallback, select_topic_cb, info);
+ XmListSelectPos(list, 1, False); /* default position */
+#else /* MOTIF */
+ list = XtVaCreateWidget(w_name, listWidgetClass, parent,
+ XtNlist, topics,
+ XtNdefaultColumns, 1,
+ XtNforceColumns, True,
+ XtNverticalList, True,
+ XtNrowSpacing, 4,
+ XtNheight, 429,
+ NULL);
+ XtAddCallback(list, XtNcallback, select_topic_cb, info);
+ XawListHighlight(list, 0); /* default position */
+#endif /* MOTIF */
+ XtManageChild(list);
+ return list;
+}
+
+
+Widget
+create_topic_window(Widget parent,
+ const char *window_title,
+ const char *widget_name,
+ struct topic_info *info,
+ void (*init_items_func)(struct topic_info *info),
+ /* OK button/callbacks */
+ const char *ok_label,
+ /* Cancel button/callbacks (can be NULL) */
+ const char *cancel_label)
+{
+ Widget topic_window, topics_list, topic_label;
+ Widget pane, form, left_form, right_container_form, right_form;
+ Widget action_area, ok_button, cancel_button;
+ XtTranslations xlats;
+
+ XtAppContext app = NULL;
+ Atom WM_DELETE_WINDOW;
+
+ char *translation_str;
+ size_t i;
+
+#if !MOTIF
+ translation_str = get_string_va("<Message>WM_PROTOCOLS: WM_popdown(%p)", info);
+ xlats = XtParseTranslationTable(translation_str);
+ free(translation_str);
+#endif
+
+ topic_window = XtVaCreatePopupShell(widget_name, SHELL_WIDGET_CLASS,
+ parent,
+ XtNtitle, window_title,
+ HELP_SHELL_ARGS);
+
+#if MOTIF
+ /* make the window manager destroy action pop down the window */
+ WM_DELETE_WINDOW = XmInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False);
+ XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info);
+#else
+ WM_DELETE_WINDOW = XInternAtom(XtDisplay(topic_window), "WM_DELETE_WINDOW", False);
+#endif
+ app = XtWidgetToApplicationContext(topic_window);
+ XtAppAddActions(app, popdown_actions, XtNumber(popdown_actions));
+
+ pane = XtVaCreateWidget("topic_pane", PANED_WIDGET_CLASS, topic_window, HELP_PANED_ARGS);
+
+ form = XtVaCreateWidget("form", FORM_WIDGET_CLASS, pane, FORM_ARGS);
+
+ /* left pane for topics selection */
+ left_form = XtVaCreateWidget("left_form", FORM_WIDGET_CLASS, form, LEFT_FORM_ARGS);
+
+ /* right form for topics display */
+ right_container_form = XtVaCreateWidget("right_container_form", FORM_WIDGET_CLASS, form, RIGHT_FORM_ARGS);
+
+ /*
+ Initialize the topic label and title string with dummy values - the real values
+ are only known inside init_items_func(). For Xaw, the size of the widget will be
+ adjusted below (for Motif it's always the full width of the right form, which is
+ what we want).
+ */
+ /* FIXME: Motif label is still chopped off if it's longer than right form -
+ work around by putting longest possible lable here ... */
+ /* Also, not all children will be sized correctly, e.g. the colors - work around
+ by specifying a rather large dummy text ... */
+ info->items[0].topic = "text text text";
+ info->items[0].title = "text text text text text text text text text text text text text text text text text";
+ topic_label = create_label_widget(right_container_form, "topic_label", info);
+ info->topic_label = topic_label;
+
+ right_form = XtVaCreateWidget("right_form", FORM_WIDGET_CLASS,
+ right_container_form,
+#if MOTIF
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, topic_label,
+ XmNtopOffset, 10,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+#else
+ XtNborderWidth, 0,
+ XtNfromVert, topic_label,
+ XtNvertDistance, 6,
+#endif /* MOTIF */
+ NULL);
+ info->right_form = right_form;
+
+ /*
+ Call the init_items_func callback. This will populate the info->items list
+ with the appropriate info, and create the forms (info->items[i].widget)
+ which are the children of right_form (which is accessed inside init_items_func()
+ through info->right_form), and all their subchildren.
+
+ It is important that every child form is already managed inside init_items_func
+ so that the total size of the preferences window is set to the maximum size of
+ the children. (The children will be unmanaged again below). All these widgets
+ are never destroyed, and are managed by demand via the list selection callback
+ (select_topic_cb).
+ */
+ init_items_func(info);
+
+ XtManageChild(topic_label);
+
+ topics_list = create_list_widget(left_form, "topics_list", info);
+ info->topics_list = topics_list;
+
+ translation_str = get_string_va("#override \n"
+ "<Key>q:close-topic-window(%p)\n"
+#ifdef MOTIF
+ "<Key>osfCancel:close-topic-window(%p)\n"
+#else
+ "<Key>Escape:close-topic-window(%p)\n"
+#endif
+ "<Key>Return:close-topic-window(%p)",
+ info, info, info);
+ xlats = XtParseTranslationTable(translation_str);
+ free(translation_str);
+ translation_str = NULL;
+
+ XtOverrideTranslations(pane, xlats);
+ XtOverrideTranslations(topics_list, xlats);
+
+ XtManageChild(left_form);
+
+ XtManageChild(right_form);
+ XtManageChild(right_container_form);
+
+ /* action area at bottom */
+ action_area = XtVaCreateWidget("action_area", FORM_WIDGET_CLASS, pane, ACTION_AREA_ARGS);
+
+ ok_button = create_button(action_area, ok_label, True, True);
+ XtOverrideTranslations(ok_button, xlats);
+
+ if (cancel_label != NULL) {
+ cancel_button = create_button(action_area, cancel_label, False, False);
+ adjust_width(ok_button, cancel_button);
+#if MOTIF
+ XtAddCallback(cancel_button, XmNactivateCallback, cancel_cb, info);
+#else
+ XtAddCallback(cancel_button, XtNcallback, cancel_cb, info);
+#endif
+ XtOverrideTranslations(cancel_button, xlats);
+ }
+
+ XtManageChild(action_area);
+
+ XtManageChild(form);
+
+ XtManageChild(pane);
+
+ XtRealizeWidget(topic_window);
+
+ /* Now unmanage all children of right_form, as described above. */
+ for (i = 0; info->items[i].topic != NULL; i++) {
+ XtUnmanageChild(info->items[i].widget);
+ }
+ info->curr_selected = 0;
+
+#if MOTIF
+ /* enable OK button */
+ XmProcessTraversal(ok_button, XmTRAVERSE_CURRENT);
+ XtOverrideTranslations(ok_button,
+ XtParseTranslationTable("<Key>Return:ArmAndActivate()\n"
+ "<Key>q:ArmAndActivate()"));
+ XtAddCallback(ok_button, XmNactivateCallback, ok_cb, info);
+ XmAddWMProtocolCallback(topic_window, WM_DELETE_WINDOW, cancel_cb, info);
+ { /* disable resizing of lower part of pane (and button) */
+ Dimension h;
+ XtVaGetValues(ok_button, XmNheight, &h, NULL);
+ XtVaSetValues(action_area,
+ XmNpaneMaximum, h + 20,
+ XmNpaneMinimum, h + 20,
+ NULL);
+ }
+#else
+ XSetWMProtocols(XtDisplay(topic_window), XtWindow(topic_window), &WM_DELETE_WINDOW, 1);
+ XtAddCallback(ok_button, XtNcallback, ok_cb, info);
+#endif
+ return topic_window;
+}
diff --git a/Build/source/texk/xdvik/gui/topic-window.h b/Build/source/texk/xdvik/gui/topic-window.h
new file mode 100644
index 00000000000..a7166b029a8
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/topic-window.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef TOPIC_WINDOW_H_
+#define TOPIC_WINDOW_H_
+
+#include "xdvi.h"
+#include "version.h"
+
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+struct topic_info; /* forward declaration */
+
+struct topic_item {
+ /* topic name */
+ char *topic;
+ /* longer title of topic, displayed as heading in the right window */
+ char *title;
+ /* the widget (subwindow of the right window) associated with the topic */
+ Widget widget;
+};
+
+struct topic_info {
+ /* the toplevel shell */
+ Widget shell;
+ /* the topics list */
+ Widget topics_list;
+ /* the right form, parent of the dummy form which
+ contains the right topic-specific window */
+ Widget right_form;
+ /* the topic label in right window */
+ Widget topic_label;
+ /* the currently selected widget */
+ Widget curr_selected;
+ /* callbacks for OK button (may be NULL); it's invoked from within
+ the `real' widget callback and is passed a pointer to this(!) struct topic_info */
+ void (*ok_callback)(XtPointer arg);
+ /* like ok_callback, for the Cancel button */
+ void (*cancel_callback)(XtPointer arg);
+ /* list of topic_items */
+ struct topic_item *items;
+ size_t items_size;
+ /* additional data the callback may need ... */
+ void *data;
+};
+
+extern Widget create_topic_window(Widget parent,
+ const char *window_title,
+ const char *widget_name,
+ struct topic_info *info,
+ void (*init_items_func)(struct topic_info *info),
+ /* OK button label (can be NULL) */
+ const char *ok_label,
+ /* Cancel button label (can be NULL) */
+ const char *cancel_label);
+extern void select_topic(struct topic_info *info, size_t idx);
+#endif /* TOPIC_WINDOW_H_ */
diff --git a/Build/source/texk/xdvik/gui/xaw_bitmaps.c b/Build/source/texk/xdvik/gui/xaw_bitmaps.c
new file mode 100644
index 00000000000..4222f9dfe13
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xaw_bitmaps.c
@@ -0,0 +1,82 @@
+#include "xaw_bitmaps.h"
+
+/*
+ * Bitmaps for indicating checkbuttons and radiobuttons in Xaw popup windows.
+ * The size of these is 16x16.
+ */
+
+/* checkbuttons: rectangular box containing a tick mark if on, empty box else */
+unsigned char button_check_on_bits[] = {
+ 0x00, 0x00, 0x00, 0x80, 0xfc, 0xff, 0x04, 0x60, 0x04, 0x30, 0x04, 0x38,
+ 0x64, 0x2c, 0xe4, 0x26, 0xc4, 0x23, 0x84, 0x21, 0x04, 0x20, 0x04, 0x20,
+ 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00
+};
+unsigned char button_check_off_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20,
+ 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20,
+ 0x04, 0x20, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00
+};
+
+/* radiobuttons: round and filled with dot if on, empty else */
+unsigned char button_radio_on_bits[] = {
+ /* 0x70, 0x00, 0x8c, 0x01, 0x02, 0x02, 0x72, 0x02, 0xf9, 0x04, 0xf9, 0x04, */
+ /* 0xf9, 0x04, 0x72, 0x02, 0x02, 0x02, 0x8c, 0x01, 0x70, 0x00 */
+ 0x00,0x00,0x00,0x00,0xc0,0x03,0x30,0x0c,0x08,0x10,0xc8,0x13,0xe4,0x27,0xe4,
+ 0x27,0xe4,0x27,0xe4,0x27,0xc8,0x13,0x08,0x10,0x30,0x0c,0xc0,0x03,0x00,0x00,
+ 0x00,0x00
+};
+unsigned char button_radio_off_bits[] = {
+ /* 0x70, 0x00, 0x8c, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x04, 0x01, 0x04, */
+ /* 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x8c, 0x01, 0x70, 0x00 */
+ 0x00,0x00,0x00,0x00,0xc0,0x03,0x30,0x0c,0x08,0x10,0x08,0x10,0x04,0x20,0x04,
+ 0x20,0x04,0x20,0x04,0x20,0x08,0x10,0x08,0x10,0x30,0x0c,0xc0,0x03,0x00,0x00,
+ 0x00,0x00
+};
+
+/*
+ * Bitmaps for left-hand markers in Xaw pulldown menus; these only
+ * use the mark elements from the button markers (dot, or tick).
+ */
+
+/* check options: similar to button_check_*_bits. */
+unsigned char menu_check_on_bits[] = {
+ 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, 0xc6, 0x00, 0x6e, 0x00,
+ 0x3c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned char menu_check_off_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* radio options: tick mark if on, else empty. These are different from
+ the `round' buttons in button_radio_* (not ideal ...) since the round
+ buttons are too large for menus.
+*/
+unsigned char menu_radio_on_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xf8, 0x00, 0xf8, 0x00,
+ 0xf8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned char menu_radio_off_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/* arrow for Xaw submenus */
+unsigned char menu_arrow_bits[] = {
+ /* 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, 0x00, */
+ /* 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00 */
+
+ 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0xe0, 0x00, 0xe0, 0x01, 0xe0, 0x03,
+ 0xe0, 0x01, 0xe0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00
+ /* 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, */
+ /* 0x00, 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00 */
+ /* 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00 */
+};
+
+
+/* double arrow for popup menus */
+unsigned char menu_double_arrow_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0xf8, 0x00,
+ 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x70, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/Build/source/texk/xdvik/gui/xaw_bitmaps.h b/Build/source/texk/xdvik/gui/xaw_bitmaps.h
new file mode 100644
index 00000000000..21daf9e2bea
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xaw_bitmaps.h
@@ -0,0 +1,21 @@
+#define BUTTON_BITMAP_H 16
+#define BUTTON_BITMAP_W 16
+extern unsigned char button_check_on_bits[];
+extern unsigned char button_check_off_bits[];
+extern unsigned char button_radio_on_bits[];
+extern unsigned char button_radio_off_bits[];
+
+#define MENU_BITMAP_H 11
+#define MENU_BITMAP_W 11
+extern unsigned char menu_check_on_bits[];
+extern unsigned char menu_check_off_bits[];
+extern unsigned char menu_radio_on_bits[];
+extern unsigned char menu_radio_off_bits[];
+
+#define MENU_ARROW_H 11
+#define MENU_ARROW_W 11
+extern unsigned char menu_arrow_bits[];
+
+#define MENU_DOUBLE_ARROW_H 16
+#define MENU_DOUBLE_ARROW_W 11
+extern unsigned char menu_double_arrow_bits[];
diff --git a/Build/source/texk/xdvik/gui/xaw_menu.c b/Build/source/texk/xdvik/gui/xaw_menu.c
new file mode 100644
index 00000000000..cc3e8bcad95
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xaw_menu.c
@@ -0,0 +1,823 @@
+/*
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Menu bar implementation for the Athena widget set.
+ */
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "c-openmx.h"
+#include "events.h"
+#include "dvi-draw.h"
+#include "dvi-init.h"
+#include "statusline.h"
+#include "pagesel.h"
+#include "util.h"
+#include "x_util.h"
+#include "xaw_menu.h"
+#include "message-window.h"
+#include "my-snprintf.h"
+#include "filehist.h"
+#include "menu.h"
+
+#ifndef MOTIF /* entire file */
+
+#include <ctype.h>
+
+#include <X11/Intrinsic.h>
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h> /* needed for def. of XtNiconX */
+
+#include <X11/Xaw/Viewport.h>
+#include <X11/Xaw/SimpleMenu.h>
+#include <X11/Xaw/MenuButton.h>
+#include <X11/Xaw/Sme.h>
+#include <X11/Xaw/SmeBSB.h>
+#include <X11/Xaw/SmeLine.h>
+#include <X11/Xaw/Dialog.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/Panner.h>
+#include <X11/Xaw/Porthole.h>
+#include <X11/Xaw/Command.h>
+
+#ifndef MAX
+# define MAX(i, j) ( (i) > (j) ? (i) : (j) )
+#endif
+
+
+static Widget line_widget, panel_widget;
+
+/* width of button panel */
+static int m_panel_width = 0;
+
+/* used for communication with the pagelist in xaw_create_pagelist */
+static int m_y_pos;
+
+
+/* access method for panel width */
+int
+get_panel_width(void)
+{
+ /* int retval = 0; */
+ /* if (resource.expert_mode & XPRT_SHOW_BUTTONS) */
+ /* retval = m_panel_width; */
+ /* TRACE_GUI((stderr, "get_panel_width: %d", retval)); */
+ /* return retval; */
+ return m_panel_width;
+}
+
+/*
+ ================================================================================
+ Pixmaps indicating the state of menu buttons (radiobutton/checkbox
+ on/off, cascading menu). Inspired by menu.c, `check_bits' in the xterm source.
+ ================================================================================
+*/
+#include "xaw_bitmaps.h"
+static Pixmap menu_check_on_bitmap;
+static Pixmap menu_check_off_bitmap;
+static Pixmap menu_radio_on_bitmap;
+static Pixmap menu_radio_off_bitmap;
+static Pixmap menu_arrow_bitmap;
+
+/*
+ ============================================================
+ Hack for pullright menus part I: data
+ ============================================================
+*/
+
+/* There are a few custom widgets for pullright menus out there, but
+ * these are old and potentially buggy, so just do it manually via an
+ * event handler, similar to Motif tooltips.
+ */
+static XtIntervalId m_timeout = 0;
+static Widget m_active_submenu = NULL; /* if not NULL, the currently active pullright */
+static Widget m_submenu = NULL; /* parent of the currently active pullright
+ (i.e. the menu label in the parent window) */
+
+static void ActPopdownSubmenus(Widget w, XEvent *event, String *params, Cardinal *num_params);
+
+/* to safely pop down the pullright, this callback is added to its parent menu */
+static XtActionsRec menu_actions[] = {
+ { "popdown-submenus", ActPopdownSubmenus }
+};
+
+struct pullright_position_info {
+ Position y;
+ Dimension w;
+ Dimension h;
+ Dimension border_width;
+ Widget menu;
+};
+
+
+/*
+ * Set all pixmaps indicating the state of the wigdet pointed to by `elems'.
+ */
+void
+xaw_set_button_state(struct button_elems *elems, Boolean on)
+{
+ static Arg args[] = {
+ { XtNleftBitmap, (XtArgVal)0 },
+ { XtNrightBitmap, (XtArgVal)0 }
+ };
+
+ if (elems->type == BT_CHECK)
+ args[0].value = on ? menu_check_on_bitmap : menu_check_off_bitmap;
+ else if (elems->type == BT_RADIO)
+ args[0].value = on ? menu_radio_on_bitmap : menu_radio_off_bitmap;
+ if (elems->submenu != NULL)
+ args[1].value = menu_arrow_bitmap;
+
+ XtSetValues(elems->widget, args, XtNumber(args));
+}
+
+/*
+ * Initialize the bitmaps.
+ */
+void
+xaw_initialize_menu_bitmaps(void)
+{
+ static Boolean initialized = False;
+ if (!initialized) {
+ initialized = True;
+ menu_check_on_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_check_on_bits, MENU_BITMAP_W, MENU_BITMAP_H);
+ menu_check_off_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_check_off_bits, MENU_BITMAP_W, MENU_BITMAP_H);
+ menu_radio_on_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_radio_on_bits, MENU_BITMAP_W, MENU_BITMAP_H);
+ menu_radio_off_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_radio_off_bits, MENU_BITMAP_W, MENU_BITMAP_H);
+ menu_arrow_bitmap
+ = XCreateBitmapFromData(XtDisplay(globals.widgets.top_level),
+ RootWindowOfScreen(XtScreen(globals.widgets.top_level)),
+ (char *)menu_arrow_bits, MENU_ARROW_W, MENU_ARROW_H);
+ }
+}
+
+
+void
+xaw_create_pagelist(void)
+{
+ Dimension height, width;
+
+ XtVaGetValues(globals.widgets.clip_widget, XtNheight, &height, NULL);
+ XtVaGetValues(panel_widget, XtNwidth, &width, NULL);
+
+ width = MAX(width - 2 * (resource.btn_side_spacing + resource.btn_border_width),
+ xaw_get_pagelist_size());
+ height -= resource.btn_top_spacing + resource.btn_border_width + m_y_pos;
+ xaw_create_pagelist_widgets(height, width, m_y_pos, panel_widget);
+}
+
+
+static XtCallbackRec command_call[] = {
+ {handle_command, NULL},
+ {NULL, NULL},
+};
+
+#ifdef USE_PANNER
+void
+scroll_x_panner(int x)
+{
+ static int old_x = 0;
+ if (panner != 0 && ABS(x - old_x) > 8) {
+ XtVaSetValues(panner, XtNsliderX, x, NULL);
+ old_x = x;
+ }
+}
+
+void
+scroll_y_panner(int y)
+{
+ static int old_y = 0;
+ if (panner != 0 && ABS(y - old_y) > 8) {
+ XtVaSetValues(panner, XtNsliderY, y, NULL);
+ old_y = y;
+ }
+}
+
+static void
+panner_cb(Widget widget, XtPointer closure, XtPointer report_ptr)
+{
+ XawPannerReport *report = (XawPannerReport *)report_ptr;
+ static int orig_x = 0, orig_y = 0;
+ int x = report->slider_x;
+ int y = report->slider_y;
+ static Dimension w, h;
+ static Arg arg_wh_clip[] = {
+ {XtNwidth, (XtArgVal) &w},
+ {XtNheight, (XtArgVal) &h},
+ };
+
+ UNUSED(closure);
+
+ XtGetValues(globals.widgets.clip_widget, arg_wh_clip, XtNumber(arg_wh_clip));
+
+ fprintf(stderr, "w: %d, h: %d, globals.page.w: %d, globals.page.h: %d\n",
+ w, h, globals.page.w, globals.page.h);
+ XtVaSetValues(widget,
+ XtNsliderWidth, w, XtNsliderHeight, h,
+ XtNcanvasWidth, globals.page.w, XtNcanvasHeight, globals.page.h,
+ NULL);
+
+ fprintf(stderr, "panner moved: %d, %d\n", report->slider_x, report->slider_y);
+ if (globals.widgets.x_bar != NULL)
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(x - orig_x));
+ if (globals.widgets.y_bar != NULL)
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(y - orig_y));
+ orig_x = x;
+ orig_y = y;
+}
+#endif /* USE_PANNER */
+
+
+static void
+create_menu_entries(struct button_info *item, Widget parent)
+{
+ size_t i;
+
+ /* add our own popdown-submenus() action to the default translations of this menu */
+ XtAccelerators menu_accels = XtParseAcceleratorTable("<BtnUp>:MenuPopdown()notify()unhighlight()popdown-submenus()");
+
+ for (i = 0; item != NULL && i < item->size; i++) {
+ Widget w;
+
+ if (item->elems[i].submenu != NULL) { /* another submenu */
+ XDVI_ERROR((stderr, "Xaw menus don't support nested pulldown menus (ignoring)"));
+ continue;
+ }
+
+ if (item->elems[i].type == BT_SEP) { /* separator */
+ w = XtCreateManagedWidget(item->elems[i].title, smeLineObjectClass, parent, NULL, 0);
+ }
+ else if (item->elems[i].action != NULL && item->elems[i].action->proc == Act_recent_files) {
+ /* special case: submenu with recent files */
+ w = XtVaCreateManagedWidget(item->elems[i].title, smeBSBObjectClass, parent,
+ XtNlabel, item->elems[i].title,
+ XtNleftMargin, 20,
+ XtNrightMargin, 16,
+ XtNrightBitmap, menu_arrow_bitmap,
+ NULL);
+ m_submenu = w;
+ XtOverrideTranslations(parent, menu_accels);
+ }
+ else { /* normal menu entry */
+ w = XtVaCreateManagedWidget(item->elems[i].title, smeBSBObjectClass, parent,
+ XtNlabel, item->elems[i].title,
+ XtNleftMargin, 20,
+ NULL);
+ XtAddCallback(w, XtNcallback, handle_command, item->elems[i].action);
+ }
+ item->elems[i].widget = w;
+ }
+}
+
+void
+xaw_create_menu(struct button_info *item, Widget parent, int *ret_width)
+{
+ Dimension y_pos = resource.btn_top_spacing;
+ size_t i;
+
+ XtAppAddActions(XtWidgetToApplicationContext(globals.widgets.form_widget), menu_actions, XtNumber(menu_actions));
+
+ for (i = 0; item != NULL && i < item->size; i++) {
+ Widget button;
+ Dimension w, h;
+
+ if (item->elems[i].type == BT_SEP) { /* separator */
+ XDVI_ERROR((stderr, "Cannot have a separator on a toplevel Xaw menu (ignoring)"));
+ /* y_pos += resource.btn_between_extra; */
+ continue;
+ }
+ else if (item->elems[i].submenu != NULL) { /* menu button, create a pulldown menu */
+ Widget shell;
+
+ button = XtVaCreateWidget("button", menuButtonWidgetClass, parent,
+ XtNmenuName, item->elems[i].title,
+ XtNlabel, item->elems[i].title,
+ XtNx, resource.btn_side_spacing,
+ XtNy, y_pos,
+ XtNborderWidth, resource.btn_border_width,
+ NULL);
+ shell = XtCreatePopupShell(item->elems[i].title, simpleMenuWidgetClass, button, NULL, 0);
+
+ create_menu_entries(item->elems[i].submenu, shell);
+ }
+ else { /* command button */
+ command_call[0].closure = (XtPointer)item->elems[i].action;
+ button = XtVaCreateWidget(item->elems[i].title, commandWidgetClass, parent,
+ XtNlabel, item->elems[i].title,
+ XtNx, resource.btn_side_spacing,
+ XtNy, y_pos,
+ XtNborderWidth, resource.btn_border_width,
+ XtNcallback, (XtArgVal)command_call,
+ NULL);
+ }
+ XtVaGetValues(button, XtNwidth, &w, XtNheight, &h, NULL);
+ y_pos += h + resource.btn_between_spacing + 2 * resource.btn_border_width;
+ if (w > m_panel_width)
+ m_panel_width = w;
+ item->elems[i].widget = button;
+ }
+
+ /* adjust button sizes, and manage buttons (managing them earlier may result
+ in `parent has no geometry manager' error) */
+ for (i = 0; item != NULL && i < item->size; i++) {
+ XtVaSetValues(item->elems[i].widget, XtNwidth, m_panel_width, NULL);
+ XtManageChild(item->elems[i].widget);
+ }
+
+ m_y_pos = y_pos - resource.btn_between_spacing + resource.btn_top_spacing + 2 * resource.btn_border_width;
+ m_panel_width += 2 * resource.btn_side_spacing + resource.btn_border_width;
+ XtVaSetValues(panel_widget, XtNwidth, m_panel_width, NULL);
+ *ret_width = m_panel_width;
+}
+
+Widget
+xaw_create_menu_widgets(Widget parent)
+{
+ /* hack to disable the magnifier in the panel: */
+ XtTranslations panel_translations = XtParseTranslationTable("#augment <ButtonPress>:");
+
+ XtAppAddActions(XtWidgetToApplicationContext(parent), menu_actions, XtNumber(menu_actions));
+
+ line_widget = XtVaCreateWidget("line", widgetClass, parent,
+ XtNbackground, (XtArgVal)resource.fore_Pixel,
+ XtNwidth, (XtArgVal)1,
+ XtNfromHoriz, (XtArgVal)globals.widgets.vport_widget,
+ XtNborderWidth, (XtArgVal)0,
+ XtNtop, (XtArgVal)XtChainTop,
+ XtNbottom, (XtArgVal)XtChainBottom,
+ XtNleft, (XtArgVal)XtChainRight,
+ XtNright, (XtArgVal)XtChainRight,
+ NULL);
+ panel_widget = XtVaCreateWidget("panel", compositeWidgetClass, parent,
+ XtNborderWidth, (XtArgVal)0,
+ XtNfromHoriz, (XtArgVal)line_widget,
+ XtNtranslations, (XtArgVal)panel_translations,
+ XtNtop, (XtArgVal)XtChainTop,
+ XtNbottom, (XtArgVal)XtChainBottom,
+ XtNleft, (XtArgVal)XtChainRight,
+ XtNright, (XtArgVal)XtChainRight,
+ NULL);
+ return panel_widget;
+}
+
+static void
+filehist_select_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ char *label, *ptr;
+ int idx;
+
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XtNlabel, &label, NULL);
+
+ idx = strtol(label, &ptr, 10) - 1;
+ while (isspace((unsigned char)*ptr))
+ ptr++;
+ TRACE_GUI((stderr, "User selected: %d, `%s'", idx, ptr));
+ if (idx == 0) {
+ globals.ev.flags |= EV_RELOAD;
+ return;
+ }
+ file_history_open(ptr);
+}
+
+static void
+update_menu_labels(Widget menu)
+{
+ WidgetList children;
+ int num_children;
+ int i;
+
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+ size_t new_len;
+
+ XtVaGetValues(menu,
+ XtNnumChildren, &num_children,
+ XtNchildren, &children,
+ NULL);
+ for (i = 0; i < (int)file_history_size(); i++) {
+ int dummy_page;
+ char *filename;
+
+ if ((filename = file_history_get_elem(i, &dummy_page)) == NULL) {
+ XDVI_ERROR((stderr, "Error accessing element %d of file history", i));
+ continue;
+ }
+
+ new_len = LENGTH_OF_INT + strlen(filename) + 1;
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ sprintf(buf, "%d %s", i + 1, filename);
+ XtVaSetValues(children[i], XtNlabel, buf, NULL);
+ TRACE_GUI((stderr, "child %d: `%s'", i, buf));
+ }
+
+ /* if history size < number of menu entries, destroy excess menu entries */
+ for (; i < num_children; i++) {
+ XtDestroyWidget(children[i]);
+ }
+}
+
+void
+filehist_menu_add_entry(const char *filename)
+{
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+ size_t new_len = LENGTH_OF_INT + strlen(filename) + 1;
+
+ Widget menu;
+ /* Don't report an error here, since "filehist_pullright" is only created on-demand
+ when user clicks on menu, but this may be called before from the event loop.
+ (The menu will still contain this entry when it's created later.) */
+ if (get_widget_by_name(&menu, globals.widgets.top_level, "filehist_pullright", False)) {
+ int num_children;
+ Widget w;
+
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ XtVaGetValues(menu, XtNnumChildren, &num_children, NULL);
+ sprintf(buf, "%d %s", num_children + 1, filename);
+
+ w = XtVaCreateManagedWidget("_filehist", smeBSBObjectClass, menu,
+ XtNlabel, buf,
+ XtNleftMargin, 10,
+ NULL);
+ XtAddCallback(w, XtNcallback, filehist_select_cb, NULL);
+ update_menu_labels(menu);
+ }
+}
+
+void
+filehist_menu_refresh(void)
+{
+ Widget menu;
+
+ /* Don't report an error here, since "filehist_pullright" is only created on-demand
+ when user clicks on menu, but this may be called before from the event loop.
+ (The menu will still contain this entry when it's created later.) */
+ if (get_widget_by_name(&menu, globals.widgets.top_level, "filehist_pullright", False)) {
+ update_menu_labels(menu);
+ }
+}
+
+
+static void
+filehist_insert_submenu(int idx, const char *filename, int pageno, void *data)
+{
+ Widget menu = (Widget)data;
+ Widget w;
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+ size_t new_len = LENGTH_OF_INT + strlen(filename) + 1;
+
+ UNUSED(pageno);
+
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ sprintf(buf, "%d %s", idx + 1, filename);
+ TRACE_GUI((stderr, "Creating menu `%s'", buf));
+ w = XtVaCreateManagedWidget("_filehist", smeBSBObjectClass, menu,
+ XtNlabel, buf,
+ XtNleftMargin, 10,
+ NULL);
+ XtAddCallback(w, XtNcallback, filehist_select_cb, NULL);
+}
+
+/*
+ ============================================================
+ Hack for pullright menus part II: callbacks and functions
+ ============================================================
+*/
+
+/* callback to pop down the currently active pullright */
+static void
+ActPopdownSubmenus(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ UNUSED(w);
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if (m_timeout != 0)
+ XtRemoveTimeOut(m_timeout);
+ m_timeout = 0;
+ if (m_active_submenu != NULL)
+ XtPopdown(m_active_submenu);
+}
+/* create a parent shell for the pullright menu entries */
+static Widget
+create_files_submenu(void)
+{
+ Widget popup = XtCreatePopupShell("filehist_pullright", simpleMenuWidgetClass, globals.widgets.top_level,
+ NULL, 0);
+ file_history_enumerate(filehist_insert_submenu, popup);
+ return popup;
+}
+
+/* Acutally pop up the pullright menu */
+static void
+popup_pullright(XtPointer client_data, XtIntervalId *id)
+{
+ int pos_x, pos_y;
+ Dimension w1;
+ Window dummy;
+ static Widget files_submenu = NULL;
+ struct pullright_position_info *info = (struct pullright_position_info *)client_data;
+
+ UNUSED(id);
+
+ if (files_submenu == NULL)
+ files_submenu = create_files_submenu();
+ /* XtManageChild(files_submenu); */
+ XTranslateCoordinates(DISP, XtWindow(XtParent(m_submenu)), RootWindowOfScreen(SCRN),
+ info->w, info->y, &pos_x, &pos_y, &dummy);
+ XtRealizeWidget(files_submenu);
+ XtVaGetValues(files_submenu, XtNwidth, &w1, NULL);
+ TRACE_GUI((stderr, "Popping up at %d, %d, %d, %d", pos_x, pos_y, w1, WidthOfScreen(SCRN)));
+
+ /* if not sufficient place on the right, pop it up on the left */
+ /* fprintf(stderr, "border_width: %d\n", info->border_width); */
+ if (pos_x + w1 > WidthOfScreen(SCRN)) {
+ /* fprintf(stderr, "%d > %d!\n", pos_x + w1, WidthOfScreen(SCRN)); */
+ pos_x -= (w1 + info->w + 3 * info->border_width);
+ /* fprintf(stderr, "new x: %d\n", pos_x); */
+ }
+ else {
+ pos_x += info->border_width;
+ }
+ XtVaSetValues(files_submenu,
+ XtNx, pos_x,
+ XtNy, pos_y,
+ NULL);
+ /* use XtPopupSpringLoaded() instead of XtPopup() since it does a few things
+ that make the pullright behave like a proper menu, like highlighting the
+ current selection, setting the cursor shape etc. */
+ XtPopupSpringLoaded(files_submenu);
+ m_active_submenu = files_submenu;
+}
+
+/*
+ * This event handler (to be called by read_events(), the main event handling loop)
+ * creates a timeout for the pullright to pop up.
+ */
+void
+SubMenuHandleEvent(XtAppContext app, XEvent *event)
+{
+ static int flag = 0;
+ static struct pullright_position_info info = { -1, 0, 0, 0, NULL };
+
+ UNUSED(app);
+
+ if (m_submenu == NULL)
+ return;
+
+ if (event->type == EnterNotify
+ || event->type == MotionNotify
+ || event->type == LeaveNotify
+ || event->type == ButtonPress) {
+
+ /* fprintf(stderr, "SubMenuHandleEvent: 0x%lx, 0x%lx\n", event->xany.window, XtWindow(m_submenu)); */
+
+ /* Could also loop through a list of windows here ...
+ We need to check for the parent of the menu item, since smeBSBObject is not
+ a real window, and then manually check whether the pointer is inside the menu
+ item.
+ */
+ if (XtParent(m_submenu) != NULL &&
+ event->xany.window == XtWindow(XtParent(m_submenu))) {
+ /* don't need to check for x coordinates since we already
+ know that pointer is inside the parent */
+ if (info.y == -1) { /* initialize info */
+ XtVaGetValues(m_submenu,
+ XtNy, &(info.y),
+ XtNwidth, &(info.w),
+ XtNheight, &(info.h),
+ NULL);
+ XtVaGetValues(XtParent(m_submenu),
+ XtNborderWidth, &(info.border_width),
+ NULL);
+
+ info.menu = m_submenu;
+ }
+ if (info.y < event->xbutton.y && info.y + info.h > event->xbutton.y) {
+ if (flag == 0) {
+ /* Create a timeout of 200ms to pop up the menu, so that it doesn't
+ pop up always when the cursor is only moved over the pulldown menu.
+ I think this is about the same delay as the one used by Motif.
+ */
+ flag = 1;
+ TRACE_GUI((stderr, "ENTER: %d, %d, %d; %d, %d",
+ info.y, info.w, info.h, event->xbutton.x, event->xbutton.y));
+ m_timeout = XtAppAddTimeOut(app, 200, popup_pullright, &info);
+ return;
+ }
+ }
+ else if (flag == 1) {
+ flag = 0;
+ TRACE_GUI((stderr, "LEAVE!"));
+ if (m_timeout != 0)
+ XtRemoveTimeOut(m_timeout);
+ m_timeout = 0;
+ if (m_active_submenu != NULL)
+ XtPopdown(m_active_submenu);
+ m_active_submenu = NULL;
+ }
+ }
+ }
+}
+
+void
+realize_button_panel(XtArgVal h)
+{
+ XtVaSetValues(line_widget, XtNheight, h, NULL);
+ XtVaSetValues(panel_widget, XtNheight, h, NULL);
+
+ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) != 0) {
+ XtManageChild(line_widget);
+ XtManageChild(panel_widget);
+ }
+}
+
+static void
+reconfig_window(void) {
+ Dimension x_top, y_top, h_top, w_top;
+ XWindowChanges sizeconfigure;
+ int sizeconfiguremask;
+
+ /* brute-force method to bring the scrollbars back. Apparently a single XConfigureWindow()
+ isn't enough to get the scrollbars back, we actually need to move the window a bit,
+ and then move it back. */
+ sizeconfiguremask = CWWidth | CWHeight;
+ XtVaGetValues(globals.widgets.top_level, XtNx, &x_top, XtNy, &y_top, XtNheight, &h_top, XtNwidth, &w_top, NULL);
+ sizeconfigure.width = w_top + 1;
+ sizeconfigure.height = h_top + 1;
+ XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure);
+ sizeconfigure.width = w_top;
+ sizeconfigure.height = h_top;
+ XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure);
+}
+
+/* toggle scrollbars to state `visible' */
+void
+toggle_scrollbars(void)
+{
+ Widget v_bar = XtNameToWidget(globals.widgets.vport_widget, "vertical");
+ Widget h_bar = XtNameToWidget(globals.widgets.vport_widget, "horizontal");
+ static Dimension bar_thick;
+ static Boolean v_bar_mapped = False, h_bar_mapped = False;
+ static Boolean initialized = False;
+
+ Boolean make_v_bar_visible = False;
+ Boolean make_v_bar_invisible = False;
+
+ Boolean make_h_bar_visible = False;
+ Boolean make_h_bar_invisible = False;
+
+ if (v_bar != 0) {
+ int test_v = 0;
+ XtVaGetValues(v_bar, XtNwidth, &test_v, NULL);
+ if (test_v > 1)
+ v_bar_mapped = True;
+ }
+ if (h_bar != 0) {
+ int test_h = 0;
+ XtVaGetValues(h_bar, XtNheight, &test_h, NULL);
+ if (test_h > 1)
+ h_bar_mapped = True;
+ }
+
+ if (!initialized) {
+ v_bar_mapped = h_bar_mapped = (resource.expert_mode & XPRT_SHOW_SCROLLBARS) != 0;
+ initialized = True;
+ if (v_bar != 0)
+ XtVaGetValues(v_bar, XtNwidth, &bar_thick, NULL);
+ else if (h_bar != 0)
+ XtVaGetValues(h_bar, XtNheight, &bar_thick, NULL);
+ else
+ bar_thick = 15; /* FIXME */
+ }
+
+ if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) {
+ if (v_bar_mapped)
+ make_v_bar_invisible = True;
+ if (h_bar_mapped)
+ make_h_bar_invisible = True;
+ }
+ else {
+ if (!v_bar_mapped)
+ make_v_bar_visible = True;
+ if (!h_bar_mapped)
+ make_h_bar_visible = True;
+ }
+
+ if (make_h_bar_visible || make_v_bar_visible) {
+ if (make_h_bar_visible && h_bar != 0) {
+ TRACE_GUI((stderr, "h_bar: h %d", bar_thick));
+ XtVaSetValues(h_bar, XtNheight, bar_thick, XtNx, bar_thick, XtNy, 0, XtNborderWidth, 1, NULL);
+ XtManageChild(h_bar);
+ h_bar_mapped = True;
+ }
+ if (make_v_bar_visible && v_bar != 0) {
+ TRACE_GUI((stderr, "v_bar: w %d", bar_thick));
+ XtVaSetValues(v_bar, XtNwidth, bar_thick, XtNx, 0, XtNy, bar_thick, XtNborderWidth, 1, NULL);
+ XtManageChild(v_bar);
+ v_bar_mapped = True;
+ }
+ if (h_bar != 0 || v_bar != 0) { /* need to reconfigure screen */
+ reconfig_window();
+ }
+ }
+ else if (make_h_bar_invisible || make_v_bar_invisible) {
+ if (make_h_bar_invisible && h_bar != 0) {
+ XtUnmanageChild(h_bar);
+ XtVaSetValues(h_bar, XtNheight, 1, XtNx, 0, XtNy, 0, XtNborderWidth, 0, NULL);
+ h_bar_mapped = False;
+ }
+ if (make_v_bar_invisible && v_bar != 0) {
+ XtUnmanageChild(v_bar);
+ XtVaSetValues(v_bar, XtNwidth, 1, XtNy, 0, XtNy, 0, XtNborderWidth, 0, NULL);
+ v_bar_mapped = False;
+ }
+ if (h_bar != 0 || v_bar != 0) { /* need to reconfigure screen */
+ reconfig_window();
+ }
+ }
+
+}
+
+void
+toggle_buttons(void)
+{
+ static Dimension panel_width = 0;
+ Dimension w;
+
+ if (panel_width == 0) /* initialize */
+ XtVaGetValues(panel_widget, XtNwidth, &panel_width, NULL);
+
+ /* need to get current width of form in case user has resized the window */
+ XtVaGetValues(globals.widgets.form_widget, XtNwidth, &w, NULL);
+ XtVaSetValues(globals.widgets.vport_widget, XtNresizable, (XtArgVal)True, NULL);
+
+ if (resource.expert_mode & XPRT_SHOW_BUTTONS) { /* show buttons */
+ XtManageChild(panel_widget);
+ XtManageChild(line_widget);
+ XtVaSetValues(globals.widgets.vport_widget,
+ XtNwidth, w - panel_width - 1, /* -1 for line_widget */
+ NULL);
+ }
+ else { /* hide buttons */
+ XtUnmanageChild(panel_widget);
+ XtUnmanageChild(line_widget);
+ XtVaSetValues(globals.widgets.vport_widget, XtNwidth, w, NULL);
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* ifndef MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xaw_menu.h b/Build/source/texk/xdvik/gui/xaw_menu.h
new file mode 100644
index 00000000000..693273c5ed9
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xaw_menu.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XAW_MENU_H_
+#define XAW_MENU_H_
+
+#include "menu.h"
+
+#ifndef MOTIF
+
+extern void xaw_set_button_state(struct button_elems *elems, Boolean on);
+extern void xaw_initialize_menu_bitmaps(void);
+extern Widget xaw_create_menu_widgets(Widget parent);
+extern void xaw_create_menu(struct button_info *items, Widget parent, int *ret_width);
+
+extern void SubMenuHandleEvent(XtAppContext app, XEvent *event);
+extern void filehist_menu_add_entry(const char *filename);
+extern int get_panel_width(void);
+
+extern void realize_button_panel(XtArgVal height);
+extern void filehist_menu_refresh(void);
+
+extern void xaw_create_pagelist(void);
+extern void toggle_scrollbars(void);
+extern void toggle_buttons(void);
+#ifdef USE_PANNER
+extern void scroll_y_panner(int y);
+extern void scroll_x_panner(int x);
+#endif
+#endif /* not MOTIF */
+
+#endif /* XAW_MENU_H_ */
diff --git a/Build/source/texk/xdvik/gui/xicon.c b/Build/source/texk/xdvik/gui/xicon.c
new file mode 100644
index 00000000000..f1b98dcbeab
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xicon.c
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Implement a nice and well behaved application icon.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "xicon.h"
+#include "util.h"
+#include "xdvi-debug.h"
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+
+#ifdef MOTIF
+# include <Xm/XmStrDefs.h>
+#endif
+
+#if defined(HAVE_X11_XPM_H)
+# include <X11/xpm.h>
+#elif defined(HAVE_XPM_H)
+# include <xpm.h>
+#elif defined(HAVE_XM_XPMP_H)
+# include <Xm/XpmP.h>
+#endif
+
+#include "xdvi.icon"
+#include "pixmaps/xdvi32x32.xpm"
+#include "pixmaps/xdvi16x16.xpm"
+#include "pixmaps/xdvi48x48.xpm"
+void
+add_icon(Widget top_level,
+ String title_name,
+ String icon_name)
+{
+#if !HAVE_XPM
+
+ static Arg args[] = {
+ {XtNiconX, (XtArgVal) 0},
+ {XtNiconY, (XtArgVal) 0},
+ };
+ static Pixmap icon_pm;
+ static Arg temp_args4 = { XtNiconPixmap, (XtArgVal) &icon_pm };
+
+ UNUSED(xdvi16x16_xpm);
+ UNUSED(xdvi32x32_xpm);
+ UNUSED(xdvi48x48_xpm);
+
+ if (resource.icon_geometry != NULL) {
+ int junk;
+
+ (void)XGeometry(DISP, XScreenNumberOfScreen(SCRN),
+ resource.icon_geometry, "",
+ 0, 0, 0, 0, 0,
+ (int *)&args[0].value,
+ (int *)&args[1].value,
+ &junk,
+ &junk);
+ XtSetValues(top_level, args, XtNumber(args));
+ }
+ /* Set icon pixmap */
+ XtGetValues(top_level, &temp_args4, 1);
+ if (icon_pm == (Pixmap) 0) {
+ temp_args4.value =
+ (XtArgVal)XCreateBitmapFromData(DISP,
+ RootWindowOfScreen(SCRN),
+ (const char *)xdvi_bits,
+ xdvi_width,
+ xdvi_height);
+ XtSetValues(top_level, &temp_args4, 1);
+ }
+#else /* HAVE_XPM */
+
+ /* Use Pixmaps, looking much nicer. */
+
+ static Pixmap icon = 0;
+ static Pixmap icon_mask = 0;
+ static const char **pixmap_data = xdvi32x32_xpm;
+ XIconSize *size;
+ int number_sizes;
+ Display *dsp;
+ XpmAttributes attr;
+
+ UNUSED(xdvi_bits);
+ /*
+ * get the icon size preferred by the window manager
+ */
+ if (XGetIconSizes(XtDisplay(top_level), RootWindowOfScreen(SCRN),
+ &size, &number_sizes) != 0) {
+ if (number_sizes > 0) {
+ if (size->max_height >= 48 && size->max_height >= 48)
+ pixmap_data = xdvi48x48_xpm;
+ else if (size->max_height >= 32 && size->max_height >= 32)
+ pixmap_data = xdvi32x32_xpm;
+ else if (size->max_height >= 16 && size->max_height >= 16)
+ pixmap_data = xdvi16x16_xpm;
+ }
+ }
+
+ dsp = XtDisplay(top_level);
+
+ attr.valuemask = 0L;
+ attr.valuemask = XpmCloseness | XpmReturnPixels | XpmColormap | XpmDepth | XpmVisual;
+ attr.closeness = 65535; /* accuracy isn't crucial */
+ /* use the same visual/colormap/depth as main window, else BadMatch ... */
+ attr.visual = G_visual;
+ attr.colormap = G_colormap;
+ attr.depth = G_depth;
+
+ if (!icon) {
+ Window rootWindow = XtWindow(globals.widgets.top_level);
+ ASSERT(rootWindow != 0, "");
+ XpmCreatePixmapFromData(dsp, rootWindow, (char **)pixmap_data,
+ &icon, &icon_mask, &attr);
+ }
+
+# ifdef MOTIF
+ XtVaSetValues(top_level, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL);
+# else
+ XtVaSetValues(top_level, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL);
+# endif
+
+ XpmFreeAttributes(&attr);
+#endif
+
+ {
+ /* code locality ... */
+ static Arg args[] = {
+ { XtNtitle, (XtArgVal) 0 },
+ { XtNiconName, (XtArgVal) 0 },
+ { XtNinput, (XtArgVal) True },
+ };
+
+ args[0].value = (XtArgVal)title_name;
+ args[1].value = (XtArgVal)icon_name;
+ XtSetValues(top_level, args, XtNumber(args));
+ }
+}
diff --git a/Build/source/texk/xdvik/gui/xicon.h b/Build/source/texk/xdvik/gui/xicon.h
new file mode 100644
index 00000000000..47991b5b092
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xicon.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XICON_H_
+#define XICON_H_
+
+extern void add_icon(Widget toplevel, String title_name, String icon_name);
+
+#endif /* XICON_H_ */
diff --git a/Build/source/texk/xdvik/gui/xlwradio.c b/Build/source/texk/xdvik/gui/xlwradio.c
new file mode 100644
index 00000000000..6542b59133a
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xlwradio.c
@@ -0,0 +1,677 @@
+/* adapted from xlwradio.c in the XEmacs distribution.
+ Changes are Copyright (C) 2002-2004 the xdvik development team.
+
+ Note SU: This widget doesn't work with Xaw3d, and I have little
+ inclination to make it work - the design would need to be utterly
+ different, e.g. the radio would need to be a diamond instead of a
+ circle, since 3d-shadowed circles don't look circular; colormap
+ issues would need to be settled, etc. And besides, I don't like Xaw3d ;)
+
+ So instead, the caller should just do:
+
+ myWidget = XtVaCreateManagedWidget("foo",
+ #ifdef XAW
+ radioWidgetClass,
+ #else
+ toggleWidgetClass,
+ #endif
+ ... arglist ...);
+
+ Feel free to submit patches if you want this implemented.
+
+ Original copyright follows:
+*/
+
+/* Radio Widget for XEmacs.
+ Copyright (C) 1999 Edward A. Falk
+
+ This file is part of XEmacs.
+
+ XEmacs is free software; you can redistribute 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.
+
+ XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ 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 XEmacs; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Radio.c 1.1 */
+
+/*
+ * Radio.c - Radio button widget
+ *
+ * Author: Edward A. Falk
+ * falk@falconer.vip.best.com
+ *
+ * Date: June 30, 1997
+ *
+ *
+ * Overview: This widget is identical to the Toggle widget in behavior,
+ * but completely different in appearance. This widget looks like a small
+ * diamond-shaped button with a label to the right.
+ *
+ * To make this work, we subclass the Toggle widget to inherit its behavior
+ * and to inherit the label-drawing function from which Toggle is
+ * subclassed. We then completely replace the Expose, Set, Unset
+ * and Highlight member functions.
+ *
+ * The Set and Unset actions are slightly unorthodox. In Toggle's
+ * ClassInit function, Toggle searches the Command actions list and
+ * "steals" the Set and Unset functions, caching pointers to them in its
+ * class record. It then calls these functions from its own ToggleSet
+ * and Toggle actions.
+ *
+ * We, in turn, override the Set() and Unset() actions in our own ClassRec.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "xdvi-debug.h"
+#include "util.h"
+#include "xaw_bitmaps.h" /* bitmaps for radio/checkbuttons */
+
+#include "xlwradioP.h"
+
+#ifndef MOTIF /* entire file */
+
+#include <stdio.h>
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+/* #include "../src/xmu.h" */
+
+#define BOX_SIZE 16
+#define PIXMAP_OFFSET 2 /* additional space between pixmap and label */
+
+#ifndef UNUSED
+# define UNUSED(x) ((void)(x))
+#endif
+
+#ifndef MAX
+# define MAX(i, j) ( (i) > (j) ? (i) : (j) )
+#endif
+
+
+#define rclass(w) ((RadioWidgetClass)((w)->core.widget_class))
+
+
+#ifdef _ThreeDP_h
+#define swid(rw) ((rw)->threeD.shadow_width)
+#else
+#define swid(rw) ((rw)->core.border_width)
+#endif
+
+#define bsize(rw) (rclass(rw)->radio_class.dsize)
+#define bs(rw) (bsize(rw) + PIXMAP_OFFSET + 2*swid(rw))
+
+/****************************************************************
+ *
+ * Full class record constant
+ *
+ ****************************************************************/
+
+/* The translations table from Toggle do not need to be
+ * overridden by Radio
+ */
+
+
+/* Member functions */
+
+static void RadioInit (Widget, Widget, ArgList, Cardinal *);
+static void RadioExpose (Widget, XEvent *, Region);
+static void RadioResize (Widget);
+static void RadioDestroy (Widget);
+static void RadioClassInit (void);
+static void RadioClassPartInit (WidgetClass);
+static Boolean RadioSetValues (Widget, Widget, Widget, ArgList, Cardinal *);
+static void DrawDiamond (Widget);
+static XtGeometryResult RadioQueryGeometry (Widget, XtWidgetGeometry *,
+ XtWidgetGeometry *);
+
+/* Action procs */
+
+static void RadioHighlight (Widget, XEvent *, String *, Cardinal *);
+static void RadioUnhighlight (Widget, XEvent *, String *, Cardinal *);
+
+/* internal privates */
+
+static void RadioSize (RadioWidget, Dimension *, Dimension *);
+
+/* The actions table from Toggle is almost perfect, but we need
+ * to override Highlight, Set, and Unset.
+ */
+
+static XtActionsRec actionsList[] =
+ {
+ {"highlight", RadioHighlight},
+ {"unhighlight", RadioUnhighlight},
+ };
+
+#define offset(field) XtOffset(RadioWidget, radio.field)
+
+static XtResource resources[] = {
+ {XtNisRadio, XtCIsRadio, XtRBoolean, sizeof(Boolean),
+ offset(isRadio), XtRImmediate, (XtPointer)(ptrdiff_t)True },
+};
+#undef offset
+
+#define SuperClass ((ToggleWidgetClass)&toggleClassRec)
+
+RadioClassRec radioClassRec = {
+ {
+ (WidgetClass) SuperClass, /* superclass */
+ "Radio", /* class_name */
+ sizeof(RadioRec), /* size */
+ RadioClassInit, /* class_initialize */
+ RadioClassPartInit, /* class_part_initialize */
+ FALSE, /* class_inited */
+ RadioInit, /* initialize */
+ NULL, /* initialize_hook */
+ XtInheritRealize, /* realize */
+ actionsList, /* actions */
+ XtNumber(actionsList), /* num_actions */
+ resources, /* resources */
+ XtNumber(resources), /* resource_count */
+ NULLQUARK, /* xrm_class */
+ TRUE, /* compress_motion */
+ TRUE, /* compress_exposure */
+ TRUE, /* compress_enterleave */
+ FALSE, /* visible_interest */
+ RadioDestroy, /* destroy */
+ RadioResize, /* resize */
+ RadioExpose, /* expose */
+ RadioSetValues, /* set_values */
+ NULL, /* set_values_hook */
+ XtInheritSetValuesAlmost, /* set_values_almost */
+ NULL, /* get_values_hook */
+ NULL, /* accept_focus */
+ XtVersion, /* version */
+ NULL, /* callback_private */
+ XtInheritTranslations, /* tm_table */
+ RadioQueryGeometry, /* query_geometry */
+ XtInheritDisplayAccelerator, /* display_accelerator */
+ NULL /* extension */
+ }, /* CoreClass fields initialization */
+ {
+ XtInheritChangeSensitive /* change_sensitive */
+#ifndef HAVE_OLD_XAW
+ , NULL
+#endif
+ }, /* SimpleClass fields initialization */
+#ifdef _ThreeDP_h
+ {
+ XtInheritXaw3dShadowDraw /* field not used */
+ }, /* ThreeDClass fields initialization */
+#endif
+ {
+ 0 /* field not used */
+ }, /* LabelClass fields initialization */
+ {
+ 0 /* field not used */
+ }, /* CommandClass fields initialization */
+ {
+ RadioSet, /* Set Procedure. */
+ RadioUnset, /* Unset Procedure. */
+ NULL /* extension. */
+ }, /* ToggleClass fields initialization */
+ {
+ BOX_SIZE,
+ DrawDiamond, /* draw procedure */
+ None, /* selected radiobutton */
+ None, /* unselected radiobutton */
+ None, /* selected menubutton */
+ None, /* unselected menubutton */
+ NULL /* extension. */
+ } /* RadioClass fields initialization */
+};
+
+/* for public consumption */
+WidgetClass radioWidgetClass = (WidgetClass) &radioClassRec;
+
+
+
+
+
+
+/****************************************************************
+ *
+ * Class Methods
+ *
+ ****************************************************************/
+
+static void
+RadioClassInit (void)
+{
+ XawInitializeWidgetSet();
+}
+
+static void
+RadioClassPartInit (WidgetClass class)
+{
+ RadioWidgetClass c = (RadioWidgetClass) class;
+ RadioWidgetClass super = (RadioWidgetClass)c->core_class.superclass;
+
+ if( c->radio_class.drawDiamond == NULL ||
+ c->radio_class.drawDiamond == XtInheritDrawDiamond )
+ {
+ c->radio_class.drawDiamond = super->radio_class.drawDiamond;
+ }
+
+}
+
+
+
+
+static void
+RadioInit (Widget request,
+ Widget new,
+ ArgList args,
+ Cardinal *num_args)
+{
+ RadioWidget rw = (RadioWidget) new;
+ RadioWidget rw_req = (RadioWidget) request;
+ Dimension w,h;
+
+ UNUSED(args);
+ UNUSED(num_args);
+
+ /* FIXME: should pixmap initialization be here?? */
+
+ /* Select initial size for the widget */
+ if( rw_req->core.width == 0 || rw_req->core.height == 0 ) {
+ RadioSize(rw, &w,&h);
+ if( rw_req->core.width == 0 )
+ rw->core.width = w;
+ if( rw_req->core.height == 0 )
+ rw->core.height = h;
+ rw->core.widget_class->core_class.resize(new);
+ }
+ /*
+ FIXME: access to XtWindow(rw) fails in the init method, so
+ I moved the bitmap creation here -- is there a better way??
+ */
+ /* create pixmaps */
+ rclass(rw)->radio_class.sel_radio
+ = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)),
+ (char *)button_radio_on_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H);
+ rclass(rw)->radio_class.unsel_radio
+ = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)),
+ (char *)button_radio_off_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H);
+ rclass(rw)->radio_class.sel_menu
+ = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)),
+ (char *)button_check_on_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H);
+ rclass(rw)->radio_class.unsel_menu
+ = XCreateBitmapFromData(XtDisplay(rw), RootWindowOfScreen(XtScreen(rw)),
+ (char *)button_check_off_bits, BUTTON_BITMAP_W, BUTTON_BITMAP_H);
+}
+
+/* Function Name: RadioDestroy
+ * Description: Destroy Callback for radio widget.
+ * Arguments: w - the radio widget that is being destroyed.
+ * Returns: none.
+ */
+
+static void
+RadioDestroy (Widget w)
+{
+ RadioWidget rw = (RadioWidget)w;
+ /* de-allocate bitmaps */
+ XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.sel_radio);
+ XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.unsel_radio);
+ XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.sel_menu);
+ XFreePixmap(XtDisplay(w), rclass(rw)->radio_class.unsel_menu);
+}
+
+
+/* React to size change from manager. Label widget will compute some internal
+ * stuff, but we need to override. This code requires knowledge of the
+ * internals of the Label widget.
+ */
+
+static void
+RadioResize (Widget w)
+{
+ RadioWidget rw = (RadioWidget)w;
+
+ /* call parent resize proc */
+ SuperClass->core_class.resize(w);
+
+ /* override label offset */
+
+ switch( rw->label.justify ) {
+ case XtJustifyLeft:
+ rw->label.label_x += (bs(rw) + rw->label.internal_width);
+ break;
+ case XtJustifyRight:
+ break;
+ case XtJustifyCenter:
+ default:
+ rw->label.label_x += (bs(rw) + rw->label.internal_width)/2;
+ break;
+ }
+}
+
+
+/*
+ * Repaint the widget window.
+ */
+
+static void
+RadioExpose (Widget w,
+ XEvent *event,
+ Region region)
+{
+ RadioWidget rw = (RadioWidget) w;
+ Display *dpy = XtDisplay(w);
+ Window win = XtWindow(w);
+ GC gc;
+ Pixmap left_bitmap;
+ extern WidgetClass labelWidgetClass;
+
+ /* Note: the Label widget examines the region to decide if anything
+ * needs to be drawn. I'm not sure that this is worth the effort,
+ * but it bears thinking on.
+ */
+
+ /* Command widget may sometimes override the label GC in order
+ * to draw inverse video. We don't use inverse video, so we need
+ * to restore the label's normal GC.
+ */
+ rw->label.normal_GC = rw->command.normal_GC;
+
+
+ /* Let label widget draw the label. If there was an lbm_x
+ * field, we could let Label draw the bitmap too. But there
+ * isn't, so we need to temporarily remove the bitmap and
+ * draw it ourself later.
+ */
+ left_bitmap = rw->label.left_bitmap;
+ rw->label.left_bitmap = None;
+ labelWidgetClass->core_class.expose(w,event,region);
+ rw->label.left_bitmap = left_bitmap;
+
+ /* now manually draw the left bitmap. TODO: 3-d look, xaw-xpm */
+ gc = XtIsSensitive(w) ? rw->label.normal_GC : rw->label.gray_GC;
+ if( left_bitmap != None && rw->label.lbm_width > 0 )
+ {
+ /* TODO: handle pixmaps */
+ XCopyPlane(dpy, left_bitmap, win, gc,
+ 0,0, rw->label.lbm_width, rw->label.lbm_height,
+ (int) rw->label.internal_width*2 + bs(rw),
+ (int) rw->label.internal_height + rw->label.lbm_y,
+ 1UL);
+ }
+ DrawDiamond(w);
+ /* Finally, the button itself */
+ ((RadioWidgetClass)(w->core.widget_class))->radio_class.drawDiamond(w);
+}
+
+
+
+
+/************************************************************
+ *
+ * Set specified arguments into widget
+ *
+ ***********************************************************/
+
+
+/* ARGSUSED */
+static Boolean
+RadioSetValues (Widget current,
+ Widget request,
+ Widget new,
+ ArgList args,
+ Cardinal *num_args)
+{
+ RadioWidget oldrw = (RadioWidget) current;
+ RadioWidget newrw = (RadioWidget) new;
+
+ UNUSED(request);
+ UNUSED(args);
+ UNUSED(num_args);
+
+ /* Need to find out if the size of the widget changed. Set new size
+ * if it did and resize is permitted. One way to determine of the
+ * widget changed size would be to scan the args list. Another way
+ * is to compare the old and new widgets and see if any of several
+ * size-related fields have been changed. The Label widget chose the
+ * former method, but I choose the latter.
+ */
+
+ if( newrw->label.resize &&
+ ( newrw->core.width != oldrw->core.width ||
+ newrw->core.height != oldrw->core.height ||
+ newrw->core.border_width != oldrw->core.border_width ) )
+ {
+ RadioSize(newrw, &newrw->core.width, &newrw->core.height);
+ }
+
+ /* The label set values routine can resize the widget. We need to
+ * recalculate if this is true.
+ */
+ if (newrw->label.label_x != oldrw->label.label_x)
+ {
+ RadioResize (new);
+ }
+ return FALSE;
+}
+
+static XtGeometryResult
+RadioQueryGeometry (Widget w,
+ XtWidgetGeometry *intended,
+ XtWidgetGeometry *preferred)
+{
+ RadioWidget rw = (RadioWidget) w;
+
+ preferred->request_mode = CWWidth | CWHeight;
+ RadioSize(rw, &preferred->width, &preferred->height);
+
+ if ( ((intended->request_mode & (CWWidth | CWHeight))
+ == (CWWidth | CWHeight)) &&
+ intended->width == preferred->width &&
+ intended->height == preferred->height)
+ return XtGeometryYes;
+ else if (preferred->width == w->core.width &&
+ preferred->height == w->core.height)
+ return XtGeometryNo;
+ else
+ return XtGeometryAlmost;
+}
+
+
+
+
+
+/************************************************************
+ *
+ * Action Procedures
+ *
+ ************************************************************/
+
+/*
+ * Draw the highlight border around the widget. The Command widget
+ * did this by drawing through a mask. We do it by just drawing the
+ * border.
+ */
+
+static void
+DrawHighlight (Widget w,
+ GC gc)
+{
+ RadioWidget rw = (RadioWidget)w;
+ XRectangle rects[4];
+ Dimension ht = rw->command.highlight_thickness;
+
+ if( ht <= 0 ||
+ ht > rw->core.width/2 ||
+ ht > rw->core.height/2 )
+ return;
+
+ if( ! XtIsRealized(w) )
+ return;
+
+ rects[0].x = 0; rects[0].y = 0;
+ rects[0].width = rw->core.width; rects[0].height = ht;
+ rects[1].x = 0; rects[1].y = rw->core.height - ht;
+ rects[1].width = rw->core.width; rects[1].height = ht;
+ rects[2].x = 0; rects[2].y = ht;
+ rects[2].width = ht; rects[2].height = rw->core.height - ht*2;
+ rects[3].x = rw->core.width - ht; rects[3].y = ht;
+ rects[3].width = ht; rects[3].height = rw->core.height - ht*2;
+ XFillRectangles( XtDisplay(w), XtWindow(w), gc, rects, 4);
+}
+
+static void
+RadioHighlight (Widget w,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ RadioWidget rw = (RadioWidget)w;
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ DrawHighlight(w, rw->command.normal_GC);
+}
+
+
+static void
+RadioUnhighlight (Widget w,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ RadioWidget rw = (RadioWidget)w;
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ DrawHighlight(w, rw->command.inverse_GC);
+}
+
+
+void
+RadioSet (Widget w,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ RadioWidget rw = (RadioWidget)w;
+ RadioWidgetClass class = (RadioWidgetClass) w->core.widget_class;
+
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if( rw->command.set )
+ return;
+
+ rw->command.set = TRUE;
+ if( XtIsRealized(w) )
+ class->radio_class.drawDiamond(w);
+}
+
+
+void
+RadioUnset (Widget w,
+ XEvent *event,
+ String *params,
+ Cardinal *num_params)
+{
+ RadioWidget rw = (RadioWidget)w;
+ RadioWidgetClass class = (RadioWidgetClass) w->core.widget_class;
+
+ UNUSED(event);
+ UNUSED(params);
+ UNUSED(num_params);
+
+ if( ! rw->command.set )
+ return;
+
+ rw->command.set = FALSE;
+ if( XtIsRealized(w) )
+ class->radio_class.drawDiamond(w);
+}
+
+
+
+
+/************************************************************
+ *
+ * Internal Procedures
+ *
+ ************************************************************/
+
+
+/* Size of widget. Width is size of box plus width of border around
+ * box plus width of label plus three margins plus the size of the left
+ * bitmap, if any. Height is max(box,bitmap,label) plus two margins.
+ */
+
+static void
+RadioSize (RadioWidget rw,
+ Dimension *w,
+ Dimension *h)
+{
+ *w = rw->label.label_width + bs(rw) + LEFT_OFFSET(rw) +
+ 3 * rw->label.internal_width;
+ *h = MAX( rw->label.label_height, bs(rw) ) +
+ 2 * rw->label.internal_width;
+}
+
+
+static void
+DrawDiamond(Widget w)
+{
+ RadioWidget rw = (RadioWidget) w;
+ Display *dpy = XtDisplay(w);
+ Window win = XtWindow(w);
+
+ Position x = rw->label.internal_width;
+ Position y = rw->core.height/2;
+ GC gc = XtIsSensitive(w) ? rw->command.normal_GC : rw->label.gray_GC;
+ Pixmap selected, unselected;
+
+ if (rw->radio.isRadio) { /* it's a radio button */
+ selected = rclass(rw)->radio_class.sel_radio;
+ unselected = rclass(rw)->radio_class.unsel_radio;
+ }
+ else {
+ selected = rclass(rw)->radio_class.sel_menu;
+ unselected = rclass(rw)->radio_class.unsel_menu;
+ }
+
+ ASSERT(selected != None, "");
+ ASSERT(unselected != None, "");
+
+ if(rw->command.set) {
+ XCopyPlane(dpy, selected, win, gc,
+ 0, 0, BUTTON_BITMAP_H, BUTTON_BITMAP_W,
+ x, y - BUTTON_BITMAP_H / 2, 1L);
+ }
+ else {
+ XCopyPlane(dpy, unselected, win, gc,
+ 0, 0, BUTTON_BITMAP_H, BUTTON_BITMAP_W,
+ x, y - BUTTON_BITMAP_H / 2, 1L);
+ }
+}
+
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xlwradio.h b/Build/source/texk/xdvik/gui/xlwradio.h
new file mode 100644
index 00000000000..cd63fbd7621
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xlwradio.h
@@ -0,0 +1,117 @@
+/* adapted from xlwradio.c in the XEmacs distribution.
+ Changes are Copyright (C) 2002-2004 the xdvik development team
+ Original copyright follows:
+*/
+
+/* Radio Widget for XEmacs.
+ Copyright (C) 1999 Edward A. Falk
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute 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.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+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 XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Synched up with: Radio.h 1.1 */
+
+/*
+ * Radio.h - Radio button widget
+ *
+ * Author: Edward A. Falk
+ * falk@falconer.vip.best.com
+ *
+ * Date: June 30, 1997
+ */
+
+#ifndef _XawRadio_h
+#define _XawRadio_h
+
+#ifndef MOTIF /* entire file */
+
+/***********************************************************************
+ *
+ * Radio Widget
+ *
+ * The Radio widget is identical to the Toggle widget in behavior but
+ * not in appearance. The Radio widget looks like a small diamond
+ * shaped button to the left of the label.
+ * (SU: changed this to use a bitmap instead.)
+ *
+ ***********************************************************************/
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Toggle.h>
+
+/* Resources:
+
+ Name Class RepType Default Value
+ ---- ----- ------- -------------
+ radioGroup RadioGroup Widget NULL
+ radioData RadioData Pointer (XPointer) Widget
+ isRadio IsRadio Booelan True
+ state State Boolean Off
+ background Background Pixel XtDefaultBackground
+ bitmap Pixmap Pixmap None
+ border BorderColor Pixel XtDefaultForeground
+ borderWidth BorderWidth Dimension 1
+ callback Callback Pointer NULL
+ cursor Cursor Cursor None
+ destroyCallback Callback Pointer NULL
+ font Font XFontStructx* XtDefaultFont
+ foreground Foreground Pixel XtDefaultForeground
+ height Height Dimension text height
+ highlightThickness Thickness Dimension 2
+ insensitiveBorder sensitive Pixmap Gray
+ internalHeight Height Dimension 2
+ internalWidth Width Dimension 4
+ justify Justify XtJustify XtJustifyCenter
+ label Label String NULL
+ mappedWhenManaged MappedWhenManaged Boolean True
+ resize Resize Boolean True
+ sensitive Sensitive Boolean True
+ width Width Dimension text width
+ x Position Position 0
+ y Position Position 0
+
+*/
+
+/*
+ * These should be in StringDefs.h but aren't so we will define
+ * them here if they are needed.
+ */
+
+
+extern WidgetClass radioWidgetClass;
+
+typedef struct _RadioClassRec *RadioWidgetClass;
+typedef struct _RadioRec *RadioWidget;
+
+#define XtNisRadio "isRadio"
+#define XtCIsRadio "IsRadio"
+
+/************************************************************
+ *
+ * Public Functions
+ *
+ ************************************************************/
+
+#endif /* MOTIF */
+
+#endif /* _XawRadio_h */
diff --git a/Build/source/texk/xdvik/gui/xlwradioP.h b/Build/source/texk/xdvik/gui/xlwradioP.h
new file mode 100644
index 00000000000..6c9da32f59e
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xlwradioP.h
@@ -0,0 +1,139 @@
+/* adapted from xlwradio.c in the XEmacs distribution.
+ Changes are Copyright (C) 2002-2004 the xdvik development team
+ Original copyright follows:
+*/
+
+/* Radio Widget for XEmacs.
+ Copyright (C) 1999 Edward A. Falk
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute 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.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+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 XEmacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/*
+ * RadioP.h - Private definitions for Radio widget
+ *
+ * Author: Edward A. Falk
+ * falk@falconer.vip.best.com
+ *
+ * Date: June 30, 1997
+ *
+ */
+
+#ifndef _XawRadioP_h
+#define _XawRadioP_h
+
+#include "xlwradio.h"
+
+#ifndef MOTIF
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/Text.h>
+#include <X11/Xaw/AsciiText.h>
+
+#include <X11/Xaw/ToggleP.h>
+#include <X11/Xaw/XawInit.h>
+
+/***********************************************************************
+ *
+ * Radio Widget Private Data
+ *
+ ***********************************************************************/
+
+typedef void (*XawDiamondProc) (Widget);
+
+void RadioSet (Widget w,
+ XEvent *event,
+ String *params, /* unused */
+ Cardinal *num_params); /* unused */
+
+void RadioUnset (Widget w,
+ XEvent *event,
+ String *params, /* unused */
+ Cardinal *num_params); /* unused */
+
+/************************************
+ *
+ * Class structure
+ *
+ ***********************************/
+
+/* New fields for the Radio widget class record */
+typedef struct _RadioClass {
+ Dimension dsize; /* diamond size */
+ XawDiamondProc drawDiamond;
+ /* pixmaps for the button */
+ Pixmap sel_radio; /* selected state */
+ Pixmap unsel_radio; /* unselected state */
+ Pixmap sel_menu; /* selected state */
+ Pixmap unsel_menu; /* unselected state */
+ /* TODO: 3-d and xaw-xpm features? */
+ XtPointer extension;
+} RadioClassPart;
+
+#define XtInheritDrawDiamond ((XawDiamondProc)_XtInherit)
+
+/* Full class record declaration */
+typedef struct _RadioClassRec {
+ CoreClassPart core_class;
+ SimpleClassPart simple_class;
+#ifdef _ThreeDP_h
+ ThreeDClassPart threeD_class;
+#endif
+ LabelClassPart label_class;
+ CommandClassPart command_class;
+ ToggleClassPart toggle_class;
+ RadioClassPart radio_class;
+} RadioClassRec;
+
+extern RadioClassRec radioClassRec;
+
+/***************************************
+ *
+ * Instance (widget) structure
+ *
+ **************************************/
+
+/* New fields for the Radio widget record */
+typedef struct {
+ /* resources */
+ Boolean isRadio; /* radio if True, checkbox else */
+ /* TODO: 3-d and xaw-xpm features? */
+
+ /* private data */
+ XtPointer extension;
+} RadioPart;
+
+ /* Full widget declaration */
+typedef struct _RadioRec {
+ CorePart core;
+ SimplePart simple;
+#ifdef _ThreeDP_h
+ ThreeDPart threeD;
+#endif
+ LabelPart label;
+ CommandPart command;
+ TogglePart toggle;
+ RadioPart radio;
+} RadioRec;
+
+#endif /* MOTIF */
+
+#endif /* _XawRadioP_h */
diff --git a/Build/source/texk/xdvik/gui/xm_colorsel.c b/Build/source/texk/xdvik/gui/xm_colorsel.c
new file mode 100644
index 00000000000..5bf4fec2324
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_colorsel.c
@@ -0,0 +1,638 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Color selector window showing a range of colors, and sliders to customize them.
+ * Heavily influenced by color_slide.c from ch. 13 of O'Reilly's Motif Programming Manual 1.2.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "Tip.h"
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "xm_prefsP.h"
+#include "xm_prefs.h"
+#include "events.h"
+#include "dvi-draw.h"
+#include "util.h"
+#include "topic-window.h"
+#include "search-internal.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/Form.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/SelectioB.h>
+# include <Xm/AtomMgr.h>
+
+#include <Xm/MwmUtil.h>
+
+#define ROWS 7
+#define COLS 10
+
+/* for passing around information - no global data here ;-) */
+struct color_info {
+ XColor new_color;
+ Widget tooltip;
+ Widget new_sample;
+ Widget r_scale;
+ Widget g_scale;
+ Widget b_scale;
+ struct color_button_info *button_info;
+};
+
+/*
+ * These are the colors of the GTK/Mozilla color picker
+ * (see e.g. http://lxr.mozilla.org/mozilla/source/toolkit/content/widgets/colorpicker.xml)
+ * which has the colors more or less sorted by columns.
+ * It's terminated by NULL just in case the table gets out of sync with
+ * the row/column number.
+ */
+static const char *colors[] = {
+ /* column 1 */
+ "#FFFFFF", "#CCCCCC", "#C0C0C0", "#999999", "#666666", "#333333", "#000000",
+ /* column 2 */
+ "#FFCCCC", "#FF6666", "#FF0000", "#CC0000", "#990000", "#660000", "#330000",
+ /* column 3 */
+ "#FFCC99", "#FF9966", "#FF9900", "#FF6600", "#CC6600", "#993300", "#663300",
+ /* column 4 */
+ "#FFFF99", "#FFFF66", "#FFCC66", "#FFCC33", "#CC9933", "#996633", "#663333",
+ /* column 5 */
+ "#FFFFCC", "#FFFF33", "#FFFF00", "#FFCC00", "#999900", "#666600", "#333300",
+ /* column 6 */
+ "#99FF99", "#66FF99", "#33FF33", "#33CC00", "#009900", "#006600", "#003300",
+ /* column 7 */
+ "#99FFFF", "#33FFFF", "#66CCCC", "#00CCCC", "#339999", "#336666", "#003333",
+ /* column 8 */
+ "#CCFFFF", "#66FFFF", "#33CCFF", "#3366FF", "#3333FF", "#000099", "#000066",
+ /* column 9 */
+ "#CCCCFF", "#9999FF", "#6666CC", "#6633FF", "#6600CC", "#333399", "#330099",
+ /* column 10 */
+ "#FFCCFF", "#FF99FF", "#CC66CC", "#CC33CC", "#993399", "#663366", "#330033",
+ /* safety */
+ NULL
+};
+
+#define MOTIF 1
+
+static void
+popdown_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ Widget dialog;
+ struct prefs_choice *prefs = (struct prefs_choice *)client_data;
+
+ UNUSED(call_data);
+
+ ASSERT(prefs != NULL, "user_data in popdown_cb musn't be NULL!");
+ if (get_widget_by_name(&dialog, widget, Xdvi_COLOR_DIALOG_NAME, True)) {
+ /* fprintf(stderr, "popdown!\n"); */
+ remove_from_deplist(prefs, dialog);
+ XtUnmanageChild(dialog);
+ }
+}
+
+static void
+h_update_sliders(struct color_info *cinfo)
+{
+ unsigned r, g, b;
+
+ r = cinfo->new_color.red >> 8;
+ g = cinfo->new_color.green >> 8;
+ b = cinfo->new_color.blue >> 8;
+
+ XtVaSetValues(cinfo->r_scale, XmNvalue, r, NULL);
+ XtVaSetValues(cinfo->g_scale, XmNvalue, g, NULL);
+ XtVaSetValues(cinfo->b_scale, XmNvalue, b, NULL);
+}
+
+static void
+popdown_apply_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct color_info *cinfo = NULL;
+ static XmDrawnButtonCallbackStruct cbs;
+ struct prefs_choice *prefs = (struct prefs_choice *)client_data;
+
+ UNUSED(call_data);
+ ASSERT(prefs != NULL, "struct prefs_choice * in popdown_apply_cb mustn't be NULL!");
+
+ /* To update button to new color, set its button_info color
+ and call the button's expose callback */
+ XtVaGetValues(widget, XmNuserData, &cinfo, NULL);
+ ASSERT(cinfo != NULL, "XmNuserData in popdown_apply_cb musn't be NULL!");
+ cinfo->button_info->pixel = cinfo->new_color.pixel;
+
+ cbs.reason = XmCR_EXPOSE;
+ XtCallCallbacks(cinfo->button_info->w, XmNexposeCallback, &cbs);
+
+ remove_from_deplist(prefs, widget);
+
+ /* Store the current setting -
+ FIXME: better way of converting color or pixel to string? pixel_to_str() in x_util.c is broken! */
+ store_preference(&(prefs->db), cinfo->button_info->resource_name,
+ "#%.2x%.2x%.2x",
+ cinfo->new_color.red >> 8,
+ cinfo->new_color.green >> 8,
+ cinfo->new_color.blue >> 8);
+
+ /* Update the display to use the new foreground/background.
+ * I don't really understand the entire color interface, but
+ * apparently the following works, and nothing else I tried did ... */
+ if (strcmp(cinfo->button_info->resource_name, "foreground") == 0) {
+ XGCValues values;
+
+ fg_initial.r = cinfo->new_color.red;
+ fg_initial.g = cinfo->new_color.green;
+ fg_initial.b = cinfo->new_color.blue;
+
+ values.foreground = resource.fore_Pixel = resource.rule_pixel = cinfo->new_color.pixel;
+ XChangeGC(DISP, globals.gc.ruler, GCForeground, &values);
+
+ scanned_page = scanned_page_color = scanned_page_reset;
+ globals.ev.flags |= EV_NEWPAGE;
+
+ }
+ else if (strcmp(cinfo->button_info->resource_name, "background") == 0) {
+ bg_initial.r = cinfo->new_color.red;
+ bg_initial.g = cinfo->new_color.green;
+ bg_initial.b = cinfo->new_color.blue;
+
+ resource.back_Pixel = cinfo->new_color.pixel;
+ scanned_page = scanned_page_color = scanned_page_reset;
+ globals.ev.flags |= EV_RELOAD; /* EV_NEWPAGE not sufficient with color code ... */
+ }
+ else if (strcmp(cinfo->button_info->resource_name, "highlight") == 0) {
+ XGCValues values;
+ values.foreground = resource.hl_Pixel = cinfo->new_color.pixel;
+ XChangeGC(DISP, globals.gc.high, GCForeground, &values);
+ /* hack to update match GC: fake change in inverted property, redraw
+ so that GC is cleared, then change inverted property back */
+ resource.match_highlight_inverted = !resource.match_highlight_inverted;
+ search_draw_inverted_regions();
+ resource.match_highlight_inverted = !resource.match_highlight_inverted;
+ /* end of hack to update match GC */
+ globals.ev.flags |= EV_NEWPAGE; /* force redraw */
+ }
+
+ XtUnmanageChild(widget);
+}
+
+static void
+popdown_cancel_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct prefs_choice *prefs = (struct prefs_choice *)client_data;
+
+ /* fprintf(stderr, "popdown cancel; call_data: %p!\n", call_data); */
+ if (call_data != NULL) {
+ /* fprintf(stderr, "removing from deplist: %p!!!\n", prefs); */
+ remove_from_deplist(prefs, widget);
+ }
+
+ XtUnmanageChild(widget);
+ /* XtPopdown(XtParent(widget)); */
+}
+
+static void
+revert_color_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct color_info *cinfo = (struct color_info *)client_data;
+ Pixel pix;
+
+ UNUSED(call_data);
+
+ /* get color of old_sample button */
+ XtVaGetValues(widget, XmNbackground, &pix, NULL);
+ /* fprintf(stderr, "Color: 0x%.6lx\n", pix); */
+
+ /* use this instead of XtVaSetValues on XmNbackground so that
+ the foreground color gets also changed appropriately. */
+#if XmVersion >= 1002
+ XmChangeColor(cinfo->new_sample, pix);
+#else
+ XtVaSetValues(cinfo->new_sample, XmNbackground, pix, NULL);
+#endif
+
+ /* update sliders */
+ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0);
+ pixel_to_color(pix, &(cinfo->new_color), DISP, G_colormap);
+ h_update_sliders(cinfo);
+}
+
+static void
+show_color_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct color_info *cinfo = (struct color_info *)client_data;
+ Pixel pix;
+
+ UNUSED(call_data);
+ XtVaGetValues(widget, XmNbackground, &pix, NULL);
+ /* fprintf(stderr, "Color: 0x%.6lx\n", pix); */
+
+ /* use this instead of XtVaSetValues on XmNbackground so that
+ the foreground color gets also changed appropriately. */
+#if XmVersion >= 1002
+ XmChangeColor(cinfo->new_sample, pix);
+#else
+ XtVaSetValues(cinfo->new_sample, XmNbackground, pix, NULL);
+#endif
+
+ /* update sliders */
+ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0);
+ pixel_to_color(pix, &(cinfo->new_color), DISP, G_colormap);
+ h_update_sliders(cinfo);
+}
+
+static void
+slider_cb(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ struct color_info *cinfo = (struct color_info *)client_data;
+ XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)call_data;
+
+ /* fprintf(stderr, "Pixel1 : 0x%.6lx\n", cinfo->new_color.pixel); */
+ /* reuse cinfo->new_color */
+ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0);
+
+ if (widget == cinfo->r_scale) {
+ cinfo->new_color.red = cbs->value << 8; /* << 8 == * 65535 */
+ }
+ else if (widget == cinfo->g_scale) {
+ cinfo->new_color.green = cbs->value << 8;
+ }
+ else if (widget == cinfo->b_scale) {
+ cinfo->new_color.blue = cbs->value << 8;
+ }
+
+ if (!XAllocColor(DISP, G_colormap, &(cinfo->new_color))) {
+ XDVI_ERROR((stderr, "Couldn't XAllocColor\n"));
+ return;
+ }
+ /* fprintf(stderr, "Pixel: 0x%.6lx\n", cinfo->new_color.pixel); */
+
+#if XmVersion >= 1002
+ /* if avaliable, use this so that the foreground color also
+ gets updated appropriately: */
+ XmChangeColor(cinfo->new_sample, cinfo->new_color.pixel);
+#else
+ XtVaSetValues(cinfo->new_sample, XmNbackground, cinfo->new_color.pixel, NULL);
+#endif
+}
+
+static Widget
+h_create_color_matrix(Widget parent, Widget top, struct color_info *cinfo)
+{
+ int i, j;
+ const char **color_ptr = colors;
+
+ Widget matrix =
+ XtVaCreateManagedWidget("color_matrix", xmRowColumnWidgetClass,
+ parent,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, top,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNpacking, XmPACK_COLUMN,
+ XmNnumColumns, COLS,
+ XmNorientation, XmVERTICAL,
+ XmNbackground, BlackPixelOfScreen(XtScreen(parent)),
+ XmNspacing, 1,
+ XmNmarginWidth, 1,
+ XmNmarginHeight, 1,
+ NULL);
+
+ for (i = 0; i < ROWS; i++) {
+ for (j = 0; j < COLS; j++) {
+ Pixel pix = BlackPixelOfScreen(XtScreen(parent));
+ Widget button;
+ if (*color_ptr == NULL) /* safety */
+ break;
+ str_to_pixel(top, *color_ptr++, &pix);
+ /* fprintf(stderr, "creating button %d, %d - %s\n", i, j, k % 2 ? "b" : "w"); */
+ button = XtVaCreateManagedWidget("c_button", xmDrawnButtonWidgetClass,
+ matrix,
+ XmNbackground, pix,
+ XmNheight, 19,
+ XmNwidth, 19,
+ XmNmarginWidth, 0,
+ XmNmarginHeight, 0,
+ XmNhighlightThickness, 0,
+ XmNshadowThickness, 0,
+ NULL);
+ XtAddCallback(button, XmNactivateCallback, show_color_cb, cinfo);
+ }
+ }
+ return matrix;
+}
+
+static void
+h_create_sliders(Widget parent, Widget top, struct color_info *cinfo)
+{
+ XmString str;
+ Widget r_label, g_label, b_label;
+ Widget r_scale, g_scale, b_scale;
+ Dimension curr, max;
+
+ Arg scale_args[8];
+ Arg label_args[8];
+ int scale_n = 0;
+
+ XtSetArg(scale_args[scale_n], XmNmaximum, 255); scale_n++;
+ /* True is an older setting of XmNshowValue that should also work with 2.x */
+ XtSetArg(scale_args[scale_n], XmNshowValue, True); scale_n++;
+ XtSetArg(scale_args[scale_n], XmNorientation, XmHORIZONTAL); scale_n++;
+#if XmVersion >= 2000
+ XtSetArg(scale_args[scale_n], XmNshowArrows, XmEACH_SIDE); scale_n++;
+ /* XmVersion < 2000 only had `True' which was the default anyway */
+#endif
+
+ str = XmStringCreateLocalized("Red");
+ XtSetArg(label_args[0], XmNlabelString, str);
+ r_label = XtCreateManagedWidget("r_label", xmLabelGadgetClass, parent, label_args, 1);
+ XmStringFree(str);
+
+ r_scale = XtCreateWidget("r_scale", xmScaleWidgetClass, parent, scale_args, scale_n);
+ cinfo->r_scale = r_scale;
+ XtAddCallback(r_scale, XmNdragCallback, slider_cb, cinfo);
+ XtAddCallback(r_scale, XmNvalueChangedCallback, slider_cb, cinfo);
+
+ str = XmStringCreateLocalized("Green");
+ XtSetArg(label_args[0], XmNlabelString, str);
+ g_label = XtCreateManagedWidget("g_label", xmLabelGadgetClass, parent, label_args, 1);
+ XmStringFree(str);
+
+ g_scale = XtCreateWidget("g_scale", xmScaleWidgetClass, parent, scale_args, scale_n);
+ cinfo->g_scale = g_scale;
+ XtAddCallback(g_scale, XmNdragCallback, slider_cb, cinfo);
+ XtAddCallback(g_scale, XmNvalueChangedCallback, slider_cb, cinfo);
+
+ str = XmStringCreateLocalized("Blue");
+ XtSetArg(label_args[0], XmNlabelString, str);
+ b_label = XtCreateManagedWidget("b_label", xmLabelGadgetClass, parent, label_args, 1);
+ XmStringFree(str);
+
+ b_scale = XtCreateWidget("b_scale", xmScaleWidgetClass, parent, scale_args, scale_n);
+ cinfo->b_scale = b_scale;
+ XtAddCallback(b_scale, XmNdragCallback, slider_cb, cinfo);
+ XtAddCallback(b_scale, XmNvalueChangedCallback, slider_cb, cinfo);
+
+ /* get max width of labels, and adjust scale size to what's left */
+ XtVaGetValues(r_label, XmNwidth, &curr, NULL);
+ XtVaGetValues(g_label, XmNwidth, &max, NULL);
+ if (curr > max)
+ max = curr;
+ XtVaGetValues(b_label, XmNwidth, &curr, NULL);
+ if (curr > max)
+ max = curr;
+ /* we know the width of the color selector is about 200 pixels (10 fields each 20 wide),
+ so we use that as max length */
+ curr = 200 - max - 2; /* some additional offset */
+
+ /* fprintf(stderr, "width of slider: %d\n", curr); */
+ /* fprintf(stderr, "width of string: %d\n", max); */
+
+ /* attach widgets; needs to be done after creating them since r_label
+ attachment references g_label etc. */
+ XtVaSetValues(r_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ XmNbottomWidget, g_label,
+ XmNbottomOffset, 20, /* needed to make label visible */
+ NULL);
+ XtVaSetValues(r_scale,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, top,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ XmNbottomWidget, g_label,
+ XmNbottomOffset, 20, /* needed to make label visible */
+ XmNscaleWidth, curr,
+ NULL);
+ XtVaSetValues(g_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ XmNbottomWidget, b_label,
+ XmNbottomOffset, 20, /* needed to make label visible */
+ NULL);
+ XtVaSetValues(g_scale,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_WIDGET,
+ XmNbottomWidget, b_label,
+ XmNbottomOffset, 20, /* needed to make label visible */
+ XmNscaleWidth, curr,
+ NULL);
+ XtVaSetValues(b_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNbottomOffset, 15,
+ NULL);
+ XtVaSetValues(b_scale,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNbottomOffset, 15,
+ XmNscaleWidth, curr,
+ NULL);
+
+ XtManageChild(r_scale);
+ XtManageChild(g_scale);
+ XtManageChild(b_scale);
+
+ h_update_sliders(cinfo);
+
+}
+
+static Widget
+h_create_shell(Widget parent, struct color_info *cinfo)
+{
+ Widget shell, dialog, form, button_row, color_matrix;
+ Widget old_sample, new_sample;
+ Widget tip_shell;
+ Atom WM_DELETE_WINDOW;
+ Arg args[32];
+ int n;
+
+ XmString str;
+
+ Pixel old_pixel = cinfo->button_info->pixel;
+ /* hack to disable resizing of the shell, since this messes up the color matrix badly */
+ int decoration = MWM_DECOR_ALL | MWM_DECOR_RESIZEH | MWM_DECOR_MENU | MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE;
+ int functions = MWM_FUNC_ALL | MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE;
+
+ struct color_button_info *binfo = cinfo->button_info;
+ struct topic_info *tinfo = binfo->tinfo;
+ struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data;
+ /* struct prefs_choice *prefs; */
+
+ n = 0;
+ XtSetArg(args[n], XmNuserData, cinfo); n++;
+
+ /* XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING); n++; */
+ /* XtSetArg(args[n], XmNnoResize, True); n++; */
+ /* XtSetArg(args[n], XmNmwmFunctions, functions); n++; */
+ /* XtSetArg(args[n], XmNmwmDecorations, decoration); n++; */
+ XtSetArg(args[n], XtNtitle, "Xdvik: Select Color"); n++;
+
+ dialog = XmCreatePromptDialog(parent, Xdvi_COLOR_DIALOG_NAME, args, n);
+ /* unmanage stuff to get a `scratch' widget */
+ XtUnmanageChild(XtNameToWidget(dialog, "Help"));
+ XtUnmanageChild(XtNameToWidget(dialog, "Text"));
+ XtUnmanageChild(XtNameToWidget(dialog, "Selection"));
+
+ shell = XtParent(dialog);
+
+ XtVaSetValues(shell,
+ XmNdeleteResponse, XmDO_NOTHING,
+ XmNnoResize, True,
+ XmNmwmFunctions, functions,
+ XmNmwmDecorations, decoration,
+ NULL);
+
+ /* cinfo->new_color is a allocated/freed by request; initialize it with old_pixel */
+ XAllocColor(DISP, G_colormap, &(cinfo->new_color));
+ cinfo->new_color.flags = DoRed | DoGreen | DoBlue;
+
+ XFreeColors(DISP, G_colormap, &(cinfo->new_color.pixel), 1, 0);
+ pixel_to_color(old_pixel, &(cinfo->new_color), DISP, G_colormap);
+
+
+ tip_shell = XtVaCreatePopupShell("tipShell", tipWidgetClass,
+ parent, XtNwidth, 1, XtNheight, 1,
+ NULL);
+ cinfo->tooltip = tip_shell;
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass,
+ dialog,
+ XmNhorizontalSpacing, 10,
+ XmNverticalSpacing, 10,
+ XmNallowResize, False,
+ NULL);
+
+ button_row = XtVaCreateManagedWidget("button_row", xmRowColumnWidgetClass,
+ form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNorientation, XmHORIZONTAL,
+ XmNpacking, XmPACK_COLUMN,
+ XmNspacing, 8,
+ XmNmarginWidth, 1,
+ XmNmarginHeight, 1,
+ NULL);
+
+ str = XmStringCreateLocalized("Old");
+ old_sample = XtVaCreateManagedWidget(Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME, xmPushButtonWidgetClass,
+ button_row,
+ XmNbackground, old_pixel,
+ XmNlabelString, str,
+ XmNhighlightThickness, 0,
+ XmNshadowThickness, 1,
+ NULL);
+ XtAddCallback(old_sample, XmNactivateCallback, revert_color_cb, cinfo);
+ XmStringFree(str);
+ str = XmStringCreateLocalized("New");
+ new_sample = XtVaCreateManagedWidget("new_sample", xmPushButtonWidgetClass,
+ button_row,
+ XmNbackground, cinfo->new_color.pixel,
+ XmNlabelString, str,
+ XmNhighlightThickness, 0,
+ XmNshadowThickness, 1,
+ NULL);
+ XmStringFree(str);
+ /* disable clicking on the new_sample button */
+ XtInsertEventHandler(new_sample,
+ KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask,
+ True, block_event_callback,
+ (XtPointer)0, 0);
+ cinfo->new_sample = new_sample;
+
+ color_matrix = h_create_color_matrix(form, button_row, cinfo);
+
+ h_create_sliders(form, color_matrix, cinfo);
+
+ XtManageChild(form);
+
+ XtAddCallback(dialog, XmNokCallback, popdown_apply_cb, prefs);
+ XtAddCallback(dialog, XmNcancelCallback, popdown_cancel_cb, prefs);
+
+ XtManageChild(dialog);
+
+ add_to_deplist(prefs, dialog);
+
+ TipAddWidget(tip_shell, old_sample, "Click to revert to old color");
+ TipAddWidget(tip_shell, new_sample, "Preview of new color");
+ /* TipAddWidget(tip_shell, color_matrix, "Select color"); */
+
+ WM_DELETE_WINDOW = XmInternAtom(DISP, "WM_DELETE_WINDOW", False);
+ XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, popdown_cb, prefs);
+
+ return dialog;
+}
+
+void
+popup_color_dialog(Widget parent, struct color_button_info *button_info)
+{
+ static Widget shell;
+ static Boolean first_time = True;
+ /* Must be static so that we can pass its address around */
+ static struct color_info cinfo;
+ struct topic_info *tinfo = button_info->tinfo;
+ struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data;
+
+ cinfo.button_info = button_info;
+
+ if (first_time) {
+ shell = h_create_shell(parent, &cinfo);
+ first_time = False;
+ }
+ else {
+ /* Already created, but we may need to change the colors of old_sample
+ and new_sample. This is done by changing the value of old_sample and
+ invoking its activate callback, which will `revert' new_sample to
+ the same color. */
+ Widget w;
+ if (get_widget_by_name(&w, shell, Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME, True)) {
+#if XmVersion >= 1002
+ XmChangeColor(w, cinfo.button_info->pixel);
+#else
+ XtVaSetValues(w, XmNbackground, cinfo.button_info->pixel, NULL);
+#endif
+ XtCallCallbacks(w, XmNactivateCallback, &cinfo);
+ }
+ add_to_deplist(prefs, shell);
+ XtManageChild(shell);
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xm_colorsel.h b/Build/source/texk/xdvik/gui/xm_colorsel.h
new file mode 100644
index 00000000000..bb4bd38b94a
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_colorsel.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_COLORSEL_H_
+#define XM_COLORSEL_H_
+
+#ifdef MOTIF
+
+struct prefs_choice;
+struct topic_info;
+
+struct color_button_info {
+ Widget w; /* current button */
+ Pixel pixel; /* label color of this button */
+ const char *resource_name; /* resource name to save this color to */
+ struct topic_info *tinfo;
+};
+
+void popup_color_dialog(Widget parent, struct color_button_info *cinfo);
+
+#endif /* MOTIF */
+
+#endif /* XM_COLORSEL_H_ */
diff --git a/Build/source/texk/xdvik/gui/xm_filesel.c b/Build/source/texk/xdvik/gui/xm_filesel.c
new file mode 100644
index 00000000000..b7a2d6fe2f4
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_filesel.c
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2001-2004 Marcin Dalecki and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Implementation of the File selection dialogue for the Motif GUI.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "sfSelFile.h"
+
+#include "dvi.h"
+#include "string-utils.h"
+#include "util.h"
+#include "events.h"
+#include "message-window.h"
+#include "dvi-init.h" /* for dviErrFlagT */
+#include "x_util.h"
+
+#if defined(MOTIF) /* entire file */
+
+#include <Xm/FileSB.h>
+#include <Xm/Form.h>
+#include <Xm/ToggleBG.h>
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XdviBell(display, window, percent) \
+ XkbBell(display, window, percent, (Atom) None)
+#else
+# define XdviBell(display, window, percent) XBell(display, percent)
+#endif
+
+/* static Widget dialog = NULL; */
+/* static char *browse_fname = NULL; */
+
+/*
+ * Process callback from Dialog cancel actions.
+ */
+static void
+cancel_callback(Widget w,
+ XtPointer client_data,
+ XtPointer call_data)
+{
+ struct filesel_callback *callback = (struct filesel_callback *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+#if 0
+ /* DON'T reset browse_fname, so that user gets the current
+ value as default next time when he cancels now */
+ if (callback->browse_fname != NULL)
+ {
+ XtFree(callback->browse_fname);
+ callback->browse_fname = NULL;
+ }
+#endif
+
+ XtUnmanageChild(callback->shell);
+ if (callback->exit_on_cancel) {
+ exit(0);
+ }
+}
+
+/*
+ * Process callback from Dialog actions.
+ */
+
+static void
+accept_callback(Widget w,
+ XtPointer client_data,
+ XtPointer call_data)
+{
+ XmFileSelectionBoxCallbackStruct *fcb;
+ struct filesel_callback *callback;
+
+ UNUSED(w);
+
+ ASSERT(client_data != NULL, "struct filesel_callback pointer expected in client data");
+ callback = (struct filesel_callback *)client_data;
+
+ /* get the filename from the file selection box */
+ fcb = (XmFileSelectionBoxCallbackStruct *)call_data;
+ if (callback->browse_fname != NULL) {
+ XtFree(callback->browse_fname);
+ callback->browse_fname = NULL;
+ }
+ XmStringGetLtoR(fcb->value, G_charset, &callback->browse_fname);
+
+ if (0 && callback->must_exist) {
+ FILE *tmp_fp = XFOPEN(callback->browse_fname, "r");
+ dviErrFlagT errflag = NO_ERROR;
+ if (tmp_fp == NULL) {
+ popup_message(XtParent(callback->shell),
+ MSG_ERR, NULL, "Could not open %s: %s.\n",
+ callback->browse_fname, strerror(errno));
+ /* leave file selection box open */
+ return;
+ }
+ else if (!process_preamble(tmp_fp, &errflag)
+ || !find_postamble(tmp_fp, &errflag)
+ || !read_postamble(tmp_fp, &errflag, True
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
+ popup_message(XtParent(callback->shell),
+ MSG_ERR, NULL, "Error opening %s:\n%s.",
+ callback->browse_fname, get_dvi_error(errflag));
+ fclose(tmp_fp);
+ /* leave file selection box open */
+ return;
+ }
+ else { /* file is OK */
+ fclose(tmp_fp);
+ }
+ }
+
+ /* success; close dialog, and call our callback */
+ XtUnmanageChild(callback->shell);
+ callback->func_ptr(callback->browse_fname, callback->data);
+}
+
+static void
+cb_open_new_window(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ if (XmToggleButtonGadgetGetState(w))
+ resource.filesel_open_new_window = True;
+ else
+ resource.filesel_open_new_window = False;
+ store_preference(NULL, "fileselOpenNewWindow", "%d", resource.filesel_open_new_window);
+}
+
+void raise_file_selector(void)
+{
+ /* dummy */
+ return;
+}
+
+void
+XsraSelFilePopup(struct filesel_callback *callback)
+{
+ if (XtIsManaged(callback->shell)) {
+ XdviBell(DISP, XtWindow(callback->shell), 10);
+ XRaiseWindow(DISP, XtWindow(callback->shell));
+ return;
+ }
+ else {
+#define ARG_CNT 4
+ XmString filemask = NULL;
+ XmString directory = NULL;
+ Arg args[ARG_CNT];
+ int i = 0;
+ char *path, *ptr;
+
+ /* only show files matching our mask */
+ filemask = XmStringCreateLtoR((char *)callback->filemask, G_charset);
+ XtSetArg(args[i], XmNpattern, filemask); i++;
+
+ /* set directory to last directory used */
+ if (callback->browse_fname == NULL) {
+ ASSERT(callback->init_path != NULL, "callback->init_path mustn't be NULL!");
+ callback->browse_fname = xt_strdup(callback->init_path);
+ }
+ path = xstrdup(callback->browse_fname);
+ ptr = strrchr(path, '/');
+ if (ptr != NULL)
+ *ptr = '\0';
+ directory = XmStringCreateLtoR(path, G_charset);
+ XtSetArg(args[i], XmNdirectory, directory); i++;
+ free(path);
+
+
+ ASSERT(i < ARG_CNT, "args list too short");
+ XtSetValues(callback->shell, args, (Cardinal)i);
+
+ free(filemask);
+ free(directory);
+
+ XtManageChild(callback->shell);
+#undef ARG_CNT
+ }
+}
+
+Widget
+XsraSelFile(Widget parent, struct filesel_callback *callback)
+{
+ Widget dialog = XmCreateFileSelectionDialog(parent, "file", NULL, 0);
+
+ XtVaSetValues(XtParent(dialog), XmNtitle, callback->title, NULL);
+
+ XtAddCallback(dialog, XmNokCallback, accept_callback, (XtPointer)callback);
+ XtAddCallback(dialog, XmNcancelCallback, cancel_callback, (XtPointer)callback);
+
+ /* When opening a DVI file, offer to open in new window */
+ if (callback->must_exist) {
+ Widget form, button;
+ XmString test;
+ form = XtVaCreateManagedWidget("new_window_form", xmFormWidgetClass, dialog, NULL);
+ test = XmStringCreateLocalized("Open file in new window");
+ button = XtVaCreateManagedWidget(Xdvi_NEW_WINDOW_RADIO_NAME, xmToggleButtonGadgetClass, form,
+ XmNlabelString, test,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNset, resource.filesel_open_new_window,
+ NULL);
+ XmStringFree(test);
+ XtAddCallback(button, XmNvalueChangedCallback, cb_open_new_window, (XtPointer)NULL);
+ }
+
+
+ /* We have no help in this window, so hide help button */
+ XtUnmanageChild(XmFileSelectionBoxGetChild(dialog, (unsigned char)XmDIALOG_HELP_BUTTON));
+
+ return dialog;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* defined(MOTIF) */
diff --git a/Build/source/texk/xdvik/gui/xm_menu.c b/Build/source/texk/xdvik/gui/xm_menu.c
new file mode 100644
index 00000000000..bc54ad88d1b
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_menu.c
@@ -0,0 +1,364 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki and others
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "xm_menu.h"
+#include "xm_toolbar.h"
+#include "my-snprintf.h"
+#include "util.h"
+#include "x_util.h"
+#include "version.h"
+#include "statusline.h"
+#include "pagehist.h"
+#include "dvi-init.h"
+#include "filehist.h"
+#include "c-openmx.h"
+#include "message-window.h"
+
+#ifdef MOTIF /* needed for `make depend' */
+
+#include <Xm/RowColumn.h>
+#include <Xm/Frame.h>
+#include <Xm/PushB.h>
+#include <Xm/PushBG.h>
+#include <Xm/CascadeBG.h>
+#include <Xm/SeparatoG.h>
+#include <Xm/ToggleB.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Separator.h>
+
+
+/*
+ * There's an apparent bug in Motif related to the interaction between
+ * the menubar menus and the magnifier.
+ *
+ * If you click on a menu on the menubar and then click on the drawing
+ * widget to pop up a magnifier, the keyboard and pointer are still
+ * grabbed, leading to a weird situation in which the magnifier stays
+ * around even after you release the pointer. The ungrab_serial
+ * counter works around this bug by ignoring such pointer events.
+ *
+ * This bug occurs in Motif 1.2 and OpenMotif 2.2.2 (at least). It
+ * does not occur in Lesstif.
+ */
+static unsigned long ungrab_event_num = 0;
+
+void
+popdown_callback(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(w);
+ UNUSED(client_data);
+ /* Lesstif gives call_data == NULL */
+ if (call_data != NULL && *((XtGrabKind *) call_data) != XtGrabNone) {
+ ungrab_event_num = LastKnownRequestProcessed(DISP);
+ }
+}
+
+Boolean
+pulldown_menu_active(unsigned long event_num)
+{
+ return event_num < ungrab_event_num;
+}
+
+
+void
+toggle_menubar(void)
+{
+ if ((resource.expert_mode & XPRT_SHOW_MENUBAR) == 0)
+ XtUnmanageChild(globals.widgets.menu_bar);
+ else
+ XtManageChild(globals.widgets.menu_bar);
+}
+
+static void
+update_menu_labels(Widget menu)
+{
+ WidgetList children;
+ int num_children;
+ int i;
+
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+
+ XtVaGetValues(menu,
+ XmNnumChildren, &num_children,
+ XmNchildren, &children,
+ NULL);
+
+ /* for (i = 0; i < num_children; i++) { */
+ for (i = 0; i < (int)file_history_size(); i++) {
+ int dummy_page;
+ char *filename;
+ size_t new_len;
+ XmString str;
+
+ if ((filename = file_history_get_elem(i, &dummy_page)) == NULL) {
+ XDVI_ERROR((stderr, "Error accessing element %d of file history", i));
+ continue;
+ }
+
+ new_len = LENGTH_OF_INT + strlen(filename) + 1;
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ sprintf(buf, "%d %s", i + 1, filename);
+ str = XmStringCreateLocalized(buf);
+ XtVaSetValues(children[i],
+ XmNlabelString, str,
+ NULL);
+ if (i + 1 < 10) {
+ XtVaSetValues(children[i], XmNmnemonic, buf[0], NULL);
+ }
+ XmStringFree(str);
+ }
+
+ /* if history size < number of menu entries, destroy excess menu entries */
+ for (; i < num_children; i++) {
+ XtDestroyWidget(children[i]);
+ }
+}
+
+static void
+filehist_select_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Widget menu;
+ XmString label;
+ char *label_ptr;
+ int pageno;
+ char *fname;
+ int idx;
+
+ /* UNUSED(w); */
+ UNUSED(call_data);
+ UNUSED(client_data);
+
+ XtVaGetValues(w,
+ XmNuserData, &menu,
+ XmNlabelString, &label,
+ NULL);
+
+ XmStringGetLtoR(label, G_charset, &label_ptr);
+ idx = strtol(label_ptr, (char **)NULL, 10) - 1;
+ XtFree(label_ptr);
+
+ ASSERT(menu != NULL, "XmNuserData in filehist_select_cb musn't be NULL!");
+
+ if (idx == 0) { /* user re-selected current file: reload */
+ globals.ev.flags |= EV_RELOAD;
+ return;
+ }
+ if ((fname = file_history_get_elem(idx, &pageno)) == NULL) {
+ statusline_error(STATUS_MEDIUM, "Error accessing file %d of history", idx);
+ return;
+ }
+
+ file_history_open(fname);
+}
+
+void
+filehist_menu_refresh(void)
+{
+ Widget menu;
+ if (get_widget_by_name(&menu, globals.widgets.menu_bar, Xdvi_FILEHIST_MENU, True)) {
+ update_menu_labels(menu);
+ }
+}
+
+void
+filehist_menu_add_entry(const char *filename)
+{
+ Widget menu;
+
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+ size_t new_len = LENGTH_OF_INT + strlen(filename) + 1;
+
+ if (get_widget_by_name(&menu, globals.widgets.menu_bar, Xdvi_FILEHIST_MENU, True)) {
+ int num_children;
+ Widget w;
+
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ XtVaGetValues(menu, XmNnumChildren, &num_children, NULL);
+
+ sprintf(buf, "%d %s", num_children + 1, filename);
+
+ w = XtVaCreateManagedWidget(buf, xmPushButtonGadgetClass, menu,
+ XmNuserData, menu,
+ NULL);
+ if (num_children + 1 < 10) {
+ XtVaSetValues(w, XmNmnemonic, buf[0], NULL);
+ }
+ XtAddCallback(w, XmNactivateCallback, filehist_select_cb, cast_int_to_XtPointer(num_children + 1));
+
+ update_menu_labels(menu);
+
+ }
+}
+
+static void
+filehist_submenu(int idx, const char *filename, int pageno, void *data)
+{
+ Widget menu = (Widget)data;
+ Widget w;
+ static char *buf = NULL;
+ static size_t buf_len = 0;
+ size_t new_len = LENGTH_OF_INT + strlen(filename) + 1;
+
+ if (new_len > buf_len) {
+ buf = xrealloc(buf, new_len);
+ buf_len = new_len;
+ }
+
+ UNUSED(pageno);
+
+ sprintf(buf, "%d %s", idx + 1, filename);
+ TRACE_GUI((stderr, "Creating menu `%s'", buf));
+ w = XtVaCreateManagedWidget(buf, xmPushButtonGadgetClass, menu,
+ /* XmNmnemonic, buf[0], */
+ XmNuserData, menu,
+ NULL);
+ if (idx + 1 < 10) {
+ XtVaSetValues(w, XmNmnemonic, buf[0], NULL);
+ }
+ XtAddCallback(w, XmNactivateCallback, filehist_select_cb, cast_int_to_XtPointer(idx));
+}
+
+
+
+static Widget
+recent_files_submenu(Widget parent, char *title, char mnemonic)
+{
+ Widget menu = 0, cascade = 0;
+ XmString str;
+
+ menu = XmCreatePulldownMenu(parent, Xdvi_FILEHIST_MENU, NULL, 0);
+ str = XmStringCreateLocalized(title);
+ cascade = XtVaCreateManagedWidget(title, xmCascadeButtonGadgetClass, parent,
+ XmNsubMenuId, menu,
+ XmNlabelString, str,
+ XmNmnemonic, mnemonic,
+ NULL);
+ XmStringFree(str);
+
+ file_history_enumerate(filehist_submenu, menu);
+ return cascade;
+}
+
+Widget
+xm_create_menu(Widget parent, char *title, char mnemonic, struct button_info *item)
+{
+ Widget menu = 0, cascade = 0, w = 0;
+ size_t i;
+ XmString str;
+
+ menu = XmCreatePulldownMenu(parent, "_pulldown", NULL, 0);
+ str = XmStringCreateLocalized(title);
+ cascade = XtVaCreateManagedWidget(title, xmCascadeButtonGadgetClass, parent,
+ XmNsubMenuId, menu,
+ XmNlabelString, str,
+ XmNmnemonic, mnemonic,
+ NULL);
+ XmStringFree(str);
+
+ /* add the menu items */
+ for (i = 0; item != NULL && i < item->size; i++) {
+ item->elems[i].widget = 0;
+ /* if there's a subitem, call this function recursively */
+ if (item->elems[i].submenu != NULL) {
+ w = xm_create_menu(menu, item->elems[i].title,
+ item->elems[i].mnemonic, item->elems[i].submenu);
+ /*
+ workaround for pointer grabbing bug; add additional callback to all menus
+ (they have the same parent)
+ */
+ XtAddCallback(XtParent(menu), XtNpopdownCallback,
+ popdown_callback, (XtPointer) 0);
+ }
+ else if (item->elems[i].action != NULL && item->elems[i].action->proc == Act_recent_files) {
+ /* special case: submenu with recent files */
+ w = recent_files_submenu(menu, item->elems[i].title, item->elems[i].mnemonic);
+ XtAddCallback(XtParent(menu), XtNpopdownCallback,
+ popdown_callback, (XtPointer) 0);
+ }
+ else {
+ switch(item->elems[i].type) {
+ case BT_PUSH:
+ w = XtVaCreateManagedWidget(item->elems[i].title, xmPushButtonGadgetClass, menu,
+ NULL);
+ break;
+ case BT_RADIO:
+ w = XtVaCreateManagedWidget(item->elems[i].title, xmToggleButtonGadgetClass, menu,
+ XmNindicatorType, XmONE_OF_MANY,
+ NULL);
+ break;
+ case BT_CHECK:
+ w = XtVaCreateManagedWidget(item->elems[i].title, xmToggleButtonGadgetClass, menu,
+ XmNindicatorType, XmN_OF_MANY,
+ NULL);
+ break;
+ case BT_SEP:
+ w = XtVaCreateManagedWidget(item->elems[i].title, xmSeparatorGadgetClass, menu,
+ NULL);
+ break;
+ default:
+ XDVI_WARNING((stderr, "unrecognized button type %d in menu %s (skipping this item).\n",
+ item->elems[i].type, item->elems[i].title));
+ break;
+ }
+ item->elems[i].widget = w;
+ }
+
+ if (item->elems[i].mnemonic != 0)
+ XtVaSetValues(w, XmNmnemonic, item->elems[i].mnemonic, NULL);
+
+ if (item->elems[i].accelerator != NULL) {
+ str = XmStringCreateLocalized(item->elems[i].accelerator);
+ XtVaSetValues(w, XmNacceleratorText, str, NULL);
+ XmStringFree(str);
+ }
+
+ if (item->elems[i].action != NULL) {
+ String cb_type;
+ if (XmIsToggleButton(w) || XmIsToggleButtonGadget(w))
+ cb_type = XmNvalueChangedCallback;
+ else
+ cb_type = XmNactivateCallback;
+ XtAddCallback(w, cb_type, handle_command, item->elems[i].action);
+ }
+ }
+ return cascade;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
+
diff --git a/Build/source/texk/xdvik/gui/xm_menu.h b/Build/source/texk/xdvik/gui/xm_menu.h
new file mode 100644
index 00000000000..28dab3a384e
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_menu.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_MENU_H_
+#define XM_MENU_H_
+
+#include "menu.h"
+
+#ifdef MOTIF
+
+#define Xdvi_FILEHIST_MENU "filehist_menu"
+
+extern Widget xm_create_menu(Widget parent, char *title, char mnemonic,
+ struct button_info *item);
+
+extern Boolean pulldown_menu_active(unsigned long event_num);
+extern void toggle_menubar(void);
+extern void popdown_callback(Widget w, XtPointer client_data, XtPointer call_data);
+extern void filehist_menu_add_entry(const char *filename);
+extern void filehist_menu_refresh(void);
+
+#endif
+
+#endif /* XM_MENU_H_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs.c b/Build/source/texk/xdvik/gui/xm_prefs.c
new file mode 100644
index 00000000000..f214ca1886c
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs.c
@@ -0,0 +1,590 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Preferences dialog for xdvik.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "message-window.h"
+#include "util.h"
+#include "events.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs.h"
+
+#include "xm_prefs_appearance.h"
+#include "xm_prefs_fonts.h"
+#include "xm_prefs_helpers.h"
+#include "xm_prefs_page.h"
+#include "xm_prefs_scroll.h"
+
+/* for reverting preferences, we need access to more prototypes ... */
+#include "dvi-draw.h"
+#include "search-internal.h"
+#include "statusline.h"
+#include "xm_toolbar.h"
+#include "xm_menu.h"
+#include "pagesel.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/Form.h>
+
+#define SCROLLING_DONE 0
+
+#define NUM_PREFS_TOPICS 16 /* should be ample ... */
+
+/* hmm, should maybe move these into xm_prefsP.c ... */
+void
+h_attach_below(Widget x, Widget y) {
+ if (y == NULL) {
+ /* no top widget, attach to form - could just pass NULL as XmNtopWidget, but lesstif warns in that case ... */
+ XtVaSetValues(x,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+ }
+ else {
+ XtVaSetValues(x,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, y,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+ }
+}
+
+
+static void
+initialize_items(struct topic_info *info)
+{
+ int i = 0;
+
+ info->items[i].widget = prefs_appearance(info);
+ info->items[i].topic = xstrdup("Appearance");
+ info->items[i].title = xstrdup("Change the appearance of xdvi");
+
+ i++;
+ info->items[i].widget = prefs_fonts_and_colors(info);
+ info->items[i].topic = xstrdup("Fonts and Colors");
+ info->items[i].title = xstrdup("Display of fonts and colors in DVI files");
+
+ i++;
+ info->items[i].widget = prefs_paper(info);
+ info->items[i].topic = xstrdup("Page Size");
+ info->items[i].title = xstrdup("Customize the default window and page size");
+
+#if SCROLLING_DONE /* not finished yet */
+ i++;
+ info->items[i].widget = prefs_scrolling(info);
+ info->items[i].topic = xstrdup("Scrolling");
+ info->items[i].title = xstrdup("Customize the scrolling behaviour when switching pages");
+#endif
+
+ i++;
+ info->items[i].widget = prefs_helpers(info);
+#ifdef LESSTIF_VERSION
+ /* compensate for width computation bug by adding extra whitespace at end */
+ info->items[i].topic = xstrdup("Helper Applications ");
+#else
+ info->items[i].topic = xstrdup("Helper Applications");
+#endif
+ info->items[i].title = xstrdup("External programs used by xdvi");
+
+ /* terminate */
+ i++;
+ info->items[i].widget = 0;
+ info->items[i].topic = info->items[i].title = NULL;
+
+ ASSERT(i < NUM_PREFS_TOPICS, "NUM_PREFS_TOPICS too small!");
+}
+
+void
+remove_from_deplist(struct prefs_choice *prefs, Widget w)
+{
+ size_t i;
+ Boolean found = False;
+
+ /* locate this widget */
+ for (i = 0; i < prefs->depwin_cnt; i++) {
+ if (prefs->depwin[i] == w) {
+ found = True;
+ break;
+ }
+ }
+
+ if (found) {
+ /* move later widgets down */
+ for (; i < prefs->depwin_cnt - 1; i++) {
+ prefs->depwin[i] = prefs->depwin[i + 1];
+ }
+ prefs->depwin_cnt--;
+ }
+
+#if 0
+ fprintf(stderr, "deplist after removal:\n");
+ for (i = 0; i < prefs->depwin_cnt; i++) {
+ fprintf(stderr, "%d: %p\n", i, prefs->depwin[i]);
+ }
+#endif
+}
+
+static void
+update_button(Widget button, Pixel pix)
+{
+ struct color_button_info *cinfo;
+ static XmDrawnButtonCallbackStruct cbs;
+
+ XtVaGetValues(button, XmNuserData, &cinfo, NULL);
+ cinfo->pixel = pix;
+ cbs.reason = XmCR_EXPOSE;
+ XtCallCallbacks(button, XmNexposeCallback, &cbs);
+}
+
+static void
+update_button_by_name(Pixel pix, const char *name)
+{
+ static Widget pref_shell = 0;
+ Widget button;
+
+ if (pref_shell == 0
+ && !get_widget_by_name(&pref_shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True))
+ return;
+
+ if (get_widget_by_name(&button, pref_shell, name, True)) {
+ update_button(button, pix);
+ }
+}
+
+static Boolean
+revert_colors(Pixel fg, Pixel bg, Pixel hl)
+{
+ XColor color_data[2];
+ Boolean need_redraw = False;
+ Widget button;
+ Pixel visited, unvisited;
+
+ color_data[0].pixel = resource.fore_Pixel;
+ color_data[1].pixel = resource.back_Pixel;
+
+ str_to_pixel(globals.widgets.top_level, resource.visited_link_color, &visited);
+ str_to_pixel(globals.widgets.top_level, resource.link_color, &unvisited);
+
+ XQueryColors(DISP, G_colormap, color_data, 2);
+
+ if (fg != resource.fore_Pixel) {
+ XGCValues values;
+
+ fg_initial.r = color_data[0].red;
+ fg_initial.g = color_data[0].green;
+ fg_initial.b = color_data[0].blue;
+
+ values.foreground = resource.rule_pixel = resource.fore_Pixel;
+ XChangeGC(DISP, globals.gc.ruler, GCForeground, &values);
+
+ scanned_page = scanned_page_color = scanned_page_reset;
+
+ update_button_by_name(resource.fore_Pixel, Xdvi_FG_COLOR_BTN);
+
+ need_redraw = True;
+ }
+ if (bg != resource.back_Pixel) {
+ bg_initial.r = color_data[1].red;
+ bg_initial.g = color_data[1].green;
+ bg_initial.b = color_data[1].blue;
+
+ scanned_page = scanned_page_color = scanned_page_reset;
+
+ update_button_by_name(resource.back_Pixel, Xdvi_BG_COLOR_BTN);
+
+ need_redraw = True;
+ }
+ if (hl != resource.hl_Pixel) {
+ XGCValues values;
+ values.foreground = resource.hl_Pixel;
+ XChangeGC(DISP, globals.gc.high, GCForeground, &values);
+ /* hack to update match GC: fake change in inverted property, redraw
+ so that GC is cleared, then change inverted property back */
+ resource.match_highlight_inverted = !resource.match_highlight_inverted;
+ search_draw_inverted_regions();
+ resource.match_highlight_inverted = !resource.match_highlight_inverted;
+
+ update_button_by_name(resource.hl_Pixel, Xdvi_HL_COLOR_BTN);
+
+ need_redraw = True;
+ }
+ /* NOTE: pixels for hyperlinks are not stored anywhere; just update always: */
+ if (get_widget_by_name(&button, globals.widgets.top_level, Xdvi_VISITED_LINKS_BTN, True)) {
+ update_button(button, visited);
+ h_update_hyperlinks(button, visited); /* this already triggers a redraw */
+ }
+ if (get_widget_by_name(&button, globals.widgets.top_level, Xdvi_UNVISITED_LINKS_BTN, True)) {
+ update_button(button, unvisited);
+ h_update_hyperlinks(button, unvisited); /* this already triggers a redraw */
+ }
+ return need_redraw;
+}
+
+static void
+revert_resources(void)
+{
+ Pixel curr_fg = resource.fore_Pixel;
+ Pixel curr_bg = resource.back_Pixel;
+ Pixel curr_hl = resource.hl_Pixel;
+ Boolean need_redraw = False;
+
+ /* save some old values */
+ int save_shrink = resource.shrinkfactor;
+
+ load_app_resources(True);
+
+ /* revert from saved values */
+ resource.use_color = globals.curr_use_color;
+ resource.gamma = globals.curr_gamma;
+ resource.paper = globals.curr_paper;
+ resource.shrinkfactor = save_shrink;
+ do_set_shrinkfactor(resource.shrinkfactor, True);
+
+ update_preferences_darkness();
+
+ /* revert expert mode */
+ if (resource.expert)
+ resource.expert_mode = XPRT_SHOW_NONE;
+ update_expert_mode();
+
+ toggle_statusline();
+#ifndef MOTIF
+ if (!BROKEN_RECONFIG)
+ toggle_scrollbars();
+#else
+ toggle_scrollbars();
+#endif
+
+#ifdef MOTIF
+ toggle_pagelist();
+ toggle_toolbar();
+ toggle_menubar();
+#else
+ toggle_buttons();
+#endif
+
+ /* reset tooltips_wait_period, similar to TipAddWidget() in Tip.c */
+ resource.tooltips_wait_period = resource.tooltips_wait_period_bak;
+ if (resource.tooltips_wait_period < 0) {
+ resource.show_tooltips = False;
+ }
+ else if (!resource.show_tooltips) {
+ if (resource.tooltips_wait_period == 0)
+ resource.tooltips_wait_period = -1;
+ else
+ resource.tooltips_wait_period = -resource.tooltips_wait_period;
+ }
+
+ update_preferences_expert();
+ update_preferences_tooltips();
+ update_preferences_search();
+
+ update_preferences_color();
+ update_preferences_hyperlinks();
+
+ update_preferences_windowsize();
+ update_preferences_shrink();
+ update_preferences_paper();
+
+ update_preferences_helpers();
+
+ need_redraw |= revert_colors(curr_fg, curr_bg, curr_hl);
+
+ /* if (need_redraw) */
+ /* just reload it always, there's too many exceptions ...
+ redraw isn't always sufficient if file has colors. */
+ globals.ev.flags |= EV_RELOAD;
+
+}
+
+/* add widget w to list of dependent windows */
+void
+add_to_deplist(struct prefs_choice *prefs, Widget w)
+{
+#if 0
+ size_t i;
+#endif
+ prefs->depwin = xrealloc(prefs->depwin,
+ (prefs->depwin_cnt + 1) * sizeof *(prefs->depwin));
+ prefs->depwin[prefs->depwin_cnt] = w;
+ prefs->depwin_cnt++;
+
+#if 0
+ fprintf(stderr, "deplist after adding:\n");
+ for (i = 0; i < prefs->depwin_cnt; i++) {
+ fprintf(stderr, "%lu: %p\n", (unsigned long)i, prefs->depwin[i]);
+ }
+#endif
+}
+
+static void
+reread_prefs_cb(Window w)
+{
+ if (w != XtWindow(globals.widgets.top_level)) {
+ XChangeProperty(DISP, w,
+ atom_reread_prefs(), atom_reread_prefs(), 8,
+ PropModeReplace,
+ /* dummy values, since all the other instance needs to do is
+ reread the ~/.xdvirc.tmp file */
+ (unsigned char *)"Y", 1);
+ }
+}
+
+static void
+apply_prefs_cb(XtPointer arg)
+{
+ struct topic_info *info = (struct topic_info *)arg;
+ struct prefs_choice *prefs = (struct prefs_choice *)info->data;
+ size_t i;
+ Widget colorsel;
+
+ if (get_widget_by_name(&colorsel, globals.widgets.top_level, Xdvi_COLOR_DIALOG_NAME, False)) {
+ XtPopdown(XtParent(colorsel));
+ }
+
+ /* pop down dependent windows */
+ TRACE_GUI((stderr, "window count: %lu\n", (unsigned long)prefs->depwin_cnt));
+ for (i = 0; i < prefs->depwin_cnt; i++) {
+ TRACE_GUI((stderr, "popping down %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i])));
+ if (XtIsRealized(prefs->depwin[i])) {
+ XtCallCallbacks(prefs->depwin[i], XmNcancelCallback, NULL);
+ XSync(DISP, True); /* wait for server to catch up */
+ if (XtIsRealized(prefs->depwin[i])) {
+ TRACE_GUI((stderr, "calling XmNokCallback of %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i])));
+ XtCallCallbacks(prefs->depwin[i], XmNokCallback, NULL);
+ }
+ }
+ }
+ free(prefs->depwin);
+ prefs->depwin = NULL;
+ prefs->depwin_cnt = 0;
+
+ if (prefs->db == NULL) /* callback invoked multiple times? */
+ return;
+
+ merge_into_user_db(prefs->db); /* this destroys prefs->db */
+ prefs->db = NULL;
+
+ /* remember some current values */
+ free(globals.curr_paper);
+ if (resource.paper != NULL)
+ globals.curr_paper = xstrdup(resource.paper);
+
+ free(globals.curr_editor);
+ if (resource.editor != NULL)
+ globals.curr_editor = xstrdup(resource.editor);
+
+ free(globals.curr_browser);
+ if (resource.browser != NULL)
+ globals.curr_browser = xstrdup(resource.browser);
+
+ /* fprintf(stderr, "set curr_browser to: |%s|\n", globals.curr_browser); */
+ /* fprintf(stderr, "set curr_editor to: |%s|\n", globals.curr_editor); */
+
+ if (get_xdvi_window_id(False, NULL) && save_user_preferences(False)) {
+ /* if other instances of xdvi are running, make them reread the
+ changed preferences by writing them to ~/.xdvirc.tmp and having
+ them read that file; otherwise they would overwrite the file if
+ user quits them after the current instance.
+ */
+ get_xdvi_window_id(False, reread_prefs_cb);
+ }
+}
+
+static void
+revert_prefs_cb(XtPointer arg)
+{
+ struct topic_info *info = (struct topic_info *)arg;
+ struct prefs_choice *prefs = (struct prefs_choice *)info->data;
+ size_t i;
+
+ /* pop down dependent windows */
+ TRACE_GUI((stderr, "window count: %lu", (unsigned long)prefs->depwin_cnt));
+ for (i = 0; i < prefs->depwin_cnt; i++) {
+ TRACE_GUI((stderr, "popping down %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i])));
+ if (XtIsRealized(prefs->depwin[i])) {
+ XtCallCallbacks(prefs->depwin[i], XmNcancelCallback, NULL);
+ XSync(DISP, True); /* wait for server to catch up */
+ if (XtIsRealized(prefs->depwin[i])) {
+ TRACE_GUI((stderr, "calling XmNokCallback of %lu: %p", (unsigned long)i, (void *)(prefs->depwin[i])));
+ XtCallCallbacks(prefs->depwin[i], XmNokCallback, NULL);
+ }
+ }
+ }
+ free(prefs->depwin);
+ prefs->depwin = NULL;
+ prefs->depwin_cnt = 0;
+
+ if (prefs->db == NULL) { /* callback invoked multiple times, or prefs not changed */
+ return;
+ }
+
+ revert_resources();
+
+ XrmDestroyDatabase(prefs->db);
+ prefs->db = NULL;
+}
+
+static void
+save_prefs_exit(XtPointer arg)
+{
+ struct topic_info *info = (struct topic_info *)arg;
+ apply_prefs_cb(info);
+ XtPopdown(info->shell);
+ XSync(DISP, False);
+ xdvi_exit(EXIT_SUCCESS);
+}
+
+static void
+no_save_prefs_exit(XtPointer arg)
+{
+ struct topic_info *info = (struct topic_info *)arg;
+ revert_prefs_cb(info);
+ XtPopdown(info->shell);
+ XSync(DISP, False);
+ xdvi_exit(EXIT_SUCCESS);
+}
+
+static void
+close_prefs_exit(Widget w, XtPointer arg)
+{
+ struct topic_info *info = (struct topic_info *)arg;
+ struct prefs_choice *prefs = (struct prefs_choice *)info->data;
+ /* Widget dialog; */
+ /* if (get_widget_by_name(&dialog, w, Xdvi_MESSAGE_DIALOG_NAME, True)) { */
+ /* fprintf(stderr, "!!!!!!!!! removing window from deplist!\n"); */
+ /* remove_from_deplist(prefs, dialog); */
+ /* } */
+
+ remove_from_deplist(prefs, w);
+
+}
+
+Boolean
+preferences_changed(void)
+{
+ Widget prefs_shell = 0, topic_pane = 0;
+
+ if (get_widget_by_name(&prefs_shell, globals.widgets.top_level, "preferences_window", False)
+ && get_widget_by_name(&topic_pane, prefs_shell, "topic_pane", False)) {
+ struct topic_info *info = NULL;
+ struct prefs_choice *prefs = NULL;
+
+ XtVaGetValues(topic_pane, XmNuserData, &info, NULL);
+ if (info == NULL) {
+ return False;
+ }
+ prefs = (struct prefs_choice *)info->data;
+ if (prefs->db != NULL) { /* prefs changed */
+
+ Widget popup = choice3_dialog(prefs_shell,
+ MSG_QUESTION, NULL,
+#ifndef MOTIF
+ NULL,
+#endif
+ close_prefs_exit, info, /* pre_callbacks */
+ "Save and Exit", save_prefs_exit, info,
+ "Exit, don't Save", no_save_prefs_exit, info,
+ "Cancel", NULL, NULL,
+ "Preferences have been changed, but not saved yet. "
+ "Save them now?");
+ add_to_deplist(prefs, popup);
+ return True;
+ }
+ }
+
+ return False;
+}
+
+void
+popup_preferences_dialog(Widget parent, int arg)
+{
+ static Widget preferences_shell = 0;
+ static struct topic_info info;
+ static struct topic_item items[NUM_PREFS_TOPICS];
+ static struct prefs_choice *prefs = NULL;
+
+ if (preferences_shell == 0) { /* called 1st time; create widget */
+ info.ok_callback = apply_prefs_cb;
+ info.cancel_callback = revert_prefs_cb;
+ info.items = items;
+ /* info.items_size = NUM_PREFS_TOPICS; */
+
+ prefs = xmalloc(sizeof *prefs);
+ prefs->depwin_cnt = 0;
+ prefs->depwin = NULL;
+ /* prefs->orig = orig_prefs; */
+ /* apply_prefs_cb/revert_prefs_cb are responsible for copying
+ the changed preferences into the current preferences as
+ appropriate, and free()ing prefs.changed */
+ /* prefs->changed = xmalloc(sizeof *(prefs->changed)); */
+ /* copy_resources(orig_prefs, prefs->changed); */
+ prefs->db = NULL; /* XrmGetStringDatabase(""); */
+ info.data = prefs;
+
+ preferences_shell = create_topic_window(parent,
+ "xdvik: Preferences",
+ Xdvi_PREFS_DIALOG_NAME,
+ &info,
+ initialize_items,
+ "OK", "Cancel");
+ info.shell = preferences_shell;
+ center_window(preferences_shell, parent);
+ select_topic(&info, 0);
+ }
+
+ if (arg >= 0)
+ select_topic(&info, arg);
+
+ XtPopup(preferences_shell, XtGrabNone);
+
+ if (resource.no_init_file) {
+ popup_message(preferences_shell,
+ MSG_WARN,
+ NULL,
+ "You specified the resource `noInitFile' or the `-q' command-line option. "
+ "Any preferences that you set in this dialog will be lost when you exit xdvi.");
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs.h b/Build/source/texk/xdvik/gui/xm_prefs.h
new file mode 100644
index 00000000000..0fb4acee4b8
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_H_
+#define XM_PREFS_H_
+
+#ifdef MOTIF
+
+#include "xm_prefsP.h"
+
+extern void popup_preferences_dialog(Widget parent, int arg);
+extern void copy_resources(const struct x_resources *source, struct x_resources *target);
+extern void remove_from_deplist(struct prefs_choice *prefs, Widget w);
+extern void add_to_deplist(struct prefs_choice *prefs, Widget w);
+extern Boolean preferences_changed(void);
+
+#endif
+
+#endif /* XM_PREFS_H_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefsP.h b/Build/source/texk/xdvik/gui/xm_prefsP.h
new file mode 100644
index 00000000000..5c57cb5bf84
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefsP.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * `Private' common header for preferences dialogs.
+ */
+
+#ifndef XM_PREFS_P_H_
+#define XM_PREFS_P_H_
+
+#include "xdvi.h"
+
+#ifdef MOTIF
+/*
+ * For consistency when also using the names for XtNameToWidget() in callbacks
+ */
+/* widget names */
+#define Xdvi_PREFS_DIALOG_NAME "preferences_window"
+#define Xdvi_COLOR_DIALOG_NAME "color_dialog"
+#define Xdvi_COLOR_DIALOG_OLD_SAMPLE_NAME "old_sample"
+#define Xdvi_BROWSER_MENU_NAME "browser_menu"
+#define Xdvi_BROWSER_COMBO_NAME "browser_combo"
+#define Xdvi_EDITOR_MENU_NAME "editor_menu"
+#define Xdvi_EDITOR_COMBO_NAME "editor_combo"
+#define Xdvi_EDITOR_POPUP_NAME "editor_prompt"
+#define Xdvi_EDITOR_POPUP "editor_prompt_popup"
+#define Xdvi_BROWSER_POPUP_NAME "browser_prompt"
+#define Xdvi_BROWSER_POPUP "browser_prompt_popup"
+#define Xdvi_TIPS_STATUSLINE "tips_statusline"
+#define Xdvi_TIPS_POPUPS "tips_popups"
+#define Xdvi_TIPS_DELAY_TEXT "tips_delay_text"
+#define Xdvi_TIPS_DELAY_LABEL1 "tips_delay_label1"
+#define Xdvi_TIPS_DELAY_LABEL2 "tips_delay_label2"
+#define Xdvi_HOME_POSITION_X_OFF_TEXT "x_off_text"
+#define Xdvi_HOME_POSITION_Y_OFF_TEXT "y_off_text"
+#define Xdvi_HOME_POSITION_UNITS_MENU "units_menu"
+#define Xdvi_HOME_POSITION_UNITS_PULLDOWN "units_pulldown"
+#define Xdvi_DARKNESS_SPINBOX "darkness_spinbox"
+#define Xdvi_DARKNESS_TEXT "darkness_text"
+#define Xdvi_SHRINK_SPINBOX "shrink_spinbox"
+#define Xdvi_SHRINK_TEXT "shrink_text"
+#define Xdvi_PAPER_CASCADE "papersize_option"
+#define Xdvi_PAPER_MENU "papersize_menu"
+
+/* widget labels that are also used as widget names */
+#define Xdvi_TB_BUTTONS_FLAT_STR "Flat"
+#define Xdvi_TB_BUTTONS_RAISED_STR "Raised"
+#define Xdvi_GUI_STATUSLINE_STR "Show Statusline"
+#define Xdvi_GUI_TOOLBAR_STR "Show Toolbar"
+#define Xdvi_GUI_PAGELIST_STR "Show Pagelist"
+#define Xdvi_GUI_SCROLLBARS_STR "Show Scrollbars"
+#define Xdvi_MATCH_INVERTED_STR "Inverted"
+#define Xdvi_MATCH_BOXED_STR "Boxed with Highlight Color"
+#define Xdvi_FG_COLOR_STR "Text:"
+#define Xdvi_FG_COLOR_BTN "fg_button"
+#define Xdvi_BG_COLOR_STR "Background:"
+#define Xdvi_BG_COLOR_BTN "bg_button"
+#define Xdvi_HL_COLOR_BTN "hl_button"
+#define Xdvi_VISITED_LINKS_STR "Visited Links:"
+#define Xdvi_VISITED_LINKS_BTN "visited_links_button"
+#define Xdvi_UNVISITED_LINKS_STR "Unvisited Links:"
+#define Xdvi_UNVISITED_LINKS_BTN "unvisited_links_button"
+#define Xdvi_DOCUMENT_COLORS_STR "Use Document Colors"
+#define Xdvi_LINKS_UNDERLINED_STR "Underlined"
+#define Xdvi_ADD_COMMAND_STR "Other ..."
+#define Xdvi_SCROLL_KEEP_STR "Keep current position"
+#define Xdvi_SCROLL_UNKEEP_STR "Scroll back to home position of page"
+#define Xdvi_HOME_POSITION_STR "Home position at:"
+#define Xdvi_HOME_POSITION_X_STR "x"
+#define Xdvi_HOME_POSITION_Y_STR "y"
+#define Xdvi_SCROLL_CURRENT_STR "Use current position as home position"
+#define Xdvi_REMEMBER_WINDOWSIZE_STR "Remember current window size"
+#define Xdvi_PAPER_PORTRAIT_STR "Portrait"
+#define Xdvi_PAPER_LANDSCAPE_STR "Landscape"
+#define Xdvi_APPLY_STR "Apply"
+
+#define Xdvi_PREFS_BROWSER_DEFAULTS \
+ "xdg-open %s\n" \
+ "htmlview %s\n" \
+ "firefox -remote \"openURL(%s,new-window)\"\n" \
+ "mozilla -remote \"openURL(%s,new-window)\"\n" \
+ "netscape -raise -remote \"openURL(%s,new-window)\"\n" \
+ "xterm -e w3m %s\n" \
+ "xterm -e lynx %s\n" \
+ "xterm -e wget %s\n" \
+ Xdvi_ADD_COMMAND_STR
+#define Xdvi_PREFS_EDITOR_DEFAULTS \
+ "gnuclient -q +%l %f\n" \
+ "emacsclient --no-wait +%l %f\n" \
+ "gvim --servername xdvi --remote +%l %f\n" \
+ "nc -noask +%l %f\n" \
+ "xterm -e vi +%l %f\n" \
+ Xdvi_ADD_COMMAND_STR
+
+struct prefs_choice {
+ XrmDatabase db;
+/* struct x_resources *orig; */
+/* struct x_resources *changed; */
+ Widget *depwin;
+ size_t depwin_cnt;
+};
+
+extern void h_attach_below(Widget x, Widget y);
+extern void h_update_hyperlinks(Widget w, Pixel pix); /* implemented in xm_prefs_fonts.c */
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_P_H_ */
+
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_appearance.c b/Build/source/texk/xdvik/gui/xm_prefs_appearance.c
new file mode 100644
index 00000000000..326b11b3143
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_appearance.c
@@ -0,0 +1,540 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Panel 1 (Apperance) for xdvik preferences dialog.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "my-snprintf.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "message-window.h"
+#include "util.h"
+#include "events.h"
+
+#include "xm_toolbar.h"
+#include "xm_menu.h"
+#include "statusline.h"
+#include "pagesel.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs_appearance.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+/*
+ * Handy defaults
+ */
+static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY };
+static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY };
+static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD };
+static Arg two_cols[] = {
+ { XmNpacking, XmPACK_TIGHT },
+ { XmNnumColumns, 2 },
+ { XmNorientation, XmHORIZONTAL }
+};
+static Arg two_cols_fixed[] = {
+ { XmNpacking, XmPACK_COLUMN },
+ { XmNnumColumns, 2 }
+};
+
+static void
+match_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+ Widget inverted, boxed;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ resource.match_highlight_inverted = !resource.match_highlight_inverted;
+
+ /* force a redraw so that a current match is updated if there was one */
+ globals.ev.flags |= EV_NEWPAGE;
+
+ store_preference(&(prefs->db), "matchInverted", "%s",
+ resource.match_highlight_inverted ? "True" : "False");
+
+ if (get_widget_by_name(&inverted, info->shell, Xdvi_MATCH_INVERTED_STR, True)
+ && get_widget_by_name(&boxed, info->shell, Xdvi_MATCH_BOXED_STR, True)) {
+
+ XmToggleButtonGadgetSetState(inverted, resource.match_highlight_inverted, False);
+ XmToggleButtonGadgetSetState(boxed, !resource.match_highlight_inverted, False);
+ }
+}
+
+static void
+tooltips_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+ const char *w_name = XtName(w);
+
+ UNUSED(call_data);
+
+ if (strcmp(w_name, Xdvi_TIPS_STATUSLINE) == 0) {
+ resource.tooltips_in_statusline = !resource.tooltips_in_statusline;
+ store_preference(&(prefs->db), "tooltipsInStatusline", "%s",
+ resource.tooltips_in_statusline ? "True" : "False");
+ }
+ else if (strcmp(w_name, Xdvi_TIPS_POPUPS) == 0) {
+ Widget label1, text, label2;
+
+ resource.show_tooltips = !resource.show_tooltips;
+
+ if (!resource.show_tooltips && resource.tooltips_wait_period >= 0) {
+ if (resource.tooltips_wait_period == 0)
+ resource.tooltips_wait_period = -1;
+ else
+ resource.tooltips_wait_period = -resource.tooltips_wait_period;
+ }
+ else if (resource.show_tooltips && resource.tooltips_wait_period < 0) {
+ resource.tooltips_wait_period = -resource.tooltips_wait_period;
+ }
+ store_preference(&(prefs->db), "showTooltips", "%s", resource.show_tooltips ? "True" : "False");
+
+ if (get_widget_by_name(&label1, info->shell, Xdvi_TIPS_DELAY_LABEL1, True)
+ && get_widget_by_name(&text, info->shell, Xdvi_TIPS_DELAY_TEXT, True)
+ && get_widget_by_name(&label2, info->shell, Xdvi_TIPS_DELAY_LABEL2, True)) {
+
+ XtSetSensitive(label1, resource.show_tooltips);
+ XtSetSensitive(text, resource.show_tooltips);
+ XtSetSensitive(label2, resource.show_tooltips);
+ }
+ }
+ else if (strcmp(w_name, Xdvi_TIPS_DELAY_TEXT) == 0) {
+ char *buf = XmTextFieldGetString(w);
+ int val = strtol(buf, (char **)NULL, 10);
+ XtFree((char *)buf);
+ TRACE_GUI((stderr, "tooltips_cb wait period2: %d\n", val));
+
+ resource.tooltips_wait_period = val;
+ store_preference(&(prefs->db), "tipShell.waitPeriod", "%d", val);
+
+ }
+ else {
+ XDVI_WARNING((stderr, "unexpected widget name `%s' in tooltips_cb", XtName(w)));
+ }
+
+}
+
+#if 0
+static void
+toolbar_buttons_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct x_resources *res = (struct x_resources *)(info->data);
+ Boolean is_flat = False, is_raised = False;
+
+ Widget flat_b, raised_b;
+
+ UNUSED(call_data);
+
+ if (!get_widget_by_name(&flat_b, XtParent(w), TB_BUTTONS_FLAT_STR, True) ||
+ !get_widget_by_name(&raised_b, XtParent(w), TB_BUTTONS_RAISED_STR, True))
+ return;
+
+ if (w == flat_b) {
+ is_flat = True;
+ }
+ else if (w == raised_b) {
+ is_raised = True;
+ }
+ else {
+ unexpected_widget_in_callback(w, "toolbar_buttons_cb()");
+ return;
+ }
+
+ res->toolbar_buttons_raised = is_raised ? True : False;
+
+ XmToggleButtonGadgetSetState(raised_b, is_raised, False);
+ XmToggleButtonGadgetSetState(flat_b, is_flat, False);
+}
+#endif /* 0 */
+
+void update_preferences_expert(void)
+{
+ Widget shell;
+ Widget statusline_b, toolbar_b, pagelist_b, scrollbars_b;
+
+ /* it's not an error if the prefs dialog doesn't exist yet */
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&statusline_b, shell, Xdvi_GUI_STATUSLINE_STR, True)
+ && get_widget_by_name(&toolbar_b, shell, Xdvi_GUI_TOOLBAR_STR, True)
+ && get_widget_by_name(&pagelist_b, shell, Xdvi_GUI_PAGELIST_STR, True)
+ && get_widget_by_name(&scrollbars_b, shell, Xdvi_GUI_SCROLLBARS_STR, True)) {
+
+ XmToggleButtonGadgetSetState(statusline_b, resource.expert_mode & XPRT_SHOW_STATUSLINE ? True : False, False);
+ XmToggleButtonGadgetSetState(toolbar_b, resource.expert_mode & XPRT_SHOW_TOOLBAR ? True : False, False);
+ XmToggleButtonGadgetSetState(pagelist_b, resource.expert_mode & XPRT_SHOW_PAGELIST ? True : False, False);
+ XmToggleButtonGadgetSetState(scrollbars_b, resource.expert_mode & XPRT_SHOW_SCROLLBARS ? True : False, False);
+ }
+}
+
+void update_preferences_tooltips(void)
+{
+ Widget shell;
+ Widget statusline_b, popup_b, label1, text, label2;
+
+ if (resource.toolbar_unusable)
+ return;
+
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True)
+ && get_widget_by_name(&statusline_b, shell, Xdvi_TIPS_STATUSLINE, True)
+ && get_widget_by_name(&popup_b, shell, Xdvi_TIPS_POPUPS, True)
+ && get_widget_by_name(&label1, shell, Xdvi_TIPS_DELAY_LABEL1, True)
+ && get_widget_by_name(&text, shell, Xdvi_TIPS_DELAY_TEXT, True)
+ && get_widget_by_name(&label2, shell, Xdvi_TIPS_DELAY_LABEL2, True)) {
+
+ char buf[LENGTH_OF_INT];
+
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", ABS(resource.tooltips_wait_period));
+ XtVaSetValues(text, XmNvalue, buf, NULL);
+
+ XmToggleButtonGadgetSetState(statusline_b, resource.tooltips_in_statusline, False);
+ XmToggleButtonGadgetSetState(popup_b, resource.show_tooltips, False);
+
+ XtSetSensitive(label1, resource.show_tooltips);
+ XtSetSensitive(text, resource.show_tooltips);
+ XtSetSensitive(label2, resource.show_tooltips);
+ }
+}
+
+void update_preferences_search(void)
+{
+ Widget shell;
+ Widget inverted, boxed;
+
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, True)
+ && get_widget_by_name(&inverted, shell, Xdvi_MATCH_INVERTED_STR, True)
+ && get_widget_by_name(&boxed, shell, Xdvi_MATCH_BOXED_STR, True)) {
+
+ XmToggleButtonGadgetSetState(inverted, resource.match_highlight_inverted, False);
+ XmToggleButtonGadgetSetState(boxed, !resource.match_highlight_inverted, False);
+ }
+}
+
+static void
+gui_buttons_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+ char *name = XtName(w);
+
+ UNUSED(call_data);
+
+ if (strcmp(name, Xdvi_GUI_STATUSLINE_STR) == 0) {
+ resource.expert_mode ^= XPRT_SHOW_STATUSLINE;
+ toggle_statusline();
+ update_expert_mode();
+ }
+ else if (strcmp(name, Xdvi_GUI_TOOLBAR_STR) == 0) {
+ resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
+ toggle_toolbar();
+ update_expert_mode();
+ }
+ else if (strcmp(name, Xdvi_GUI_PAGELIST_STR) == 0) {
+ resource.expert_mode ^= XPRT_SHOW_PAGELIST;
+ toggle_pagelist();
+ update_expert_mode();
+ }
+ else if (strcmp(name, Xdvi_GUI_SCROLLBARS_STR) == 0) {
+#if defined(LESSTIF_VERSION)
+ static Boolean warned_about_lesstif = False;
+#endif
+ resource.expert_mode ^= XPRT_SHOW_SCROLLBARS;
+ toggle_scrollbars();
+ update_expert_mode();
+#if defined(LESSTIF_VERSION)
+ if (!warned_about_lesstif) {
+ warned_about_lesstif = True;
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ NULL,
+ "This version has been compiled with LessTif; "
+ "toggling the scrollbars won't work with LessTif.");
+ }
+#endif
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ REPORT_XDVI_BUG_TEMPLATE,
+ "Unexpected label in gui buttons: |%s|!\n", name);
+ }
+ store_preference(&(prefs->db), "expertMode", "%d", resource.expert_mode);
+}
+
+
+#if 0
+static void
+toolbar_buttons_init(struct topic_info *info, Widget raised, Widget flat)
+{
+ Boolean is_flat = False, is_raised = False;
+ struct x_resources *res = (struct x_resources *)(info->data);
+
+ if (res->toolbar_buttons_raised)
+ is_raised = True;
+
+ XmToggleButtonGadgetSetState(raised, is_raised, False);
+ XmToggleButtonGadgetSetState(flat, is_flat, False);
+
+ XtAddCallback(flat, XmNvalueChangedCallback, toolbar_buttons_cb, (XtPointer)info);
+ XtAddCallback(raised, XmNvalueChangedCallback, toolbar_buttons_cb, (XtPointer)info);
+}
+#endif /* 0 */
+
+
+Widget
+prefs_appearance(struct topic_info *info)
+{
+ Widget form;
+ Widget gui_frame, gui_label, gui_rowcol,
+ gui_statusline, gui_toolbar, gui_pagelist, gui_scrollbars;
+ Widget tips_frame, tips_label, tips_form, tips_statusline;
+ Widget tips_popups, tips_delay_text, tips_delay_label1, tips_delay_label2;
+ Widget match_frame, match_label, match_rowcol, match_inverted, match_boxed;
+#if 0
+ Widget tb_buttons_frame, tb_buttons_label, tb_buttons_rowcol,
+ tb_buttons_flat, tb_buttons_raised;
+#endif
+ XmString str;
+ char buf[LENGTH_OF_INT];
+ Arg args[10];
+ int n;
+
+ form = XmCreateForm(info->right_form, "appearance_form", NULL, 0);
+ h_attach_below(form, NULL);
+
+ n = 0;
+ XtSetArg(args[n], XmNmarginWidth, 8); n++;
+ XtSetArg(args[n], XmNmarginHeight, 4); n++;
+ gui_frame = XmCreateFrame(form, "gui_frame", args, n);
+ h_attach_below(gui_frame, NULL);
+
+ gui_label = XmCreateLabelGadget(gui_frame, "Window Configuration", &frame_title, 1);
+ XtManageChild(gui_label);
+
+ gui_rowcol = XmCreateRowColumn(gui_frame, "gui_rowcol", two_cols_fixed, XtNumber(two_cols_fixed));
+ XtManageChild(gui_rowcol);
+
+ gui_statusline = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_STATUSLINE_STR, &n_of_many, 1);
+ XmToggleButtonGadgetSetState(gui_statusline, resource.expert_mode & XPRT_SHOW_STATUSLINE ? True : False, False);
+ XtManageChild(gui_statusline);
+
+ gui_toolbar = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_TOOLBAR_STR, &n_of_many, 1);
+ XmToggleButtonGadgetSetState(gui_toolbar, resource.expert_mode & XPRT_SHOW_TOOLBAR ? True : False, False);
+ XtManageChild(gui_toolbar);
+
+ gui_pagelist = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_PAGELIST_STR, &n_of_many, 1);
+ XmToggleButtonGadgetSetState(gui_pagelist, resource.expert_mode & XPRT_SHOW_PAGELIST ? True : False, False);
+ XtManageChild(gui_pagelist);
+
+ gui_scrollbars = XmCreateToggleButtonGadget(gui_rowcol, Xdvi_GUI_SCROLLBARS_STR, &n_of_many, 1);
+ XmToggleButtonGadgetSetState(gui_scrollbars, resource.expert_mode & XPRT_SHOW_SCROLLBARS ? True : False, False);
+ XtManageChild(gui_scrollbars);
+
+ XtAddCallback(gui_statusline, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info);
+ XtAddCallback(gui_toolbar, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info);
+ XtAddCallback(gui_pagelist, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info);
+ XtAddCallback(gui_scrollbars, XmNvalueChangedCallback, gui_buttons_cb, (XtPointer)info);
+
+ n = 0;
+ XtSetArg(args[n], XmNmarginWidth, 8); n++;
+ XtSetArg(args[n], XmNmarginHeight, 4); n++;
+ XtSetArg(args[n], XmNtopOffset, 10); n++;
+ tips_frame = XmCreateFrame(form, "tips_frame", args, n);
+ h_attach_below(tips_frame, gui_frame);
+
+ tips_label = XmCreateLabelGadget(tips_frame, "Show Tooltips", &frame_title, 1);
+ XtManageChild(tips_label);
+
+ tips_form = XmCreateForm(tips_frame, "tips_form", NULL, 0);
+
+ str = XmStringCreateLocalized("As Text in Statusline");
+ tips_statusline = XtVaCreateManagedWidget(Xdvi_TIPS_STATUSLINE,
+ xmToggleButtonGadgetClass, tips_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNset, True,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ XmStringFree(str);
+
+ str = XmStringCreateLocalized("As Popups");
+ tips_popups = XtVaCreateManagedWidget(Xdvi_TIPS_POPUPS,
+ xmToggleButtonGadgetClass, tips_form,
+ XmNlabelString, str,
+ XmNindicatorType, XmN_OF_MANY,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, tips_statusline,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ XmStringFree(str);
+
+ str = XmStringCreateLocalized("with");
+ tips_delay_label1 = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_LABEL1,
+ xmLabelGadgetClass, tips_form,
+ XmNlabelString, tips_form,
+ XmNlabelString, str,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, tips_statusline,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, tips_popups,
+ XmNleftOffset, 0, /* no spacing to prev text */
+ NULL);
+ XmStringFree(str);
+
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", ABS(resource.tooltips_wait_period));
+
+ tips_delay_text = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_TEXT,
+ xmTextFieldWidgetClass, tips_form,
+ XmNcolumns, 4,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, tips_statusline,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, tips_delay_label1,
+ XmNvalue, buf,
+ NULL);
+
+ str = XmStringCreateLocalized("milliseconds delay");
+ tips_delay_label2 = XtVaCreateManagedWidget(Xdvi_TIPS_DELAY_LABEL2,
+ xmLabelGadgetClass, tips_form,
+ XmNlabelString, str,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, tips_statusline,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, tips_delay_text,
+ NULL);
+
+ adjust_heights(tips_popups, tips_delay_label1, tips_delay_text, tips_delay_label2, NULL);
+
+ XmToggleButtonGadgetSetState(tips_statusline, resource.tooltips_in_statusline, False);
+ XmToggleButtonGadgetSetState(tips_popups, resource.show_tooltips, False);
+
+ if (resource.toolbar_unusable) {
+ XtSetSensitive(tips_frame, False);
+ }
+ else {
+ XtSetSensitive(tips_delay_label1, resource.show_tooltips);
+ XtSetSensitive(tips_delay_text, resource.show_tooltips);
+ XtSetSensitive(tips_delay_label2, resource.show_tooltips);
+
+ XtAddCallback(tips_statusline, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info);
+ XtAddCallback(tips_popups, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info);
+ XtAddCallback(tips_delay_text, XmNvalueChangedCallback, tooltips_cb, (XtPointer)info);
+ }
+
+#if 0
+ tb_buttons_frame = XmCreateFrame(form, "tb_buttons_frame", &v_off, 1);
+ h_attach_below(tb_buttons_frame, tips_frame);
+
+ tb_buttons_label = XmCreateLabelGadget(tb_buttons_frame, "Toolbar Buttons:", &frame_title, 1);
+ XtManageChild(tb_buttons_label);
+
+ tb_buttons_rowcol = XmCreateRowColumn(tb_buttons_frame, "tb_buttons_rowcol", two_cols, XtNumber(two_cols));
+ XtManageChild(tb_buttons_rowcol);
+
+ tb_buttons_raised = XmCreateToggleButtonGadget(tb_buttons_rowcol, "Raised", &one_of_many, 1);
+ XtManageChild(tb_buttons_raised);
+
+ tb_buttons_flat = XmCreateToggleButtonGadget(tb_buttons_rowcol, "Flat", &one_of_many, 1);
+ XtManageChild(tb_buttons_flat);
+ toolbar_buttons_init((XtPointer)info, tb_buttons_raised, tb_buttons_flat);
+#endif /* 0 */
+
+ n = 0;
+ XtSetArg(args[n], XmNmarginWidth, 8); n++;
+ XtSetArg(args[n], XmNmarginHeight, 4); n++;
+ XtSetArg(args[n], XmNtopOffset, 10); n++;
+ match_frame = XmCreateFrame(form, "match_frame", args, n);
+ XtVaSetValues(match_frame,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, tips_frame,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ match_label = XmCreateLabelGadget(match_frame, "String Matches are shown:", &frame_title, 1);
+ XtManageChild(match_label);
+
+ match_rowcol = XmCreateRowColumn(match_frame, "tb_buttons_rowcol", two_cols, XtNumber(two_cols));
+ XtManageChild(match_rowcol);
+
+ match_inverted = XmCreateToggleButtonGadget(match_rowcol, Xdvi_MATCH_INVERTED_STR, &one_of_many, 1);
+ XtManageChild(match_inverted);
+
+ match_boxed = XmCreateToggleButtonGadget(match_rowcol, Xdvi_MATCH_BOXED_STR, &one_of_many, 1);
+ XtManageChild(match_boxed);
+
+ XmToggleButtonGadgetSetState(match_inverted, resource.match_highlight_inverted, False);
+ XmToggleButtonGadgetSetState(match_boxed, !resource.match_highlight_inverted, False);
+
+ XtAddCallback(match_inverted, XmNvalueChangedCallback, match_cb, (XtPointer)info);
+ XtAddCallback(match_boxed, XmNvalueChangedCallback, match_cb, (XtPointer)info);
+
+ /* manage children (order shouldn't matter, since children are already managed, but ...) */
+ XtManageChild(gui_frame);
+
+ XtManageChild(tips_form);
+ XtManageChild(tips_frame);
+
+#if 0
+ XtManageChild(tb_buttons_frame);
+#endif
+
+ XtManageChild(match_frame);
+
+ XtManageChild(form);
+
+ return form;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_appearance.h b/Build/source/texk/xdvik/gui/xm_prefs_appearance.h
new file mode 100644
index 00000000000..1c94a184d3c
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_appearance.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_APPEARANCE_
+#define XM_PREFS_APPEARANCE_
+
+#ifdef MOTIF
+
+struct topic_info; /* forward declaration */
+extern Widget prefs_appearance(struct topic_info *info);
+extern void update_preferences_expert(void);
+extern void update_preferences_tooltips(void);
+extern void update_preferences_search(void);
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_APPEARANCE_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_fonts.c b/Build/source/texk/xdvik/gui/xm_prefs_fonts.c
new file mode 100644
index 00000000000..ac1868bcc57
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_fonts.c
@@ -0,0 +1,692 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Panel 2 (Fonts and colors) for xdvik preferences dialog.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "util.h"
+#include "events.h"
+#include "hypertex.h"
+#include "my-snprintf.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs_fonts.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+
+#if USE_SPINBOX
+#include <Xm/SpinB.h>
+#endif
+
+/*
+ * Handy defaults
+ */
+static Arg v_off = { XmNtopOffset, 10 };
+static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY };
+static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD };
+
+
+static void
+underline_toggle_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *tinfo = (struct topic_info *)client_data;
+ struct prefs_choice *prefs;
+ Boolean is_set;
+
+ UNUSED(call_data);
+
+ ASSERT(tinfo != NULL, "struct topic_info * in underline_toggle_cb mustn't be NULL!");
+ prefs = (struct prefs_choice *)tinfo->data;
+
+ XtVaGetValues(w, XmNset, &is_set, NULL);
+ if (is_set)
+ resource.link_style |= 1;
+ else
+ resource.link_style &= ~1;
+
+ store_preference(&(prefs->db), "linkStyle", "%d", resource.link_style);
+
+ /* update display */
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+static void
+colorspecial_toggle_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *tinfo = (struct topic_info *)client_data;
+ struct prefs_choice *prefs;
+
+ UNUSED(w);
+ /* UNUSED(client_data); */
+ UNUSED(call_data);
+
+ ASSERT(tinfo != NULL, "struct topic_info * in colorspecial_toggle_cb mustn't be NULL!");
+ prefs = (struct prefs_choice *)tinfo->data;
+
+ do_toggle_color(False);
+ store_preference(&(prefs->db), "color", "%s", resource.use_color ? "True" : "False");
+}
+
+static void
+darkness_text_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ char *text;
+ int val;
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+#if USE_SPINBOX
+ /* synchronize internal spinbox value. Apparently this loses the insertion position,
+ so we need to save it and set it again. */
+ XmTextPosition pos = XmTextFieldGetInsertionPosition(w);
+
+ UNUSED(call_data);
+ text = XmTextFieldGetString(w);
+ val = strtol(text, (char **)NULL, 10);
+
+ if (val != 0) {
+ XtVaSetValues(w, XmNposition, val, NULL);
+ XmTextFieldSetInsertionPosition(w, pos);
+ }
+#else
+ Widget text_field;
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XmNuserData, &text_field, NULL);
+ XtVaGetValues(text_field, XmNvalue, &text, NULL);
+ val = strtol(text, (char **)NULL, 10);
+#endif
+ if (XtIsRealized(w)) {
+ do_set_density(val / 100.0, True, False);
+ store_preference(&(prefs->db), "gamma", "%f", val / 100.0);
+ }
+ XtFree(text);
+}
+
+
+#if 0 /* currently unused */
+static void
+darkness_spinbox_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ int val;
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XmNposition, &val, NULL);
+ if (XtIsRealized(w)) {
+ do_set_density(val / 100.0, True, False);
+ /* fprintf(stderr, "storing pref: %d\n", val); */
+ store_preference(&(prefs->db), "gamma", "%f", val / 100.0);
+ }
+
+}
+#endif /* currently unused */
+
+
+void
+h_update_hyperlinks(Widget w, Pixel pix)
+{
+ const char *name = XtName(w);
+ int type = 0;
+
+ if (strcmp(name, Xdvi_UNVISITED_LINKS_BTN) == 0) {
+ type = 1;
+ }
+ else if (strcmp(name, Xdvi_VISITED_LINKS_BTN) == 0) {
+ type = 2;
+ }
+
+ /* fprintf(stderr, "WIDGET: |%s|; type: %d\n", name, type); */
+
+ if (type != 0) {
+ GC new_gc = set_or_make_gc(NULL, GXcopy, pix, resource.back_Pixel);
+ GC old_gc;
+ double r, g, b;
+ double factor = 65535.0;
+ XColor color;
+
+ pixel_to_color(pix, &color, DISP, G_colormap);
+ r = color.red / factor;
+ g = color.green / factor;
+ b = color.blue / factor;
+
+ if (type == 1) {
+ old_gc = globals.gc.linkcolor;
+ sprintf(g_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b);
+ }
+ else {
+ old_gc = globals.gc.visited_linkcolor;
+ sprintf(g_visited_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b);
+ }
+
+ if (type == 1) {
+ globals.gc.linkcolor = new_gc;
+ XFreeGC(XtDisplay(w), old_gc);
+ }
+ else {
+ globals.gc.visited_linkcolor = new_gc;
+ XFreeGC(XtDisplay(w), old_gc);
+ }
+ /* update display */
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+ }
+}
+
+static void
+redraw_or_push_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ XmDrawnButtonCallbackStruct *cbs = (XmDrawnButtonCallbackStruct *)call_data;
+ static GC border_gc = 0;
+ struct color_button_info *cinfo;
+ Pixel pix = (Pixel)client_data;
+
+ if (cbs == NULL) {
+ XDVI_WARNING((stderr, "cinfo mustn't be NULL in redraw_or_push_cb!\n"));
+ return;
+ }
+
+ /* this can also be called via XtCallCallbacks, without call_data */
+ if (cbs->reason == XmCR_EXPOSE) {
+ /* redraw button label */
+ Dimension high_thick, st, wd, ht;
+ Dimension inner_w, inner_h, off_x, off_y;
+ GC label_gc;
+ XGCValues values;
+
+ XtVaGetValues(w,
+ XmNhighlightThickness, &high_thick,
+ XmNshadowThickness, &st,
+ XmNwidth, &wd,
+ XmNheight, &ht,
+ XmNuserData, &cinfo,
+ NULL);
+
+ values.function = GXcopy;
+
+ if (border_gc == 0) {
+ /* create the static GC for drawing the border - Note: never free'd! */
+ values.foreground = BlackPixelOfScreen(XtScreen(w));
+ /* values.line_width = 2; */
+ /* note: never free'd! */
+ border_gc = XCreateGC(XtDisplay(w), XtWindow(w),
+ GCFunction | GCForeground /* | GCLineWidth */, &values);
+ }
+ values.foreground = cinfo->pixel;
+ label_gc = XCreateGC(XtDisplay(w), XtWindow(w),
+ GCFunction | GCForeground, &values);
+
+ off_x = high_thick + st + 4;
+ inner_w = wd - 2 * off_x;
+ off_y = high_thick + st + 4;
+ inner_h = ht - 2 * off_y;
+#if 0
+ fprintf(stderr, "shadow: %d, high: %d\n", st, high_thick);
+ fprintf(stderr, "width: %d, height: %d\n", wd, ht);
+ fprintf(stderr, "inner w: %d, inner h: %d\n", inner_w, inner_h);
+#endif
+
+ XFillRectangle(XtDisplay(w), XtWindow(w), label_gc,
+ off_x, off_y, inner_w, inner_h);
+ XDrawRectangle(XtDisplay(w), XtWindow(w), border_gc,
+ off_x - 1, off_y - 1, inner_w + 1, inner_h + 1);
+ XFreeGC(XtDisplay(w), label_gc);
+
+ if (pix != cinfo->pixel) {
+ h_update_hyperlinks(w, cinfo->pixel);
+ }
+ }
+ else if (cbs->reason == XmCR_ACTIVATE) {
+ /* pushed, open color dialog */
+ XtVaGetValues(w, XmNuserData, &cinfo, NULL);
+ if (cinfo != NULL) {
+ cinfo->w = w;
+ popup_color_dialog(globals.widgets.top_level, cinfo);
+ }
+ else {
+ XDVI_WARNING((stderr, "cinfo mustn't be NULL in redraw_or_push_cb!\n"));
+ return;
+ }
+ }
+ /* else, XmCR_RESIZE - nothing to do */
+}
+
+static Widget
+h_create_colorsample(Widget parent, Widget left,
+ const char *name,
+ const char *resource_name,
+ Pixel pix,
+ struct topic_info *info)
+{
+ struct color_button_info *cinfo = xmalloc(sizeof *cinfo); /* note: never free()d */
+ Widget button;
+
+ UNUSED(left);
+
+ cinfo->pixel = pix;
+ cinfo->tinfo = info;
+ cinfo->resource_name = xstrdup(resource_name); /* note: never free()d */
+
+ button = XtVaCreateManagedWidget(name, xmDrawnButtonWidgetClass, parent,
+ XtNwidth, 42,
+ XtNheight, 28,
+ XmNuserData, cinfo,
+ /* we want the normal button look here to
+ make it obvious that users can press it */
+ XmNshadowType, XmSHADOW_OUT,
+ XmNpushButtonEnabled, True,
+ NULL);
+ XtAddCallback(button, XmNactivateCallback, redraw_or_push_cb, (XtPointer)pix);
+ XtAddCallback(button, XmNexposeCallback, redraw_or_push_cb, (XtPointer)pix);
+ XtAddCallback(button, XmNresizeCallback, redraw_or_push_cb, (XtPointer)pix);
+
+ return button;
+}
+
+
+static Widget
+h_create_fonts_frame(Widget top, struct topic_info *info)
+{
+ Widget darkness_form, darkness_label;
+
+ UNUSED(info);
+
+ darkness_form = XmCreateForm(top, "darkness_form", NULL, 0);
+ XtVaSetValues(darkness_form,
+ XmNverticalSpacing, 10,
+ XmNhorizontalSpacing, 10,
+ NULL);
+
+
+ darkness_label = XmCreateLabelGadget(darkness_form, "Font Darkness: ", NULL, 0);
+ XtVaSetValues(darkness_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtManageChild(darkness_label);
+ {
+ Widget darkness_text;
+#if USE_SPINBOX
+ Widget darkness_spinbox = XmCreateSpinBox(darkness_form, Xdvi_DARKNESS_SPINBOX, NULL, 0);
+ darkness_text = XmCreateTextField(darkness_spinbox, Xdvi_DARKNESS_TEXT, NULL, 0);
+ XtVaSetValues(darkness_spinbox,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, darkness_label,
+ XmNinitialDelay, 200,
+ XmNrepeatDelay, 50,
+ NULL);
+ XtVaSetValues(darkness_text,
+ XmNspinBoxChildType, XmNUMERIC,
+ XmNminimumValue, 0,
+ XmNmaximumValue, 1000,
+ XmNeditable, True,
+ XmNcolumns, 4,
+ XmNincrementValue, 1,
+ XmNwrap, False, /* too confusing */
+ XmNposition, (int)(resource.gamma * 100.0 + 0.5),
+ NULL);
+ XtAddCallback(darkness_text, XmNactivateCallback, darkness_text_cb, (XtPointer)info);
+ XtAddCallback(darkness_text, XmNvalueChangedCallback, darkness_text_cb, (XtPointer)info);
+
+ adjust_heights(darkness_spinbox, darkness_text, darkness_label, NULL);
+
+ XtManageChild(darkness_text);
+ XtManageChild(darkness_spinbox);
+#else
+ char buf[LENGTH_OF_INT];
+ Widget darkness_button;
+ darkness_text = XmCreateTextField(darkness_form, Xdvi_DARKNESS_TEXT, NULL, 0);
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", (int)(resource.gamma * 100.0 + 0.5));
+ XtVaSetValues(darkness_text,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, darkness_label,
+ XmNcolumns, 4,
+ XmNvalue, buf,
+ XmNuserData, darkness_text,
+ NULL);
+ XtOverrideTranslations(darkness_text, XtParseTranslationTable("<Key>Return:activate()"));
+ XtAddCallback(darkness_text, XmNactivateCallback, darkness_text_cb, (XtPointer)info);
+
+ darkness_button = XmCreatePushButton(darkness_form, Xdvi_APPLY_STR, NULL, 0);
+ XtVaSetValues(darkness_button,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, darkness_text,
+ XmNuserData, darkness_text,
+ NULL);
+ XtAddCallback(darkness_button, XmNactivateCallback, darkness_text_cb, (XtPointer)info);
+
+ adjust_heights(darkness_label, darkness_text, darkness_button, NULL);
+ XtManageChild(darkness_text);
+ XtManageChild(darkness_button);
+#endif
+ }
+
+ /* XtManageChild(darkness_form); */
+
+ return darkness_form;
+}
+
+static Widget
+h_create_colors_form(Widget top, struct topic_info *info)
+{
+ Widget text_bg_frame, text_bg_label, text_bg_form;
+ Widget links_frame, links_label, links_form;
+ Widget fg_label, fg_button;
+ Widget bg_label, bg_button;
+ Widget unvisited_label, unvisited_button;
+ Widget visited_label, visited_button;
+ Widget underline_toggle;
+ Widget colorspecials_toggle;
+
+ Widget form = XmCreateForm(top, "colors_form", NULL, 0);
+ Pixel visited_link_pix, link_pix;
+
+ str_to_pixel(top, resource.visited_link_color, &visited_link_pix);
+ str_to_pixel(top, resource.link_color, &link_pix);
+
+ text_bg_frame = XmCreateFrame(form, "text_bg_frame", NULL, 0);
+ XtVaSetValues(text_bg_frame,
+ XmNmarginWidth, 10,
+ XmNmarginHeight, 10,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_POSITION,
+ XmNrightPosition, 50,
+ XmNrightOffset, 10,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ text_bg_label = XmCreateLabelGadget(text_bg_frame, "Text Color", &frame_title, 1);
+ XtManageChild(text_bg_label);
+
+ text_bg_form = XmCreateForm(text_bg_frame, "fg_form", NULL, 0);
+ XtVaSetValues(text_bg_form, XmNverticalSpacing, 2, NULL);
+
+ fg_label = XmCreateLabelGadget(text_bg_form, Xdvi_FG_COLOR_STR, NULL, 0);
+ fg_button = h_create_colorsample(text_bg_form, fg_label,
+ Xdvi_FG_COLOR_BTN, "foreground",
+ resource.fore_Pixel, info);
+ XtVaSetValues(fg_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues(fg_button,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_NONE,
+ NULL);
+ adjust_heights(fg_label, fg_button, NULL);
+ XtManageChild(fg_label);
+ XtManageChild(fg_button);
+
+ bg_label = XmCreateLabelGadget(text_bg_form, Xdvi_BG_COLOR_STR, NULL, 0);
+ bg_button = h_create_colorsample(text_bg_form, bg_label,
+ Xdvi_BG_COLOR_BTN, "background",
+ resource.back_Pixel, info);
+ XtVaSetValues(bg_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, fg_label,
+ NULL);
+ XtVaSetValues(bg_button,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_NONE,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, fg_label,
+ NULL);
+ adjust_heights(bg_label, bg_button, NULL);
+ XtManageChild(bg_label);
+ XtManageChild(bg_button);
+
+ colorspecials_toggle = XmCreateToggleButtonGadget(text_bg_form, Xdvi_DOCUMENT_COLORS_STR, &n_of_many, 1);
+ XtVaSetValues(colorspecials_toggle,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, bg_label,
+ NULL);
+ XtManageChild(colorspecials_toggle);
+ XmToggleButtonGadgetSetState(colorspecials_toggle, resource.use_color, False);
+ XtAddCallback(colorspecials_toggle, XmNvalueChangedCallback, colorspecial_toggle_cb, (XtPointer)info);
+
+ links_frame = XmCreateFrame(form, "links_frame", NULL, 0);
+ XtVaSetValues(links_frame,
+ XmNmarginWidth, 10,
+ XmNmarginHeight, 10,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, text_bg_frame,
+ XmNleftOffset, 10,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ links_label = XmCreateLabelGadget(links_frame, "Hyperlinks", &frame_title, 1);
+ XtManageChild(links_label);
+
+ links_form = XmCreateForm(links_frame, "links_form", NULL, 0);
+ XtVaSetValues(links_form,
+ XmNverticalSpacing, 2,
+ NULL);
+
+ unvisited_label = XmCreateLabelGadget(links_form, Xdvi_UNVISITED_LINKS_STR, NULL, 0);
+ unvisited_button = h_create_colorsample(links_form, unvisited_label,
+ Xdvi_UNVISITED_LINKS_BTN, "linkColor",
+ link_pix, info);
+ XtVaSetValues(unvisited_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ NULL);
+ XtVaSetValues(unvisited_button,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_NONE,
+ XmNtopAttachment, XmATTACH_FORM,
+ NULL);
+ adjust_heights(unvisited_label, unvisited_button, NULL);
+ XtManageChild(unvisited_label);
+ XtManageChild(unvisited_button);
+
+ visited_label = XmCreateLabelGadget(links_form, Xdvi_VISITED_LINKS_STR, NULL, 0);
+ visited_button = h_create_colorsample(links_form, visited_label,
+ Xdvi_VISITED_LINKS_BTN, "visitedLinkColor",
+ visited_link_pix, info);
+ XtVaSetValues(visited_label,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, unvisited_label,
+ NULL);
+ XtVaSetValues(visited_button,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_NONE,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, unvisited_label,
+ NULL);
+ adjust_heights(visited_label, visited_button, NULL);
+ XtManageChild(visited_label);
+ XtManageChild(visited_button);
+
+ underline_toggle = XmCreateToggleButtonGadget(links_form, Xdvi_LINKS_UNDERLINED_STR, &n_of_many, 1);
+ XtVaSetValues(underline_toggle,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, visited_label,
+ NULL);
+ XtManageChild(underline_toggle);
+
+ /* if (res->link_style & 1) */
+ if (resource.link_style & 1)
+ XmToggleButtonGadgetSetState(underline_toggle, True, False);
+ else
+ XmToggleButtonGadgetSetState(underline_toggle, False, False);
+
+ XtAddCallback(underline_toggle, XmNvalueChangedCallback, underline_toggle_cb, (XtPointer)info);
+
+ XtManageChild(links_frame);
+ XtManageChild(text_bg_frame);
+
+ XtManageChild(text_bg_form);
+ XtManageChild(links_form);
+
+ return form;
+}
+
+void update_preferences_color(void)
+{
+ Widget shell, button;
+
+ /* it's not an error if the prefs dialog doesn't exist yet */
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&button, shell, Xdvi_DOCUMENT_COLORS_STR, True)) {
+ XmToggleButtonGadgetSetState(button, resource.use_color, False);
+ }
+}
+
+void update_preferences_hyperlinks(void)
+{
+ Widget shell, button;
+
+ /* it's not an error if the prefs dialog doesn't exist yet */
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&button, shell, Xdvi_LINKS_UNDERLINED_STR, True)) {
+ XmToggleButtonGadgetSetState(button, resource.link_style & 1 ? True : False, False);
+ }
+}
+
+void update_preferences_darkness(void)
+{
+ Widget shell, text;
+
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&text, shell, Xdvi_DARKNESS_TEXT, True)) {
+
+ char buf[LENGTH_OF_INT];
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", (int)(resource.gamma * 100.0 + 0.5));
+#if USE_SPINBOX
+ XmTextFieldSetString(text, buf);
+ XtVaSetValues(text, XmNposition, (int)(resource.gamma * 100.0 + 0.5), NULL);
+#else
+ XtVaSetValues(text, XmNvalue, buf, NULL);
+#endif
+ }
+}
+
+Widget
+prefs_fonts_and_colors(struct topic_info *info)
+{
+ Widget form;
+ Widget colors_form;
+ Widget other_colors_frame, fonts_frame;
+
+ form = XmCreateForm(info->right_form, "fonts_colors_form", NULL, 0);
+ h_attach_below(form, NULL);
+
+ colors_form = h_create_colors_form(form, info);
+ h_attach_below(colors_form, NULL);
+ XtManageChild(colors_form);
+
+ { /* other colors - currently only highlight color */
+ Widget other_colors_form, other_colors_label;
+ Widget hl_color_text, hl_color_button;
+
+ other_colors_frame = XmCreateFrame(form, "other_colors_frame", &v_off, 1);
+ XtVaSetValues(other_colors_frame,
+ XmNmarginWidth, 10,
+ NULL);
+ h_attach_below(other_colors_frame, colors_form);
+
+ other_colors_label = XmCreateLabelGadget(other_colors_frame, "Highlight Color", &frame_title, 1);
+ other_colors_form = XmCreateForm(other_colors_frame, "other_colors_form", NULL, 0);
+ XtVaSetValues(other_colors_form, XmNverticalSpacing, 2, NULL);
+
+ hl_color_text = XmCreateLabelGadget(other_colors_form,
+#if defined(LESSTIF_VERSION) /* stupid LessTif doesn't wrap Labels at '\n' */
+ "Color of page border, rulers and bounding boxes.",
+#else
+ "Color used for page border, rulers in `ruler mode', and\n"
+ "bounding boxes for forward search and EPS images.",
+#endif
+ NULL, 0);
+ hl_color_button = h_create_colorsample(other_colors_form, hl_color_text,
+ Xdvi_HL_COLOR_BTN, "highlight",
+ resource.hl_Pixel, info);
+ XtVaSetValues(hl_color_text,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNbottomOffset, 10,
+ XmNalignment, XmALIGNMENT_BEGINNING,
+ NULL);
+ XtVaSetValues(hl_color_button,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ NULL);
+
+ XtManageChild(hl_color_text);
+ XtManageChild(hl_color_button);
+ XtManageChild(other_colors_form);
+ XtManageChild(other_colors_label);
+ XtManageChild(other_colors_frame);
+ }
+
+ fonts_frame = h_create_fonts_frame(form, info);
+ h_attach_below(fonts_frame, other_colors_frame);
+ XtManageChild(fonts_frame);
+
+ XtManageChild(form);
+
+ return form;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_fonts.h b/Build/source/texk/xdvik/gui/xm_prefs_fonts.h
new file mode 100644
index 00000000000..b87984cafb2
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_fonts.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_FONTS_
+#define XM_PREFS_FONTS_
+
+#ifdef MOTIF
+
+struct topic_info; /* forward declaration */
+extern Widget prefs_fonts_and_colors(struct topic_info *info);
+extern void update_preferences_color(void);
+extern void update_preferences_hyperlinks(void);
+extern void update_preferences_darkness(void);
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_FONTS_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_helpers.c b/Build/source/texk/xdvik/gui/xm_prefs_helpers.c
new file mode 100644
index 00000000000..7609e8170cd
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_helpers.c
@@ -0,0 +1,898 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Panel 3 (Helper Applications) for xdvik preferences dialog.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "util.h"
+#include "string-utils.h"
+#include "string_list.h"
+#include "message-window.h"
+#include "events.h"
+#include "xm_menu.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs.h"
+#include "xm_prefs_helpers.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/PushBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/FileSB.h>
+#include <Xm/SelectioB.h>
+
+struct choice_dialog_info {
+ struct topic_info *tinfo;
+ /* struct prefs_choice *prefs; */
+ Widget combo_box;
+ Widget message_popup;
+};
+
+static char **m_browser_list = NULL;
+static char **m_editor_list = NULL;
+
+#if USE_COMBOBOX
+#include <Xm/ComboBox.h>
+#include <Xm/List.h>
+#else
+#include <Xm/CascadeBG.h>
+#endif
+
+static void select_browser_cb(Widget w, XtPointer client_data, XtPointer call_data);
+static void select_editor_cb(Widget w, XtPointer client_data, XtPointer call_data);
+
+/*
+ * User clicked on `Help' in browser text input prompt
+ */
+static void
+help_browser_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Widget popup = popup_message(XtParent(w),
+ MSG_HELP,
+ NULL,
+ "The browser is used by xdvi to browse remote documents. "
+ "Please enter the name of the browser (i.e. the executable program) "
+ "you want to use. The browser command may optionally contain a string "
+ "`%%s' which is replaced by the current URL. If no `%%s' is present, "
+ "the URL argument is simply appended to the command.");
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ TRACE_GUI((stderr, "setting user data to %p", (void *)popup));
+ XtVaSetValues(w, XmNuserData, popup, NULL);
+}
+
+/*
+ * User clicked on `Help' in editor text input prompt
+ */
+static void
+help_editor_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Widget popup = popup_message(XtParent(w),
+ MSG_HELP,
+ NULL,
+ "The editor is used by reverse search to open the TeX source for a DVI file "
+ "(see `Help' -> `Source Specials' for details)."
+ "Please enter the name of the editor executable you want to use. "
+ "The editor command may optionally contain two format strings: "
+ "`%%l' is replaced by the line number in the TeX file, and `%%f' by the file name. "
+ "(If the format strings are not present, they are appended implicitly.)");
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ TRACE_GUI((stderr, "setting user data to %p", (void *)popup));
+ XtVaSetValues(w, XmNuserData, popup, NULL);
+}
+
+/*
+ * User cancelled browser or editor text input prompt
+ */
+static void
+destroy_dialog_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ /* Widget browser_combo = (Widget)client_data; */
+ struct choice_dialog_info *info = (struct choice_dialog_info *)client_data;
+ Widget browser_combo = NULL;
+ Widget help_popup;
+#if USE_COMBOBOX
+ Widget browser_list_w;
+#endif
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XmNuserData, &help_popup, NULL);
+ TRACE_GUI((stderr, "GOT help_popup: %p", (void *)help_popup));
+
+ if (info != NULL)
+ browser_combo = info->combo_box;
+
+ if (browser_combo != NULL) {
+#if USE_COMBOBOX
+ /* Need to unselect the `Other...' entry from the list; to do this,
+ we select the index from XmNuserData if it's >= 0, or the first item. */
+ ptrdiff_t idx;
+ XtPointer p;
+ XtVaGetValues(browser_combo,
+ XmNlist, &browser_list_w,
+ XmNuserData, &p,
+ NULL);
+ idx = (ptrdiff_t) p;
+ if (browser_list_w == 0)
+ XDVI_ERROR((stderr, "couldn't get list component of combo box!\n"));
+ else {
+ if (idx < 0)
+ idx = 0;
+ XmListSelectPos(browser_list_w, idx + 1, True);
+ }
+#else
+ Widget parent;
+ if ((parent = XtParent(w)) != NULL) {
+ Widget rowcol, child;
+ if (strcmp(XtName(parent), Xdvi_BROWSER_POPUP) == 0) {
+ if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_BROWSER_COMBO_NAME, True)) {
+ XtVaGetValues(rowcol, XmNuserData, &child, NULL);
+ XtVaSetValues(rowcol, XmNmenuHistory, child, NULL);
+ }
+ }
+ else if (strcmp(XtName(parent), Xdvi_EDITOR_POPUP) == 0) {
+ if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_EDITOR_COMBO_NAME, True)) {
+ XtVaGetValues(rowcol, XmNuserData, &child, NULL);
+ XtVaSetValues(rowcol, XmNmenuHistory, child, NULL);
+ }
+ }
+ else {
+ XDVI_WARNING((stderr, "unexpected widget name `%s' in destroy_dialog_cb", XtName(parent)));
+ }
+ }
+#endif
+ }
+
+ /*
+ * Also popdown dependent help window if it exists before destroying the widget;
+ * otherwise, Motif may even crash in _XmIsFastSubclass() when the help window is moved!
+ *
+ * Since `help_popup' is the top-level xmDialogShellWidget, we need to get its
+ * xmMessageBoxWidget child (by name ...). Don't report an error if it doesn't
+ * exist in case the help window has already been closed.
+ */
+ if (help_popup != NULL) {
+ static Widget message;
+ if (get_widget_by_name(&message, help_popup, Xdvi_MESSAGE_DIALOG_NAME, False))
+ XtCallCallbacks(message, XmNokCallback, NULL);
+ }
+
+ if (info != NULL) {
+ struct prefs_choice *prefs = (struct prefs_choice *)info->tinfo->data;
+ remove_from_deplist(prefs, w);
+ free(info);
+ }
+
+ /* destroy the parent of this dialog (the shell) */
+ XtDestroyWidget(XtParent(w));
+}
+
+static void
+h_get_input_wrapper(const char *listbox_name,
+ Widget w, XtPointer client_data, XtPointer call_data)
+{
+ /* Widget combobox = (Widget)client_data; */
+ struct choice_dialog_info *info = (struct choice_dialog_info *)client_data;
+ struct topic_info *tinfo = info->tinfo;
+ struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data;
+ Widget combobox, child;
+ /* following need to be allocated since we want to set resource.xyz to it */
+ static char *browser_choice= NULL, *editor_choice = NULL;
+#if !USE_COMBOBOX
+ XtCallbackProc select_cb = NULL;
+#endif
+ XmSelectionBoxCallbackStruct *cbs = (XmSelectionBoxCallbackStruct *)call_data;
+ static char *ptr = NULL;
+ char *tmp_list;
+
+ if (call_data == NULL) /* widget already being destroyed? */
+ return;
+
+ ASSERT(info != NULL, "client_data in h_get_input_wrapper mustn't be NULL!");
+ combobox = info->combo_box;
+ child = info->message_popup;
+ XtVaGetValues(w, XmNuserData, &child, NULL);
+ TRACE_GUI((stderr, "GOT child: %p", (void *)child));
+
+ if (ptr)
+ XtFree((XtPointer)ptr);
+ ptr = NULL;
+ XmStringGetLtoR(cbs->value, G_charset, &ptr);
+ if (strlen(ptr) == 0 || is_spaces_only(ptr)) {
+ popup_message(XtParent(w),
+ MSG_ERR,
+ NULL,
+ "Empty input string");
+ return;
+ }
+
+ if (strcmp(listbox_name, Xdvi_BROWSER_COMBO_NAME) == 0) {
+#if 0
+ int i;
+#endif
+
+ free(browser_choice);
+ browser_choice = xstrdup(ptr);
+ resource.browser = browser_choice;
+
+#if 0
+ for (i = 0; m_browser_list[i] != NULL; i++) {
+ fprintf(stderr, "list %d: |%s|\n", i, m_browser_list[i]);
+ }
+#endif
+ m_browser_list = string_list_prepend(m_browser_list, ptr);
+#if 0
+ for (i = 0; m_browser_list[i] != NULL; i++) {
+ fprintf(stderr, "NEW list %d: |%s|\n", i, m_browser_list[i]);
+ }
+#endif
+ tmp_list = string_list_to_str(m_browser_list, "\n");
+#if 0
+ fprintf(stderr, "TMP LIST: |%s|\n", tmp_list);
+#endif /* 0 */
+ store_preference(&(prefs->db), "prefsBrowserList", "%s", tmp_list);
+ free(tmp_list);
+
+ store_preference(&(prefs->db), "wwwBrowser", "%s", ptr);
+#if !USE_COMBOBOX
+ select_cb = select_browser_cb;
+#endif
+ }
+ else if (strcmp(listbox_name, Xdvi_EDITOR_COMBO_NAME) == 0) {
+ free(editor_choice);
+ editor_choice = xstrdup(ptr);
+ resource.editor = editor_choice;
+
+ m_editor_list = string_list_prepend(m_editor_list, ptr);
+ tmp_list = string_list_to_str(m_editor_list, "\n");
+ store_preference(&(prefs->db), "prefsEditorList", "%s", tmp_list);
+ free(tmp_list);
+
+ store_preference(&(prefs->db), "editor", "%s", ptr);
+#if !USE_COMBOBOX
+ select_cb = select_editor_cb;
+#endif
+ }
+ else
+ XDVI_WARNING((stderr, "Unexpected name in h_get_input_wrapper: `%s'", listbox_name));
+
+#if USE_COMBOBOX
+ UNUSED(listbox_name);
+ /* add user input to the combo box list, and make it current */
+ XmComboBoxAddItem(combobox, cbs->value, 1, True);
+ XmComboBoxSelectItem(combobox, cbs->value);
+ { /* if more than 9 items, add scrollbar */
+ size_t n;
+ XtVaGetValues(combobox, XmNitemCount, &n, NULL);
+ XtVaSetValues(combobox, XmNvisibleItemCount, n > 10 ? 10 : n, NULL);
+ }
+#else
+ {
+ Widget new_menu, parent, grandparent, rowcol;
+ if ((parent = XtParent(w)) != NULL && (grandparent = XtParent(parent)) != NULL) {
+ /* add new item to front of list ... */
+ new_menu = XtVaCreateManagedWidget(ptr, xmPushButtonGadgetClass, grandparent,
+ XmNpositionIndex, 0,
+ XmNuserData, tinfo,
+ NULL);
+ if (select_cb != NULL) {
+ XtAddCallback(new_menu, XmNactivateCallback, select_cb, grandparent);
+ }
+ /* ... and make it current! */
+ if (get_widget_by_name(&rowcol, globals.widgets.top_level, listbox_name, True)) {
+ XtVaSetValues(rowcol, XmNmenuHistory, new_menu, NULL);
+ }
+ }
+ }
+#endif
+
+ /* as above: popdown help window */
+ if (child != NULL) {
+ Widget message;
+ if (get_widget_by_name(&message, child, Xdvi_MESSAGE_DIALOG_NAME, False))
+ XtCallCallbacks(message, XmNokCallback, NULL);
+ }
+
+ remove_from_deplist(prefs, w);
+ free(info);
+
+ /* destroy the parent of this dialog (the shell) */
+ XtDestroyWidget(XtParent(w));
+}
+
+static void
+h_selector(const char *prompt_name,
+ const char *title_str, const char *label_str,
+ XtCallbackProc ok_cb,
+ XtCallbackProc destroy_cb,
+ XtCallbackProc help_cb,
+ Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *tinfo = NULL;
+ struct prefs_choice *prefs = NULL;
+ struct choice_dialog_info *info = NULL;
+ char *choice;
+ /* following need to be allocated since we want to set resource.xyz to it */
+ static char *browser_choice= NULL, *editor_choice = NULL;
+
+#if USE_COMBOBOX
+ XmComboBoxCallbackStruct *cb;
+#else
+ XmString str;
+ UNUSED(client_data);
+ UNUSED(call_data);
+#endif
+
+#if USE_COMBOBOX
+ tinfo = (struct topic_info *)client_data;
+ prefs = (struct prefs_choice *)tinfo->data;
+#endif
+ info = xmalloc(sizeof *info);
+#if USE_COMBOBOX
+ cb = (XmComboBoxCallbackStruct *)call_data;
+
+ if (cb->event == NULL) /* only browsing, no selection */
+ return;
+
+ choice = (char *)XmStringUnparse(cb->item_or_text, XmFONTLIST_DEFAULT_TAG,
+ XmCHARSET_TEXT, XmCHARSET_TEXT,
+ NULL, 0,
+ XmOUTPUT_ALL);
+#else
+ XtVaGetValues(w, XmNlabelString, &str, NULL);
+ XmStringGetLtoR(str, G_charset, &choice);
+
+ XtVaGetValues(w, XmNuserData, &tinfo, NULL);
+ ASSERT(tinfo != NULL, "XmNuserData in callback musn't be NULL!");
+ prefs = (struct prefs_choice *)tinfo->data;
+#endif
+
+ if (strcmp(choice, Xdvi_ADD_COMMAND_STR) == 0) {
+ Widget prompt_widget;
+ Arg args[8];
+ int n = 0;
+ XmString title = XmStringCreateLocalized((char *)title_str);
+ XmString label = XmStringCreateLocalized((char *)label_str);
+
+ XtSetArg(args[n], XmNselectionLabelString, label); n++;
+ XtSetArg(args[n], XmNautoUnmanage, False); n++;
+ XtSetArg(args[n], XmNdialogTitle, title); n++;
+ XtSetArg(args[n], XmNuserData, NULL); n++;
+ prompt_widget = XmCreatePromptDialog(
+#if USE_COMBOBOX
+ w,
+#else
+ XtParent(w),
+#endif
+ (char *)prompt_name, args, n);
+ /* XmStringFree(label); */
+
+ add_to_deplist(prefs, prompt_widget);
+
+ info->tinfo = tinfo;
+ info->combo_box = w;
+ info->message_popup = NULL;
+
+ /* Note: w is the browser_combo widget */
+ XtAddCallback(prompt_widget, XmNokCallback, ok_cb, (XtPointer)info);
+ XtAddCallback(prompt_widget, XmNcancelCallback, destroy_cb, (XtPointer)info);
+ XtAddCallback(prompt_widget, XmNhelpCallback, help_cb, (XtPointer)info);
+
+ XtManageChild(prompt_widget);
+ }
+ else { /* normal item */
+#if USE_COMBOBOX
+ int i;
+#endif
+
+ if (strcmp(prompt_name, Xdvi_BROWSER_POPUP_NAME) == 0) {
+#if !USE_COMBOBOX
+ Widget rowcol;
+ if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_BROWSER_COMBO_NAME, True)) {
+ XtVaSetValues(rowcol, XmNuserData, w, NULL);
+ }
+#endif
+ free(browser_choice);
+ browser_choice = xstrdup(choice);
+ resource.browser = browser_choice;
+ store_preference(&(prefs->db), "wwwBrowser", "%s", browser_choice);
+ }
+ else if (strcmp(prompt_name, Xdvi_EDITOR_POPUP_NAME) == 0) {
+#if !USE_COMBOBOX
+ Widget rowcol;
+ if (get_widget_by_name(&rowcol, globals.widgets.top_level, Xdvi_EDITOR_COMBO_NAME, True)) {
+ XtVaSetValues(rowcol, XmNuserData, w, NULL);
+ }
+#endif
+ free(editor_choice);
+ editor_choice = xstrdup(choice);
+ resource.editor = editor_choice;
+ store_preference(&(prefs->db), "editor", "%s", editor_choice);
+ }
+ else
+ XDVI_ERROR((stderr, "Unknown category `%s' in h_selector()!", prompt_name));
+
+
+#if USE_COMBOBOX
+ /* update the currently selected value */
+ XtVaGetValues(w, XmNselectedPosition, &i, NULL);
+ XtVaSetValues(w, XmNuserData, cast_int_to_XtPointer(i), NULL);
+#endif
+ }
+#if USE_COMBOBOX
+ XtFree(choice);
+#endif
+}
+
+/*
+ * User OK'ed browser text input prompt
+ */
+static void
+get_browser_text_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ if (XtIsRealized(w)) {
+ h_get_input_wrapper(Xdvi_BROWSER_COMBO_NAME, w, client_data, call_data);
+ }
+}
+
+
+/*
+ * User OK'ed editor text input prompt
+ */
+static void
+get_editor_text_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ if (XtIsRealized(w)) {
+ h_get_input_wrapper(Xdvi_EDITOR_COMBO_NAME, w, client_data, call_data);
+ }
+}
+
+
+/*
+ * User selected an item from browser combo box pulldown list
+ */
+static void
+select_browser_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ h_selector(Xdvi_BROWSER_POPUP_NAME,
+ "xdvik: Add Browser Command",
+ "Browser Command (optional `%s' is replaced by URL): ",
+ get_browser_text_cb, destroy_dialog_cb, help_browser_dialog_cb,
+ w, client_data, call_data);
+}
+
+/*
+ * User selected an item from editor combo box pulldown list
+ */
+static void
+select_editor_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ UNUSED(client_data);
+ h_selector(Xdvi_EDITOR_POPUP_NAME,
+ "xdvik: Add Editor Command",
+ "Editor Command (optional: `%l' = line number, `%f' = file name): ",
+ get_editor_text_cb, destroy_dialog_cb, help_editor_dialog_cb,
+ w, client_data, call_data);
+}
+
+void
+update_preferences_helpers(void)
+{
+ Widget shell, browser_cascade, editor_cascade;
+
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&browser_cascade, shell, Xdvi_BROWSER_COMBO_NAME, True)
+ && get_widget_by_name(&editor_cascade, shell, Xdvi_EDITOR_COMBO_NAME, True)) {
+
+#if USE_COMBOBOX
+
+ Widget browser_list_w, editor_list_w;
+ XmString str;
+ int i;
+ Boolean found = False;
+
+ XtVaGetValues(browser_cascade, XmNlist, &browser_list_w, NULL);
+ XtVaGetValues(editor_cascade, XmNlist, &editor_list_w, NULL);
+
+ for (i = 0; m_browser_list[i] != NULL; i++) {
+ if (globals.curr_browser != NULL) { /* if this is set, ignore browser setting */
+ if (strcmp(globals.curr_browser, m_browser_list[i]) == 0) {
+ found = True;
+ break;
+ }
+ }
+ else if (resource.browser != NULL) {
+ if (strcmp(resource.browser, m_browser_list[i]) == 0) {
+ found = True;
+ break;
+ }
+ }
+ }
+ if (!found)
+ i = 0;
+ str = XmStringCreateLtoR((char *)m_browser_list[i], "UNMARKED");
+ XmComboBoxSelectItem(browser_cascade, str);
+ XmStringFree(str);
+
+ for (i = 0; m_editor_list[i] != NULL; i++) {
+ if (globals.curr_editor != NULL) { /* if this is set, ignore editor setting */
+ if (strcmp(globals.curr_editor, m_editor_list[i]) == 0) {
+ found = True;
+ break;
+ }
+ }
+ else if (resource.editor != NULL) {
+ if (strcmp(resource.editor, m_editor_list[i]) == 0) {
+ found = True;
+ break;
+ }
+ }
+ }
+ if (!found)
+ i = 0;
+ str = XmStringCreateLtoR((char *)m_editor_list[i], "UNMARKED");
+ XmComboBoxSelectItem(editor_cascade, str);
+ XmStringFree(str);
+ /* XmListSetPos(editor_list_w, i); */
+ /* fprintf(stderr, "setting editor list index %d, %s\n", */
+ /* i, editor_list[i-1]); */
+
+
+ /* if (XmListGetSelectedPos(browser_list_w, &browser_items, &browser_cnt) */
+ /* && XmListGetSelectedPos(editor_list_w, &editor_items, &editor_cnt)) { */
+ /* if (browser_cnt > 0 && editor_cnt > 0) { */
+ /* int browser_idx = browser_items[0] - 1; */
+ /* int editor_idx = editor_items[0] - 1; */
+ /* fprintf(stderr, "selected: %s, %s\n", */
+ /* browser_list[browser_idx], */
+ /* editor_list[editor_idx]); */
+ /* } */
+ /* else { */
+ /* XDVI_WARNING((stderr, "Shouldn't happen: No items selected in browser list?")); */
+ /* return; */
+ /* } */
+ /* XtFree((XtPointer)browser_items); */
+ /* XtFree((XtPointer)editor_items); */
+ /* } */
+#else
+ Widget browser_menu, editor_menu;
+ if (get_widget_by_name(&browser_menu, shell, Xdvi_BROWSER_MENU_NAME, True)
+ && get_widget_by_name(&editor_menu, shell, Xdvi_EDITOR_MENU_NAME, True)) {
+ int i, num_buttons;
+ WidgetList buttons;
+
+ XtVaGetValues(browser_menu,
+ XmNnumChildren, &num_buttons,
+ XmNchildren, &buttons,
+ NULL);
+ for (i = 0; i < num_buttons; i++) {
+ XmString str;
+ char *ptr;
+
+ XtVaGetValues(buttons[i], XmNlabelString, &str, NULL);
+ XmStringGetLtoR(str, G_charset, &ptr);
+ /* fprintf(stderr, "kid %d: %s\n", i, ptr); */
+ if (globals.curr_browser != NULL) { /* if this is set, ignore browser setting */
+ if (strcmp(globals.curr_browser, ptr) == 0) {
+ break;
+ }
+ }
+ else if (resource.browser != NULL) {
+ if (strcmp(resource.browser, ptr) == 0) {
+ break;
+ }
+ }
+ }
+ if (i >= num_buttons) /* not found */
+ i = 0;
+ XtVaSetValues(browser_cascade, XmNmenuHistory, buttons[i], NULL);
+
+ /* same for editor */
+ XtVaGetValues(editor_menu,
+ XmNnumChildren, &num_buttons,
+ XmNchildren, &buttons, NULL);
+ for (i = 0; i < num_buttons; i++) {
+ XmString str;
+ char *ptr;
+
+ XtVaGetValues(buttons[i], XmNlabelString, &str, NULL);
+ XmStringGetLtoR(str, G_charset, &ptr);
+ /* fprintf(stderr, "kid %d: %s\n", i, ptr); */
+ if (globals.curr_editor != NULL) { /* if this is set, ignore editor setting */
+ if (strcmp(globals.curr_editor, ptr) == 0) {
+ break;
+ }
+ }
+ else if (resource.editor != NULL) {
+ if (strcmp(resource.editor, ptr) == 0) {
+ break;
+ }
+ }
+ }
+ if (i >= num_buttons) /* not found */
+ i = 0;
+ XtVaSetValues(editor_cascade, XmNmenuHistory, buttons[i], NULL);
+
+ }
+#endif
+ /* for browser/editor, try:
+
+ Widget menu;
+ int num_buttons;
+ WidgetList buttons;
+
+ XtVaGetValues( simple_option_widget, XmNsubMenuId, &menu, NULL);
+
+ XtVaGetValues( menu, XmNnumChildren, &num_buttons,
+ XmNchildren, &buttons, NULL ) ;
+
+ */
+ }
+}
+
+static Widget
+h_create_command(const char *name,
+ const char *menu_name,
+ const char *label,
+ const char *curr_value,
+ Widget parent, Widget top,
+ char **command_list,
+ XtCallbackProc select_cb,
+ struct topic_info *tinfo)
+{
+ const char *ptr = NULL;
+ size_t i;
+
+#if USE_COMBOBOX
+ XmStringTable str_list;
+ Widget text_label, combo_box;
+ size_t k, num;
+ int curr_index = -1;
+#else
+ Widget menu, cascade, item;
+ XmString str;
+ Arg args[8];
+ int n;
+#endif
+
+ /* check if we need to add the default resource name */
+ ptr = curr_value;
+
+ /* don't add it if it's already in our list */
+ for (i = 0; ptr != NULL && command_list[i] != NULL; i++) {
+ if (strcmp(command_list[i], ptr) == 0) {
+ ptr = NULL;
+ }
+ }
+#if USE_COMBOBOX
+ UNUSED(menu_name);
+ text_label = XmCreateLabelGadget(parent, (char *)label, NULL, 0);
+ XtVaSetValues(text_label,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, top,
+ XmNleftAttachment, XmATTACH_FORM,
+ /* XmNrightAttachment, XmATTACH_FORM, */
+ NULL);
+
+ /* count elements in command_list */
+ for (num = 0; command_list[num] != NULL; num++) { ; }
+
+ if (ptr != NULL)
+ num++;
+
+ str_list = (XmStringTable)XtMalloc(num * sizeof(XmString *));
+
+ i = 0;
+ if (ptr != NULL)
+ str_list[i++] = XmStringCreateLtoR((char *)ptr, "UNMARKED");
+
+ for (k = 0; i < num; i++, k++) {
+ if (curr_value != NULL && strcmp(command_list[k], curr_value) == 0) {
+ curr_index = i;
+ }
+ if (strcmp(command_list[k], Xdvi_ADD_COMMAND_STR) == 0)
+ str_list[i] = XmStringCreateLtoR((char *)command_list[k], "MARKED");
+ else
+ str_list[i] = XmStringCreateLtoR((char *)command_list[k], "UNMARKED");
+ }
+ combo_box = XtVaCreateWidget(name, xmComboBoxWidgetClass,
+ parent,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, top, /* if top == NULL, this uses XmATTACH_FORM */
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, text_label,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNcomboBoxType, XmDROP_DOWN_LIST,
+ XmNitems, str_list,
+ XmNitemCount, num,
+ XmNvisibleItemCount, num > 10 ? 10 : num,
+ XmNuserData, cast_int_to_XtPointer(curr_index),
+ XmNarrowSize, Xdvi_COMBO_BOX_ARROW_SIZE,
+ NULL);
+ if (top != NULL) /* FIXME: This assumes we only have 2 items ... */
+ XtVaSetValues(combo_box,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ /* make resource setting current value */
+ if (curr_index >= 0) {
+ XmComboBoxSelectItem(combo_box, str_list[curr_index]);
+ }
+
+ for (i = 0; i < num; i++)
+ XmStringFree(str_list[i]);
+ XtFree((XtPointer)str_list);
+
+ XtAddCallback(combo_box, XmNselectionCallback, select_cb, (XtPointer)tinfo);
+
+ /*
+ * workaround for pointer grabbing bug (see xm_menu.c). We need to use
+ * the popdownCallback of the internal `GrabShell' child of the combo box.
+ */
+ {
+ Widget grab_shell;
+ if (get_widget_by_name(&grab_shell, combo_box, "GrabShell", True))
+ XtAddCallback(grab_shell, XtNpopdownCallback, popdown_callback, NULL);
+ }
+ adjust_heights(text_label, combo_box, NULL);
+
+ XtManageChild(text_label);
+ XtManageChild(combo_box);
+
+ return combo_box;
+#else
+ menu = XmCreatePulldownMenu(parent, (char *)menu_name, NULL, 0);
+ /* XtVaSetValues(menu, */
+ /* XmNtopAttachment, XmATTACH_WIDGET, */
+ /* XmNtopWidget, top, */
+ /* XmNleftAttachment, XmATTACH_FORM, */
+ /* XmNrightAttachment, XmATTACH_FORM, */
+ /* NULL); */
+
+ str = XmStringCreateLocalized((char *)label);
+ n = 0;
+ XtSetArg(args[n], XmNsubMenuId, menu); n++;
+ XtSetArg(args[n], XmNlabelString, str); n++;
+ XtSetArg(args[n], XmNuserData, NULL); n++;
+ cascade = XmCreateOptionMenu(parent, (char *)name, args, n);
+ if (top)
+ XtVaSetValues(cascade,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, top,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ else
+ XtVaSetValues(cascade,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ XmStringFree(str);
+
+ if (ptr != NULL) {
+ item = XtVaCreateManagedWidget(ptr, xmPushButtonGadgetClass, menu,
+ XmNuserData, tinfo,
+ NULL);
+ XtAddCallback(item, XmNactivateCallback, select_cb, menu);
+ }
+
+ for (i = 0; command_list[i] != NULL; i++) {
+ item = XtVaCreateManagedWidget(command_list[i], xmPushButtonGadgetClass, menu,
+ XmNuserData, tinfo,
+ NULL);
+ XtAddCallback(item, XmNactivateCallback, select_cb, menu);
+ }
+ XtManageChild(cascade);
+ return cascade;
+#endif
+}
+
+Widget
+prefs_helpers(struct topic_info *tinfo)
+{
+ /* struct prefs_choice *prefs = (struct prefs_choice *)info->data; */
+ Widget form, /* frame, */ form1;
+ Widget browser_command;
+
+ form = XmCreateForm(tinfo->right_form, "helpers_form", NULL, 0);
+
+ /* frame = XmCreateFrame(form, "commands_frame", NULL, 0); */
+
+ form1 = XtVaCreateWidget("commands_form", xmFormWidgetClass,
+ form,
+ XmNverticalSpacing, 10,
+ XmNhorizontalSpacing, 0,
+ NULL);
+
+ if (m_browser_list == NULL)
+ m_browser_list = get_separated_list(resource.prefs_browser_list, "\n", False);
+
+ if (m_editor_list == NULL)
+ m_editor_list = get_separated_list(resource.prefs_editor_list, "\n", False);
+
+ browser_command = h_create_command(Xdvi_BROWSER_COMBO_NAME,
+ Xdvi_BROWSER_MENU_NAME,
+ "Web Browser: ",
+ resource.browser,
+ form1, NULL,
+ m_browser_list,
+ select_browser_cb, tinfo);
+
+ h_create_command(Xdvi_EDITOR_COMBO_NAME,
+ Xdvi_EDITOR_MENU_NAME,
+ "Editor for Source Specials: ",
+ resource.editor,
+ form1, browser_command,
+ m_editor_list,
+ select_editor_cb, tinfo);
+
+ /* #if PS_GS */
+ /* Widget b2 = XmCreateLabelGadget(rowcol, "[x] Use Ghostscript to interpret PS specials", NULL, 0); */
+
+ /* TODO: don't need this??? Similar: ps2pdf, dvips conversion?? */
+ /* Widget b3 = XmCreateLabelGadget(rowcol, "Path to Ghostscript: ____________", NULL, 0); */
+
+ /* #endif */
+ /* Widget b4 = XmCreateLabelGadget(rowcol, "Editor for source specials: <pulldown> [Other ...]", NULL, 0); */
+ /* XtManageChild(b1); */
+ /* XtManageChild(b2); */
+ /* XtManageChild(b3); */
+ /* XtManageChild(b4); */
+ /* XtManageChild(rowcol); */
+
+ XtManageChild(form1);
+ /* XtManageChild(frame); */
+
+ return form;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
+
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_helpers.h b/Build/source/texk/xdvik/gui/xm_prefs_helpers.h
new file mode 100644
index 00000000000..07b851186b1
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_helpers.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_HELPERS_
+#define XM_PREFS_HELPERS_
+
+#ifdef MOTIF
+
+struct topic_info; /* forward declaration */
+extern Widget prefs_helpers(struct topic_info *info);
+extern void update_preferences_helpers(void);
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_HELPERS_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_page.c b/Build/source/texk/xdvik/gui/xm_prefs_page.c
new file mode 100644
index 00000000000..f18eeacbfb8
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_page.c
@@ -0,0 +1,691 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Panel 4 (Paper size) for xdvik preferences dialog.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "util.h"
+#include "events.h"
+#include "statusline.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs_page.h"
+#include "my-snprintf.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/PushBG.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/CascadeBG.h>
+
+#if USE_SPINBOX
+#include <Xm/SpinB.h>
+#endif
+
+/*
+ * Handy defaults
+ */
+static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY };
+static Arg n_of_many = { XmNindicatorType, XmN_OF_MANY };
+static Arg frame_title = { XmNchildType, XmFRAME_TITLE_CHILD };
+static Arg one_col[] = {
+ { XmNpacking, XmPACK_TIGHT },
+ { XmNnumColumns, 1 },
+ { XmNorientation, XmVERTICAL }
+};
+
+
+/* this is a small selection from the paper types in xdvi.c
+ * (only the more frequenlty used ones)
+ */
+static struct paper_info {
+ const char *format;
+ const char *resource_format;
+ const char *size;
+ const char *landscape_size;
+} papersizes[] = {
+ { "US (Letter)", "us", "8.5x11in", "11x8.5in" },
+ { "Tabloid", "tabloid", "11x17in", "17x11in" }, /* dvips compatibility */
+ { "Legal", "legal", "8.5x14in", "14x8.5in" },
+ { "A0", "a0", "841x1189mm", "1189x841mm" },
+ { "A1", "a1", "594x841mm", "841x594mm" },
+ { "A2", "a2", "420x594mm", "594x420mm" },
+ { "A3", "a3", "297x420mm", "420x297mm" },
+ { "A4", "a4", "210x297mm", "297x210mm" },
+ { "A5", "a5", "148x210mm", "210x148mm" },
+ { "B5", "b5", "176x250mm", "250x176mm" },
+ { "B6", "b6", "125x176mm", "176x125mm" },
+ { "B7", "b7", "88x125mm", "125x88mm" },
+ { NULL, NULL, NULL, NULL } /* terminate */
+};
+
+void update_preferences_windowsize(void)
+{
+ Widget shell, button;
+
+ /* it's not an error if the prefs dialog doesn't exist yet */
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&button, shell, Xdvi_REMEMBER_WINDOWSIZE_STR, True)) {
+ XmToggleButtonGadgetSetState(button, resource.remember_windowsize, False);
+ }
+}
+
+void update_preferences_shrink(void)
+{
+ Widget shell, text;
+
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&text, shell, Xdvi_SHRINK_TEXT, True)) {
+ char buf[LENGTH_OF_INT];
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", resource.shrinkfactor);
+#if USE_SPINBOX
+ XmTextFieldSetString(text, buf);
+ XtVaSetValues(text, XmNposition, resource.shrinkfactor, NULL);
+#else
+ XtVaSetValues(text, XmNvalue, buf, NULL);
+#endif
+ }
+}
+
+static void
+landscape_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *tinfo = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data;
+ Widget portrait_b, landscape_b;
+ Boolean landscape = False, is_set;
+ static char *paper_option = NULL;
+ Boolean match = False;
+ int i;
+
+ UNUSED(call_data);
+
+ for (i = 0; papersizes[i].format != NULL; i++) {
+ /* ignore final `r' when comparing */
+ if (strncmp(resource.paper,
+ papersizes[i].resource_format,
+ strlen(papersizes[i].resource_format)) == 0) {
+ const char *ptr;
+ match = True;
+ if (strcmp(resource.paper, "letter") == 0) /* special case */
+ ptr = "us";
+ else
+ ptr = papersizes[i].resource_format;
+ free(paper_option);
+ paper_option = xstrdup(ptr);
+ break;
+ }
+ }
+
+ if (!match) {
+ XDVI_ERROR((stderr, "paper resource `%s' not found in list!\n", resource.paper));
+ return;
+ }
+
+ if (get_widget_by_name(&portrait_b, tinfo->shell, Xdvi_PAPER_PORTRAIT_STR, True)
+ && get_widget_by_name(&landscape_b, tinfo->shell, Xdvi_PAPER_LANDSCAPE_STR, True)) {
+
+ if (w == portrait_b) {
+ XtVaGetValues(portrait_b, XmNset, &is_set, NULL);
+ landscape = !is_set;
+ }
+ else {
+ XtVaGetValues(landscape_b, XmNset, &is_set, NULL);
+ landscape = is_set;
+ }
+
+ /* fprintf(stderr, "++++++++ CALLBACK: setting portrait to %s, landscape to %s\n", */
+ /* landscape ? "False" : "True", */
+ /* landscape ? "True" : "False"); */
+
+ XmToggleButtonGadgetSetState(portrait_b, !landscape, False);
+ XmToggleButtonGadgetSetState(landscape_b, landscape, False);
+ }
+
+ if (landscape) {
+ paper_option = xstrcat(paper_option, "r");
+ }
+
+ resource.paper = paper_option;
+ store_preference(&(prefs->db), "paper", "%s", paper_option);
+}
+
+static void
+select_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *tinfo = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)tinfo->data;
+
+ XmString str;
+ char *choice;
+ int i;
+ static char *curr_choice= NULL;
+ Boolean landscape = False;
+
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XmNlabelString, &str, NULL);
+ XmStringGetLtoR(str, G_charset, &choice);
+
+ if (strlen(resource.paper) > 0 &&
+ strcmp(resource.paper, "letter") != 0 &&
+ resource.paper[strlen(resource.paper) - 1] == 'r')
+ landscape = True;
+
+ free(curr_choice);
+ curr_choice = NULL;
+ for (i = 0; papersizes[i].format != NULL; i++) {
+ if (strcmp(choice, papersizes[i].format) == 0) {
+ curr_choice = xstrdup(papersizes[i].resource_format);
+ }
+ }
+ if (curr_choice == NULL) {
+ XDVI_ERROR((stderr, "choice`%s' not found in list!\n", choice));
+ return;
+ }
+
+ if (landscape) {
+ curr_choice = xstrcat(curr_choice, "r");
+ }
+
+ resource.paper = curr_choice;
+ store_preference(&(prefs->db), "paper", "%s", curr_choice);
+}
+
+void
+update_preferences_paper(void)
+{
+ Widget shell, portrait_button, landscape_button, sizes_menu, sizes_cascade;
+ Boolean landscape = False;
+
+ /* it's not an error if the prefs dialog doesn't exist yet */
+ if (get_widget_by_name(&shell, globals.widgets.top_level, Xdvi_PREFS_DIALOG_NAME, False)
+ && get_widget_by_name(&portrait_button, shell, Xdvi_PAPER_PORTRAIT_STR, True)
+ && get_widget_by_name(&landscape_button, shell, Xdvi_PAPER_LANDSCAPE_STR, True)
+ && get_widget_by_name(&sizes_menu, shell, Xdvi_PAPER_MENU, True)
+ && get_widget_by_name(&sizes_cascade, shell, Xdvi_PAPER_CASCADE, True)) {
+
+ int i;
+ Widget sizes_button;
+
+ if (strlen(resource.paper) > 0 &&
+ strcmp(resource.paper, "letter") != 0 &&
+ resource.paper[strlen(resource.paper) - 1] == 'r') {
+
+ landscape = True;
+ }
+
+#if 0
+ XtVaGetValues(portrait_button, XmNset, &test1, NULL);
+ XtVaGetValues(landscape_button, XmNset, &test2, NULL);
+
+ fprintf(stderr, "+++++++ old state of portrait: %d, landscape: %d\n",
+ test1, test2);
+
+ fprintf(stderr, "+++++++ setting portrait to %s, landscape to %s\n",
+ landscape ? "False" : "True",
+ landscape ? "True" : "False");
+#endif /* 0 */
+
+ /*
+ Apparently there's a bug in Motif (OpenMotif 2.1) in that the button
+ is not properly updated in all cases.
+
+ To reproduce:
+
+ Open Preferences dialog, change `landscape' option, click
+ `OK'. Now open the dialog again, change the option again,
+ but click `Cancel'. This correctly reverts the visible
+ state of the buttons, but when opening the dialog again,
+ the button's internal state is not consistent with the
+ visual appearance: when clicking on the unset button, its
+ ValueChanged callback is not invoked, so nothing happens;
+ but after clicking on another(!) button in the preferences
+ dialog, it works again.
+
+ As a workaround, we destroy the buttons and re-create them from scratch - yuck!
+ */
+ {
+ Widget form = XtParent(portrait_button);
+ Widget cascade;
+ struct topic_info *info;
+
+ XtVaGetValues(portrait_button,
+ XmNleftWidget, &cascade,
+ XmNuserData, &info,
+ NULL);
+ XtDestroyWidget(portrait_button);
+ XtDestroyWidget(landscape_button);
+
+ portrait_button = XmCreateToggleButtonGadget(form, Xdvi_PAPER_PORTRAIT_STR, &one_of_many, 1);
+ XmToggleButtonGadgetSetState(portrait_button, !landscape, False);
+ XtVaSetValues(portrait_button,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, cascade,
+ XmNleftOffset, 10,
+ XmNuserData, (XtPointer)info,
+ NULL);
+ landscape_button = XmCreateToggleButtonGadget(form, Xdvi_PAPER_LANDSCAPE_STR, &one_of_many, 1);
+ XmToggleButtonGadgetSetState(landscape_button, landscape, False);
+ XtVaSetValues(landscape_button,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, portrait_button,
+ XmNleftOffset, 10,
+ XmNuserData, (XtPointer)info,
+ NULL);
+ XtManageChild(portrait_button);
+ XtManageChild(landscape_button);
+ XtAddCallback(portrait_button, XmNvalueChangedCallback, landscape_cb, (XtPointer)info);
+ XtAddCallback(landscape_button, XmNvalueChangedCallback, landscape_cb, (XtPointer)info);
+ }
+#if 0
+ XtVaGetValues(portrait_button, XmNset, &test1, NULL);
+ XtVaGetValues(landscape_button, XmNset, &test2, NULL);
+
+ fprintf(stderr, "+++++++ new state of portrait: %d, landscape: %d\n",
+ test1, test2);
+#endif /* 0 */
+
+ for (i = 0; papersizes[i].format != NULL; i++) {
+ if (strncmp(resource.paper,
+ papersizes[i].resource_format,
+ strlen(papersizes[i].resource_format)) == 0
+ && get_widget_by_name(&sizes_button, sizes_menu, papersizes[i].format, True)) {
+
+ XtVaSetValues(sizes_cascade, XmNmenuHistory, sizes_button, NULL);
+ }
+ }
+ }
+}
+
+#if 0 /* currently unused */
+static void
+shrinkfactor_spinbox_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ int val;
+ /* static Boolean first_time = True; */
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+ UNUSED(call_data);
+
+ XtVaGetValues(w, XmNposition, &val, NULL);
+
+ /* return if value not changed yet; else the first invocation of the
+ window may actually reset the shrink factor to the default.
+ */
+ /* if (val != resource.shrinkfactor) { */
+ /* first_time = False; */
+ /* } */
+
+ if (XtIsRealized(w)) {
+ /* don't set the resource.shrinkfactor here so that we can revert it from there if needed */
+ do_set_shrinkfactor(val, False);
+ store_preference(&(prefs->db), "shrinkFactor", "%d", val);
+ }
+}
+#endif /* currently unused */
+
+static void
+set_shrinkfactor_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ char *text;
+ int val;
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+#if USE_SPINBOX
+ XmTextPosition pos;
+ UNUSED(call_data);
+ text = XmTextFieldGetString(w);
+ val = strtol(text, (char **)NULL, 10);
+#else
+ Widget text_field;
+ UNUSED(call_data);
+ XtVaGetValues(w, XmNuserData, &text_field, NULL);
+ ASSERT(text_field != 0, "Expected text field in XmNuserData, set_shrinkfactor_cb()");
+ XtVaGetValues(text_field, XmNvalue, &text, NULL);
+ val = strtol(text, (char **)NULL, 10);
+ /* fprintf(stderr, "spinbox value: |%s|\n", text); */
+#endif
+
+ if (!XtIsRealized(w))
+ return;
+
+ /* verify values in case of direct text input */
+ if (val > 100 || val <= 0) {
+ if (val > 100)
+ statusline_info(STATUS_MEDIUM, "Shrink factor larger than maximum 100");
+ else if (val <= 0)
+ statusline_info(STATUS_MEDIUM, "Shrink factor smaller than minimum 1");
+ return;
+ }
+#if USE_SPINBOX
+ /* synchronize internal spinbox value */
+ pos = XmTextFieldGetInsertionPosition(w);
+ XtVaSetValues(w, XmNposition, val, NULL);
+ XmTextFieldSetInsertionPosition(w, pos);
+#endif
+ /* don't set the resource.shrinkfactor here so that we can revert it from there if needed */
+ do_set_shrinkfactor(val, False);
+ store_preference(&(prefs->db), "shrinkFactor", "%d", val);
+
+ XtFree(text);
+}
+
+static Widget
+h_create_shrink_frame(Widget top, struct topic_info *info)
+{
+ Widget shrink_form, shrink_label;
+
+ UNUSED(info);
+
+ shrink_form = XmCreateForm(top, "shrink_form", NULL, 0);
+ XtVaSetValues(shrink_form,
+ /* XmNverticalSpacing, 10, */
+ /* XmNhorizontalSpacing, 10, */
+ NULL);
+
+
+ shrink_label = XmCreateLabelGadget(shrink_form, "Default Shrink Factor: ", NULL, 0);
+ XtVaSetValues(shrink_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ /* TODO XmNleftOffset, 10, */
+ NULL);
+ XtManageChild(shrink_label);
+ {
+ Widget shrink_text;
+#if USE_SPINBOX
+ Widget shrink_spinbox =
+ XtVaCreateManagedWidget(Xdvi_SHRINK_SPINBOX, xmSpinBoxWidgetClass, shrink_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, shrink_label,
+ XmNinitialDelay, 200,
+ XmNrepeatDelay, 50,
+ NULL);
+ shrink_text =
+ XtVaCreateManagedWidget(Xdvi_SHRINK_TEXT, xmTextFieldWidgetClass, shrink_spinbox,
+ XmNspinBoxChildType, XmNUMERIC,
+ XmNminimumValue, 1,
+ XmNmaximumValue, 100,
+ XmNeditable, True,
+ XmNcolumns, 3,
+ XmNincrementValue, 1,
+ XmNwrap, False, /* too confusing */
+ /* NOTE: use resource.shrinkfactor here, not current setting,
+ otherwise the current setting will sneak into ~/.xdvirc */
+ XmNposition, (int)(resource.shrinkfactor),
+ NULL);
+
+ XtAddCallback(shrink_text, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info);
+ XtAddCallback(shrink_text, XmNvalueChangedCallback, set_shrinkfactor_cb, (XtPointer)info);
+
+ adjust_heights(shrink_spinbox, shrink_text, shrink_label, NULL);
+
+#else
+ char buf[LENGTH_OF_INT];
+ Widget shrink_button;
+ shrink_text = XmCreateTextField(shrink_form, Xdvi_SHRINK_TEXT, NULL, 0);
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", resource.shrinkfactor);
+ XtVaSetValues(shrink_text,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, shrink_label,
+ XmNcolumns, 4,
+ XmNvalue, buf,
+ XmNuserData, shrink_text,
+ NULL);
+ XtOverrideTranslations(shrink_text, XtParseTranslationTable("<Key>Return:activate()"));
+ XtAddCallback(shrink_text, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info);
+
+ shrink_button = XmCreatePushButton(shrink_form, Xdvi_APPLY_STR, NULL, 0);
+ XtVaSetValues(shrink_button,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftOffset, 10,
+ XmNleftWidget, shrink_text,
+ XmNuserData, shrink_text,
+ NULL);
+ XtAddCallback(shrink_button, XmNactivateCallback, set_shrinkfactor_cb, (XtPointer)info);
+
+ adjust_heights(shrink_label, shrink_text, shrink_button, NULL);
+ XtManageChild(shrink_text);
+ XtManageChild(shrink_button);
+#endif
+ }
+
+ /* XtManageChild(shrink_form); */
+
+ return shrink_form;
+}
+
+static void
+remember_windowsize_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ resource.remember_windowsize = !resource.remember_windowsize;
+
+ store_preference(&(prefs->db), "rememberWindowSize", "%s", resource.remember_windowsize ? "True" : "False");
+}
+
+
+
+static Widget
+h_create_papersize_form(Widget parent, struct topic_info *info)
+{
+ Widget form, menu, cascade, portrait_option, landscape_option;
+ XmString str;
+ Arg args[8];
+ int n;
+ size_t i;
+ Boolean landscape = False;
+
+ form = XmCreateForm(parent, "paper_form", NULL, 0);
+
+ menu = XmCreatePulldownMenu(form, Xdvi_PAPER_MENU, NULL, 0);
+
+ if (strcmp(resource.paper, "letter") != 0 && /* exceptions: these have no landscape format */
+ strcmp(resource.paper, "ledger") != 0 &&
+ strlen(resource.paper) > 0 &&
+ resource.paper[strlen(resource.paper) - 1] == 'r') { /* landscape format */
+ landscape = True;
+ }
+
+ str = XmStringCreateLocalized("Paper Size:");
+
+ n = 0;
+ XtSetArg(args[n], XmNsubMenuId, menu); n++;
+ XtSetArg(args[n], XmNlabelString, str); n++;
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+
+ cascade = XmCreateOptionMenu(form, Xdvi_PAPER_CASCADE, args, n);
+ XmStringFree(str);
+
+ portrait_option = XmCreateToggleButtonGadget(form, Xdvi_PAPER_PORTRAIT_STR, &one_of_many, 1);
+ XmToggleButtonGadgetSetState(portrait_option, !landscape, False);
+ XtVaSetValues(portrait_option,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, cascade,
+ XmNleftOffset, 10,
+ XmNuserData, (XtPointer)info,
+ NULL);
+
+ landscape_option = XmCreateToggleButtonGadget(form, Xdvi_PAPER_LANDSCAPE_STR, &one_of_many, 1);
+ XmToggleButtonGadgetSetState(landscape_option, landscape, False);
+ XtVaSetValues(landscape_option,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, portrait_option,
+ XmNleftOffset, 10,
+ XmNuserData, (XtPointer)info,
+ NULL);
+ /* adjust_heights(landscape_option, menu, cascade, NULL); */
+ XtAddCallback(portrait_option, XmNvalueChangedCallback, landscape_cb, (XtPointer)info);
+ XtAddCallback(landscape_option, XmNvalueChangedCallback, landscape_cb, (XtPointer)info);
+ /* XtAddCallback(portrait_option, XmNarmCallback, test_cb, (XtPointer)info); */
+ /* XtAddCallback(landscape_option, XmNarmCallback, test_cb, (XtPointer)info); */
+
+ XtManageChild(portrait_option);
+ XtManageChild(landscape_option);
+
+ for (i = 0; papersizes[i].format != NULL; i++) {
+ Widget w = XtVaCreateManagedWidget(papersizes[i].format, xmPushButtonGadgetClass, menu,
+ XmNuserData, landscape_option,
+ NULL);
+ /* fprintf(stderr, "Created button: %p for %s\n", w, papersizes[i].format); */
+
+ /* select default value */
+ if (strncmp(resource.paper,
+ papersizes[i].resource_format,
+ strlen(papersizes[i].resource_format)) == 0) {
+ XtVaSetValues(cascade, XmNmenuHistory, w, NULL);
+ }
+ XtAddCallback(w, XmNactivateCallback, select_cb, (XtPointer)info);
+ }
+ XtManageChild(cascade);
+
+ return form;
+}
+
+Widget
+prefs_paper(struct topic_info *info)
+{
+ Widget form;
+ Widget geometry_frame, geometry_label, geometry_rowcol, shrink_frame, geometry_button;
+ Widget paper_frame, paper_label;
+ Arg args[10];
+ int n = 0;
+ Widget rowcol;
+#if !defined(LESSTIF_VERSION)
+ Widget paper_text;
+#endif
+ Widget paper_size_form;
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass,
+ info->right_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ n = 0;
+ XtSetArg(args[n], XmNmarginWidth, 8); n++;
+ XtSetArg(args[n], XmNmarginHeight, 4); n++;
+ geometry_frame = XmCreateFrame(form, "geometry_frame", args, n);
+ h_attach_below(geometry_frame, NULL);
+
+ geometry_label = XmCreateLabelGadget(geometry_frame, "Window Size and Shrink Factor", &frame_title, 1);
+ XtManageChild(geometry_label);
+
+ geometry_rowcol = XmCreateRowColumn(geometry_frame, "geometry_rowcol", one_col, XtNumber(one_col));
+
+ geometry_button = XmCreateToggleButtonGadget(geometry_rowcol, Xdvi_REMEMBER_WINDOWSIZE_STR, &n_of_many, 1);
+ XmToggleButtonGadgetSetState(geometry_button, resource.remember_windowsize, False);
+ XtAddCallback(geometry_button, XmNvalueChangedCallback, remember_windowsize_cb, (XtPointer)info);
+ XtManageChild(geometry_button);
+
+ shrink_frame = h_create_shrink_frame(geometry_rowcol, info);
+ XtManageChild(shrink_frame);
+
+ XtManageChild(geometry_rowcol);
+
+ n = 0;
+ XtSetArg(args[n], XmNmarginWidth, 8); n++;
+ XtSetArg(args[n], XmNmarginHeight, 4); n++;
+ XtSetArg(args[n], XmNtopOffset, 10); n++;
+ paper_frame = XmCreateFrame(form, "paper_frame", args, n);
+ h_attach_below(paper_frame, geometry_frame);
+
+ paper_label = XmCreateLabelGadget(paper_frame, "Default Paper Size", &frame_title, 1);
+ XtManageChild(paper_label);
+
+ rowcol = XmCreateRowColumn(paper_frame, "papersize_rowcol", NULL, 0);
+
+#if !defined(LESSTIF_VERSION) /* stupid LessTif doesn't wrap Labels at '\n' */
+ paper_text = XmCreateLabelGadget(rowcol,
+ "Used if the DVI file does not specify the paper size, e.g. via\n"
+ "\\usepackage[dvips]{geometry}. This setting will only take effect\n"
+ "after restarting xdvi.", NULL, 0);
+ XtVaSetValues(paper_text,
+ XmNalignment, XmALIGNMENT_BEGINNING,
+ NULL);
+ XtManageChild(paper_text);
+#endif
+
+ paper_size_form = h_create_papersize_form(rowcol, info);
+ XtManageChild(paper_size_form);
+
+ XtManageChild(rowcol);
+
+ XtManageChild(geometry_frame);
+ XtManageChild(paper_frame);
+
+ XtManageChild(form);
+
+ return form;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
+
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_page.h b/Build/source/texk/xdvik/gui/xm_prefs_page.h
new file mode 100644
index 00000000000..e333f831507
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_page.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_PAGE_
+#define XM_PREFS_PAGE_
+
+#ifdef MOTIF
+
+struct topic_info; /* forward declaration */
+extern Widget prefs_paper(struct topic_info *info);
+extern void update_preferences_windowsize(void);
+extern void restore_preferences_shrink(void);
+extern void update_preferences_shrink(void);
+extern void update_preferences_paper(void);
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_PAGE_ */
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_scroll.c b/Build/source/texk/xdvik/gui/xm_prefs_scroll.c
new file mode 100644
index 00000000000..b3697713261
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_scroll.c
@@ -0,0 +1,470 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Panel 5 (Scrolling behaviour) for xdvik preferences dialog.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "x_util.h"
+#include "xm_colorsel.h"
+#include "topic-window.h"
+#include "util.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "statusline.h"
+
+#include "xm_prefsP.h"
+#include "xm_prefs_scroll.h"
+#include "my-snprintf.h"
+
+#ifdef MOTIF /* entire file */
+
+#include <ctype.h>
+
+#include <X11/Xatom.h>
+
+#include <Xm/Xm.h>
+#include <Xm/Protocols.h>
+#include <Xm/DialogS.h>
+#include <Xm/LabelG.h>
+#include <Xm/PushB.h>
+#include <Xm/PushBG.h>
+#include <Xm/Form.h>
+#include <Xm/Frame.h>
+#include <Xm/PanedW.h>
+#include <Xm/DrawnB.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Scale.h>
+#include <Xm/ToggleBG.h>
+#include <Xm/Text.h>
+#include <Xm/TextF.h>
+#include <Xm/CascadeBG.h>
+
+/*
+ * Handy defaults
+ */
+static Arg one_of_many = { XmNindicatorType, XmONE_OF_MANY };
+
+static void
+select_unit_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+ Widget pulldown = XtParent(w);
+ Widget form = XtParent(XtParent(pulldown));
+ Widget text_x, text_y;
+
+ const char *w_name = XtName(w);
+
+ UNUSED(call_data);
+
+ fprintf(stderr, "setting name: %s\n", w_name);
+ XtVaSetValues(pulldown, XmNuserData, (XtPointer)w_name, NULL);
+
+ if (get_widget_by_name(&text_x, form, Xdvi_HOME_POSITION_X_OFF_TEXT, True)
+ && get_widget_by_name(&text_y, form, Xdvi_HOME_POSITION_Y_OFF_TEXT, True)) {
+ const char *buf_x = XmTextFieldGetString(text_x);
+ const char *buf_y = XmTextFieldGetString(text_y);
+
+ int val_x = strtol(buf_x, (char **)NULL, 10);
+ int val_y = strtol(buf_y, (char **)NULL, 10);
+
+ static char x_off[LENGTH_OF_INT + 16];
+ static char y_off[LENGTH_OF_INT + 16];
+
+ SNPRINTF(x_off, LENGTH_OF_INT + 16, "%s%s", buf_x, w_name);
+ SNPRINTF(y_off, LENGTH_OF_INT + 16, "%s%s", buf_y, w_name);
+
+ resource.sidemargin = x_off;
+ resource.topmargin = y_off;
+
+ resource.sidemargin_int = val_x;
+ resource.topmargin_int = val_y;
+
+ store_preference(&(prefs->db), "sideMargin", "%s", x_off);
+ store_preference(&(prefs->db), "topMargin", "%s", y_off);
+
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+
+ XtFree((char *)buf_x);
+ XtFree((char *)buf_y);
+ }
+}
+
+static void
+set_offset_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+ Widget form = XtParent(w);
+ Widget pulldown;
+
+ UNUSED(call_data);
+
+ if (get_widget_by_name(&pulldown, form, Xdvi_HOME_POSITION_UNITS_PULLDOWN, True)) {
+ char *ptr = NULL;
+ const char *w_name = XtName(w);
+
+ XtVaGetValues(pulldown, XmNuserData, &ptr, NULL);
+
+ if (ptr == NULL) {
+ XDVI_WARNING((stderr, "XmNuserData for %s is NULL in set_offset_cb()\n",
+ Xdvi_HOME_POSITION_UNITS_PULLDOWN));
+ return;
+ }
+ fprintf(stderr, "UNIT: |%s|\n", ptr);
+
+ if (strcmp(w_name, Xdvi_HOME_POSITION_X_OFF_TEXT) == 0) {
+ static char x_off[LENGTH_OF_INT + 16];
+ const char *buf = XmTextFieldGetString(w);
+ int val = strtol(buf, (char **)NULL, 10);
+
+ SNPRINTF(x_off, LENGTH_OF_INT + 16, "%s%s", buf, ptr);
+
+ XtFree((char *)buf);
+
+ resource.sidemargin = x_off;
+ resource.sidemargin_int = val;
+ store_preference(&(prefs->db), "sideMargin", "%s", x_off);
+
+ goto_page(current_page, resource.keep_flag ? NULL : home, True);
+ }
+ else if (strcmp(w_name, Xdvi_HOME_POSITION_Y_OFF_TEXT) == 0) {
+ static char y_off[LENGTH_OF_INT + 16];
+ const char *buf = XmTextFieldGetString(w);
+ int val = strtol(buf, (char **)NULL, 10);
+
+ SNPRINTF(y_off, LENGTH_OF_INT + 16, "%s%s", buf, ptr);
+
+ XtFree((char *)buf);
+
+ resource.topmargin = y_off;
+ resource.topmargin_int = val;
+ store_preference(&(prefs->db), "topMargin", "%s", y_off);
+
+ goto_page(current_page, resource.keep_flag ? NULL : home, True);
+ }
+ else {
+ XDVI_WARNING((stderr, "unexpected widget name `%s' in set_offset_cb()", w_name));
+ }
+ }
+}
+
+static void
+home_position_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+ Widget parent = XtParent(XtParent(w));
+ Widget toggle_home, toggle_curr, label_x, label_y, text_x, text_y, units_menu;
+
+ UNUSED(call_data);
+
+ resource.use_current_offset = !resource.use_current_offset;
+
+ if (get_widget_by_name(&toggle_home, parent, Xdvi_HOME_POSITION_STR, True)
+ && get_widget_by_name(&toggle_curr, parent, Xdvi_SCROLL_CURRENT_STR, True)
+ && get_widget_by_name(&label_x, parent, Xdvi_HOME_POSITION_X_STR, True)
+ && get_widget_by_name(&label_y, parent, Xdvi_HOME_POSITION_Y_STR, True)
+ && get_widget_by_name(&text_x, parent, Xdvi_HOME_POSITION_X_OFF_TEXT, True)
+ && get_widget_by_name(&text_y, parent, Xdvi_HOME_POSITION_Y_OFF_TEXT, True)
+ && get_widget_by_name(&units_menu, parent, Xdvi_HOME_POSITION_UNITS_MENU, True)) {
+
+ XmToggleButtonGadgetSetState(toggle_home, !resource.use_current_offset, False);
+ XmToggleButtonGadgetSetState(toggle_curr, resource.use_current_offset, False);
+
+ XtSetSensitive(label_x, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(label_y, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(text_x, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(text_y, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(units_menu, !resource.keep_flag && !resource.use_current_offset);
+ }
+
+ store_preference(&(prefs->db), "useCurrentOffset", "%s", resource.use_current_offset ? "True" : "False");
+}
+
+static void
+keep_cb(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct topic_info *info = (struct topic_info *)client_data;
+ struct prefs_choice *prefs = (struct prefs_choice *)(info->data);
+
+ Widget parent, keep, unkeep, toggle_home, toggle_curr, label_x, label_y, text_x, text_y, units_menu;
+
+ UNUSED(call_data);
+
+ resource.keep_flag = !resource.keep_flag;
+
+ parent = XtParent(w);
+
+ if (get_widget_by_name(&keep, parent, Xdvi_SCROLL_KEEP_STR, True)
+ && get_widget_by_name(&unkeep, parent, Xdvi_SCROLL_UNKEEP_STR, True)
+ && get_widget_by_name(&toggle_home, parent, Xdvi_HOME_POSITION_STR, True)
+ && get_widget_by_name(&toggle_curr, parent, Xdvi_SCROLL_CURRENT_STR, True)
+ && get_widget_by_name(&label_x, parent, Xdvi_HOME_POSITION_X_STR, True)
+ && get_widget_by_name(&label_y, parent, Xdvi_HOME_POSITION_Y_STR, True)
+ && get_widget_by_name(&text_x, parent, Xdvi_HOME_POSITION_X_OFF_TEXT, True)
+ && get_widget_by_name(&text_y, parent, Xdvi_HOME_POSITION_Y_OFF_TEXT, True)
+ && get_widget_by_name(&units_menu, parent, Xdvi_HOME_POSITION_UNITS_MENU, True)) {
+
+ XmToggleButtonGadgetSetState(keep, resource.keep_flag, False);
+ XmToggleButtonGadgetSetState(unkeep, !resource.keep_flag, False);
+
+ XtSetSensitive(label_x, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(label_y, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(text_x, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(text_y, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(units_menu, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(toggle_home, !resource.keep_flag);
+ XtSetSensitive(toggle_curr, !resource.keep_flag);
+ }
+
+ store_preference(&(prefs->db), "keepPosition", "%s", resource.keep_flag ? "True" : "False");
+
+}
+
+static Widget
+h_create_scrolling(Widget parent, struct topic_info *info)
+{
+ Widget form, form1, form2, size_option, curr_option;
+ Widget x_off_label, x_off_text;
+ Widget y_off_label, y_off_text;
+ Widget off_units_menu, cascade, entry1, entry2, entry3;
+
+ Widget scroll_keep, scroll_unkeep;
+
+ char x_buf[LENGTH_OF_INT + 16];
+ char y_buf[LENGTH_OF_INT + 16];
+ int n;
+ Arg args[8];
+
+ fprintf(stderr, "sidemargin: %s, topmargin: %s\n", resource.sidemargin, resource.topmargin);
+
+ if (resource.sidemargin != NULL) {
+ char *ptr;
+ strcpy(x_buf, resource.sidemargin);
+ ptr = x_buf;
+ if (*ptr == '-')
+ ptr++;
+ while (isdigit((int)*ptr))
+ ptr++;
+ *ptr = '\0';
+ }
+ else
+ strcpy(x_buf, "0");
+
+ if (resource.topmargin != NULL) {
+ char *ptr;
+ strcpy(y_buf, resource.topmargin);
+ ptr = y_buf;
+ if (*ptr == '-')
+ ptr++;
+ while (isdigit((int)*ptr))
+ ptr++;
+ *ptr = '\0';
+ }
+ else
+ strcpy(y_buf, "0");
+
+ form = XmCreateForm(parent, "offsets_form", NULL, 0);
+
+ scroll_keep = XmCreateToggleButtonGadget(form, Xdvi_SCROLL_KEEP_STR, &one_of_many, 1);
+ XtVaSetValues(scroll_keep,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+ scroll_unkeep = XmCreateToggleButtonGadget(form, Xdvi_SCROLL_UNKEEP_STR, &one_of_many, 1);
+ XtVaSetValues(scroll_unkeep,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, scroll_keep,
+ XmNleftAttachment, XmATTACH_FORM,
+ NULL);
+
+ XmToggleButtonGadgetSetState(scroll_keep, resource.keep_flag, False);
+ XmToggleButtonGadgetSetState(scroll_unkeep, !resource.keep_flag, False);
+
+ XtAddCallback(scroll_keep, XmNvalueChangedCallback, keep_cb, (XtPointer)info);
+ XtAddCallback(scroll_unkeep, XmNvalueChangedCallback, keep_cb, (XtPointer)info);
+
+ XtManageChild(scroll_keep);
+ XtManageChild(scroll_unkeep);
+
+ form1 = XmCreateForm(form, "offsets_form1", NULL, 0);
+ XtVaSetValues(form1,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, scroll_unkeep,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ NULL);
+
+ size_option = XmCreateToggleButtonGadget(form1, Xdvi_HOME_POSITION_STR, &one_of_many, 1);
+ XtVaSetValues(size_option,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ x_off_label = XmCreateLabelGadget(form1, Xdvi_HOME_POSITION_X_STR, NULL, 0);
+ XtVaSetValues(x_off_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, size_option,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ x_off_text = XtVaCreateManagedWidget(Xdvi_HOME_POSITION_X_OFF_TEXT,
+ xmTextFieldWidgetClass, form1,
+ XmNcolumns, 4,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, x_off_label,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNvalue, x_buf,
+ /* XmNvalue, buf, */
+ NULL);
+ y_off_label = XmCreateLabelGadget(form1, Xdvi_HOME_POSITION_Y_STR, NULL, 0);
+ XtVaSetValues(y_off_label,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, x_off_text,
+ XmNleftOffset, 10,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ y_off_text = XtVaCreateManagedWidget(Xdvi_HOME_POSITION_Y_OFF_TEXT,
+ xmTextFieldWidgetClass, form1,
+ XmNcolumns, 4,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNleftWidget, y_off_label,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNvalue, y_buf,
+ NULL);
+ n = 0;
+ XtSetArg(args[n], XmNuserData, (XtPointer)"in"); n++;
+ off_units_menu = XmCreatePulldownMenu(form1, Xdvi_HOME_POSITION_UNITS_PULLDOWN, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XmNsubMenuId, off_units_menu); n++;
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
+ XtSetArg(args[n], XmNleftWidget, y_off_text); n++;
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+ cascade = XmCreateOptionMenu(form1, Xdvi_HOME_POSITION_UNITS_MENU, args, n);
+ entry1 = XtVaCreateManagedWidget("in", xmPushButtonGadgetClass, off_units_menu,
+ NULL);
+ XtAddCallback(entry1, XmNactivateCallback, select_unit_cb, info);
+ entry2 = XtVaCreateManagedWidget("cm", xmPushButtonGadgetClass, off_units_menu,
+ NULL);
+ XtAddCallback(entry2, XmNactivateCallback, select_unit_cb, info);
+ entry3 = XtVaCreateManagedWidget("Pixel", xmPushButtonGadgetClass, off_units_menu,
+ NULL);
+ XtAddCallback(entry3, XmNactivateCallback, select_unit_cb, info);
+
+ XtAddCallback(x_off_text, XmNvalueChangedCallback, set_offset_cb, (XtPointer)info);
+ XtAddCallback(y_off_text, XmNvalueChangedCallback, set_offset_cb, (XtPointer)info);
+
+ XtManageChild(size_option);
+ XtManageChild(x_off_label);
+ XtManageChild(x_off_text);
+ XtManageChild(y_off_label);
+ XtManageChild(y_off_text);
+ XtManageChild(cascade);
+
+ form2 = XmCreateForm(form, "offsets_form2", NULL, 0);
+ XtVaSetValues(form2,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, form1,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ NULL);
+
+ curr_option = XmCreateToggleButtonGadget(form2, Xdvi_SCROLL_CURRENT_STR, &one_of_many, 1);
+ XtVaSetValues(curr_option,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+ XtManageChild(curr_option);
+
+ XtSetSensitive(x_off_label, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(x_off_text, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(y_off_label, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(y_off_text, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(cascade, !resource.keep_flag && !resource.use_current_offset);
+ XtSetSensitive(size_option, !resource.keep_flag);
+ XtSetSensitive(curr_option, !resource.keep_flag);
+
+ XmToggleButtonGadgetSetState(size_option, !resource.use_current_offset, False);
+ XmToggleButtonGadgetSetState(curr_option, resource.use_current_offset, False);
+
+ XtAddCallback(size_option, XmNvalueChangedCallback, home_position_cb, (XtPointer)info);
+ XtAddCallback(curr_option, XmNvalueChangedCallback, home_position_cb, (XtPointer)info);
+
+ XtManageChild(form1);
+ XtManageChild(form2);
+
+ return form;
+}
+
+Widget
+prefs_scrolling(struct topic_info *info)
+{
+ Widget form;
+ Widget scrolling_form, scrolling_frame;
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass,
+ info->right_form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ scrolling_frame = XmCreateFrame(form, "scrolling_frame", NULL, 0);
+ h_attach_below(scrolling_frame, NULL);
+
+ scrolling_form = h_create_scrolling(scrolling_frame, info);
+ XtVaSetValues(scrolling_form,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, scrolling_frame,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+
+ XtManageChild(scrolling_form);
+ XtManageChild(scrolling_frame);
+
+ return form;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
+
diff --git a/Build/source/texk/xdvik/gui/xm_prefs_scroll.h b/Build/source/texk/xdvik/gui/xm_prefs_scroll.h
new file mode 100644
index 00000000000..838a55afdfd
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_prefs_scroll.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef XM_PREFS_SCROLL_
+#define XM_PREFS_SCROLL_
+
+#ifdef MOTIF
+
+struct topic_info; /* forward declaration */
+extern Widget prefs_scrolling(struct topic_info *info);
+
+#endif /* MOTIF */
+
+#endif /* XM_PREFS_SCROLL_ */
diff --git a/Build/source/texk/xdvik/gui/xm_toolbar.c b/Build/source/texk/xdvik/gui/xm_toolbar.c
new file mode 100644
index 00000000000..7b523d344db
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_toolbar.c
@@ -0,0 +1,863 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * Tool bar implementation for the Motif widget set.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include "pagesel.h"
+#include "help-window.h"
+#include "message-window.h"
+#include "kpathsea/tex-file.h"
+#include "kpathsea/expand.h"
+#include "statusline.h"
+#include "dvi-init.h"
+#include "events.h"
+#include "dvi-draw.h"
+#include "xm_menu.h"
+#include "xm_toolbar.h"
+#include "util.h"
+#include "x_util.h"
+#include "Tip.h"
+
+#include <stdlib.h>
+
+#include "xdvi-config.h"
+#include "c-openmx.h"
+
+/* default toolbar pixmap file */
+#include "pixmaps/toolbar.xpm"
+
+#ifdef MOTIF
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/RowColumn.h>
+#include <Xm/Frame.h>
+#include <Xm/PushB.h>
+#include <Xm/Form.h>
+#include <Xm/Separator.h>
+#include <Xm/CascadeB.h>
+#include <Xm/MainW.h>
+#include <Xm/DialogS.h>
+#include <Xm/MessageB.h>
+#include <Xm/Label.h>
+
+#if defined(HAVE_X11_XPM_H)
+# include <X11/xpm.h>
+#elif defined(HAVE_XPM_H)
+# include <xpm.h>
+#elif defined(HAVE_XM_XPMP_H)
+# include <Xm/XpmP.h>
+#endif
+
+#include <sys/stat.h>
+
+/*
+ * The following needs to be keept in sync with the actual pixmap sizes in
+ * tools.xpm. When editing the pixmaps, take care that the symbolic names
+ * are not messed up (e.g. it works with "pixmap" from ftp.x11.org, but
+ * not with xv).
+ */
+
+#define PIXMAP_WIDTH 18
+#define PIXMAP_HEIGHT 18
+/* #define PIXMAP_COUNT 13 */
+
+
+static Widget tool_bar_frame;
+
+#define SEP_CHAR ':' /* character separating entries in translations lines */
+
+void
+toggle_scrollbars(void)
+{
+ Widget x_bar = XtNameToWidget(globals.widgets.main_window, "HorScrollBar");
+ Widget y_bar = XtNameToWidget(globals.widgets.main_window, "VertScrollBar");
+
+ if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) {
+ XtUnmanageChild(x_bar);
+ XtUnmanageChild(y_bar);
+ }
+ else {
+ XtManageChild(x_bar);
+ XtManageChild(y_bar);
+ }
+
+ set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
+}
+
+void
+toggle_toolbar(void)
+{
+#if !HAVE_XPM
+ statusline_error(STATUS_LONG,
+ "Compiled without XPM support; no toolbar available.");
+#else
+ if (resource.toolbar_unusable) {
+ statusline_error(STATUS_LONG,
+ "Toolbar pixmap file not found; toolbar is disabled.");
+ return;
+ }
+
+ if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ XtUnmanageChild(tool_bar_frame);
+ else
+ XtManageChild(tool_bar_frame);
+
+ set_menu(&resource.expert_mode, Act_set_expert_mode, check_resource_expert);
+
+#endif /* not HAVE_XPM */
+}
+
+typedef enum { TB_BUTTON, TB_SEPARATOR } toolbarButtonT;
+
+/* global array of button infos */
+static struct toolbar_button_info {
+ Widget button;
+ toolbarButtonT type;
+ char *tip;
+} *toolbar_buttons = NULL;
+
+#if HAVE_XPM /* remainder of file: toolbar is disabled without XPM support */
+
+/* to save current values to */
+static Pixel m_background = 0, m_top_shadow_color = 0, m_bottom_shadow_color = 0;
+
+/* to save resource value of XmNshadowThickness before overriding it if
+ toolbar_buttons_raised is false; it will be used to raise the button on enter:
+*/
+static int m_shadow_thickness;
+extern Boolean get_int_arg(String *param, Cardinal *num_params, int *res);
+
+/* indexes for named colors */
+enum {
+ BACKGROUND,
+ FOREGROUND,
+ BOTTOM_SHADOW,
+ TOP_SHADOW,
+ HIGHLIGHT
+};
+
+/* save info about buttons that need to change state */
+static struct state_buttons_info {
+ Widget back_button; /* insensitive when current page is last page */
+ Widget zoom_in_button; /* insensitive when shrinkfactor is 1 */
+ Widget forward_button; /* insensitive when current page is first page */
+ Widget hyperref_back_button; /* insensitive when at end of href history */
+ Widget hyperref_forward_button; /* insensitive when at begin of href history */
+} m_button_info;
+
+static XtCallbackRec command_call[] = {
+ { handle_command, NULL },
+ { NULL, NULL },
+};
+
+static void
+set_button_sensitivity(Widget w, Boolean sensitive)
+{
+ if (w == NULL) { /* if button hadn't been initialized properly */
+ return;
+ }
+ XtVaSetValues(w, XmNsensitive, sensitive, NULL);
+ /* also remove `raised' property on mouse over */
+ if (!sensitive && !resource.toolbar_buttons_raised) {
+ Dimension x, y, wd, ht;
+ Pixel foreground;
+ static GC backgroundGC = NULL;
+ if (!XtIsRealized(w))
+ return;
+ XtVaGetValues(w,
+ XmNx, &x,
+ XmNy, &y,
+ XmNwidth, &wd,
+ XmNheight, &ht,
+ NULL);
+ if (backgroundGC == NULL) {
+ XtVaGetValues(w, XmNforeground, &foreground, NULL);
+ backgroundGC = set_or_make_gc(NULL, GXcopy, m_background, foreground);
+ }
+ XtVaSetValues(w,
+ XmNtopShadowColor, m_background,
+ XmNbottomShadowColor, m_background,
+ NULL);
+#if 0
+ fprintf(stderr, "drawing on %d,%d\n", x, y);
+ XFillRectangle(XtDisplay(w), XtWindow(w), globals.gc.high, /* backgroundGC, */
+ x, y, wd, ht);
+#endif
+ }
+ XSync(DISP, False);
+}
+
+void
+tb_check_navigation_sensitivity(int pageno)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+
+ set_button_sensitivity(m_button_info.forward_button, pageno == total_pages - 1 ? False : True);
+ set_button_sensitivity(m_button_info.back_button, pageno == 0 ? False : True);
+}
+
+void
+tb_set_htex_back_sensitivity(Boolean sensitive)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+ set_button_sensitivity(m_button_info.hyperref_back_button, sensitive);
+}
+
+void
+tb_set_htex_forward_sensitivity(Boolean sensitive)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+
+ set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive);
+}
+
+void
+tb_set_pagehist_back_sensitivity(Boolean sensitive)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+ set_button_sensitivity(m_button_info.hyperref_back_button, sensitive);
+}
+
+void
+tb_set_pagehist_forward_sensitivity(Boolean sensitive)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+
+ set_button_sensitivity(m_button_info.hyperref_forward_button, sensitive);
+}
+
+void
+tb_set_zoom_sensitivity(Boolean sensitive)
+{
+ if (!XtIsRealized(globals.widgets.top_level) || (resource.expert_mode & XPRT_SHOW_TOOLBAR) == 0)
+ return;
+
+ set_button_sensitivity(m_button_info.zoom_in_button, sensitive);
+}
+
+#if 0
+static void
+search_callback(Widget w,
+ XtPointer client_data,
+ XmAnyCallbackStruct *call_data)
+{
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL, "Sorry, not yet implemented");
+}
+#endif /* 0 */
+
+
+
+/*
+ * If successful, this extracts a square pixmap from resource.toolbar_pixmap_file
+ * and returns True.
+ * In this case, the pixmap `sen' will contain the actual
+ * pixmap and `insen' will contain a drawn pixmap for the insensitive state of
+ * the button. We are emulating a shaded state derived from the monochrome 'm'
+ * color attributes of the XPM.
+ *
+ * If unsuccessful, it returns False, and the Pixmap pointers are undefined.
+ */
+
+static Boolean
+create_pixmap(Widget parent, int iconidx, Pixmap *sen, Pixmap *insen)
+{
+ static Boolean first_time = True;
+ static Window rootWindow;
+ static XpmColorSymbol color[5] = {
+ {"none", "none", 0},
+ {"iconColor1", NULL, 0},
+ {"bottomShadowColor", NULL, 0},
+ {"topShadowColor", NULL, 0},
+ {"selectColor", NULL, 0}
+ };
+ static Pixmap tools_map;
+ static Pixmap tools_mask;
+ static Pixmap shade_map;
+ static Pixmap shade_mask;
+
+ int status = 0;
+ XpmAttributes attr;
+ Pixmap map;
+ Pixmap mask;
+ static String pixmap_file_path = NULL; /* note: never free()d */
+
+ ASSERT(iconidx >= 0, "index must be positive");
+
+ if (first_time) {
+ /* FIXME: We use a dummy window here to get the correct depth/visual for the
+ pixmap creation (cant use globals.widgets.top_level since it's not realized
+ yet and realizing it now would result in wrong dimensions) ... */
+ Widget dummy = XtVaAppCreateShell("xdvi", "Xdvi",
+ transientShellWidgetClass, DISP,
+ XtNdepth, G_depth,
+ XtNvisual, G_visual,
+ XtNcolormap, G_colormap,
+ XtNmappedWhenManaged, False,
+ NULL);
+ XtRealizeWidget(dummy); /* note: doesn't pop it up */
+ rootWindow = XtWindow(dummy);
+ ASSERT(rootWindow != 0, "");
+ XtVaGetValues(parent,
+ XmNbackground, &color[BACKGROUND].pixel,
+ XmNforeground, &color[FOREGROUND].pixel,
+ XmNbottomShadowColor, &color[BOTTOM_SHADOW].pixel,
+ XmNtopShadowColor, &color[TOP_SHADOW].pixel,
+ XmNhighlightColor, &color[HIGHLIGHT].pixel,
+ NULL);
+ /* try to locate the XPM file with the toolbar pixmaps */
+ pixmap_file_path = XtResolvePathname(DISP,
+ "pixmaps",
+ resource.toolbar_pixmap_file,
+ (String)NULL, /* suffix */
+ (String)NULL, /* use default path */
+ (Substitution)NULL, /* substitutions */
+ 0, /* number of substitutions */
+ (XtFilePredicate)NULL); /* return True iff file exists */
+
+ TRACE_GUI((stderr, "pixmap file search via XtResolvePathname: %s => %s",
+ resource.toolbar_pixmap_file, pixmap_file_path ? (char*)pixmap_file_path : "<NULL>"));
+ if (pixmap_file_path == NULL) {
+ pixmap_file_path = (String)kpse_find_file(resource.toolbar_pixmap_file,
+ kpse_program_text_format,
+ 0);
+ TRACE_GUI((stderr,
+ "pixmap file search via kpse_find_file: %s => %s",
+ resource.toolbar_pixmap_file,
+ pixmap_file_path ? (char*)pixmap_file_path : "<NULL>"));
+ if (pixmap_file_path == NULL) {
+ TRACE_GUI((stderr, "No installed toolbar pixmap found, using built-in pixmap."));
+ }
+ }
+ }
+
+ /* Setup the color subsititution table */
+ attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColormap | XpmDepth | XpmVisual;
+ attr.closeness = 65535; /* accuracy isn't crucial */
+ attr.colorsymbols = color;
+ attr.numsymbols = XtNumber(color);
+ attr.visual = G_visual;
+ attr.colormap = G_colormap;
+ attr.depth = G_depth;
+
+ /* Create the "sensitive" pixmap */
+ if (!tools_map) {
+ if (pixmap_file_path != NULL) {
+ status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow,
+ pixmap_file_path, &tools_map, &tools_mask, &attr);
+ }
+ else {
+ status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow,
+ (char **)toolbar_xpm, &tools_map, &tools_mask, &attr);
+ }
+ }
+ else
+ status = XpmSuccess;
+
+ map = tools_map;
+ mask = tools_mask;
+
+ if (status == XpmSuccess) {
+ static Pixmap tmp_mask;
+ static GC gc;
+
+ if (first_time) {
+ tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT, 1);
+ gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL);
+ }
+ XCopyArea(XtDisplay(globals.widgets.top_level),
+ mask, tmp_mask, gc, iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
+
+ mask = tmp_mask;
+ }
+ else { /* something went wrong */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ "Something's wrong with your XPM file - "
+ "try to load it into an image editor and fix the problem.",
+ "Xpm error: %s - switching toolbar off.",
+ XpmGetErrorString(status));
+ sen = insen = NULL;
+ resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
+ return False;
+ }
+
+ XpmFreeAttributes(&attr);
+
+ if (map != 0) {
+ static GC back_gc, bots_gc;
+
+ if (first_time) {
+ XGCValues gcvalues;
+
+ gcvalues.foreground = color[BACKGROUND].pixel;
+ back_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
+
+ gcvalues.foreground = color[BOTTOM_SHADOW].pixel;
+ bots_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
+ }
+
+ /* Need to create new Pixmaps with the mask applied. */
+ XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask);
+
+ /* Create the "sensitive" pixmap. */
+ *sen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT,
+ G_depth);
+ XFillRectangle(XtDisplay(globals.widgets.top_level), *sen, back_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT);
+ if (iconidx != -1)
+ XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc,
+ iconidx * PIXMAP_WIDTH, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
+ else
+ XCopyArea(XtDisplay(globals.widgets.top_level), map, *sen, bots_gc,
+ 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT, 0, 0);
+
+ if (iconidx == -1)
+ XFreePixmap(XtDisplay(globals.widgets.top_level), map);
+
+ /* Create the "insensitive" pixmap. */
+ if (insen != NULL) {
+ Pixmap map;
+ Pixmap mask;
+
+ attr.valuemask = XpmColorSymbols | XpmCloseness | XpmColorKey | XpmColormap | XpmDepth | XpmVisual;
+ attr.closeness = 65535; /* accuracy isn't crucial */
+ attr.colorsymbols = color;
+ attr.numsymbols = XtNumber(color);
+ attr.color_key = XPM_MONO;
+ attr.visual = G_visual;
+ attr.colormap = G_colormap;
+ attr.depth = G_depth;
+
+
+ if (!shade_map) {
+ if (pixmap_file_path != NULL) {
+ status = XpmReadFileToPixmap(XtDisplay(globals.widgets.top_level), rootWindow,
+ pixmap_file_path, &shade_map, &shade_mask, &attr);
+ }
+ else {
+ status = XpmCreatePixmapFromData(XtDisplay(globals.widgets.top_level), rootWindow,
+ (char **)toolbar_xpm, &shade_map, &shade_mask, &attr);
+ }
+ }
+ else
+ status = XpmSuccess;
+
+ map = shade_map;
+ mask = shade_mask;
+
+ if (status == XpmSuccess) {
+ static Pixmap tmp_mask;
+ static GC gc;
+
+ if (first_time) {
+ tmp_mask = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow,
+ PIXMAP_WIDTH, PIXMAP_HEIGHT, 1);
+ gc = XCreateGC(XtDisplay(globals.widgets.top_level), tmp_mask, 0, NULL);
+ }
+
+ XCopyArea(XtDisplay(globals.widgets.top_level), mask, tmp_mask, gc,
+ iconidx * PIXMAP_WIDTH, 0,
+ PIXMAP_WIDTH, PIXMAP_HEIGHT,
+ 0, 0);
+
+ mask = tmp_mask;
+ }
+ else { /* something went wrong */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ "Something's wrong with your XPM file - "
+ "try to load it into an image editor and fix the problem.",
+ "Xpm error: %s - switching toolbar off.",
+ XpmGetErrorString(status));
+ sen = insen = NULL;
+ resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
+ return False;
+ }
+
+ if (mask != 0) {
+ static GC tops_gc;
+
+ if (first_time) {
+ XGCValues gcvalues;
+
+ gcvalues.foreground = color[TOP_SHADOW].pixel;
+ tops_gc = XCreateGC(XtDisplay(globals.widgets.top_level), rootWindow, GCForeground, &gcvalues);
+ }
+
+ /* Need to create new Pixmaps with the mask applied. */
+ XSetClipMask(XtDisplay(globals.widgets.top_level), bots_gc, mask);
+ XSetClipMask(XtDisplay(globals.widgets.top_level), tops_gc, mask);
+ XSetClipOrigin(XtDisplay(globals.widgets.top_level), tops_gc, 1, 1);
+
+ *insen = XCreatePixmap(XtDisplay(globals.widgets.top_level), rootWindow, PIXMAP_WIDTH, PIXMAP_HEIGHT,
+ G_depth);
+
+ XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, back_gc, 0, 0,
+ PIXMAP_WIDTH, PIXMAP_HEIGHT);
+ XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, tops_gc, 1, 1,
+ PIXMAP_WIDTH - 1, PIXMAP_HEIGHT - 1);
+ XFillRectangle(XtDisplay(globals.widgets.top_level), *insen, bots_gc, 0, 0, PIXMAP_WIDTH, PIXMAP_HEIGHT);
+
+ if (iconidx == -1)
+ XFreePixmap(XtDisplay(globals.widgets.top_level), map);
+ }
+
+ XpmFreeAttributes(&attr);
+ }
+ }
+
+ first_time = False;
+ return True;
+}
+
+/*
+ * If successful, this returns True, and sets *button to a button with
+ * a square pixmap on it (which is cut out form `index' position in
+ * resource.toolbar_pixmap_file). If unsuccessful, it returns false,
+ * and *button is undefined.
+ */
+static Boolean
+create_toolbar_button(Widget parent, Widget *button,
+ const Pixmap *image_sens, const Pixmap *image_insens)
+{
+ Boolean sensitive = True; /* dummy */
+ *button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, parent,
+ XmNhighlightOnEnter, True,
+ XmNlabelPixmap, *image_sens,
+ XmNlabelInsensitivePixmap, *image_insens,
+ XmNsensitive, sensitive,
+ XmNlabelType, XmPIXMAP,
+ NULL);
+ XtVaGetValues(*button, XmNshadowThickness, &m_shadow_thickness, NULL);
+ if (!resource.toolbar_buttons_raised) {
+ if (m_background == 0) { /* initialize values */
+ XtVaGetValues(*button,
+ /* should we rather get background of parent widget? */
+ XmNbackground, &m_background,
+ XmNtopShadowColor, &m_top_shadow_color,
+ XmNbottomShadowColor, &m_bottom_shadow_color,
+ NULL);
+ }
+ /* remove shadows, setting them later when mouse enters button */
+ XtVaSetValues(*button,
+ XmNtopShadowColor, m_background,
+ XmNbottomShadowColor, m_background,
+ NULL);
+ }
+ return True;
+}
+
+static void
+create_toolbar_separator(Widget parent, Widget *separator, int width)
+{
+ *separator = XtVaCreateManagedWidget("toolbarSeparator",
+ xmSeparatorWidgetClass, parent,
+ XmNseparatorType, XmNO_LINE,
+ XmNminWidth, width,
+ XmNwidth, width,
+ XmNorientation, XmVERTICAL,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ XmNrightAttachment, XmATTACH_WIDGET,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ NULL);
+}
+
+/* taken from shadow_trick in WlToolBar.c, mgv-3.1.5:
+ Get a raised behaviour for armed buttons, by explicitly setting
+ a shadow on entry and removing it on leave.
+*/
+static void
+enter_leave(Widget w, XtPointer closure, XEvent *event, Boolean *cont)
+{
+ char *tooltip = (char *)closure;
+ XCrossingEvent *ev = (XCrossingEvent *)event;
+ static Boolean entered = False; /* to skip double leaves */
+
+ UNUSED(cont);
+
+ if (ev->type == EnterNotify) {
+ if (!resource.toolbar_buttons_raised) {
+ /* draw shadows */
+ XtVaSetValues(w,
+ XmNtopShadowColor, m_top_shadow_color,
+ XmNbottomShadowColor, m_bottom_shadow_color,
+ NULL);
+ }
+ entered = True;
+ if (resource.tooltips_in_statusline) {
+ statusline_info(STATUS_SHORT, tooltip);
+ }
+ }
+ else if (ev->type == LeaveNotify && !resource.toolbar_buttons_raised) {
+ /* remove shadows */
+ if (!entered)
+ return;
+
+ XtVaSetValues(w,
+ XmNtopShadowColor, m_background,
+ XmNbottomShadowColor, m_background,
+ NULL);
+ entered = False;
+ }
+}
+
+/*
+ save info about special buttons in m_button_info
+ (see definition of that for details)
+*/
+static void
+button_info_save(struct xdvi_action *action, Widget w)
+{
+ if (action->proc == Act_back_page
+ && action->num_params > 0 && strcmp(action->params[0], "1") == 0) {
+ m_button_info.back_button = w;
+ }
+ else if (action->proc == Act_forward_page
+ && action->num_params > 0 && strcmp(action->params[0], "1") == 0) {
+ m_button_info.forward_button = w;
+ }
+ else if (action->proc == Act_pagehistory_back) {
+ set_button_sensitivity(w, False);
+ m_button_info.hyperref_back_button = w;
+ }
+ else if (action->proc == Act_pagehistory_forward) {
+ set_button_sensitivity(w, False);
+ m_button_info.hyperref_forward_button = w;
+ }
+ else if (action->proc == Act_set_shrink_factor
+ && action->num_params > 0 && action->params[0][0] == '+') {
+ m_button_info.zoom_in_button = w;
+ }
+}
+
+#endif /* HAVE_XPM */
+
+/*
+ * Create a toolbar with buttons, return toolbar widget.
+ */
+Widget
+create_toolbar(Widget parent, Widget menu_bar)
+{
+#if HAVE_XPM
+ size_t alloc_len = 0, n;
+ size_t alloc_step = 16;
+ const char *c_ptr, *e_ptr;
+#endif /* HAVE_XPM */
+ Widget tool_bar;
+ resource.toolbar_unusable = False;
+
+ tool_bar_frame = XtVaCreateWidget("toolBarFrame",
+ xmFrameWidgetClass, parent,
+ XmNshadowType, XmSHADOW_OUT,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNtopAttachment, XmATTACH_WIDGET,
+ XmNtopWidget, menu_bar,
+ NULL);
+
+ tool_bar = XtVaCreateManagedWidget("toolBar",
+ xmRowColumnWidgetClass, tool_bar_frame,
+ XmNchildType, XmFRAME_WORKAREA_CHILD,
+ XmNrowColumnType, XmWORK_AREA,
+ XmNorientation, XmHORIZONTAL,
+ XmNtraversalOn, False,
+ XmNisHomogeneous, False,
+ XmNpacking, XmPACK_TIGHT,
+ XmNspacing, 0, /* override to use SEPARATOR(n) instead */
+ XmNadjustLast, True,
+ NULL);
+
+#if HAVE_XPM
+ /* parse toolbar_translations, create the widgets and assign the actions */
+ for (n = 0, c_ptr = resource.toolbar_translations;
+ c_ptr != NULL && *c_ptr != '\0';
+ c_ptr = e_ptr, n++) {
+ char **line_items = NULL;
+ int extra_space;
+ size_t len, curr, item_count = 0;
+
+ if ((e_ptr = strchr(c_ptr, '\n')) == NULL
+ /* ... and in case last line doesn't end with \n ... */
+ && (e_ptr = strchr(c_ptr, '\0')) == NULL) {
+ break;
+ }
+
+ if (e_ptr == c_ptr) {
+ XDVI_WARNING((stderr, "Skipping empty line in toolbarTranslations resource."));
+ e_ptr++;
+ continue;
+ }
+ len = e_ptr - c_ptr;
+ TRACE_GUI((stderr, "LEN %lu: |%.*s|", (unsigned long)len, (int)len, c_ptr));
+
+ line_items = split_line(c_ptr, SEP_CHAR, 0, len, &item_count);
+
+ if (globals.debug & DBG_GUI) {
+ int k;
+ for (k = 0; line_items[k] != NULL; k++) {
+ fprintf(stderr, "ITEM %d of %lu: |%s|\n", k, (unsigned long)item_count, line_items[k]);
+ }
+ }
+ while (alloc_len <= n + 1) {
+ alloc_len += alloc_step;
+ toolbar_buttons = xrealloc(toolbar_buttons, alloc_len * sizeof *toolbar_buttons);
+ }
+
+ if (item_count == 1 && sscanf(line_items[0], "SPACER(%d)", &extra_space) == 1) {
+ TRACE_GUI((stderr, "creating spacer of witdh %d at %lu", extra_space, (unsigned long)n));
+ create_toolbar_separator(tool_bar, &(toolbar_buttons[n].button), extra_space);
+ toolbar_buttons[n].type = TB_SEPARATOR;
+ }
+ else if (item_count == 4) {
+ Pixmap sens, insens;
+ int idx = strtoul(line_items[0], (char **)NULL, 10);
+ struct xdvi_action *action;
+
+ sens = insens = 0; /* make compiler happy ... */
+
+ TRACE_GUI((stderr, "creating pixmap at %d", idx));
+ if (!create_pixmap(tool_bar, idx, &sens, &insens)) {
+ free(toolbar_buttons);
+ toolbar_buttons = NULL;
+ break;
+ }
+ TRACE_GUI((stderr, "creating button %ld", (unsigned long)n));
+ if (!create_toolbar_button(tool_bar, &(toolbar_buttons[n].button), &sens, &insens)) {
+ free(toolbar_buttons);
+ toolbar_buttons = NULL;
+ break;
+ }
+ toolbar_buttons[n].type = TB_BUTTON;
+
+ if (compile_action(line_items[3], &action)) {
+ char *long_tooltip = xstrdup(line_items[1]);
+ toolbar_buttons[n].tip = xstrdup(line_items[2]);
+ /* char *short_tooltip = xstrdup(line_items[2]); */
+ command_call[0].closure = (XtPointer) action;
+
+ /*
+ eventually save this widget in list of `special' buttons
+ that need to toggle between sensitive/insensitive
+ */
+ button_info_save(action, toolbar_buttons[n].button);
+
+ XtVaSetValues(toolbar_buttons[n].button, XmNactivateCallback, (XtArgVal)command_call, NULL);
+ XtAddEventHandler(toolbar_buttons[n].button,
+ EnterWindowMask | LeaveWindowMask,
+ False,
+ enter_leave,
+ long_tooltip);
+ }
+ else {
+ XDVI_WARNING((stderr, "Invalid action \"%s\" in toolbarTranslations resource:\n\"%.*s\"",
+ line_items[3], (int)len, c_ptr));
+ }
+ }
+ else {
+ XDVI_WARNING((stderr, "Skipping malformed line \"%.*s\" in toolbarTranslations resource "
+ "(%lu instead of 4 items).",
+ (int)len, c_ptr, (unsigned long)item_count));
+ toolbar_buttons[n].button = 0;
+ }
+
+ for (curr = 0; curr < item_count; curr++) {
+ free(line_items[curr]);
+ }
+ free(line_items);
+ line_items = NULL;
+
+ if (*e_ptr != '\0')
+ e_ptr++;
+ }
+#else
+ if ((resource.expert_mode & XPRT_SHOW_SCROLLBARS) != 0) {
+ XDVI_WARNING((stderr, "This version has been compiled without XPM support. "
+ "Disabling the toolbar, which needs XPM."));
+ }
+#endif /* HAVE_XPM */
+
+ if (toolbar_buttons == NULL) {
+ resource.toolbar_unusable = True;
+ resource.expert_mode ^= XPRT_SHOW_TOOLBAR;
+ }
+ else {
+#if HAVE_XPM
+ toolbar_buttons[n].button = 0; /* terminate info */
+#endif
+ }
+ return tool_bar;
+}
+
+/*
+ * Add the tips to the toolbar. This has to be done after the toolbar has been
+ * realized.
+ */
+void
+create_tips(Widget toplevel)
+{
+#if HAVE_XPM
+ Widget tip_shell;
+
+ int i;
+
+ if (resource.toolbar_unusable) /* don't create tips in this case */
+ return;
+
+ tip_shell = XtVaCreatePopupShell("tipShell", tipWidgetClass,
+ toplevel, XtNwidth, 1, XtNheight, 1,
+ NULL);
+
+ for (i = 0; toolbar_buttons[i].button != 0; i++) {
+ if (toolbar_buttons[i].type == TB_BUTTON) {
+ TipAddWidget(tip_shell, toolbar_buttons[i].button, toolbar_buttons[i].tip);
+ }
+ }
+#else
+ UNUSED(toplevel);
+#endif /* HAVE_XPM */
+}
+
+
+#else /* MOTIF */
+/* silence "empty compilation unit" and "`toolbar_xpm' defined but not used" warnings */
+static void bar(void); static void foo(void) { UNUSED(toolbar_xpm); bar(); } static void bar(void) { foo(); }
+#endif /* MOTIF */
diff --git a/Build/source/texk/xdvik/gui/xm_toolbar.h b/Build/source/texk/xdvik/gui/xm_toolbar.h
new file mode 100644
index 00000000000..7afd1012d59
--- /dev/null
+++ b/Build/source/texk/xdvik/gui/xm_toolbar.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2001 Marcin Dalecki
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+
+ */
+
+#ifndef XM_TOOLBAR_H_
+#define XM_TOOLBAR_H_
+
+#ifdef MOTIF
+
+extern Widget create_toolbar(Widget parent, Widget menu_bar);
+
+extern Boolean toolbar_visible, scrollbars_visible, pagelist_visible;
+extern void create_tips(Widget parent);
+
+#if HAVE_XPM
+extern void tb_check_navigation_sensitivity(int pageno);
+extern void tb_check_navigation_sensitivity(int pageno);
+extern void tb_set_htex_forward_sensitivity(Boolean sensitive);
+extern void tb_set_htex_back_sensitivity(Boolean sensitive);
+extern void tb_set_pagehist_forward_sensitivity(Boolean sensitive);
+extern void tb_set_pagehist_back_sensitivity(Boolean sensitive);
+extern void tb_set_zoom_sensitivity(Boolean sensitive);
+#endif /* HAVE_XPM */
+
+extern void toggle_toolbar(void);
+extern void toggle_scrollbars(void);
+
+#endif /* MOTIF */
+
+#endif /* XM_TOOLBAR_H_ */
diff --git a/Build/source/texk/xdvik/hypertex.c b/Build/source/texk/xdvik/hypertex.c
new file mode 100644
index 00000000000..2cb55d07406
--- /dev/null
+++ b/Build/source/texk/xdvik/hypertex.c
@@ -0,0 +1,2257 @@
+
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Original copyright:
+ *
+ * Hypertex modifications to DVI previewer for X.
+ * This portion of xhdvi is completely in the public domain. The
+ * author renounces any copyright claims. It may be freely used for
+ * commercial or non-commercial purposes. The author makes no claims
+ * or guarantees - use this at your own risk.
+ *
+ * Arthur Smith, U. of Washington, 1994
+ *
+ * 5/1994 code written from scratch, probably inspired by (but
+ * incompatible with) the CERN WWW library.
+ *
+ * 3/1995 CERN WWW library called to do document fetching.
+ *
+ * 5/2002 SU: rewritten from scratch to make it work with the new
+ * event handling in xdvi >= 22.41: Anchors are now saved
+ * per page instead of per document, making it more robust
+ * wrt. interrupting the drawing and skipping to another page.
+ * Only drawback is that links breaking over pages are more
+ * difficult to handle (but they didn't work properly before either).
+ * Clicking on a link now performs a search for the
+ * corresponding anchor similiar to `forward search'.
+ *
+ * Removed libwww, since it has become too bloated
+ * and buggy, and had only rudimentary support for GUI
+ * interaction to begin with (e.g., interrupting a
+ * download). And since this is 2002, we might just as well
+ * use a web browser to fetch remote documents ;-)
+ */
+
+/* TODO:
+
+- implement popup with list of visited links, as specified in
+http://xdvi.sourceforge.net/gui.html#navigation-openLinks
+(maybe this should be a simple menu list, not a popup window).
+*/
+
+#define COPY_TMP_FILE 0 /* see comments below */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+ /* #define DEBUG */
+
+ /* #define DEBUG_MEMORY_HANDLING */
+#include "alloc-debug.h"
+
+#include <string.h>
+
+#include <ctype.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+#include <X11/StringDefs.h> /* for XtNwidth, XtNheight */
+
+#include "events.h"
+#include "dvi-init.h"
+#include "message-window.h"
+#include "util.h"
+#include "dl_list.h"
+#include "x_util.h"
+#include "mime.h"
+#include "mag.h"
+#include "dvi-draw.h"
+#include "statusline.h"
+#include "browser.h"
+#include "hypertex.h"
+#include "special.h"
+#include "string-utils.h"
+#include "xm_toolbar.h"
+#include "my-snprintf.h"
+#include "pagehist.h"
+
+ /* globals */
+ /* rgb specifications to translate resource.{visited_}link_color into */
+ char *g_link_color_rgb = NULL;
+char *g_visited_link_color_rgb = NULL;
+char *g_anchor_pos = NULL;
+size_t g_anchor_len = 0;
+
+static const int DEFAULT_MARKER_X_OFFSET = 2; /* horizontal offset of anchor marker to edge of screen */
+static const int HTEX_ALLOC_STEP = 32;
+
+/* distance of underline from lower edge of character bbox */
+static const int ANCHOR_XTRA_V_BBOX = 6;
+
+/* info whether we're dealing with hypertex or hdvips type links */
+typedef enum { HYPERTEX_LINK, HDVIPS_LINK } hrefLinkT;
+static hrefLinkT m_href_type;
+
+typedef enum {
+ A_HREF = 0,
+ A_NAME,
+ A_HREF_FILE, /* hdvips file ref */
+ A_HREF_URL, /* hdvips URL ref */
+ A_HDVIPS_INTERNAL, /* internal ref */
+ A_HDVIPS_HREF, /* hdvips href */
+ A_HDVIPS_NAME, /* hdvips name */
+ A_OTHER,
+ A_END,
+ A_NONE,
+ A_MISMATCH
+} htexAnchorT;
+
+/****************************** helper routines ******************************/
+
+static Boolean
+htex_is_href(htexAnchorT type)
+{
+ return type == A_HREF
+ || type == A_HREF_FILE
+ || type == A_HREF_URL
+ || type == A_HDVIPS_HREF
+ || type == A_HDVIPS_INTERNAL;
+}
+
+static Boolean
+htex_is_name(htexAnchorT type)
+{
+ return type == A_NAME || type == A_HDVIPS_NAME;
+}
+
+static void
+parse_html_special(const char *special, size_t len, const char **beg, const char **end)
+{
+ *beg = special;
+ while (isspace((int)**beg) || **beg == '=') {
+ (*beg)++;
+ len--;
+ }
+ *end = *beg + len - 1;
+
+ while (isspace((int)**end) || **end == '>')
+ (*end)--;
+
+ /* remove quote pairs */
+ if (**beg == '"') {
+ (*beg)++;
+ if (**end == '"') {
+ (*end)--;
+ }
+ }
+ /* now end points to last anchor char, move behind that */
+ (*end)++;
+}
+
+/*
+ Anchor prescanning stuff: We make a pass through all pages in the document
+ before displaying them to collect information about mismatched anchors
+ (anchors where the opening tag is on some previous page).
+ The information is stored in the following struct:
+*/
+struct prescan_info {
+ int anchor_depth;
+ size_t anchor_num;
+ size_t anchor_list_size;
+ int *anchor_list;
+ /* pointers to either NULL, or to mismatched anchor strings
+ (the contents of '<a href="...">' on some previous page),
+ for each page */
+ size_t pagelist_len;
+ char **pagelist;
+};
+
+static struct prescan_info m_prescan_info = { 0, 0, 0, NULL, 0, NULL };
+static struct prescan_info m_save_prescan_info = { 0, 0, 0, NULL, 0, NULL };
+
+
+/*
+ Save prescan info from previous page, in case we only have a partial
+ scan of the current page and need to start all over.
+*/
+void
+htex_prescan_save(void)
+{
+ m_save_prescan_info.anchor_depth = m_prescan_info.anchor_depth;
+ m_save_prescan_info.anchor_num = m_prescan_info.anchor_num;
+ /* copy over anchor list */
+ while (m_save_prescan_info.anchor_depth >= (int)m_save_prescan_info.anchor_list_size) {
+ int i;
+ m_save_prescan_info.anchor_list_size += HTEX_ALLOC_STEP;
+ m_save_prescan_info.anchor_list = XREALLOC(m_save_prescan_info.anchor_list,
+ m_save_prescan_info.anchor_list_size
+ * sizeof *(m_save_prescan_info.anchor_list));
+ for (i = 0; i < m_save_prescan_info.anchor_depth; i++) {
+ m_save_prescan_info.anchor_list[i] = m_prescan_info.anchor_list[i];
+ }
+ }
+ /* the page list of anchor strings can only have had its current position modified;
+ we'll simply delete that position in htex_prescan_restore().
+ */
+}
+
+/*
+ Restore prescan info from m_save_prescan_info.
+*/
+void
+htex_prescan_restore(int pageno)
+{
+ m_prescan_info.anchor_depth = m_save_prescan_info.anchor_depth;
+ m_prescan_info.anchor_num = m_save_prescan_info.anchor_num;
+ /* copy back anchor list */
+ if (m_save_prescan_info.anchor_depth > 0) {
+ int i;
+ /* old list might have been free()d in htex_prescan_reset_firstpass */
+ while (m_save_prescan_info.anchor_depth >= (int)m_prescan_info.anchor_list_size) {
+ m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP;
+ m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list,
+ m_prescan_info.anchor_list_size
+ * sizeof *(m_prescan_info.anchor_list));
+ }
+ for (i = 0; i < m_save_prescan_info.anchor_depth; i++) {
+ m_prescan_info.anchor_list[i] = m_save_prescan_info.anchor_list[i];
+ }
+ }
+ /* reset anchor string info for this page */
+ if ((int)m_prescan_info.pagelist_len > pageno) {
+ ASSERT(m_prescan_info.pagelist != NULL, "m_prescan_info.pagelist not properly allocated");
+ FREE(m_prescan_info.pagelist[pageno]);
+ m_prescan_info.pagelist[pageno] = NULL;
+ }
+}
+
+/*
+ Reset prescan info for first pass (anchor numbers only) to its initial state,
+ freeing up allocated resources for anchor_list.
+
+*/
+void
+htex_prescan_reset_firstpass(void)
+{
+ MYTRACE((stderr, "resetting anchor_depth to 0!!!!!!!!!!!!"));
+ m_prescan_info.anchor_depth = 0;
+ m_prescan_info.anchor_num = 0;
+ m_prescan_info.anchor_list_size = 0;
+ FREE(m_prescan_info.anchor_list);
+ m_prescan_info.anchor_list = NULL;
+}
+
+/*
+ Reset the prescan info, freeing up all allocated memory.
+ Used when e.g. switching to a different file via Ctrl-F.
+*/
+static void
+htex_prescan_reset(void)
+{
+ size_t i;
+ m_prescan_info.anchor_depth = 0;
+ m_prescan_info.anchor_num = 0;
+ m_prescan_info.anchor_list_size = 0;
+
+ free(m_prescan_info.anchor_list);
+ m_prescan_info.anchor_list = NULL;
+
+ for (i = 0; i < m_prescan_info.pagelist_len; i++) {
+ free(m_prescan_info.pagelist[i]);
+ }
+ free(m_prescan_info.pagelist);
+ m_prescan_info.pagelist = NULL;
+ m_prescan_info.pagelist_len = 0;
+}
+
+/*
+ Initialize m_prescan_info for scanning a new page.
+*/
+void
+htex_prescan_initpage(void)
+{
+ m_prescan_info.anchor_num = 0;
+}
+
+
+Boolean
+htex_prescan_special(const char *cp, int cp_len, struct htex_prescan_data *data)
+{
+ UNUSED(cp_len);
+ ASSERT(data != NULL, "data argument to htex_prescan_special() mustn't be NULL");
+ if (data->pageno + 1 < (int)m_prescan_info.pagelist_len) { /* already scanned this page */
+ MYTRACE((stderr, "already scanned page %d", data->pageno+1));
+ return False;
+ }
+
+ /* resize pagelist */
+ while (data->pageno >= (int)m_prescan_info.pagelist_len) {
+ size_t old_len = m_prescan_info.pagelist_len;
+ size_t i;
+ MYTRACE((stderr, "============ resizing pagelist to %d", data->pageno + 1));
+ m_prescan_info.pagelist_len = data->pageno + 1;
+ m_prescan_info.pagelist = XREALLOC(m_prescan_info.pagelist,
+ m_prescan_info.pagelist_len * sizeof *m_prescan_info.pagelist);
+ /* initialize with NULL values */
+ for (i = old_len; i < m_prescan_info.pagelist_len; i++) {
+ MYTRACE((stderr, "============ initializing pagelist %d", i));
+ m_prescan_info.pagelist[i] = NULL;
+ }
+ }
+
+ if (data->scan_type == HTEX_ANCHOR_STRING) {
+ if ((int)m_prescan_info.anchor_num == data->anchor_num) {
+ char *anchor;
+ const char *beg, *end;
+ const char *cp1 = cp;
+ const char *ptr = NULL;
+ const char *pptr = NULL;
+
+ if (memicmp(cp1, "<a href", strlen("<a href")) == 0) {
+ cp1 += strlen("<a href");
+ parse_html_special(cp1, strlen(cp1), &beg, &end);
+ anchor = xmalloc(end - beg + 1);
+ memcpy(anchor, beg, end - beg);
+ anchor[end - beg] = '\0';
+ /* save the anchor string in m_prescan_info.pagelist[<current_page>] */
+ m_prescan_info.pagelist[data->pageno] = anchor;
+ }
+ else if (memcmp(cp1, "/A", 2) == 0) {
+ if ((ptr = strstr(cp1 + 2, "/GoToR")) != NULL /* external file */
+ && (ptr = strchr(ptr, '(')) != NULL
+ && (pptr = strchr(ptr + 1, '(')) != NULL) {
+ anchor = xmalloc(pptr - ptr);
+ memcpy(anchor, ptr + 1, pptr - ptr - 1);
+ anchor[pptr - ptr - 1] = '\0';
+ /* save the anchor string in m_prescan_info.pagelist[<current_page>] */
+ m_prescan_info.pagelist[data->pageno] = anchor;
+ }
+ else if ((ptr = strstr(cp1 + 2, "/URI")) != NULL /* external file */
+ && (ptr = strchr(ptr, '(')) != NULL
+ && (pptr = strchr(ptr + 1, '(')) != NULL) {
+ anchor = xmalloc(pptr - ptr);
+ memcpy(anchor, ptr + 1, pptr - ptr - 1);
+ anchor[pptr - ptr - 1] = '\0';
+ /* save the anchor string in m_prescan_info.pagelist[<current_page>] */
+ m_prescan_info.pagelist[data->pageno] = anchor;
+ }
+ }
+ else if (memcmp(cp, "/L", 2) == 0) {
+ if ((ptr = strstr(cp1 + 2, "/Dest")) != NULL /* internal link */
+ && (ptr = strchr(ptr, '(')) != NULL
+ && (pptr = strchr(ptr + 1, '(')) != NULL) {
+ anchor = xmalloc(pptr - ptr);
+ memcpy(anchor, ptr + 1, pptr - ptr - 1);
+ anchor[pptr - ptr - 1] = '\0';
+ /* save the anchor string in m_prescan_info.pagelist[<current_page>] */
+ m_prescan_info.pagelist[data->pageno] = anchor;
+ }
+ }
+ }
+ }
+ if (memicmp(cp, "<a ", 3) == 0) {
+ while (m_prescan_info.anchor_depth >= (int)m_prescan_info.anchor_list_size) {
+ m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP;
+ m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list,
+ m_prescan_info.anchor_list_size
+ * sizeof *(m_prescan_info.anchor_list));
+ }
+ ASSERT(m_prescan_info.anchor_depth >= 0, "List should contain previous anchor info");
+ m_prescan_info.anchor_list[m_prescan_info.anchor_depth] = m_prescan_info.anchor_num;
+ m_prescan_info.anchor_depth++;
+ m_prescan_info.anchor_num++;
+ }
+ else if (memicmp(cp, "</a", 3) == 0) {
+ if (m_prescan_info.anchor_depth < 1) {
+ /* this can happen when stuff had been prescanned before */
+ return False;
+ }
+ m_prescan_info.anchor_depth--;
+ m_prescan_info.anchor_num++;
+ }
+ else if (memcmp(cp, "H.S end", strlen("H.S end")) == 0) { /* start of anchor */
+ while (m_prescan_info.anchor_depth >= (int)m_prescan_info.anchor_list_size) {
+ m_prescan_info.anchor_list_size += HTEX_ALLOC_STEP;
+ m_prescan_info.anchor_list = XREALLOC(m_prescan_info.anchor_list,
+ m_prescan_info.anchor_list_size
+ * sizeof *(m_prescan_info.anchor_list));
+ }
+ ASSERT(m_prescan_info.anchor_depth >= 0, "List should contain previous anchor info");
+ m_prescan_info.anchor_list[m_prescan_info.anchor_depth] = m_prescan_info.anchor_num;
+ m_prescan_info.anchor_depth++;
+ m_prescan_info.anchor_num++;
+
+ }
+ else if (memcmp(cp, "H.R end", strlen("H.R end")) == 0 /* end of rect */
+ || memcmp(cp, "H.A end", strlen("H.A end")) == 0 /* end of anchor */
+ || memcmp(cp, "H.L end", strlen("H.L end")) == 0 /* end of link */
+ ) {
+ if (m_prescan_info.anchor_depth < 1) {
+ /* this can happen when stuff had been prescanned before */
+ return False;
+ }
+ m_prescan_info.anchor_depth--;
+ m_prescan_info.anchor_num++;
+ }
+ return False;
+}
+
+int
+htex_prescan_get_depth(void)
+{
+ return m_prescan_info.anchor_depth;
+}
+
+/* copy over pagelist from old_page to new_page */
+void
+htex_prescan_carry_over(int old_page, int new_page)
+{
+ ASSERT(old_page >= 0, "old_page out of range");
+ ASSERT(old_page < (int)m_prescan_info.pagelist_len, "old_page out of range");
+
+ /* resize if needed */
+ if (new_page >= (int)m_prescan_info.pagelist_len) {
+ size_t old_len = m_prescan_info.pagelist_len;
+ size_t i;
+ m_prescan_info.pagelist_len = new_page + 1;
+ m_prescan_info.pagelist = XREALLOC(m_prescan_info.pagelist,
+ m_prescan_info.pagelist_len * sizeof *m_prescan_info.pagelist);
+ /* initialize with NULL values */
+ for (i = old_len; i < m_prescan_info.pagelist_len; i++) {
+ m_prescan_info.pagelist[i] = NULL;
+ }
+ }
+ free(m_prescan_info.pagelist[new_page]);
+ /* don't share pointers here */
+ if (m_prescan_info.pagelist[old_page] != NULL) {
+ m_prescan_info.pagelist[new_page] = xstrdup(m_prescan_info.pagelist[old_page]);
+ }
+ else {
+ m_prescan_info.pagelist[new_page] = NULL;
+ }
+}
+
+size_t
+htex_prescan_get_mismatched_anchor_num(size_t depth)
+{
+ ASSERT((int)depth <= m_prescan_info.anchor_depth, "depth too large");
+ ASSERT(depth <= m_prescan_info.anchor_list_size, "depth too large for lookup list");
+
+ return m_prescan_info.anchor_list[m_prescan_info.anchor_depth - 1];
+}
+
+/******************************* end of prescan stuff ******************************/
+
+struct anchor_marker {
+ int page; /* page on which marker is located */
+ char *filename; /* file in which the marker is located */
+ int y_pos; /* vertical position for marker */
+ int x_pos; /* horizontal position for marker */
+} g_anchormarker = { -1, NULL, -1, -1 };
+
+static XtIntervalId m_href_timeout_id = 0;
+
+
+struct history_info {
+ char *anchor; /* anchor name */
+ char *filename; /* name of file in which this anchor is located */
+ int page; /* pagenumber on which anchor is located */
+};
+
+struct anchor_info {
+ /* anchor contents as strings */
+ char *a_name;
+ char *a_href;
+ htexObjectT object_type;
+ /* bounding box info for this anchor */
+ int lrx, lry; /* lower-right corner */
+ int ulx, uly; /* upper-left corner */
+ /* int refpage; /\* page in DVI file for stack of visited anchors *\/ */
+ /* char *filename; /\* name of file in which this anchor is located, for visited anchors *\/ */
+ int prev_wrapped; /* index of prev elem, for wrapped hrefs, or -1 */
+ int next_wrapped; /* index of next elem, for wrapped hrefs, or -1 */
+};
+
+struct htex_page_info {
+ struct anchor_info *anchors; /* anchor info */
+ int tot_cnt; /* anchor info size */
+ int curr_cnt; /* current number of anchor on page */
+ int page; /* page in DVI file this anchor info refers to */
+ int have_wrapped; /* -1 if no wrapped anchor on beginning of page, or index of wrapped anchor */
+};
+
+/* file-scope globals ... */
+/* record x and y positions of current anchor, to recognize linebreaks in anchors */
+static int x_pos_bak = 0;
+static int y_pos_bak = 0;
+/* holds all anchors on current page */
+static struct htex_page_info htex_page_info = { NULL, 0, 0, -1, -1 };
+
+/*
+ double linked list with history of clicked links, for htex_forward/htex_back
+*/
+static struct dl_list *htex_history = NULL; /* current list insertion point */
+
+struct htex_anchor_stack_elem {
+ htexAnchorT type; /* type of anchor (href, anchor, ...) */
+ int anchor_num; /* number of this anchor on page (same as curr_cnt in struct htex_page_info) */
+};
+
+/*
+ * stack datatype and access functions; used for nested anchors
+ */
+struct htex_anchor_stack {
+ size_t size;
+ size_t depth;
+ struct htex_anchor_stack_elem *types;
+};
+
+struct visited_anchor {
+ int *list;
+ size_t list_size;
+};
+
+struct visited_anchors {
+ struct visited_anchor *anchors;
+ size_t size;
+};
+
+static struct visited_anchors visited_links = { NULL, 0 };
+
+static struct htex_anchor_stack stack = { 0, 0, NULL };
+
+
+
+/* the following list is from
+ http://www.iana.org/assignments/uri-schemes
+ re-sorted for likeliness. All protocols except for `file'
+ are considered remote.
+ (i.e. not accessible via the ordinary Unix file system)
+*/
+static const char *remote_URL_schemes[] = {
+ "http:", /* Hypertext Transfer Protocol [RFC2068] */
+ "ftp:", /* File Transfer Protocol [RFC1738] */
+ "https:", /* Hypertext Transfer Protocol Secure [RFC2818] */
+ "mailto:", /* Electronic mail address [RFC2368] */
+ "news:", /* USENET news [RFC1738] */
+ "nntp:", /* USENET news using NNTP access [RFC1738] */
+ "telnet:", /* Reference to interactive sessions [RFC1738] */
+ "nfs:", /* network file system protocol [RFC2224] */
+ "gopher:", /* The Gopher Protocol [RFC1738] */
+ "wais:", /* Wide Area Information Servers [RFC1738] */
+ /* the only exception: */
+ /* "file:", */ /* Host-specific file names [RFC1738] */
+ "prospero:", /* Prospero Directory Service [RFC1738] */
+ "z39.50s", /* Z39.50 Session [RFC2056] */
+ "z39.50r", /* Z39.50 Retrieval [RFC2056] */
+ "cid:", /* content identifier [RFC2392] */
+ "mid:", /* message identifier [RFC2392] */
+ "vemmi:", /* versatile multimedia interface [RFC2122] */
+ "service:", /* service location [RFC2609] */
+ "imap:", /* internet message access protocol [RFC2192] */
+ "acap:", /* application configuration access protocol [RFC2244] */
+ "rtsp:", /* real time streaming protocol [RFC2326] */
+ "tip:", /* Transaction Internet Protocol [RFC2371] */
+ "pop:", /* Post Office Protocol v3 [RFC2384] */
+ "data:", /* data [RFC2397] */
+ "dav:", /* dav [RFC2518] */
+ "opaquelocktoken:", /* opaquelocktoken [RFC2518] */
+ "sip:", /* session initiation protocol [RFC2543] */
+ "tel:", /* telephone [RFC2806] */
+ "fax:", /* fax [RFC2806] */
+ "modem:", /* modem [RFC2806] */
+ "ldap:", /* Lightweight Directory Access Protocol [RFC2255] */
+ "soap.beep:", /* soap.beep [RFCSOAP] */
+ "soap.beeps:", /* soap.beeps [RFCSOAP] */
+ /* Reserved URI Scheme Names: */
+ "afs:", /* Andrew File System global file names */
+ "tn3270:", /* Interactive 3270 emulation sessions */
+ "mailserver:", /* Access to data available from mail servers */
+ NULL
+};
+
+/* prototypes */
+static void htex_erase_anchormarker(XtPointer client_data, XtIntervalId *id);
+static void htex_draw_anchormarker(int y);
+
+
+static void
+resize_info_if_needed(struct htex_page_info *info)
+{
+ /* resize info if needed */
+ if (info->curr_cnt + 2 >= info->tot_cnt) {
+ int i;
+ while (info->curr_cnt + 2 >= info->tot_cnt) {
+ info->tot_cnt += HTEX_ALLOC_STEP;
+ }
+ info->anchors = XREALLOC(info->anchors, info->tot_cnt * sizeof *(info->anchors));
+ for (i = info->curr_cnt; i < info->tot_cnt; i++) {
+ /* fprintf(stderr, "initializing info at index %d\n", i); */
+ info->anchors[i].a_href = NULL;
+ info->anchors[i].a_name = NULL;
+ /* info->anchors[i].filename = NULL; */
+ info->anchors[i].ulx = INT_MAX;
+ info->anchors[i].uly = INT_MAX;
+ info->anchors[i].lrx = 0;
+ info->anchors[i].lry = 0;
+ info->anchors[i].object_type = HTEX_TEXT;
+ info->anchors[i].prev_wrapped = -1;
+ info->anchors[i].next_wrapped = -1;
+ }
+ }
+}
+
+static void
+init_visited_links(struct visited_anchors *links, int total_pages, Boolean new_dvi_file)
+{
+ size_t i, old_size = links->size;
+ if (new_dvi_file) {
+ /* free old list */
+ for (i = 0; i < old_size; i++) {
+ FREE(links->anchors[i].list);
+ links->anchors[i].list = NULL;
+ links->anchors[i].list_size = 0;
+ }
+ }
+ if (links->size <= (size_t)total_pages) {
+ MYTRACE((stderr, "resetting visited links (%d != %d)", links->size, total_pages));
+ links->size = total_pages + 1;
+ links->anchors = XREALLOC(links->anchors, (links->size + 1) * sizeof *(links->anchors));
+ for (i = old_size; i < links->size; i++) {
+ MYTRACE((stderr, "+++ initializing visited links for page %d", i));
+ links->anchors[i].list = NULL;
+ links->anchors[i].list_size = 0;
+ }
+ }
+}
+
+#if 0
+static void
+show_visited(struct visited_anchors *links, int pageno)
+{
+ size_t i;
+ fprintf(stderr, "visited links on page %d:\n", pageno);
+ for (i = 0; i < links->anchors[pageno].list_size; i++) {
+ fprintf(stderr, "%d ", links->anchors[pageno].list[i]);
+ }
+ fprintf(stderr, "\n");
+}
+#endif
+
+static void
+save_in_list(struct visited_anchors *links, int pageno, int idx)
+{
+ links->anchors[pageno].list
+ = XREALLOC(links->anchors[pageno].list,
+ (links->anchors[pageno].list_size + 1)
+ * sizeof *(links->anchors[pageno].list));
+ links->anchors[pageno].list[links->anchors[pageno].list_size] = idx;
+ links->anchors[pageno].list_size++;
+}
+
+static void
+set_visited(struct visited_anchors *links, int pageno, int anchor_num)
+{
+ int i;
+ /* is it already present? */
+ for (i = 0; i < (int)links->anchors[pageno].list_size; i++) {
+ if (links->anchors[pageno].list[i] == anchor_num)
+ return;
+ }
+ save_in_list(links, pageno, anchor_num);
+ i = anchor_num;
+ /* also set previous/next of this anchor to visited */
+ while ((i = htex_page_info.anchors[i].prev_wrapped) != -1) {
+ TRACE_HTEX((stderr, "set_visited: setting prev_wrapped %d to visited too", i));
+ save_in_list(links, pageno, i);
+ }
+ i = anchor_num;
+ while ((i = htex_page_info.anchors[i].next_wrapped) != -1) {
+ TRACE_HTEX((stderr, "set_visited: setting next_wrapped %d to visited too", i));
+ save_in_list(links, pageno, i);
+ }
+#if 0
+ show_visited(links, pageno);
+#endif
+}
+
+static Boolean
+is_visited(struct visited_anchors *links, int pageno, int anchor_num)
+{
+ size_t i;
+
+ ASSERT((size_t)pageno < links->size, "too few elements in links structure");
+
+ for (i = 0; i < links->anchors[pageno].list_size; i++) {
+ if (links->anchors[pageno].list[i] == anchor_num) {
+ return True;
+ }
+ }
+ return False;
+}
+
+static void
+push_stack(struct htex_anchor_stack *stack, htexAnchorT type, int anchor_num)
+{
+ size_t i = 0;
+ if (stack->depth >= stack->size) {
+ stack->size += HTEX_ALLOC_STEP;
+ stack->types = XREALLOC(stack->types, stack->size * sizeof *(stack->types));
+ for (i = stack->depth; i < stack->size; i++) {
+ stack->types[i].type = A_NONE;
+ stack->types[i].anchor_num = -1;
+ }
+ }
+ stack->types[stack->depth].type = type;
+ stack->types[stack->depth].anchor_num = anchor_num;
+ stack->depth++;
+#if 0
+ {
+ fprintf(stderr, "PUSH - stack is now: \n");
+ for (i = 0; i < stack->depth; i++)
+ fprintf(stderr, "%d:%d ", i, stack->types[i]);
+ MYTRACE(stderr, "\n");
+ }
+#endif
+}
+
+static htexAnchorT
+pop_stack(struct htex_anchor_stack *stack, int *anchor_num)
+{
+ htexAnchorT ret;
+
+ if (stack->depth < 1) {
+ return A_MISMATCH;
+ }
+
+#if 0
+ {
+ int i;
+ MYTRACE((stderr, "POP - stack is now: "));
+ for (i = 0; i < stack->depth; i++)
+ MYTRACE((stderr, "%d:%d ", i, stack->types[i]));
+ MYTRACE((stderr, ""));
+ }
+#endif
+ stack->depth--;
+ ret = stack->types[stack->depth].type;
+ *anchor_num = stack->types[stack->depth].anchor_num;
+ stack->types[stack->depth].type = A_NONE;
+ stack->types[stack->depth].anchor_num = -1;
+ return ret;
+}
+
+
+/* return True if stack contains an A_HREF, False else */
+static Boolean
+get_href_depth(const struct htex_anchor_stack *stack)
+{
+ size_t i;
+ for (i = 0; i <= stack->depth; i++) {
+ ASSERT(stack->types != NULL, "types musn't be NULL!");
+ if (htex_is_href(stack->types[i].type))
+ return True;
+ }
+ return False;
+}
+
+static htexAnchorT
+peek_stack(struct htex_anchor_stack *stack, int *anchor_num)
+{
+ if (stack->depth < 1) {
+ MYTRACE((stderr, "Xdvi warning: wrong nesting of anchors on page %d", current_page));
+ *anchor_num = -1;
+ return A_NONE;
+ }
+
+ *anchor_num = stack->types[stack->depth - 1].anchor_num;
+ return stack->types[stack->depth - 1].type;
+}
+
+/* routines for coloring the anchors */
+static void
+push_colorspecial(void)
+{
+ int i;
+
+ i = htex_page_info.curr_cnt - 1;
+ /* apply color if needed */
+ if (resource.link_style > 1) { /* colored links are wanted */
+ Boolean visited = False;
+
+ ASSERT(i >= 0, "i mustn't be negative");
+ if (is_visited(&visited_links, current_page, i)) {/* || wrapped_anchor_is_visited(i)) { */
+ visited = True;
+ }
+
+ MYTRACE((stderr, "anchor %d, %s is %s\n",
+ htex_page_info.curr_cnt - 1, htex_page_info.anchors[htex_page_info.curr_cnt - 1].a_href,
+ visited ? "******* visited ****** " : "not visited"));
+ if ((visited && resource.visited_link_color != NULL)
+ || (! visited && resource.link_color != NULL)) {
+ color_special(visited ? g_visited_link_color_rgb : g_link_color_rgb);
+ }
+ }
+}
+
+static void
+pop_colorspecial(void)
+{
+ color_special("pop");
+}
+
+/* return filename if it's a local file, NULL else */
+const char *
+is_local_file(const char *filename)
+{
+ int i;
+ if (strchr(filename, ':') != NULL) {
+ if (memicmp(filename, "file:", strlen("file:")) == 0) {
+ TRACE_HTEX((stderr, "%s uses file scheme", filename));
+ filename += strlen("file:");
+ /*
+ skip over `//localhost' part, and skip first `/' iff the
+ absolute path starts with `//' (as required by RFC2396,
+ but in the past most browsers/applications didn't support
+ this).
+ */
+ if (memicmp(filename, "//localhost", strlen("//localhost")) == 0) {
+ filename += strlen("//localhost");
+ }
+ if (memicmp(filename, "//", 2) == 0) {
+ filename += 1;
+ }
+ return filename;
+ }
+
+ /* check remote schemes */
+ for (i = 0; remote_URL_schemes[i] != NULL; i++) {
+ if (memicmp(filename, remote_URL_schemes[i], strlen(remote_URL_schemes[i])) == 0) {
+ TRACE_HTEX((stderr, "%s is a remote scheme", filename));
+ return NULL;
+ }
+ }
+ }
+ /* in all other cases, treat it as an ordinary filename */
+ TRACE_HTEX((stderr, "%s is an ordinary filename", filename));
+ return filename;
+}
+
+
+static char *
+parse_anchortext(const char *input, int len)
+{
+ char *anchor = NULL;
+ const char *beg, *end;
+
+ parse_html_special(input, len, &beg, &end);
+
+ anchor = XMALLOC(anchor, end - beg + 1);
+ memcpy(anchor, beg, end - beg);
+ anchor[end - beg] = '\0';
+ return anchor;
+}
+
+static void
+add_anchor(struct htex_page_info *info, htexAnchorT type,
+ const char *str, size_t len,
+ int pageno, char *filename)
+{
+ UNUSED(pageno);
+ UNUSED(filename);
+
+ resize_info_if_needed(info);
+
+ ASSERT(htex_is_name(type) || htex_is_href(type), "This doesn't look like a valid anchor");
+ /* add an anchor or a href, depending on `type' */
+ if (type == A_HREF) {
+ if (info->anchors[info->curr_cnt].a_href == NULL) {
+ info->anchors[info->curr_cnt].a_href = parse_anchortext(str, len);
+ }
+ TRACE_HTEX((stderr, "adding HREF %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href));
+ }
+ else if (type == A_HREF_URL) {
+ if (info->anchors[info->curr_cnt].a_href == NULL) {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + 1);
+ strncpy(info->anchors[info->curr_cnt].a_href, str, len);
+ info->anchors[info->curr_cnt].a_href[len] = '\0';
+ }
+ TRACE_HTEX((stderr, "adding HREF_URL %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href));
+ }
+ else if (type == A_HDVIPS_INTERNAL) {
+ if (info->anchors[info->curr_cnt].a_href == NULL) {
+ /* dynamically add a `#' prefix */
+ if (str[0] != '#') {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + 2);
+ strcpy(info->anchors[info->curr_cnt].a_href, "#");
+ memcpy(info->anchors[info->curr_cnt].a_href + 1, str, len);
+ info->anchors[info->curr_cnt].a_href[len + 1] = '\0';
+ }
+ else {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + 1);
+ strncpy(info->anchors[info->curr_cnt].a_href, str, len);
+ info->anchors[info->curr_cnt].a_href[len] = '\0';
+ }
+ }
+ TRACE_HTEX((stderr, "adding HREF_URL %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href));
+ }
+ else if (type == A_HREF_FILE) {
+ if (info->anchors[info->curr_cnt].a_href == NULL) {
+ /* dynamically add a `file:' extension */
+ if (memcmp(str, "file:", strlen("file:")) == 0) {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + 1);
+ strncpy(info->anchors[info->curr_cnt].a_href, str, len);
+ info->anchors[info->curr_cnt].a_href[len] = '\0';
+ }
+ else {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + strlen("file:") + 1);
+ strcpy(info->anchors[info->curr_cnt].a_href, "file:");
+ memcpy(info->anchors[info->curr_cnt].a_href + strlen("file:"),
+ str, len);
+ info->anchors[info->curr_cnt].a_href[len + strlen("file:")] = '\0';
+ }
+ }
+ TRACE_HTEX((stderr, "adding HREF_FILE %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_href));
+ }
+ else if (type == A_NAME) {
+ if (info->anchors[info->curr_cnt].a_name == NULL) {
+ info->anchors[info->curr_cnt].a_name = parse_anchortext(str, len);
+ }
+ TRACE_HTEX((stderr, "adding NAME %d: %s", info->curr_cnt, info->anchors[info->curr_cnt].a_name));
+ }
+ else if (type == A_HDVIPS_HREF) {
+ if (info->anchors[info->curr_cnt].a_href == NULL) {
+ info->anchors[info->curr_cnt].a_href = xmalloc(len + 1);
+ strncpy(info->anchors[info->curr_cnt].a_href, str, len);
+ info->anchors[info->curr_cnt].a_href[len] = '\0';
+ }
+ TRACE_HTEX((stderr, "adding HDVIPS_HREF %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_name));
+ }
+ else if (type == A_HDVIPS_NAME) {
+ if (info->anchors[info->curr_cnt].a_name == NULL) {
+ info->anchors[info->curr_cnt].a_name = xmalloc(len + 1);
+ strncpy(info->anchors[info->curr_cnt].a_name, str, len);
+ info->anchors[info->curr_cnt].a_name[len] = '\0';
+ }
+ TRACE_HTEX((stderr, "adding HDVIPS_NAME %d: |%s|", info->curr_cnt, info->anchors[info->curr_cnt].a_name));
+ }
+}
+
+static void
+set_anchor_size(struct htex_page_info *info, int index,
+ int ulx, int uly, int lrx, int lry)
+{
+ struct anchor_info *anchor;
+
+ ASSERT(info->anchors != NULL, "info->anchors should have been allocated before");
+ ASSERT(index < info->curr_cnt, "info too small");
+
+ anchor = &(info->anchors[index]);
+
+ anchor->ulx = ulx;
+ anchor->uly = uly;
+ anchor->lrx = lrx;
+ anchor->lry = lry;
+}
+
+void
+htex_set_objecttype(htexObjectT type)
+{
+ htex_page_info.anchors[htex_page_info.curr_cnt - 1].object_type = type;
+}
+
+void
+htex_set_anchorsize(int ulx, int uly, int lrx, int lry)
+{
+ set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1,
+ ulx, uly, lrx, lry);
+}
+
+static void
+enlarge_anchor_size(struct htex_page_info *info, int index,
+ int ulx, int uly, int lrx, int lry)
+{
+ struct anchor_info *anchor;
+
+ ASSERT(info->anchors != NULL, "info->anchors should have been allocated before");
+ ASSERT(index < info->curr_cnt, "info too small");
+
+ /* fprintf(stderr, "enlarging anchor at index %d; %s\n", index, info->anchors[index].a_href); */
+ anchor = &(info->anchors[index]);
+
+ if (ulx < anchor->ulx) {
+ anchor->ulx = ulx;
+ }
+ if (uly < anchor->uly) {
+ anchor->uly = uly;
+ }
+ if (lrx > anchor->lrx) {
+ anchor->lrx = lrx;
+ }
+ /* set lry only for first character, since this will be used
+ to position underline */
+ /* if (lry > anchor->lry && anchor->lry == 0) { */
+ if (lry > anchor->lry) {
+ anchor->lry = lry;
+ }
+}
+
+static void
+reset_page_info(struct htex_page_info *info, int pageno, Boolean force_init)
+{
+ int i, dummy;
+
+ if (force_init || pageno != info->page) {
+#if 0
+ fprintf(stderr, "%d or %d != %d: resetting anchorinfo for page %d (%d anchors)\n",
+ force_init, pageno, info->page, current_page, info->curr_cnt);
+#endif
+ ASSERT(info->curr_cnt == 0 || info->anchors != NULL, "inconsistency in info structure");
+ /* re-initialize all values */
+ for (i = 0; i < info->curr_cnt; i++) {
+ TRACE_HTEX((stderr, "----- resetting info for anchor %d", i));
+ FREE(info->anchors[i].a_name);
+ FREE(info->anchors[i].a_href);
+ info->anchors[i].a_name = NULL;
+ info->anchors[i].a_href = NULL;
+ info->anchors[i].ulx = INT_MAX;
+ info->anchors[i].uly = INT_MAX;
+ info->anchors[i].lrx = 0;
+ info->anchors[i].lry = 0;
+ info->anchors[i].object_type = HTEX_TEXT;
+ info->anchors[i].prev_wrapped = -1;
+ info->anchors[i].next_wrapped = -1;
+ }
+ }
+ if (pageno != info->page) { /* reset info */
+ free(info->anchors);
+ info->anchors = NULL;
+ info->tot_cnt = 0;
+ }
+ TRACE_HTEX((stderr, "---------------- setting curr_cnt to 0, and emptying stack"));
+ info->page = pageno;
+ info->curr_cnt = 0;
+ info->have_wrapped = -1;
+ while (stack.depth > 0)
+ pop_stack(&stack, &dummy);
+}
+
+/*
+ * htex_initpage does what's neccessary at the beginning of a page:
+ * - re-initialize geometry info if file or page size has changed (according to size_changed),
+ * - re-initialize visited links info if file has changed (according to new_dvi_file),
+ * - take care of mismatched anchors at the beginning of the page.
+ */
+void
+htex_initpage(Boolean new_dvi_file, Boolean size_changed, int pageno)
+{
+ reset_page_info(&htex_page_info, pageno, size_changed | new_dvi_file);
+ init_visited_links(&visited_links, total_pages, new_dvi_file);
+
+#if 0
+ show_visited(&visited_links, pageno);
+#endif
+
+ if (pageno > 0
+ && (int)m_prescan_info.pagelist_len > pageno /* pagelist_len will be 0 for file with no hyperlinks */
+ && m_prescan_info.pagelist[pageno - 1] != NULL) {
+ add_anchor(&htex_page_info, A_HREF,
+ m_prescan_info.pagelist[pageno - 1],
+ strlen(m_prescan_info.pagelist[pageno - 1]),
+ pageno, NULL);
+ htex_page_info.curr_cnt++;
+ MYTRACE((stderr, "++++++++++ mismatched anchor text (at %d): |%s|",
+ htex_page_info.curr_cnt - 1, m_prescan_info.pagelist[pageno - 1]));
+ /* x_pos_bak = y_pos_bak = INT_MAX; */
+ x_pos_bak = y_pos_bak = INT_MAX;
+ set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, 0, 0, 1, 1);
+ htex_page_info.have_wrapped = htex_page_info.curr_cnt - 1;
+ if (bg_current != NULL) { /* only if it has been initialized by redraw_page in events.c */
+ push_colorspecial();
+ }
+ /* else { */
+ /* fprintf(stderr, "----------------------- NOT pushing color, waiting ...\n"); */
+ /* } */
+ push_stack(&stack, A_HREF, htex_page_info.curr_cnt - 1);
+ }
+}
+
+/* Returns a PostScript literal text string inside parentheses. The
+ scanner works according to "PostScript language reference, third
+ edition" - Sec. 3.2.2. The specification is implemented completely:
+ balanced parentheses and all escape sequences are considered.
+
+ The argument STR is expected to be a pointer to the first character
+ after the opening parenthesis. The function returns NULL if the
+ text string is malformed. Otherwise the return value points to
+ an allocated string which should be freed by the calling function.
+*/
+static char *
+scan_ps_literal_text_string(const char *str)
+{
+ const char *s;
+ char *cp, *c;
+ int count = 1;
+
+ /* Search end of string by considering balanced parentheses. */
+ for (s = str; *s; s++)
+ if (*s == '\\' && *(s+1))
+ s++;
+ else if (*s == '(')
+ count++;
+ else if (*s == ')')
+ if (! --count)
+ break;
+
+ if (!*s)
+ return NULL;
+
+
+ if ((cp = malloc((s - str + 1) * sizeof(*cp))) == NULL) {
+ XDVI_ERROR((stderr, "Not enough memory"));
+ return NULL;
+ }
+
+ /* copy string while translating escape sequences */
+ for (c = cp; str < s; str++) {
+ if (*str == '\\') {
+ switch (*++str) {
+ case 'n': *c++ = '\n'; break;
+ case 'r': *c++ = '\r'; break;
+ case 't': *c++ = '\t'; break;
+ case 'b': *c++ = '\b'; break;
+ case 'f': *c++ = '\f'; break;
+ case '\n': break;
+ case '\r': if (*(str + 1) == '\n') str++; break;
+ default:
+ if (isdigit((unsigned char)*str)) {
+ char number[] = "xxx";
+ char *end;
+ strncpy(number, str, 3);
+ *c++ = strtoul(number, &end, 8);
+ str += end - number - 1;
+ }
+ else {
+ *c++ = *str; /* ignore \ if followed by another char,
+ including ( and ) and \ */
+ }
+ }
+ }
+ else {
+ *c++ = *str;
+ }
+ }
+ *c = '\0';
+
+ return cp;
+}
+
+static void
+hdvips_add_anchor(struct htex_page_info *info, htexAnchorT type, const char *str)
+{
+ char *ptr;
+ if ((ptr = scan_ps_literal_text_string(str)) != NULL) {
+ int curr_cnt_bak = info->curr_cnt;
+ /* overwrite previously created dummy/wrapped anchors */
+ ASSERT(info->curr_cnt > 0, "hdvips_add_anchor must be called after add_anchor()!");
+
+ while (info->curr_cnt > 0
+ && info->anchors[info->curr_cnt - 1].a_href != NULL
+ && (strcmp(info->anchors[info->curr_cnt - 1].a_href, "__WRAPPED__") == 0
+ || strcmp(info->anchors[info->curr_cnt - 1].a_href, "__DUMMY__") == 0)) {
+ info->curr_cnt--;
+ free(info->anchors[info->curr_cnt].a_href);
+ free(info->anchors[info->curr_cnt].a_name);
+ info->anchors[info->curr_cnt].a_href = info->anchors[info->curr_cnt].a_name = NULL;
+ add_anchor(info, type, ptr, strlen(ptr), 0, NULL);
+ }
+ info->curr_cnt = curr_cnt_bak;
+ free(ptr);
+ }
+ else {
+ MYTRACE((stderr, "Xdvi warning: skipping malformed hdvips link `%s'", str));
+ }
+}
+
+/*
+ * htex_reset_page: invoked when drawing was interrupted,
+ * assumes that htex_page_info is in an inconsistent state and resets it.
+ */
+void
+htex_reset_page(int pageno)
+{
+ reset_page_info(&htex_page_info, pageno, True);
+}
+
+/* returns True iff inside a href tag */
+Boolean
+htex_scan_anchor(const char *cp, size_t len)
+{
+ char *ptr;
+
+ if (memicmp(cp, "</a>", 4) == 0) { /* end tag */
+ /* struct anchor_info *anchor; */
+ int num;
+ htexAnchorT type = pop_stack(&stack, &num);
+ if (type == A_MISMATCH)
+ return False;
+
+ /* ASSERT(htex_page_info.curr_cnt - 1 >= 0, "Index out of range"); */
+ /* anchor = &(htex_page_info.anchors[htex_page_info.curr_cnt - 1]); */
+
+ /* reset color if needed */
+ if (resource.link_style > 1 && resource.link_color != NULL && htex_is_href(type))
+ pop_colorspecial();
+ }
+ else if (memicmp(cp, "<a ", 3) == 0) {
+ m_href_type = HYPERTEX_LINK;
+ cp += 3; /* skip over `<a ' part */
+ len -= 3;
+ TRACE_HTEX((stderr, "scan_anchor: |%s|", cp));
+ if (memicmp(cp, "name", 4) == 0) {
+ add_anchor(&htex_page_info, A_NAME, cp + 4, len - 4, 0, NULL);
+ htex_page_info.curr_cnt++;
+ push_stack(&stack, A_NAME, htex_page_info.curr_cnt);
+ }
+ else if (memicmp(cp, "href", 4) == 0) {
+ add_anchor(&htex_page_info, A_HREF, cp + 4, len - 4, 0, NULL);
+ htex_page_info.curr_cnt++;
+ push_stack(&stack, A_HREF, htex_page_info.curr_cnt);
+
+ /* MYTRACE((stderr, "NON-WRAPPED ANCHOR at %d,%d!", PXL_H, PXL_V)); */
+ push_colorspecial();
+ x_pos_bak = PXL_H;
+ y_pos_bak = PXL_V;
+ /* set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, PXL_H, PXL_V, PXL_H + 10, PXL_V + 10); */
+ }
+ else {
+ XDVI_WARNING((stderr, "Skipping unimplemented htex special `%s'", cp));
+ push_stack(&stack, A_OTHER, htex_page_info.curr_cnt);
+ }
+ }
+ else if (memcmp(cp, "H.S end", strlen("H.S end")) == 0) {
+ /* start of anchor, link or rect. We just assume that the link
+ target will have length 0, so when we see text between H.S
+ and H.R, assume that it's the link text.
+ */
+ m_href_type = HDVIPS_LINK;
+ /* add dummy */
+ add_anchor(&htex_page_info, A_HDVIPS_HREF, "__DUMMY__", strlen("__DUMMY__"), 0, NULL);
+ htex_page_info.curr_cnt++;
+ push_stack(&stack, A_HREF, htex_page_info.curr_cnt - 1);
+ push_colorspecial();
+ x_pos_bak = PXL_H;
+ y_pos_bak = PXL_V;
+ return True;
+ }
+ else if (memcmp(cp, "H.R end", strlen("H.R end")) == 0 /* end of rect */
+ || memcmp(cp, "H.A end", strlen("H.A end")) == 0 /* end of anchor */
+ || memcmp(cp, "H.L end", strlen("H.L end")) == 0 /* end of link */
+ ) {
+ int num;
+ htexAnchorT type = pop_stack(&stack, &num);
+ if (type == A_MISMATCH)
+ return False;
+ if (resource.link_style > 1 && resource.link_color != NULL)
+ pop_colorspecial();
+ return False;
+ }
+ /* add anchor texts for hdvips links */
+ else if (memcmp(cp, "/A", 2) == 0) { /* possibly an hdvips external link */
+ /* fprintf(stderr, "+++++ EXT: |%s|\n", cp); */
+ if ((ptr = strstr(cp + 2, "/GoToR")) != NULL /* external file */
+ && (ptr = strchr(ptr, '(')) != NULL) {
+ hdvips_add_anchor(&htex_page_info, A_HREF_FILE, ptr + 1);
+ }
+ else if ((ptr = strstr(cp + 2, "/URI")) != NULL /* URL */
+ && (ptr = strchr(ptr, '(')) != NULL) {
+ hdvips_add_anchor(&htex_page_info, A_HREF_URL, ptr + 1);
+ }
+ return False;
+ }
+ else if (memcmp(cp, "/L", 2) == 0) { /* possibly an hdvips internal link */
+ if ((ptr = strstr(cp + 2, "/Dest")) != NULL
+ && (ptr = strchr(ptr, '(')) != NULL) {
+ hdvips_add_anchor(&htex_page_info, A_HDVIPS_INTERNAL, ptr + 1);
+ }
+ return False;
+ }
+ else if (memcmp(cp, "/V", 2) == 0) { /* possibly an hdvips anchor */
+ if ((ptr = strstr(cp + 2, "/Dest")) != NULL
+ && (ptr = strchr(ptr, '(')) != NULL) {
+ hdvips_add_anchor(&htex_page_info, A_HDVIPS_NAME, ptr + 1);
+ }
+ return False;
+ }
+ else { /* unrecognized tag */
+ if (globals.warn_spec_now) {
+ XDVI_WARNING((stderr, "Ignoring unknown hyperref special `%s'", cp));
+ }
+ return False;
+ }
+ return get_href_depth(&stack);
+}
+
+void
+htex_record_position(int ulx, int uly, int w, int h)
+{
+ int lrx, lry;
+ int y_delta;
+
+ if (!INSIDE_MANE_WIN) /* this would give wrong values */
+ return;
+
+ lrx = ulx + w;
+ lry = uly + h;
+
+ y_delta = lry - uly;
+
+ /* heuristics for creating new bounding box at what might be linebreaks */
+ if (lrx < x_pos_bak /* ordinary linebreak */
+ || lry + y_delta < y_pos_bak) { /* column break (from bottom of 1st to top 2nd column) */
+ htexAnchorT type;
+ int idx, prev, curr;
+ /* get anchor index of topmost stack item, to find the matching open tag */
+ if ((type = peek_stack(&stack, &idx)) == A_NONE) {
+ /* fprintf(stderr, "!!!!!!!!!!!! couldn't find opening tag for this wrapped link!"); */
+ return;
+ }
+ ASSERT(idx >= 0, "Index out of range");
+ /* fprintf(stderr, "wrapped link: index %d, type %d\n", idx, type); */
+ /* get correct idx */
+ if (m_href_type == HYPERTEX_LINK) {
+ while (htex_page_info.anchors[idx].a_href == NULL && idx > 0) {
+ idx--;
+ }
+ if (htex_page_info.anchors[idx].a_href == NULL && idx == 0) {
+ XDVI_ERROR((stderr, "Couldn't find wrapped anchor for idx %d, page %d!", idx, current_page));
+ return;
+ }
+ add_anchor(&htex_page_info, A_HREF,
+ htex_page_info.anchors[idx].a_href,
+ strlen(htex_page_info.anchors[idx].a_href),
+ 0, NULL);
+ }
+ else {
+ add_anchor(&htex_page_info, A_HREF, "__WRAPPED__", strlen("__WRAPPED__"), 0, NULL);
+ }
+ htex_page_info.curr_cnt++;
+ /* add wrapping info */
+ if (htex_page_info.have_wrapped >= 0) {
+ /* this is the only case where some other material might have come between
+ this and the previous anchor */
+ prev = htex_page_info.have_wrapped;
+ htex_page_info.have_wrapped = -1;
+ }
+ else {
+ prev = htex_page_info.curr_cnt - 2;
+ }
+ curr = htex_page_info.curr_cnt - 1;
+ ASSERT(prev >= 0, "Index out of range");
+
+ /* fprintf(stderr, "setting prev to %d, curr to %d\n", prev, curr); */
+ htex_page_info.anchors[prev].next_wrapped = curr;
+ htex_page_info.anchors[curr].prev_wrapped = prev;
+ /* initialize it to cover current character */
+ set_anchor_size(&htex_page_info, htex_page_info.curr_cnt - 1, ulx, uly, lrx, lry);
+ }
+ else {
+ int prev_idx = htex_page_info.curr_cnt - 1;
+
+ if (prev_idx >= 0) {
+ enlarge_anchor_size(&htex_page_info, prev_idx, ulx, uly, lrx, lry);
+ }
+ else {
+ MYTRACE((stderr, "!!!!!!!!!!!! Bug? prev_idx < 0"));
+ }
+ }
+ x_pos_bak = lrx;
+ y_pos_bak = uly;
+}
+
+#if 0
+static void
+show_history(void)
+{
+ struct dl_list *ptr = htex_history;
+ struct history_info *info = ptr->item;
+ int i;
+
+ fprintf(stderr, "**************** history: %s, %d, %s\n", info->filename, info->page, info->anchor);
+ for (; ptr->prev != NULL; ptr = ptr->prev) { ; }
+ for (i = 0; ptr != NULL; ptr = ptr->next, i++) {
+ info = ptr->item;
+ fprintf(stderr, "elem %d: %s, %d, %s\n", i, info->filename, info->page, info->anchor);
+ MYTRACE((stderr, "elem: %p, prev: %p, next: %p", (void *)ptr, (void *)ptr->prev, (void *)ptr->next));
+ }
+}
+#endif
+
+/* check for names like foo/bar.dvi#link, return copy of
+ link truncated at the `#' if found (NULL else), and
+ save `link' into resource.anchor_pos for later use.
+*/
+static char *
+check_relative_name(const char *link)
+{
+ char *ptr;
+ TRACE_HTEX((stderr, "check_relative_name: |%s|", link));
+ if ((ptr = strchr(link, '#')) != NULL
+ && ptr > link + 4
+ && (memicmp(ptr - 4, ".dvi", 4) == 0)) {
+ char *new_link = xstrdup(link);
+ new_link[ptr - link] = '\0'; /* truncate the copy */
+ free(g_anchor_pos);
+ g_anchor_pos = xstrdup(ptr + 1);
+ g_anchor_len = strlen(g_anchor_pos);
+
+ return new_link;
+ }
+ else { /* reset g_anchor_pos */
+ free(g_anchor_pos);
+ g_anchor_pos = NULL;
+ }
+ return NULL;
+}
+
+static void
+htex_update_toolbar_navigation(void)
+{
+#if 0
+ show_history();
+#endif
+#if defined(MOTIF) && HAVE_XPM
+ tb_set_htex_back_sensitivity(htex_history->prev != NULL);
+ tb_set_htex_forward_sensitivity(htex_history->next != NULL);
+#endif
+}
+
+void
+htex_back(void)
+{
+ struct history_info *info;
+
+ if (htex_history == NULL) {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT, "Hyperref history is empty");
+ return;
+ }
+ info = htex_history->item;
+
+ if (htex_history->prev == NULL) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "At begin of history"); */
+ htex_update_toolbar_navigation();
+ return;
+ }
+
+ if (strcmp(info->filename, globals.dvi_name) != 0) { /* new filename different */
+ Boolean tried_dvi_ext = False;
+ char *new_dvi_name = NULL;
+
+ if ((new_dvi_name = open_dvi_file_wrapper(info->filename, False, False,
+ &tried_dvi_ext, False))
+ == NULL) {
+
+ statusline_error(STATUS_MEDIUM, "Re-opening file \"%s\" failed!\n", info->filename);
+ return;
+ }
+ else {
+ set_dvi_name(new_dvi_name);
+ globals.ev.flags |= EV_NEWDOC;
+ globals.ev.flags |= EV_PAGEHIST_INSERT;
+ /* statusline_info(STATUS_MEDIUM, "Back to file: \"%s\"", globals.dvi_name); */
+ }
+ }
+ else {
+ page_history_insert(info->page);
+ }
+ goto_page(info->page, resource.keep_flag ? NULL : home, False);
+
+ MYTRACE((stderr, "curr page now: %d", current_page));
+ htex_history = htex_history->prev;
+
+ info = htex_history->item;
+
+#if 0
+ MYTRACE((stderr, "------ before skipping: %d, %s", info->page, info->anchor));
+ show_history();
+ while (info->page == current_page && htex_history->prev != NULL) {
+ /* skip identical locations */
+ MYTRACE((stderr, "+++++++ skipping identical page %d, %s", current_page, info->anchor));
+ htex_history = htex_history->prev;
+ info = htex_history->item;
+ }
+ MYTRACE((stderr, "------ after skipping: %d, %s", info->page, info->anchor));
+#endif
+
+ htex_update_toolbar_navigation();
+}
+
+
+void
+htex_forward(void)
+{
+ struct history_info *info;
+ char *link;
+
+ if (htex_history == NULL) {
+ xdvi_bell();
+ statusline_info(STATUS_SHORT, "Hyperref history is empty");
+ return;
+ }
+ if (htex_history->next == NULL) {
+ xdvi_bell();
+/* statusline_info(STATUS_SHORT, "At end of history"); */
+ return;
+ }
+
+ htex_history = htex_history->next;
+ info = htex_history->item;
+ link = info->anchor;
+ /* go there */
+ if (*link == '#') { /* it's a relative link */
+ MYTRACE((stderr, "XXXXXXXX %s:%d: setting anchor to |%s|+1", __FILE__, __LINE__, info->anchor));
+ free(g_anchor_pos);
+ g_anchor_pos = xstrdup(info->anchor + 1);
+ g_anchor_len = strlen(g_anchor_pos);
+ globals.ev.flags |= EV_ANCHOR;
+ }
+ else { /* it's an absolute link */
+ char *new_linkname = NULL;
+ char *new_dvi_name = NULL;
+ Boolean tried_dvi_ext = False;
+
+ if ((new_linkname = check_relative_name(link)) != NULL)
+ link = new_linkname;
+
+ if ((new_dvi_name = open_dvi_file_wrapper(link, False, False,
+ &tried_dvi_ext, False)) == NULL) {
+ statusline_error(STATUS_MEDIUM, "Re-opening file \"%s\" failed!\n", info->filename);
+ free(new_linkname);
+ return;
+ }
+ else {
+ set_dvi_name(new_dvi_name);
+
+ globals.ev.flags |= EV_NEWDOC;
+ goto_page(0, resource.keep_flag ? NULL : home, False);
+ globals.ev.flags |= EV_PAGEHIST_INSERT;
+
+ if (g_anchor_pos != NULL)
+ globals.ev.flags |= EV_ANCHOR;
+
+ /* statusline_info(STATUS_MEDIUM, "Loaded file: \"%s\"", globals.dvi_name); */
+ free(new_linkname);
+ }
+ }
+
+ htex_update_toolbar_navigation();
+}
+
+/* save this anchor in jump_history, current location in goback_history,
+ and update Motif toolbar icons
+*/
+static void
+history_save_anchor(const char *anchor, int current_page, const char *dvi_name)
+{
+ struct history_info *item;
+
+ if (htex_history == NULL) {
+ /* Insert dummy start elem. We need this to prevent dropping
+ off from the begin of the list, since otherwise a 1-elem
+ list couldn't encode the information whether we can still go
+ back. This way it will point to the dummy elem when there's
+ no way to go back. */
+ struct history_info *start_marker = XMALLOC(start_marker, sizeof *start_marker);
+ start_marker->anchor = NULL;
+ start_marker->filename = NULL;
+ start_marker->page = -1;
+ htex_history = dl_list_insert(htex_history, start_marker);
+ }
+ item = XMALLOC(item, sizeof *item);
+ item->anchor = xstrdup(anchor);
+ item->filename = xstrdup(dvi_name);
+ item->page = current_page;
+ htex_history = dl_list_truncate(dl_list_insert(htex_history, item));
+
+#if 0
+ MYTRACE((stderr, "==================== after inserting "));
+ show_history();
+#endif
+
+ htex_update_toolbar_navigation();
+
+}
+
+/*
+ * Return anchor string at coordinates x, y, and anchor count in 3rd argument,
+ * or NULL if there's no anchor at these coordinates.
+ */
+static char *
+get_anchor_at_index(int x, int y, int *count)
+{
+ int i;
+
+ for (i = 0; i < htex_page_info.curr_cnt; i++) {
+ struct anchor_info anchor = htex_page_info.anchors[i];
+ /* fprintf(stderr, "getting anchor at index %d; %s\n", i, anchor.a_href); */
+ if (anchor.a_href == NULL) {
+ continue;
+ }
+ if (anchor.lry + 2 > y && anchor.uly - 1 < y /* allow some vertical fuzz */
+ && anchor.lrx > x && anchor.ulx < x) {
+ *count = i;
+ return anchor.a_href;
+ }
+ }
+ *count = -1;
+ return NULL;
+}
+
+
+/*
+ generate exposure events for anchor at index idx, and all anchors wrapping to/from it,
+ so that they will be redrawn in `visited' color
+*/
+static void
+redraw_anchors(int idx)
+{
+ struct anchor_info anchor = htex_page_info.anchors[idx];
+ int other;
+ int i = idx;
+#define DO_EXPOSE(lx,ly,rx,ry) (clearexpose(&mane, lx - 20, ly - 3, rx - lx + 26, ry - ly + 6))
+
+ /* HACK ALERT: This is a workaround for a coloring problem with wrapped anchors
+ (see regression/href/002/url-wrap-test2.dvi):
+ We can't change the color on-the-fly for a wrapped anchor, since the special
+ is pushed only at the opening tag. So for wrapped anchors, the visited colour
+ wouldn't be set correctly. Redrawing the entire page ensures this (but it's ugly).
+ Currently this hack overrides the algorithm below for all anchors that have a
+ `prev_wrapped' pointer.
+ */
+ if (htex_page_info.anchors[i].prev_wrapped != -1) {
+ globals.ev.flags |= EV_NEWPAGE;
+ XSync(DISP, False);
+ return;
+ }
+
+ DO_EXPOSE(anchor.ulx, anchor.uly, anchor.lrx, anchor.lry);
+
+ /* previous parts of wrapped anchors: */
+ for (i = idx;
+ i >= 0 && (other = htex_page_info.anchors[i].prev_wrapped) != -1;
+ i--) {
+ DO_EXPOSE(htex_page_info.anchors[other].ulx, htex_page_info.anchors[other].uly,
+ htex_page_info.anchors[other].lrx, htex_page_info.anchors[other].lry);
+ }
+
+ /* later parts of wrapped anchors: */
+ for (i = idx;
+ i < htex_page_info.curr_cnt && (other = htex_page_info.anchors[i].next_wrapped) != -1;
+ i++) {
+ DO_EXPOSE(htex_page_info.anchors[other].ulx, htex_page_info.anchors[other].uly,
+ htex_page_info.anchors[other].lrx, htex_page_info.anchors[other].lry);
+ }
+#undef DO_EXPOSE
+}
+
+
+/*
+ * Invoked when clicking on a link.
+ * newwindow == True means open new window,
+ * newwindow == False means jump to link in current window.
+ * With newwindow == True, don't update the toolbar navigation icons, since there's nothing to go back.
+ */
+Boolean
+htex_handleref(int x, int y, Boolean newwindow)
+{
+ char *link;
+ int link_num;
+
+ /* fprintf(stderr, "---------- htex_handleref!\n"); */
+ if (!(globals.cursor.flags & CURSOR_LINK))
+ /* When no link cursor is shown, clicking shouldn't jump to link */
+ return False;
+
+ if ((link = get_anchor_at_index(x, y, &link_num)) != NULL) {
+ set_visited(&visited_links, current_page, link_num);
+
+ if (*link == '#') { /* it's a relative link */
+ if (newwindow) {
+ launch_xdvi(globals.dvi_name, link + 1);
+ redraw_anchors(link_num);
+ return True;
+ }
+ else {
+ history_save_anchor(link, current_page, globals.dvi_name);
+ free(g_anchor_pos);
+ g_anchor_pos = xstrdup(link + 1);
+ g_anchor_len = strlen(g_anchor_pos);
+ globals.ev.flags |= EV_ANCHOR;
+ redraw_anchors(link_num);
+ return True;
+ }
+ }
+ else { /* it's an absolute link */
+ char *new_dvi_name = NULL;
+ int pageno_bak = current_page;
+ char *new_linkname = NULL;
+ char *orig_link = link;
+ Boolean tried_dvi_ext = False;
+
+ MYTRACE((stderr, "OLD FILE: |%s|", globals.dvi_name));
+
+ if ((new_linkname = check_relative_name(link)) != NULL)
+ link = new_linkname;
+
+ if ((new_dvi_name = open_dvi_file_wrapper(link, False, newwindow,
+ &tried_dvi_ext, False)) != NULL) {
+ /* only save link in history if opening succeeds */
+ history_save_anchor(orig_link, pageno_bak, globals.dvi_name);
+ set_dvi_name(new_dvi_name);
+ if (!newwindow) {
+ globals.ev.flags |= EV_NEWDOC;
+ goto_page(0, resource.keep_flag ? NULL : home, False);
+ globals.ev.flags |= EV_PAGEHIST_INSERT;
+
+ MYTRACE((stderr, "NEW FILE: |%s|", globals.dvi_name));
+ if (g_anchor_pos != NULL)
+ globals.ev.flags |= EV_ANCHOR;
+ /* statusline_info(STATUS_MEDIUM, "Loaded file: \"%s\"", dvi_name); */
+ }
+ else {
+ redraw_anchors(link_num);
+ }
+ }
+ free(new_linkname);
+ redraw_anchors(link_num);
+ return True;
+ }
+ }
+ return False;
+}
+
+/* change cursor and display anchor text in statusline */
+void
+htex_displayanchor(int x, int y)
+{
+ static int id_bak = -1;
+ static int pageno_bak = -1;
+ int id_curr;
+ char *anchor_text;
+
+ anchor_text = get_anchor_at_index(x, y, &id_curr);
+
+ if (anchor_text != NULL) { /* found an anchor */
+ if (!(globals.cursor.flags & CURSOR_LINK) && !(globals.cursor.flags & CURSOR_TEXT)) {
+ globals.cursor.flags |= CURSOR_LINK;
+ globals.ev.flags |= EV_CURSOR;
+ }
+ /* to prevent flicker, print only when it differs from previous one,
+ i.e. when it either has a different ID or is on a different page: */
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0
+ && (id_curr != id_bak || current_page != pageno_bak)) {
+ statusline_info(STATUS_FOREVER, "%s", anchor_text);
+ id_bak = id_curr;
+ pageno_bak = current_page;
+ }
+ }
+ else { /* not over anchor text, reset cursor and statusline */
+ if (globals.cursor.flags & CURSOR_LINK) {
+ globals.cursor.flags &= ~CURSOR_LINK;
+ globals.ev.flags |= EV_CURSOR;
+ }
+
+ if (id_bak != -1 && (resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) {
+ statusline_clear();
+ id_bak = -1;
+ }
+ }
+}
+
+/*
+ * Invoked from all commands that change the shrink factor;
+ * forces re-computation of the anchor markers.
+ */
+void
+htex_resize_page(void)
+{
+ htex_initpage(False, True, current_page);
+}
+
+/*
+ * Invoked from all commands that reread the DVI file;
+ * resets all link infos.
+ * Note: visited_links and anchor stack data
+ * are preserved across multiple files, so we don't need to free() them.
+ */
+void
+htex_reinit(void)
+{
+ htex_prescan_reset();
+ htex_initpage(True, True, current_page);
+}
+
+/*
+ Underline/highlight anchors if the appropriate resource is set.
+ Since this is done after the entire page is parsed, we can't use
+ the checks for fg_current and do_color_change(), but need to
+ use a separate GC instead.
+*/
+void
+htex_draw_anchormarkers(void)
+{
+ int i;
+ int rule_height = (globals.page.h / 1000.0);
+ XRectangle rect = { -1, -1, 0, 0 };
+
+ if (rule_height == 0)
+ rule_height = 1;
+
+ if (current_page == g_anchormarker.page
+ && strcmp(globals.dvi_name, g_anchormarker.filename) == 0
+ && g_anchormarker.y_pos > 0) {
+ htex_draw_anchormarker(g_anchormarker.y_pos);
+ }
+
+ if (resource.link_style == 0 || resource.link_style == 2)
+ return;
+
+ for (i = 0; i < htex_page_info.curr_cnt; i++) {
+ struct anchor_info anchor = htex_page_info.anchors[i];
+
+ if (anchor.a_href != NULL) {
+ int offset;
+ Boolean visited = False;
+
+#if 0
+ XDrawRectangle(DISP, mane.win, globals.gc.high,
+ anchor.ulx, anchor.uly,
+ anchor.lrx - anchor.ulx, anchor.lry - anchor.uly);
+
+#endif
+
+ if (is_visited(&visited_links, current_page, i)) {/* || wrapped_anchor_is_visited(i)) { */
+ visited = True;
+ }
+ offset = ANCHOR_XTRA_V_BBOX / (double)currwin.shrinkfactor + 0.5;
+
+ TRACE_HTEX((stderr, "UNDERLINE: %d, %s is %s", i, anchor.a_href,
+ visited ? "******* visited ****** " : "not visited"));
+ anchor.ulx -= currwin.base_x;
+ anchor.lrx -= currwin.base_x;
+ anchor.lry -= currwin.base_y;
+ anchor.uly -= currwin.base_y;
+
+ /* BUG ALERT: Don't use put_rule here, since this will cause a segfault
+ * with the new color code when switching density (#616920)!
+ */
+ MYTRACE((stderr, "UNDERLINE: checking if %d is visited: %d!", i, visited));
+
+ /* if (clip_region_to_rect(&rect)) { */
+ if (anchor.object_type == HTEX_IMG) {
+ rect.x = anchor.ulx - 1;
+ rect.y = anchor.uly - 1;
+ rect.width = anchor.lrx - anchor.ulx + 2;
+ rect.height = anchor.lry - anchor.uly + 2;
+ if (clip_region_to_rect(&rect)) {
+ XDrawRectangle(DISP, mane.win,
+ visited ? globals.gc.visited_linkcolor : globals.gc.linkcolor,
+ rect.x, rect.y,
+ rect.width, rect.height);
+ }
+ }
+ else {
+ rect.x = anchor.ulx - 1;
+ rect.y = anchor.lry + offset;
+ rect.width = anchor.lrx - anchor.ulx + 2;
+ rect.height = rule_height;
+ if (clip_region_to_rect(&rect)) {
+ XFillRectangle(DISP, mane.win,
+ visited ? globals.gc.visited_linkcolor : globals.gc.linkcolor,
+ rect.x, rect.y,
+ rect.width, rect.height);
+ }
+ }
+ }
+ }
+}
+
+void
+launch_xdvi(const char *filename, const char *anchor_name)
+{
+#define ARG_LEN 32
+ int i = 0;
+ const char *argv[ARG_LEN];
+ char *shrink_arg = NULL;
+
+ ASSERT(filename != NULL, "filename argument to launch_xdvi() mustn't be NULL");
+
+ argv[i++] = kpse_invocation_name;
+ /* FIXME: there's something broken with this and invoking xdvi.bin.
+ To reproduce the problem, invoke from the shell:
+ xdvi.bin -geometry 829x1172 /usr/share/texmf/doc/programs/kpathsea.dvi
+ this will run at 300dpi, i.e. ignore an .Xdefaults setting as opposed to:
+ xdvi.bin /usr/share/texmf/doc/programs/kpathsea.dvi
+
+ Also, how about the other command-line switches that might have
+ been passed to the parent instance? How about things that have been changed
+ at run-time, like shrink factor - should they be converted to command-line
+ options?
+ */
+
+ argv[i++] = "-name";
+ argv[i++] = "xdvi";
+
+ /* start the new instance with the same debug flags as the current instance */
+ if (globals.debug != 0) {
+ argv[i++] = "-debug";
+ argv[i++] = resource.debug_arg;
+ }
+
+ if (anchor_name != NULL) {
+ argv[i++] = "-anchorposition";
+ argv[i++] = anchor_name;
+ }
+
+ argv[i++] = "-s";
+ shrink_arg = XMALLOC(shrink_arg, LENGTH_OF_INT + 1);
+ sprintf(shrink_arg, "%d", currwin.shrinkfactor);
+ argv[i++] = shrink_arg;
+
+ argv[i++] = filename; /* FIXME */
+
+ argv[i++] = NULL;
+ ASSERT(i <= ARG_LEN, "Too few elements in argv[]");
+
+ if (globals.debug & DBG_HTEX) {
+ fprintf(stderr, "Invoking:\n");
+ for (i = 0; argv[i]; i++) {
+ fprintf(stderr, "%s\n", argv[i]);
+ }
+ }
+
+ /*
+ FIXME: using fork_process here hangs the new xdvi process when it tries
+ printing to stderr, so we use plain fork/exec (see comments in util.c)
+ */
+#if 0
+ fork_process(argv[0], False, NULL, NULL, NULL, 0, argv);
+#else
+ {
+ int pid;
+ switch (pid = fork()) {
+ case -1:
+ perror("fork");
+ case 0:
+ execvp(argv[0], (char **)argv);
+ XDVI_ERROR((stderr, "%s: Execution of %s failed.", globals.program_name, argv[0]));
+ _exit(EXIT_FAILURE);
+ default:
+ FREE(shrink_arg);
+ }
+ }
+#endif
+#undef ARG_LEN
+}
+
+#if COPY_TMP_FILE
+/* callback to remove temporary file after helper application has terminated.
+ Currently unused. Note the possible danger of a temp race if the application
+ does an fclose() on the file before ...
+*/
+static void
+remove_temp_file(int status, struct xchild *this)
+{
+ char *pathname = (char *)this->data;
+ if (WEXITSTATUS(status) == 0) {
+ unlink(pathname);
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN, NULL,
+ "Warning: Calling `%s' on `%s' terminated with non-zero status (%d)"
+ "\n(Not removing `%s')",
+ this->name, pathname, status, pathname);
+ }
+ free(pathname);
+}
+#endif
+
+void
+launch_program(const char *filename)
+{
+ const char *format_string = NULL;
+ char *content_type = NULL;
+ char *viewer = NULL;
+ char *argv[4];
+ struct stat statbuf;
+ const char *local_filename_sans_prefix;
+ char *path, *syscmd, *tmp;
+#if COPY_TMP_FILE
+ int tmp_fd;
+#endif
+ const char *ptr;
+ char *fullpath = NULL;
+ char canonical_path[MAXPATHLEN + 1];
+ Boolean needs_terminal;
+ size_t offset;
+
+ TRACE_HTEX((stderr, "launch_program called with |%s|", filename));
+
+ /* is it a local file? */
+ local_filename_sans_prefix = is_local_file(filename);
+ if (local_filename_sans_prefix == NULL) { /* not local */
+ launch_browser(filename);
+ return;
+ }
+
+ /* expand the filename if it contains a relative path */
+ path = find_file(local_filename_sans_prefix, &statbuf, kpse_program_text_format);
+ if (path != NULL) {
+ /* fully canonicalize path before passing it to helper applications */
+ fullpath = REALPATH(path, canonical_path);
+ if (fullpath == NULL) {
+ XDVI_WARNING((stderr, "Couldn't canonicalize %s to full path - returning unexpanded.",
+ path));
+ fullpath = path;
+ }
+ else
+ FREE(path);
+ }
+ else {
+ XDVI_WARNING((stderr, "Couldn't find file %s; passing to application unchanged.",
+ local_filename_sans_prefix));
+ /* if it doesn't exist, maybe the user has encoded some magic in the
+ filename; in that case, pass it to the application unchanged. */
+ fullpath = (char *)local_filename_sans_prefix;
+ }
+
+ TRACE_HTEX((stderr, "fullpath: |%s|", fullpath));
+ content_type = figure_mime_type(fullpath);
+ ASSERT(content_type != NULL, "figure_mime_type() should have returned a valid type (eventually a fallback)");
+
+ /* make it safe to pass the argument to system() or `sh -c',
+ by escaping all `dangerous' characters: */
+ tmp = shell_escape_string(fullpath);
+ fullpath = tmp;
+
+ if ((viewer = figure_viewer(content_type, &format_string, &needs_terminal, fullpath)) == NULL) {
+ /* warn user if no application has been found. Help text needs to be constructed at
+ run-time, since we want the correct content-type in it. */
+#if 0
+ char *helptext = NULL;
+#else
+ char *helptext = get_string_va("Please assign an application to the "
+ "MIME type `%s' in your ~/.mailcap file. "
+ "E.g. if you want to view the file with firefox, "
+ "add the following line to your ~/.mailcap:\n"
+ "%s; firefox '%%s'\n\n",
+ content_type, content_type);
+#endif
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ helptext,
+ "Could not determine an application for the file %s, MIME type `%s'.",
+ fullpath, content_type);
+ /* FIXME: We can't free helptext here, because it won't be used until
+ * the popup comes up and the user clicks on "Help". This doesn't
+ * happen until after this function returns. */
+ /* free(helptext); */
+ free(fullpath);
+ return;
+ }
+
+#if COPY_TMP_FILE
+ /* copy the file to a temporary location before passing it to the
+ viewer. This is e.g. how Acroread does it. This should fix the
+ problem with xdvizilla without -no-rm for DVI files (see comment
+ in figure_viewer(), mime.c).
+ SU 2003/10/02: currently I can't reproduce the xdvizilla problem
+ any more - it seems that for xdvi files, argv[0] will be invoked
+ anyway? Also, copying the files to tmp may break figure locations
+ and relative links for DVI files. Suspended this for the time being.
+ */
+ tmp = NULL;
+ if ((tmp_fd = xdvi_temp_fd(&tmp)) == -1) {
+ XDVI_ERROR((stderr, "couldn't create temporary file; not calling helper application."));
+ return;
+ }
+ TRACE_HTEX((stderr, "copying to temporary location: |%s->%s|", fullpath, tmp));
+ if (!copy_file(fullpath, tmp)) {
+ XDVI_ERROR((stderr, "couldn't copy %s to temporary file %s; not invoking helper application.",
+ fullpath, tmp));
+ return;
+ }
+ free(fullpath);
+ fullpath = tmp;
+#endif
+
+ if (strlen(format_string) > 0) {
+ ptr = find_format_str(viewer, format_string);
+ }
+ else {
+ /*
+ Contrary to RFC 1343, we don't pass stuff via pipes (too bothersome).
+ Instead, pass it as normal argument by appending it to the command.
+ */
+ ptr = strchr(viewer, '\0');
+ }
+
+ offset = 0;
+ if (needs_terminal) {
+ offset += strlen("xterm -e ");
+ }
+ /* allocate extra byte for optional whitespace after viewer command */
+ syscmd = xmalloc(offset + strlen(viewer) + strlen(fullpath) + 2);
+ if (needs_terminal) {
+ strcpy(syscmd, "xterm -e ");
+ }
+ /* viewer command */
+ memcpy(syscmd + offset, viewer, ptr - viewer);
+ /* bugfix for #2931447: add space separator after viewer command if no format string is present */
+ if (strlen(format_string) == 0) {
+ strcpy(syscmd + offset + (ptr - viewer), " ");
+ offset += 1;
+ }
+ /* viewer argument */
+ strcpy(syscmd + offset + (ptr - viewer), fullpath);
+ /* rest of command */
+ strcpy(syscmd + offset + (ptr - viewer) + strlen(fullpath), ptr + strlen(format_string));
+
+ /*
+ mailcap(5) says that the mailcap command shall be passed to system(),
+ so we musn't use fork_process() directly here. Instead, we pass the command
+ to `/bin/sh -c', but via fork_process so that
+
+ - xdvi doesn't hang if the process doesn't return;
+ - we can still catch the return value if `sh -c' exits with an error
+ (e.g. if the viewer command is not found).
+
+ Note however that this doesn't mimick most of POSIX's system() semantics.
+ */
+ TRACE_HTEX((stderr, "execv(\"/bin/sh -c %s\")", syscmd));
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = syscmd;
+ argv[3] = NULL;
+#if COPY_TMP_FILE
+ fork_process("/bin/sh", False, globals.dvi_file.dirname, remove_temp_file,
+ fullpath, 0, argv);
+#else
+ fork_process("/bin/sh", False, globals.dvi_file.dirname, NULL,
+ NULL, 0, argv);
+#endif
+
+ FREE(viewer);
+#if COPY_TMP_FILE
+#else
+ FREE(fullpath);
+#endif
+ FREE(syscmd);
+}
+
+void
+htex_set_anchormarker(int y)
+{
+ Position drawing_x;
+
+ /* erase old marker if it's on the same page as the new marker, after
+ cancelling the old timeout so that it won't affect the new marker */
+ if (m_href_timeout_id)
+ XtRemoveTimeOut(m_href_timeout_id);
+ htex_erase_anchormarker(NULL, NULL);
+ XFlush(DISP);
+
+ XtVaGetValues(globals.widgets.draw_widget, XtNx, &drawing_x, NULL);
+ g_anchormarker.page = current_page;
+ free(g_anchormarker.filename);
+ g_anchormarker.filename = xstrdup(globals.dvi_name);
+ g_anchormarker.y_pos = y;
+ g_anchormarker.x_pos = DEFAULT_MARKER_X_OFFSET + -drawing_x;
+ m_href_timeout_id = XtAppAddTimeOut(globals.app, STATUS_SHORT * 1000, htex_erase_anchormarker, (XtPointer)NULL);
+}
+
+static void
+htex_draw_anchormarker(int y)
+{
+ int x;
+ XPoint points[3];
+
+ Position drawing_x, clip_w;
+
+ XtVaGetValues(globals.widgets.clip_widget, XtNwidth, &clip_w, NULL);
+ XtVaGetValues(globals.widgets.draw_widget, XtNx, &drawing_x, NULL);
+
+ /* compute offset to draw into visible region */
+ x = DEFAULT_MARKER_X_OFFSET + -drawing_x;
+
+ /* Eventually erase old marker, to avoid `smearing' on horizontal scrolls. */
+ if (x != g_anchormarker.x_pos) {
+ clearexpose(&mane, g_anchormarker.x_pos - 1, y - 3, 20, 10);
+ }
+ g_anchormarker.x_pos = x;
+
+ points[0].x = x + 10;
+ points[1].x = x + 19;
+ points[2].x = x + 10;
+ points[0].y = y - 3;
+ points[1].y = y + 2;
+ points[2].y = y + 7;
+
+ XFillRectangle(DISP, mane.win, globals.gc.visited_linkcolor, x, y, 10, 4);
+ XFillPolygon(DISP, mane.win, globals.gc.visited_linkcolor, points, 3, Convex, CoordModeOrigin);
+ /* -1 indicates that no horizontal scrolling is wanted, since the
+ anchormarker will always be horizontally positioned inside the
+ visible area.
+ */
+ scroll_page_if_needed(-1, -1, y + 3, y - 3);
+}
+
+
+static void
+htex_erase_anchormarker(XtPointer client_data, XtIntervalId *id)
+{
+ Position clip_w;
+
+ UNUSED(client_data);
+ UNUSED(id);
+
+ if (globals.debug & DBG_EVENT) {
+ fprintf(stderr, "htex_erase_anchormarker called!\n");
+ }
+
+ if (m_href_timeout_id == (XtIntervalId)0) { /* timeout was removed but callback happened anyway */
+ return;
+ }
+
+ m_href_timeout_id = (XtIntervalId)0;
+ /* clear the mark if we're in the same file and on the same page as the mark */
+ if (g_anchormarker.filename != NULL
+ && strcmp(globals.dvi_name, g_anchormarker.filename) == 0
+ && g_anchormarker.page == current_page) {
+ XtVaGetValues(globals.widgets.clip_widget, XtNwidth, &clip_w, NULL);
+ clearexpose(&mane, 0, g_anchormarker.y_pos - 3, clip_w, 10);
+ }
+ g_anchormarker.y_pos = -1;
+}
+
diff --git a/Build/source/texk/xdvik/hypertex.h b/Build/source/texk/xdvik/hypertex.h
new file mode 100644
index 00000000000..43dcb987197
--- /dev/null
+++ b/Build/source/texk/xdvik/hypertex.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef HYPERTEX_H_
+#define HYPERTEX_H_
+
+/* fallbacks if parsing user-specified colors fails */
+#define LINK_COLOR_FALLBACK "BLUE2"
+#define VISITED_LINK_COLOR_FALLBACK "Purple4"
+
+extern const char *is_local_file(const char *filename);
+extern void launch_program(const char *filename);
+extern void launch_xdvi(const char *filename, const char *anchor_name);
+extern Boolean htex_handleref(int x, int y, Boolean newwindow);
+extern void htex_reinit(void);
+extern void htex_resize_page(void);
+extern void htex_draw_anchormarkers(void);
+extern void htex_record_position(int, int, int, int);
+
+extern void htex_initpage(Boolean dvi_file_changed, Boolean size_changed, int pageno);
+
+typedef enum { HTEX_ANCHOR_NUM, HTEX_ANCHOR_STRING } htexPrescanTypeT;
+
+struct htex_prescan_data {
+ int pageno;
+ int anchor_num;
+ htexPrescanTypeT scan_type;
+};
+
+typedef enum { HTEX_TEXT, HTEX_IMG } htexObjectT;
+
+/* prescanning stuff */
+extern Boolean htex_prescan_special(const char *str, int str_len, struct htex_prescan_data *data);
+extern int htex_prescan_get_depth(void);
+extern size_t htex_prescan_get_mismatched_anchor_num(size_t depth);
+extern void htex_prescan_save(void);
+extern void htex_prescan_reset_firstpass(void);
+extern void htex_prescan_restore(int pageno);
+extern void htex_prescan_initpage(void);
+extern void htex_prescan_carry_over(int old_page, int new_page);
+extern void htex_set_anchorsize(int x, int y, int w, int h);
+extern void htex_set_objecttype(htexObjectT type);
+
+extern void htex_reset_page(int pageno);
+extern void htex_displayanchor(int, int);
+extern void htex_set_anchormarker(int y);
+extern void htex_back(void);
+extern void htex_forward(void);
+
+extern Boolean htex_scan_anchor(const char *special, size_t len);
+
+#endif /* HTEXTEX_H_ */
diff --git a/Build/source/texk/xdvik/image-magick.c b/Build/source/texk/xdvik/image-magick.c
new file mode 100644
index 00000000000..c83f52f87f5
--- /dev/null
+++ b/Build/source/texk/xdvik/image-magick.c
@@ -0,0 +1,1443 @@
+/*
+ Imagemagick support for xdvik, written by Zhang Linbo <zlb@lsec.cc.ac.cn>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/*
+ TODO:
+
+ 1. Specials other than 'psfile=' and 'em:graph' which include
+ image files.
+
+ [ NOTE SU: I consider this more or less done now with the backtick
+ parsing ;-) ]
+
+ 2. Use an XtWorkProc or similar to do some background pre-processing
+ of image files before they are displayed.
+
+ 3. Replace popen() by fork and explicit pipes, and make the
+ use of xdvi_temp_fd safer.
+
+ 4. PS figs are always clipped to the bbox defined in the special
+ string, which is not what we want when clip=false.
+ The problem can be partly solved by increasing the value of
+ the PSBW macro, or we may get the correct bbox by reading the
+ '%%BoundingBox' or '%%HiresBoundingBox' lines in the PS file
+ and set the image geometry accordingly.
+
+ 5. The code only(?) works with true color displays.
+
+ 6. There's also work to do to respond to window events in
+ load_image() and display_image() functions.
+*/
+#include "xdvi-config.h"
+
+#include <ctype.h>
+
+#include "xdvi.h"
+#include "dvi-init.h"
+#include "events.h"
+#include "dvi-draw.h"
+#include "util.h"
+#include "special.h"
+#include "image-magick.h"
+
+#ifdef MAGICK /* entire file */
+
+#ifndef MAGICK_RENDER_PS
+# define MAGICK_RENDER_PS 0
+#endif
+
+#include "magick/api.h"
+#if MAGICK_VER_MAJOR > 5 || MAGICK_VER_MINOR >= 4
+# include "magick/xwindow.h" /* IM >= 5.4 */
+#else
+# include "magick/xwindows.h" /* IM <= 5.3 */
+#endif
+
+#if MAGICK_VER_MAJOR > 5 || MAGICK_VER_MINOR >= 4 /* >= 5.4 */
+# define CATCH_EXCEPTION(e) do { \
+ if (e.severity != UndefinedException) CatchException(&e); } while (0)
+#elif MAGICK_VER_MINOR >= 3 /* 5.3 */
+# define CATCH_EXCEPTION(e) if (image == NULL) \
+ MagickWarning(e.severity, e.reason, e.description);
+#else /* <= 5.2 (no check) */
+# define CATCH_EXCEPTION(e) if (image == NULL) \
+ MagickWarning(e.severity, e.message, e.qualifier);
+#endif
+
+#if 0
+#define CATCH_EXCEPTION(e) /* do nothing */
+#endif
+
+#ifndef False
+# define False 0
+#endif
+
+#ifndef True
+# define True 1
+#endif
+
+#define TWOPI (2*3.141592653589793)
+
+static double ROUND_tmp;
+#define ROUND(x) ( (ROUND_tmp=(x)) >= 0 ? (long)(ROUND_tmp + 0.5) : \
+ - (long)(- ROUND_tmp + 0.5) )
+
+static void
+showtime(const char *msg)
+{
+ if (globals.debug & DBG_PS) {
+ static double time0 = -1;
+ double time;
+ struct timeval tv;
+
+ gettimeofday(&tv, (struct timezone *) 0);
+ time = tv.tv_sec + (double) tv.tv_usec * 1e-6;
+ if (time0 < 0)
+ time0 = time;
+ fprintf(stderr, " %-40s %0.4f\n", msg, time - time0);
+ }
+}
+
+#define DPI ( resource.pixels_per_inch*0.001*magnification/mane.shrinkfactor )
+
+typedef struct XDviImageInfo {
+ Boolean clip;
+ int rwi, rhi, angle;
+ double llx, lly, urx, ury;
+ char filename[MaxTextExtent];
+} XDviImageInfo;
+
+typedef struct {
+ XDviImageInfo info;
+ XImage *ximage; /* ximage */
+ unsigned long bgpixel; /* background pixel */
+ int xoff, yoff; /* offsets in pixels */
+} XDviImage;
+
+static size_t cache_size = 0;
+/* default value for cache_limit (16MB), it can be specified with the
+ * "-magick_cache size" option */
+static size_t cache_limit = 16 * 1024 * 1024;
+static int ncached = 0;
+static XDviImage *cache = NULL;
+
+static char *magick_tmp;
+static double current_dpi = -1;
+
+/* Input image types */
+enum {
+ TYPE_UNKNOWN, /* unknown */
+ TYPE_CONVERT, /* `convert ... */
+};
+static int image_type; /* type of current input image */
+
+static void
+cleanup(void)
+{
+ if (magick_tmp != NULL)
+ unlink(magick_tmp);
+}
+
+static void
+free_ximage(XImage * ximage)
+{
+ if (ximage == NULL)
+ return;
+ if (ximage->data != NULL) {
+ free(ximage->data);
+ ximage->data = NULL;
+ }
+ XDestroyImage(ximage);
+}
+
+static void
+clear_cache(void)
+{
+ XDviImage *c;
+ if (!ncached)
+ return;
+ for (c = cache; c < cache + ncached; c++)
+ free_ximage(c->ximage);
+ free(cache);
+ ncached = 0;
+ cache = NULL;
+ cache_size = 0;
+}
+
+static void
+parse_backtick(char *fn)
+{
+ char *p, *q, *r, c;
+
+ if (fn[0] != '`')
+ return;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: parsing backtick command |%s|\n", fn);
+
+#ifdef __GNUC__
+#warning FIXME: add code to execute the cmd then load the output file, \
+ if '-allowshell' is effective and the user requests it \
+ somehow (slow but reliable).
+#endif
+
+ fn[0] = '\0';
+ p = fn + 1;
+ /* Skip 'env' and 'VAR=value' */
+ do {
+ while (isspace((int)*p))
+ ++p;
+ q = p;
+ while (*q != '\0' && !isspace((int)*q))
+ ++q;
+ if (*q == '\0' || q <= p)
+ return;
+ if (((r = strchr(p, '=')) == NULL || r >= q) &&
+ (!isspace((int)*q) || strncmp(p, "env", 3)))
+ break;
+ p = q;
+ } while (1);
+
+ /* Now [p ... q-1] is the command name */
+ if (q - p == 7 && !memcmp(p, "convert", 7))
+ image_type = TYPE_CONVERT;
+ else
+ image_type = TYPE_UNKNOWN;
+ p = q;
+ do {
+ while (isspace((int)*p))
+ ++p;
+ q = p;
+ if (*q == '`' || *q == '\'' || *q == '"') {
+ c = *p;
+ ++q;
+ while (*q != '\0' && *q != c)
+ q++;
+ if (*q != '\0')
+ q++;
+ }
+ else {
+ while (*q != '\0' && !isspace((int)*q))
+ q++;
+ }
+#ifdef __GNUC__
+#warning FIXME: check for some cmdline options
+ break;
+#endif
+ } while (1);
+ *q = '\0';
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: filename=|%s|\n", p);
+
+ /* check for the case `kpsewhich -n ... #1` */
+ if (*p == '`') {
+#if 0
+ /* WARNING: unsafe! */
+ FILE *pipe;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: executing %s\n", p);
+ if (*(--q) == '`')
+ *q = '\0';
+ if ((pipe = popen(p + 1, "r")) == NULL)
+ return;
+ fscanf(pipe, "%s", fn);
+ pclose(pipe);
+ return;
+#else
+ if (memcmp(++p, "kpsewhich", sizeof("kpsewhich") - 1))
+ return;
+#ifdef __GNUC__
+#warning FIXME: better make KPSE library call here.
+#endif
+ if (*(--q) == '`')
+ --q;
+ while (q >= p && isspace((int)*q))
+ --q;
+ if (q < p)
+ return;
+ *(q + 1) = '\0';
+ while (q >= p && !isspace((int)*q))
+ --q;
+ p = q + 1;
+#endif
+ }
+
+ strcpy(fn, p);
+}
+
+static Boolean
+imagick_eps_to_jpeg(const char *fullpath,
+ unsigned long *columns, unsigned long *rows,
+ XDviImage *img, PixelPacket *bgcolor,
+ double xdpi, double ydpi)
+{
+ size_t size;
+#ifdef __GNUC__
+#warning FIXME: security (check 'allowshell'?), backticks, pathname canonicalization,
+ /* note SU: better use fork()/exec() here, popen() is too unsafe. */
+#endif
+ static char *cmdline = NULL;
+ static size_t cmdline_size = 0;
+ static char *fmt = "%s -q -dBATCH -dMaxBitmap=300000000 "
+ "-dNOPAUSE -dNOSAFER -sDEVICE=jpeg "
+ "-dTextAlphaBits=4 -dGraphicsAlphaBits=4 "
+ "-g%ldx%ld -r%0.4fx%0.4f -sOutputFile=%s - -c quit";
+ static const char strsafe[] =
+ "{ << /PermitFileReading [ (*) ] /PermitFileWriting [ ] /PermitFileControl [ ] "
+ ">> setuserparams .locksafe "
+ "} stopped pop\n";
+ FILE *pipe;
+
+ showtime("PS/EPS -> JPEG:");
+ /* Add a border to the drawing box (PSBW=border width in bp) */
+#define PSBW 1
+ *columns += ROUND(2 * PSBW / 72.0 * xdpi);
+ *rows += ROUND(2 * PSBW / 72.0 * ydpi);
+ img->xoff = ROUND(PSBW / 72.0 * xdpi);
+ img->yoff = -ROUND(PSBW / 72.0 * ydpi);
+
+ size = strlen(fmt) + 25 * 2 + 10 * 2 + strlen(magick_tmp) + strlen(resource.gs_path) + 1;
+ if (size > cmdline_size) {
+ cmdline_size = size;
+ cmdline = xrealloc(cmdline, cmdline_size);
+ }
+ unlink(magick_tmp);
+ sprintf(cmdline, fmt, resource.gs_path, *columns, *rows, xdpi, ydpi,
+ magick_tmp);
+ if ((pipe = popen(cmdline, "w")) == NULL) {
+ fprintf(stderr, "%s: Cannot execute %s, ignoring image %s.\n",
+ globals.program_name, resource.gs_path, fullpath);
+ return False;
+ }
+
+#define ColorToPixelPacket(c) ((c*((1L<<(QuantumDepth))-1L)+32768L)/65535L)
+#define UnifiedColorValue(c) ((c)/(double)((1L<<(QuantumDepth))-1L))
+#ifdef __GNUC__
+#warning FIXME: how to control roundoff error which may produce a \
+ different backgroung pixel in the output image?
+#endif
+#if COLOR
+ bgcolor->red = ColorToPixelPacket(bg_current->color.r);
+ bgcolor->green = ColorToPixelPacket(bg_current->color.g);
+ bgcolor->blue = ColorToPixelPacket(bg_current->color.b);
+#else
+ bgcolor->red = bgcolor->green = bgcolor->blue = ColorToPixelPacket(65535);
+#endif
+ bgcolor->opacity = (1L << QuantumDepth) - 1L;
+
+#ifdef __GNUC__
+#warning FIXME: how to set bg color within gs (instead of filling the bbox) ?
+#endif
+ if (resource.gs_safer) {
+ fprintf(pipe, strsafe);
+ }
+ /* fill PS paper with background color */
+ fprintf(pipe,
+ "newpath -5 -5 moveto %f 0 rlineto "
+ "0 %f rlineto %f 0 rlineto 0 %f rlineto "
+ "closepath %f %f %f setrgbcolor fill\n",
+ img->info.urx - img->info.llx + 2 * (PSBW + 5),
+ img->info.ury - img->info.lly + 2 * (PSBW + 5),
+ -(img->info.urx - img->info.llx + 2 * (PSBW + 5)),
+ -(img->info.ury - img->info.lly + 2 * (PSBW + 5)),
+ UnifiedColorValue(bgcolor->red),
+ UnifiedColorValue(bgcolor->green),
+ UnifiedColorValue(bgcolor->blue));
+
+ /* shift PS coordinates */
+ fprintf(pipe, "%f %f translate\n", -img->info.llx + PSBW, -img->info.lly + PSBW);
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " clip=%s\n", img->info.clip ? "yes" : "no");
+ if (img->info.clip) {
+ fprintf(pipe, "newpath %f %f moveto %f 0 rlineto 0 %f rlineto "
+ "%f 0 rlineto 0 %f rlineto closepath clip\n",
+ img->info.llx, img->info.lly, img->info.urx - img->info.llx,
+ img->info.ury - img->info.lly, -(img->info.urx - img->info.llx),
+ -(img->info.ury - img->info.lly));
+ }
+ fprintf(pipe, "%f %f moveto\n", img->info.llx, img->info.lly);
+ fprintf(pipe, "(%s) run showpage\n", fullpath);
+ pclose(pipe);
+ return True;
+}
+
+
+static Image *
+rotate_image(XDviImage *img, Image *image, ExceptionInfo exception)
+{
+ Image *tmp_image;
+ unsigned long w = image->columns, h = image->rows;
+ double sin_a = sin(img->info.angle * (TWOPI / 360));
+ double cos_a = cos(img->info.angle * (TWOPI / 360));
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "\t rotating image by %d degrees\n",
+ img->info.angle);
+
+ /* adjust xoff, yoff, assuming (0,0) the origin of rotation */
+ if (img->xoff || img->yoff) {
+ double a, b;
+ a = img->xoff * cos_a + img->yoff * sin_a;
+ b = -img->xoff * sin_a + img->yoff * cos_a;
+ img->xoff = ROUND(a);
+ img->yoff = ROUND(b);
+ }
+
+ showtime("RotateImage:");
+ tmp_image = RotateImage(image, -(double)img->info.angle, &exception);
+ DestroyImage(image);
+ image = tmp_image;
+ CATCH_EXCEPTION(exception);
+ if (image == NULL)
+ return NULL;
+ /*
+ * _______________________________________
+ * | * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * |* *|
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | * * |
+ * | O (origin) |
+ * O--------------------------------------
+ * (lower-left corner of image box after rotation)
+ */
+ if (img->info.angle <= 90) {
+ img->xoff += ROUND(h * sin_a);
+ }
+ else if (img->info.angle <= 180) {
+ img->xoff += ROUND(h * sin_a - w * cos_a);
+ img->yoff += ROUND(h * cos_a);
+ }
+ else if (img->info.angle <= 270) {
+ img->xoff -= ROUND(w * cos_a);
+ img->yoff += ROUND(w * sin_a + h * cos_a);
+ }
+ else {
+ img->yoff += ROUND(w * sin_a);
+ }
+ return image;
+}
+
+static Image *
+crop_shift_image(XDviImage *img, Image *image,
+ unsigned long *columns, unsigned long *rows,
+ double xscale, double yscale,
+ ExceptionInfo exception)
+{
+ /* ZLB: the code below works for the case where the BoundingBox
+ * of the PS figure generated by the shell command is (0 0 w h),
+ * where w and h are the pixel width and height of the input image.
+ * (this is true for the program 'convert' without options).
+ * The image should then be cropped or/and shifted depending
+ * on the value of 'clip' */
+ int w = image->columns, h = image->rows;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: type of input image = CONVERT\n");
+
+ if (!img->info.clip) {
+ /* We only need to shift the image */
+ img->xoff = +ROUND(xscale * DPI * img->info.llx / 72.0);
+ img->yoff = -ROUND(yscale * DPI * img->info.lly / 72.0);
+ *columns = ROUND(xscale * DPI * w / 72.0);
+ *rows = ROUND(yscale * DPI * h / 72.0);
+ }
+ else {
+ int llx = ROUND(img->info.llx);
+ int lly = ROUND(img->info.lly);
+ int urx = ROUND(img->info.urx);
+ int ury = ROUND(img->info.ury);
+
+ if (llx < 0) {
+ img->xoff = +ROUND(xscale * DPI * llx / 72.0);
+ llx = 0;
+ }
+ if (lly < 0) {
+ img->yoff = -ROUND(yscale * DPI * lly / 72.0);
+ lly = 0;
+ }
+ if (urx > w)
+ urx = w;
+ if (ury > h)
+ ury = h;
+
+ if ((urx - llx) < 1 || (urx - llx) < 1) {
+ DestroyImage(image);
+ return NULL;
+ }
+
+ if (llx != 0 || lly != 0 || urx != w || ury != h) {
+ /* Crop the image */
+ Image *tmp_image;
+ RectangleInfo geo;
+ geo.width = urx - llx;
+ geo.height = ury - lly;
+ geo.x = llx;
+ geo.y = h - ury;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "\t cropping image (%d %d %d %d)\n",
+ llx, lly, urx, ury);
+ showtime("CropImage:");
+ tmp_image = CropImage(image, &geo, &exception);
+ DestroyImage(image);
+ image = tmp_image;
+ CATCH_EXCEPTION(exception);
+ if (image == NULL)
+ return NULL; /* error cropping image */
+ }
+ *columns = ROUND(xscale * DPI * (urx - llx) / 72.0);
+ *rows = ROUND(yscale * DPI * (ury - lly) / 72.0);
+ }
+ return image;
+}
+
+
+/* parse and return the `magick_cache' resource size_str */
+static long
+parse_cache_setting(const char *size_str)
+{
+ char *p;
+ long size = strtol(size_str, &p, 0);
+ switch (*p) {
+ case 'g':
+ case 'G':
+ size *= 1024;
+ /* fall through */
+ case 'm':
+ case 'M':
+ size *= 1024;
+ /* fall through */
+ case 'k':
+ case 'K':
+ size *= 1024;
+ break;
+ default:
+ if (*p != '\0') {
+ fprintf(stderr, "Magick: invalid suffix (%c) in "
+ "magick_cache option\n", *p);
+ }
+ }
+ return size;
+}
+
+static XDviImage *
+load_image(XDviImageInfo *info)
+{
+ static ExceptionInfo exception;
+ static ImageInfo *image_info;
+ static XVisualInfo visual_info;
+ static XStandardColormap map_info;
+ static Boolean initialized = False;
+ static Boolean disabled = False;
+
+ static XDviImage img = { {False, 0, 0, 0, 0, 0, 0, 0, ""}, NULL, 0, 0, 0 };
+
+ Image *image, *tmp_image;
+ PixelPacket *pp;
+ double xscale, yscale, xdpi, ydpi;
+ int n;
+ unsigned int x, y;
+ unsigned long columns, rows;
+ char density[40];
+ size_t size;
+ char *fn = info->filename;
+ XDviImage *c;
+ PixelPacket bgcolor;
+
+ struct stat statbuf;
+ char *path, *fullpath;
+ char canonical_path[MAXPATHLEN + 1];
+
+ if (disabled)
+ return NULL;
+
+ parse_backtick(info->filename);
+ if (info->filename[0] == '\0') {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: skipping malformed backtick command.\n");
+ return NULL;
+ }
+ else {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: filename=|%s|\n", info->filename);
+ }
+
+ img.info = *info;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: load_image: fn=%s\n", fn);
+
+ /* check for changes in mag/shrink/resolution */
+ if (fabs(current_dpi - DPI) > 1e-4) {
+ current_dpi = DPI;
+ clear_cache();
+ }
+
+ /* look it up in the cache */
+ if (ncached) {
+ for (c = cache; c < cache + ncached; c++) {
+ if (memcmp(&c->info, info, sizeof *info))
+ continue;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " Image found in cache.\n");
+ return c;
+ }
+ }
+
+ if (!initialized) {
+ magick_tmp = NULL;
+ if ((n = xdvi_temp_fd(&magick_tmp)) == -1) {
+ fprintf(stderr, "Magick: cannot create tmp filename, disabled.\n");
+ disabled = True;
+ return NULL;
+ }
+ /* FIXME: mustn't close filedescriptor returned by xdvi_temp_fd(),
+ else we have a race condition again; see e.g.
+ http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/avoid-race.html
+ */
+ close(n);
+ unlink(magick_tmp);
+ atexit(cleanup); /* remove magick_tmp at exit. */
+
+ showtime("Initializing load_image:");
+ InitializeMagick("xdvi.bin");
+ GetExceptionInfo(&exception);
+ image_info = CloneImageInfo((ImageInfo *) NULL);
+
+ if (!XMatchVisualInfo(DISP, XScreenNumberOfScreen(SCRN),
+ G_depth, G_visual->class, &visual_info)) {
+ fprintf(stderr, "Magick: can't get visual info, image disabled.\n");
+ disabled = True;
+ return NULL;
+ }
+
+ if (resource.magick_cache != NULL) {
+ cache_limit = parse_cache_setting(resource.magick_cache);
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " Setting magick_cache to %lu\n",
+ (unsigned long)cache_limit);
+ }
+ initialized = True;
+ }
+
+ xscale = info->rwi / (double) ((int) (10 * (info->urx - info->llx) + .5));
+ yscale = info->rhi / (double) ((int) (10 * (info->ury - info->lly) + .5));
+ xdpi = xscale * DPI;
+ ydpi = yscale * DPI;
+ /* Compute scaled size of the image */
+ columns = ROUND(DPI * info->rwi * 0.1 / 72);
+ rows = ROUND(DPI * info->rhi * 0.1 / 72);
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "\tscale=%0.2fx%0.2f, dpi=%0.2fx%0.2f, size=%ldx%ld\n",
+ xscale, yscale, xdpi, ydpi, columns, rows);
+
+ /* expand and canonicalize path name */
+ path = find_file(fn, &statbuf, kpse_pict_format);
+ if (path != NULL) {
+ fullpath = REALPATH(path, canonical_path);
+ if (fullpath == NULL) {
+ XDVI_WARNING((stderr, "Couldn't canonicalize %s to full path - returning unexpanded.",
+ path));
+ fullpath = path;
+ }
+ else {
+ free(path);
+ }
+ }
+ else {
+ fprintf(stderr, "%s: %s:%d: Can't find image file %s!\n",
+ globals.program_name, __FILE__, __LINE__, fn);
+ return NULL;
+ }
+
+ /* If the file is PS/EPS transform it to JPEG first (faster) */
+ n = strlen(fullpath);
+ if ((n >= 3 && !memicmp(fullpath + n - 3, ".ps", 3)) ||
+ (n >= 4 && !memicmp(fullpath + n - 4, ".eps", 4))) {
+ if (!imagick_eps_to_jpeg(fullpath, &columns, &rows, &img, &bgcolor, xdpi, ydpi)) {
+ return NULL;
+ }
+ /* Should we append the 'JPEG:' prefix to the filename to help
+ * ImageMagick to identify the file format? */
+ fullpath = magick_tmp;
+ }
+ else {
+ img.xoff = img.yoff = 0;
+ }
+
+ strcpy(image_info->filename, fullpath);
+ showtime("ReadImage:");
+ if (fullpath == magick_tmp) {
+ /* seems 'density' only affects image size of PS/EPS files */
+ sprintf(density, "%0.2fx%0.2f", xdpi, ydpi);
+ image_info->density = density;
+ image_info->units = PixelsPerInchResolution;
+ }
+ image = ReadImage(image_info, &exception);
+ CATCH_EXCEPTION(exception);
+ unlink(magick_tmp);
+ if (image == NULL) /* error loading image */
+ return NULL;
+
+ /* Set background color for PS/EPS fig */
+ if (fullpath == magick_tmp) /* input is PS */
+ image->background_color = bgcolor;
+
+ if (globals.debug & DBG_PS) {
+ int i = image->units;
+ fprintf(stderr, "\t image size = %ldx%ld\n",
+ image->columns, image->rows);
+ fprintf(stderr, "\t image resolution = %0.2fx%0.2f (units=%s)\n",
+ image->x_resolution, image->y_resolution,
+ i == UndefinedResolution ? "???" :
+ i == PixelsPerInchResolution ? "PPI" : "PPCM");
+ }
+
+ if (fullpath != magick_tmp) { /* non PS image */
+ /* Note: (info->llx info->lly info->urx info->ury) should be
+ * regarded as the viewport */
+ if (image_type == TYPE_CONVERT) {
+ image = crop_shift_image(&img, image, &columns, &rows, xscale, yscale, exception);
+ }
+ else {
+ /* Do nothing. The image will be scaled to the size of the bbox.
+ * ZLB: the output will be identical to dvips iff the bbox of
+ * the PS figure generated by the shell command is equal to
+ * (info->llx info->lly info->urx info->ury).
+ * (this is true if the bbox set via 'bb', 'viewport', etc.,
+ * is equal to the real bbox of the PS figure) */
+ }
+
+ if (columns != image->columns || rows != image->rows) {
+ /* Scale image */
+ if (globals.debug & DBG_PS) {
+ fprintf(stderr, "\t scaling image %ldx%ld -> %ldx%ld\n",
+ image->columns, image->rows, columns, rows);
+ }
+ showtime("ScaleImage:");
+ tmp_image = ScaleImage(image, columns, rows, &exception);
+ DestroyImage(image);
+ image = tmp_image;
+ CATCH_EXCEPTION(exception);
+ if (image == NULL)
+ return NULL; /* error resizing image */
+ }
+ }
+
+ /* rotate image */
+ if (info->angle) {
+ image = rotate_image(&img, image, exception);
+ }
+
+#if 0
+ DescribeImage(image, stdout, 1 /* verbosity */ );
+ DisplayImages(image_info, image);
+#endif
+
+#define XStandardPixel(map,color,dx) (unsigned long) (map.base_pixel + \
+ (((color).red * map.red_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.red_mult + \
+ (((color).green * map.green_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.green_mult + \
+ (((color).blue * map.blue_max + (1L << (dx - 1L))) / ((1L << dx) - 1L)) * map.blue_mult)
+
+ img.bgpixel = XStandardPixel(map_info, image->background_color, 16);
+#undef XStandardPixel
+ if (img.ximage != NULL) {
+ free_ximage(img.ximage);
+ img.ximage = NULL;
+ }
+
+ /* Transform to XImage */
+ pp = GetImagePixels(image, 0, 0, image->columns, image->rows);
+ img.ximage = XCreateImage(DISP, G_visual, G_depth, ZPixmap, 0, NULL,
+ image->columns, image->rows, BMBITS, 0);
+ if (img.ximage == NULL)
+ return NULL;
+ size = img.ximage->bytes_per_line * img.ximage->height;
+ img.ximage->data = malloc(size ? size : 1); /* NOTE: no xmalloc! */
+ if (img.ximage->data == NULL) {
+ fprintf(stderr, "Magick: cannot allocate memory for ximage data.\n");
+ XDestroyImage(img.ximage);
+ img.ximage = NULL;
+ return NULL;
+ }
+ for (y = 0; y < image->rows; y++) {
+ for (x = 0; x < image->columns; x++, pp++) {
+ struct rgb color;
+ color.r = USHRT_MAX * pp->red / MaxRGB;
+ color.g = USHRT_MAX * pp->green / MaxRGB;
+ color.b = USHRT_MAX * pp->blue / MaxRGB;
+ XPutPixel(img.ximage, x, y, alloc_color(&color, img.bgpixel));
+ }
+ }
+ DestroyImage(image);
+
+ size += sizeof(XDviImage) + sizeof(XImage);
+ if (cache_size + size > cache_limit) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " image not cached (cache limit).\n");
+ return &img;
+ }
+
+ c = realloc(cache, sizeof(XDviImage) * (ncached + 1)); /* NOTE: no xrealloc! */
+ if (c == NULL) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " image not cached (cache alloc).\n");
+ return &img;
+ }
+ cache_size += size;
+ cache = c;
+ c = cache + (ncached++);
+ *c = img;
+ img.ximage = NULL; /* so next call won't delete this ximage */
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " image cached (cache_size=%uKB, limit=%uKB).\n",
+ cache_size / 1024, cache_limit / 1024);
+#if 0
+ DestroyImageInfo(image_info);
+ DestroyExceptionInfo(&exception);
+ DestroyMagick();
+#endif
+
+ return c;
+}
+
+static void
+display_image(XDviImage * img, int xul, int yul,
+ const struct window_expose_info *expose,
+ const GC gc)
+{
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, " display_image: pos=%d, %d\n", xul, yul);
+
+ xul -= img->xoff;
+ yul -= img->yoff;
+
+#if 0
+ XPutImage(DISP, mane.win, globals.gc.copy, img->ximage, 0, 0,
+ xul, yul - img->ximage.height + 1,
+ img->ximage->width, img->ximage->height);
+#else
+ /* Try to make background pixels transparent */
+ {
+ XImage *scr;
+ int x0 = xul;
+ int y0 = yul - img->ximage->height + 1;
+ int w = img->ximage->width;
+ int h = img->ximage->height;
+ int xoff = 0;
+ int yoff = 0;
+ int x, y;
+
+ if (x0 + w <= expose->min_x || x0 >= expose->max_x ||
+ y0 + h <= expose->min_y || y0 >= expose->max_y)
+ return;
+ if (x0 < expose->min_x) {
+ xoff = expose->min_x - x0;
+ x0 = expose->min_x;
+ w -= xoff;
+ }
+ if (x0 + w > expose->max_x)
+ w = expose->max_x - x0 + 0;
+ if (y0 < expose->min_y) {
+ yoff = expose->min_y - y0;
+ y0 = expose->min_y;
+ h -= yoff;
+ }
+ if (y0 + h > expose->max_y)
+ h = expose->max_y - y0 + 0;
+
+ {
+ /* Need to double check the bounds here, because redraw_page() in
+ * events.c may set larger bounding box (expose->min_x, expose->min_y, etc.)
+ * than actual viewport causing 'BadMatch' error in XGetImage().
+ *
+ * Here we clip the rectangle w*h+x0+y0 with the root window. */
+ XWindowAttributes a;
+ Status status;
+ Window child;
+
+ status = XGetWindowAttributes(DISP, mane.win, &a);
+ if (!status || a.map_state != IsViewable)
+ return;
+ XTranslateCoordinates(DISP, mane.win, a.root, x0, y0, &x, &y,
+ &child);
+ XGetWindowAttributes(DISP, a.root, &a);
+ if (x + w <= a.x || x >= a.x + a.width || y + h <= a.y
+ || y >= a.y + a.height) return;
+ if (x < a.x) {
+ x0 += a.x - x;
+ xoff += a.x - x;
+ w -= a.x - x;
+ x = a.x;
+ }
+ if (x + w > a.x + a.width)
+ w = a.x + a.width - x;
+ if (y < a.y) {
+ y0 += a.y - y;
+ yoff += a.y - y;
+ h -= a.y - y;
+ y = a.y;
+ }
+ if (y + h > a.y + a.height)
+ h = a.y + a.height - y;
+#if 0
+ XDrawLine(DISP, mane.win, gc, x0, y0, x0 + w - 1, y0);
+ XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0, x0 + w - 1, y0 + h - 1);
+ XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0 + h - 1, x0, y0 + h - 1);
+ XDrawLine(DISP, mane.win, gc, x0, y0 + h - 1, x0, y0);
+ XDrawLine(DISP, mane.win, gc, x0, y0, x0 + w - 1, y0 + h - 1);
+ XDrawLine(DISP, mane.win, gc, x0 + w - 1, y0, x0, y0 + h - 1);
+
+ XDrawLine(DISP, mane.win, gc, expose->min_x,
+ expose->min_y, expose->max_x, expose->min_y);
+ XDrawLine(DISP, mane.win, gc, expose->max_x,
+ expose->min_y, expose->max_x, expose->max_y);
+ XDrawLine(DISP, mane.win, gc, expose->max_x,
+ expose->max_y, expose->min_x, expose->max_y);
+ XDrawLine(DISP, mane.win, gc, expose->min_x,
+ expose->max_y, expose->min_x, expose->min_y);
+ XDrawLine(DISP, mane.win, gc, expose->max_x,
+ expose->max_y, expose->min_x, expose->min_y);
+ XDrawLine(DISP, mane.win, gc, expose->min_x,
+ expose->max_y, expose->max_x, expose->min_y);
+#endif
+ }
+
+#ifdef __GNUC__
+#warning FIXME: GetImage may still produce 'BadMatch' when dragging \
+ the window around (toward outside of the desktop).
+#endif
+ scr = XGetImage(DISP, mane.win, x0, y0, w, h, AllPlanes, ZPixmap);
+
+#warning FIXME: the loops are only a quick hack and are slow.
+ for (y = 0; y < h; y++)
+ for (x = 0; x < w; x++) {
+ unsigned long pixel = 0;
+ pixel = XGetPixel(img->ximage, x + xoff, y + yoff);
+ if (pixel == img->bgpixel)
+ continue;
+ XPutPixel(scr, x, y, pixel);
+ }
+ XPutImage(DISP, mane.win, globals.gc.copy, scr, 0, 0, x0, y0, w, h);
+ XDestroyImage(scr);
+ }
+#endif
+ showtime(" Done.");
+}
+
+static void
+render_image_file(XDviImageInfo *info, int x, int y)
+{
+ XDviImage *im = NULL;
+ int w, h;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: render_image_file: pos=(%d,%d)\n", x, y);
+
+#ifdef __GNUC__
+#warning FIXME: immediate return if image not exposed.
+#endif
+
+ if (!INSIDE_MANE_WIN)
+ return;
+
+ info->angle = bbox_angle >= 0 ? bbox_angle % 360 : 360 - (-bbox_angle) % 360;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: render_image_file: angle=%d\n", info->angle);
+
+ if (resource.postscript && (im = load_image(info)) != NULL)
+ display_image(im, x, y, &globals.win_expose, globals.gc.rule);
+
+ if (im != NULL && resource.postscript == 1)
+ return;
+
+ /* Draw bbox of the image */
+ w = ROUND(DPI * info->rwi / 720.0);
+ h = ROUND(DPI * info->rhi / 720.0);
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: render_image_file: box=%dx%d+%d+%d\n",
+ w, h, x, y - h + 1);
+
+ if (!info->angle) {
+ XDrawRectangle(DISP, currwin.win, globals.gc.high, x, y - h + 1, w, h);
+ }
+ else
+ {
+#if 1
+ bbox_valid = True;
+ bbox_width = w;
+ bbox_height = bbox_voffset = h;
+ save_bbox();
+ bbox_valid = False;
+#else
+ /* code borrowed from special.c:draw_bbox() */
+ double sin_a = sin(info->angle * (TWOPI / 360));
+ double cos_a = cos(info->angle * (TWOPI / 360));
+ double a, b, c, d;
+
+ a = cos_a * (w-1);
+ b = -sin_a * (w-1);
+ c = -sin_a * (h-1);
+ d = -cos_a * (h-1);
+
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ x, y, x + ROUND(a), y + ROUND(b));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ x + ROUND(a), y + ROUND(b),
+ x + ROUND(a + c), y + ROUND(b + d));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ x + ROUND(a + c), y + ROUND(b + d),
+ x + ROUND(c), y + ROUND(d));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ x + ROUND(c), y + ROUND(d), x, y);
+#endif
+ }
+}
+
+#if !MAGICK_RENDER_PS
+static Boolean
+is_ps(char *fn)
+{
+ int l;
+ char *p;
+
+ if (strchr(fn, '`') != NULL)
+ return False;
+
+ l = strlen(fn);
+ p = fn + l - 1;
+ while (p > fn && *p != '.' && *p != '/')
+ p--;
+ l -= p - fn;
+ if (*p == '.' && ((l >= 3 && !memicmp(p, ".ps", 3)) ||
+ (l >= 4 && !memicmp(p, ".eps", 4)))) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: passing PS/EPS file to psgs.c\n");
+ return True;
+ }
+ return False;
+}
+#endif
+
+/* Process EPSF specials */
+
+static Boolean
+epsf_special(char *cp)
+{
+ char *filename;
+ unsigned filename_len;
+ char *p;
+ int n;
+ unsigned long flags = 0, u;
+ double rwi, rhi;
+ enum { LLX, LLY,
+ URX, URY,
+ RWI, RHI,
+ HSIZE, VSIZE,
+ HOFFSET, VOFFSET,
+ HSCALE, VSCALE,
+ ANGLE
+ };
+ XDviImageInfo info;
+
+ struct {
+ double val;
+ const char *key;
+ long mask;
+ } key_info[] = {
+ { 0, "llx", 0x0001 },
+ { 0, "lly", 0x0002 },
+ { 0, "urx", 0x0004 },
+ { 0, "ury", 0x0008 },
+ { 0, "rwi", 0x0010 },
+ { 0, "rhi", 0x0020 },
+ { 0, "hsize", 0x0040 },
+ { 0, "vsize", 0x0080 },
+ { 0, "hoffset", 0x0100 },
+ { 0, "voffset", 0x0200 },
+ { 0, "hscale", 0x0400 },
+ { 0, "vscale", 0x0800 },
+ { 0, "angle", 0x1000 },
+ };
+
+ memset(&info, 0, sizeof info); /* for validating memcmp(&info, ... */
+
+ filename = cp;
+ if (*cp == '\'' || *cp == '"') {
+ do
+ ++cp;
+ while (*cp != '\0' && *cp != *filename);
+ filename_len = cp - filename - 1;
+ if (*cp == *filename)
+ ++cp;
+ ++filename;
+ }
+ else {
+ while (*cp != '\0' && !isspace((int)*cp))
+ ++cp;
+ filename_len = cp - filename;
+ }
+
+ if (filename_len + 1 > MaxTextExtent) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: filename too long, passing to psgs.c\n");
+ return False;
+ }
+
+ memcpy(info.filename, filename, filename_len); /* no need to terminate because of memset(...) above */
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: epsf_special: filename = '%s'\n",
+ info.filename);
+
+#if !MAGICK_RENDER_PS
+ if (is_ps(info.filename))
+ return False;
+#endif
+
+ /* Scan for EPSF keywords */
+ while (*cp != '\0') {
+ while (isspace((int)*cp))
+ ++cp;
+ p = cp;
+ while (*p != '=' && !isspace((int)*p) && *p != '\0')
+ p++;
+ n = p - cp;
+ if (!n)
+ break;
+ if (*p == '=')
+ ++p;
+ while (isspace((int)*p))
+ ++p;
+
+ if (!memcmp(cp, "clip", n)) {
+ /* this is the only key without value */
+ info.clip = True;
+ }
+ else {
+ size_t i;
+ Boolean found = False;
+ for (i = 0; !found && i < XtNumber(key_info); i++) {
+ if (memicmp(cp, key_info[i].key, n) == 0) {
+ if (sscanf(p, "%lf", &(key_info[i].val)) == 1) {
+ flags |= key_info[i].mask;
+ while (!isspace((int)*p) && *p != '\0')
+ ++p;
+ found = True;
+ }
+ else {
+ fprintf(stderr, "Magick: invalid value for %s\n", key_info[i].key);
+ return False;
+ }
+ }
+ }
+
+ if (!found) {
+ i = *(cp + n);
+ *(cp + n) = '\0';
+ fprintf(stderr,"Magick: ignoring unknown EPSF key \"%s\".\n", cp);
+ *(cp + n) = i;
+ /* skip '=...' */
+ while (*p != '\0' && !isspace((int)*p))
+ ++p;
+ }
+ }
+ cp = p;
+ }
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: epsf_special: flags = 0x%lx\n", flags);
+
+ /* only accept the special when llx, lly, urx, ury are properly defined */
+ u = key_info[LLX].mask | key_info[LLY].mask |
+ key_info[URX].mask | key_info[URY].mask;
+ if ((flags & u) != u)
+ return False;
+
+#ifdef __GNUC__
+#warning keywords to handle: [hv]size, [hv]offset, [hv]scale, angle \
+ (ZLB: not used by the graphicx/graphics packages)
+#endif
+ if (flags & (key_info[HSIZE].mask | key_info[VSIZE].mask |
+ key_info[HOFFSET].mask | key_info[VOFFSET].mask |
+ key_info[HSCALE].mask | key_info[VSCALE].mask |
+ key_info[ANGLE].mask))
+ fprintf(stderr, "Magick: warning: EPSF keywords '[hv]size', "
+ "'[hv]offset', '[hv]scale', and 'angle' are not "
+ "implemented.\n");
+
+ info.urx = key_info[URX].val;
+ info.ury = key_info[URY].val;
+ info.llx = key_info[LLX].val;
+ info.lly = key_info[LLY].val;
+ rwi = key_info[RWI].val;
+ rhi = key_info[RHI].val;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: epsf_special: llx=%0.2f, lly=%0.2f, "
+ "urx=%0.2f, ury=%0.2f\n",
+ info.llx, info.lly, info.urx, info.ury);
+
+ if (info.urx - info.llx < 1 || info.ury - info.lly < 1)
+ return False;
+ if (info.urx - info.llx > 1e+4 || info.ury - info.lly > 1e+4)
+ return False;
+ if (fabs(info.llx) > 1e+10 || fabs(info.lly) > 1e+10)
+ return False;
+
+ if (!(flags & (key_info[RWI].mask | key_info[RHI].mask))) {
+ /* both rwi and rhi undefined */
+ rwi = 10 * (info.urx - info.llx);
+ rhi = 10 * (info.ury - info.lly);
+ }
+ else if (!(flags & key_info[RWI].mask)) {
+ /* rwi undefined, rhi defined */
+ rwi = rhi * (info.urx - info.llx) / (info.ury - info.lly);
+ }
+ else if (!(flags & key_info[RHI].mask)) {
+ /* rhi undefined, rwi defined */
+ rhi = rwi * (info.ury - info.lly) / (info.urx - info.llx);
+ }
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: epsf_special: rwi=%f, rhi=%f\n", rwi, rhi);
+
+ if (rwi < 1 || rhi < 1)
+ return False;
+
+ /* We don't want IM to process large images (>16MB) */
+ if (DPI * rwi / 720 * DPI * rhi / 720 * G_depth / 8 / 1024 / 1024 > 16) {
+ p = filename + (n = filename_len);
+ if ((n >= 3 && !memicmp(p - 3, ".ps", 3)) ||
+ (n >= 4 && !memicmp(p - 4, ".eps", 4))) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: image too large, passing to psgs.c\n");
+ return False;
+ }
+ else {
+ /* don't pass non-PS files to psgs.c */
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: image too large, ignored.\n");
+ return True;
+ }
+ }
+
+ info.rwi = ROUND(rwi);
+ info.rhi = ROUND(rhi);
+
+ render_image_file(&info, PXL_H - currwin.base_x, PXL_V - currwin.base_y);
+
+ return True;
+}
+
+static char *
+emgraph_get_dimen(char *cp, double *v)
+{
+ char *p;
+ typedef struct {
+ int name_len;
+ char *name;
+ double factor;
+ } Unit;
+ Unit *u;
+ /* table for converting an arbitrary unit to bp */
+#define UNIT(u) sizeof(u)-1, u
+ static Unit units[] = {
+ { UNIT("bp"), 1.0 },
+ { UNIT("in"), 72.0 },
+ { UNIT("cm"), 72.0 / 2.54 },
+ { UNIT("mm"), 72.0 / 2.54 * 0.1 },
+ { UNIT("pt"), 72.0 / 72.27 },
+ { UNIT("sp"), 72.0 / 72.27 / 65536.0 },
+ { UNIT("pc"), 12.0 * 72.0 / 72.27 },
+ { UNIT("dd"), 1238.0 / 1157.0 * 72.0 / 72.27 },
+ { UNIT("cc"), 12.0 * 1238.0 / 1157.0 * 72.0 / 72.27 }
+ };
+
+ *v = strtod(cp, &p);
+ if (p == NULL) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: can't get dimension, image ignored.\n");
+ return NULL;
+ }
+
+ while (isspace((int)*p))
+ ++p;
+ for (u = units; u < units + XtNumber(units); u++)
+ if (!memicmp(p, u->name, u->name_len))
+ break;
+ if (u >= units + XtNumber(units)) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: unknown unit, image ignored.\n");
+ return NULL;
+ }
+ *v *= u->factor;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: unit=%s, len=%d, factor=%0.4f, value=%0.4f\n",
+ u->name, u->name_len, u->factor, *v);
+
+ if (*v < 0.01 || *v > 10000) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: invalid dimension, image ignored.\n");
+ return NULL;
+ }
+
+ return p + u->name_len;
+}
+
+static Boolean
+emgraph_special(char *cp)
+{
+ char *p;
+ double w, h;
+ XDviImageInfo info;
+
+ memset(&info, 0, sizeof info);
+
+ /* get filename */
+ while (isspace((int)*cp))
+ ++cp;
+ p = cp;
+ while (!isspace((int)*p) && *p != '\0' && *p != ',')
+ ++p;
+ if ((unsigned)(p - cp) >= sizeof info.filename) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: filename too long, image ignored.\n");
+ return False;
+ }
+ if (p <= cp) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: empty filename, image ignored.\n");
+ return False;
+ }
+ memcpy(info.filename, cp, p - cp); /* no need to terminate because of memset(...) above */
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: emgraph_special: filename = '%s'\n",
+ info.filename);
+
+#if !MAGICK_RENDER_PS
+ if (is_ps(info.filename))
+ return False;
+#endif
+
+ cp = p;
+
+ /* get width */
+ if ((cp = strchr(cp, ',')) == NULL) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: width undefined, image ignored.\n");
+ return False;
+ }
+ if ((cp = emgraph_get_dimen(++cp, &w)) == NULL)
+ return False;
+
+ /* get height */
+ if ((cp = strchr(cp, ',')) == NULL) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: height undefined, image ignored.\n");
+ return False;
+ }
+ if ((cp = emgraph_get_dimen(++cp, &h)) == NULL)
+ return False;
+
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: filename=\"%s\", width=%0.2f, height=%0.2f\n",
+ info.filename, w, h);
+
+ info.llx = info.lly = 0;
+ info.urx = w;
+ info.ury = h;
+ info.rwi = ROUND(10 * w);
+ info.rhi = ROUND(10 * h);
+
+ if (info.rwi < 1 || info.rhi < 1)
+ return False;
+
+ render_image_file(&info, PXL_H - currwin.base_x,
+ PXL_V - currwin.base_y + ROUND(h / 72 * DPI) - 1);
+
+ return True;
+}
+
+/* Filter specials. Returns True if the special has been processed
+ * by ImageMagick, False otherwise. */
+Boolean
+Magick_parse_special(char *cp)
+{
+ switch (*cp) {
+ case 'p':
+ case 'P':
+ if (!memicmp(cp, "psfile", 6)) {
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: parsing string |%s|\n", cp);
+ cp += 6;
+ while (isspace((int)*cp))
+ ++cp;
+ if (*cp != '=')
+ return False;
+ do
+ ++cp;
+ while (isspace((int)*cp));
+ return epsf_special(cp);
+ }
+ break;
+ case 'e':
+ case 'E':
+ if (!memicmp(cp, "em:", 3)) {
+ cp += 3;
+ while (isspace((int)*cp))
+ ++cp;
+ if (memicmp(cp, "graph", 5))
+ return False;
+ cp += 5;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Magick: parsing string |em:graph %s|\n", cp);
+ return emgraph_special(cp);
+ }
+ break;
+ }
+
+ return False;
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* MAGICK */
diff --git a/Build/source/texk/xdvik/image-magick.h b/Build/source/texk/xdvik/image-magick.h
new file mode 100644
index 00000000000..bad1aa0ad11
--- /dev/null
+++ b/Build/source/texk/xdvik/image-magick.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef IMAGE_MAGICK_H_
+#define IMAGE_MAGICK_H_
+
+#include "xdvi.h"
+
+#ifdef MAGICK
+extern Boolean Magick_parse_special(char *cp);
+#endif /* MAGICK */
+
+#endif /* IMAGE_MAGICK_H_ */
+
diff --git a/Build/source/texk/xdvik/m4/xdvi-c-bitmap-type.m4 b/Build/source/texk/xdvik/m4/xdvi-c-bitmap-type.m4
new file mode 100644
index 00000000000..5a6b372fc26
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-c-bitmap-type.m4
@@ -0,0 +1,34 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 1999 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_C_BITMAP_TYPE
+# ------------------
+# Determine integer type to use for bitmaps.
+# Uses AC_CHECK_SIZEOF(TYPE) and thus works when cross compiling.
+AC_DEFUN([XDVI_C_BITMAP_TYPE],
+[AC_CHECK_SIZEOF([unsigned long])[]dnl
+ AC_CHECK_SIZEOF([unsigned int])[]dnl
+ AC_CHECK_SIZEOF([unsigned short])[]dnl
+ AC_CHECK_SIZEOF([unsigned char])[]dnl
+AC_MSG_CHECKING([for integer type to use in bitmaps])
+AC_CACHE_VAL([xdvi_cv_bitmap_type],
+[AS_IF([(test $ac_cv_sizeof_unsigned_long = 4 || test $ac_cv_sizeof_unsigned_long = 2) \
+ && test $ac_cv_sizeof_unsigned_long != $ac_cv_sizeof_unsigned_int],
+ [xdvi_cv_bitmap_type="BMTYPE=long BMBYTES=$ac_cv_sizeof_unsigned_long"],
+ [test $ac_cv_sizeof_unsigned_int = 4 || test $ac_cv_sizeof_unsigned_int = 2],
+ [xdvi_cv_bitmap_type="BMTYPE=int BMBYTES=$ac_cv_sizeof_unsigned_int"],
+ [test $ac_cv_sizeof_unsigned_short = 4 || test $ac_cv_sizeof_unsigned_short = 2],
+ [xdvi_cv_bitmap_type="BMTYPE=short BMBYTES=$ac_cv_sizeof_unsigned_short"],
+ [xdvi_cv_bitmap_type="BMTYPE=char BMBYTES=$ac_cv_sizeof_unsigned_cher"])])
+eval "$xdvi_cv_bitmap_type"
+AC_DEFINE_UNQUOTED([BMTYPE], [$BMTYPE],
+ [Define to determine the integer type to be used in bitmaps.
+ The type used will be "unsigned BMTYPE".])
+AC_DEFINE_UNQUOTED([BMBYTES], [$BMBYTES], [Define to the length (in bytes) of type BMTYPE.])
+AC_MSG_RESULT([unsigned $BMTYPE, size = $BMBYTES])
+]) # XDVI_C_BITMAP_TYPE
diff --git a/Build/source/texk/xdvik/m4/xdvi-check-iconv.m4 b/Build/source/texk/xdvik/m4/xdvi-check-iconv.m4
new file mode 100644
index 00000000000..2fab0052c72
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-check-iconv.m4
@@ -0,0 +1,116 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2004-2009 Stefan Ulrich <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009-2013 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_CHECK_ICONV
+# ----------------
+# Check for <iconv.h>, iconv(), and for type of iconv() input argument.
+AC_DEFUN([XDVI_CHECK_ICONV], [dnl
+AC_ARG_WITH([iconv],
+ AS_HELP_STRING([--with-iconv],
+ [Use an iconv library @<:@default=check@:>@]),
+ [],
+ [with_iconv=check])[]dnl
+dnl
+AC_ARG_WITH([iconv-include],
+ AS_HELP_STRING([--with-iconv-include=DIR],
+ [Specify the location of <iconv.h> header]))[]dnl
+AC_ARG_WITH([iconv-libdir],
+ AS_HELP_STRING([--with-iconv-libdir=DIR],
+ [Specify the location of iconv (-liconv or -lrecode) library]))[]dnl
+AS_CASE([$with_iconv_include],
+ [yes | no | ""], [iconv_includes=],
+ [iconv_includes="-I$with_iconv_include"])
+AS_CASE([$with_iconv_libdir],
+ [yes | no | ""], [iconv_libpath=],
+ [iconv_libpath="-L$with_iconv_libdir"])
+dnl
+AS_IF([test "x$with_iconv" != xno], [dnl
+ xdvi_iconv_save_CPPFLAGS=$CPPFLAGS
+ AC_CHECK_HEADERS([iconv.h], [dnl
+ # Check if -liconv or -lrecode is needed for iconv()
+ _XDVI_ICONV_LIB
+ if test "x$xdvi_cv_search_iconv" != xno; then
+ if test "x$xdvi_cv_search_iconv" = "xnone required"; then
+ iconv_libs=
+ else
+ iconv_libs=$xdvi_cv_search_iconv
+ fi
+ AC_DEFINE([HAVE_ICONV], 1,
+ [Define to 1 if you have the `iconv' function.])
+ _XDVI_ICONV_CHAR_PPTR_TYPE
+ fi], [], [AC_INCLUDES_DEFAULT])
+ CPPFLAGS=$xdvi_iconv_save_CPPFLAGS
+])[]dnl
+AC_SUBST([iconv_includes])
+AC_SUBST([iconv_libpath])
+AC_SUBST([iconv_libs])
+]) # XDVI_CHECK_ICONV
+
+# _XDVI_ICONV_LIB
+# ---------------
+# Check for library containing iconv(), could be -liconv or -lrecode.
+# Much like AC_SEARCH_LIBS([iconv], [iconv recode]),
+# but needs to '#include <iconv.h>'.
+m4_define([_XDVI_ICONV_LIB], [dnl
+AC_CACHE_CHECK([for library containing iconv],
+ [xdvi_cv_search_iconv], [dnl
+xdvi_iconv_save_LDFLAGS=$LDFLAGS
+xdvi_iconv_save_LIBS=$LIBS
+LDFLAGS="$iconv_libpath $LDFLAGS"
+AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include <stdlib.h>
+#include <iconv.h>]],
+ [[iconv_t cd = iconv_open("","");]])])
+xdvi_cv_search_iconv=no
+for xdvi_lib in "" -liconv -lrecode; do
+ LIBS="$xdvi_lib $xdvi_iconv_save_LIBS"
+ AC_LINK_IFELSE([],
+ [xdvi_cv_search_iconv=$xdvi_lib
+ break])
+done
+test "x$xdvi_cv_search_iconv" = x && xdvi_cv_search_iconv="none required"
+LDFLAGS=$xdvi_iconv_save_LDFLAGS
+LIBS=$xdvi_iconv_save_LIBS])
+]) # _XDVI_ICONV_LIB
+
+# _XDVI_ICONV_CHAR_PPTR_TYPE
+# --------------------------
+# Check whether iconv takes a 'const char **' or a 'char **' input argument.
+# According to IEEE 1003.1, `char **' is correct, but e.g. librecode
+# uses `const char **'.
+# Inspired by Autoconf's AC_FUNC_SELECT_ARGTYPES we do this without the need
+# to run a test program or to use C++.
+m4_define([_XDVI_ICONV_CHAR_PPTR_TYPE], [dnl
+AC_CACHE_CHECK([for iconv input type],
+ [xdvi_cv_iconv_char_pptr_type],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+/* iconv() definitions may differ depending on following macros ... */
+#ifdef __hpux
+/* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED
+ * leads to poll() not realizing that a file descriptor is writable in psgs.c.
+ */
+# define _HPUX_SOURCE 1
+#else
+# ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 600
+# endif
+# define _XOPEN_SOURCE_EXTENDED 1
+# define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */
+# define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */
+# define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */
+#endif
+
+#include <iconv.h>
+ ]],
+ [[extern size_t iconv(iconv_t, char **, size_t *, char**, size_t*);]])],
+ [xdvi_cv_iconv_char_pptr_type='char **'],
+ [xdvi_cv_iconv_char_pptr_type='const char **'])])
+AC_DEFINE_UNQUOTED([ICONV_CHAR_PPTR_TYPE], [$xdvi_cv_iconv_char_pptr_type],
+ [Define the type of the iconv input string (char ** or const char **)])
+]) # _XDVI_ICONV_CHAR_PPTR_TYPE
diff --git a/Build/source/texk/xdvik/m4/xdvi-check-langinfo.m4 b/Build/source/texk/xdvik/m4/xdvi-check-langinfo.m4
new file mode 100644
index 00000000000..d366f8a368b
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-check-langinfo.m4
@@ -0,0 +1,27 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2004 - 2009 Stefan Ulrich <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_CHECK_LANGINFO
+# -------------------
+# Check for nl_langinfo(), <langinfo.h>, and if nl_langinfo(CODESET)
+# is working.
+AC_DEFUN([XDVI_CHECK_LANGINFO],
+[AC_CHECK_FUNCS([nl_langinfo])
+AC_CHECK_HEADERS([langinfo.h])
+if test "x$ac_cv_func_nl_langinfo:$ac_cv_header_langinfo_h" = xyes:yes; then
+ AC_CACHE_CHECK([if nl_langinfo(CODESET) is working],
+ [xdvi_cv_nl_langinfo_codeset],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]],
+ [[char* cs = nl_langinfo(CODESET);]])],
+ [xdvi_cv_nl_langinfo_codeset=yes],
+ [xdvi_cv_nl_langinfo_codeset=no])])
+ AS_IF([test "x$xdvi_cv_nl_langinfo_codeset" = xyes],
+ [AC_DEFINE([HAVE_WORKING_NL_LANGINFO_CODESET], 1,
+ [Define if the CODESET argument to nl_langinfo works.])])
+fi
+]) # XDVI_CHECK_LANGINFO
diff --git a/Build/source/texk/xdvik/m4/xdvi-check-xaw.m4 b/Build/source/texk/xdvik/m4/xdvi-check-xaw.m4
new file mode 100644
index 00000000000..6f7301c6340
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-check-xaw.m4
@@ -0,0 +1,80 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2003 - 2009 Stefan Ulrich <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_CHECK_XAW_HEADERS
+# ----------------------
+# Check for Xaw headers and library version.
+AC_DEFUN([XDVI_CHECK_XAW_HEADERS],
+[save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_CACHE_CHECK([for Xaw headers],
+ [xdvi_cv_xaw_headers],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xaw/Form.h>]])],
+ [xdvi_cv_xaw_headers=yes],
+ [xdvi_cv_xaw_headers=no])])
+xdvi_have_xaw=$xdvi_cv_xaw_headers
+#
+if test "x$xdvi_have_xaw" = xyes; then
+ _XDVI_CHECK_XAW_VERSION
+fi
+CPPFLAGS=$save_CPPFLAGS
+]) # XDVI_CHECK_XAW_HEADERS
+
+# _XDVI_CHECK_XAW_VERSION
+# -----------------------
+# Check Xaw version.
+m4_define([_XDVI_CHECK_XAW_VERSION],
+[AC_CHECK_MEMBER([SimpleClassPart.extension],
+ [],
+ [AC_DEFINE([HAVE_OLD_XAW], 1,
+ [Define if you have an old version of the Xaw library])],
+ [[
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xaw/SimpleP.h>]])
+]) # _XDVI_CHECK_XAW_VERSION
+
+# XDVI_CHECK_XAW_LIBRARY
+# ----------------------
+# Check for Xaw library.
+# If found, set prog_extension and x_tool_libs, and define XAW.
+AC_DEFUN([XDVI_CHECK_XAW_LIBRARY],
+[AC_REQUIRE([XDVI_CHECK_XAW_HEADERS])
+if test "x$xdvi_have_xaw" = xyes; then
+ # First try without libXp
+ AC_CHECK_LIB([Xaw], [XawInitializeWidgetSet],
+ [x_tool_libs="-lXaw"],
+ [# libXaw without libXp failed
+ if test "x$x_xp_lib" = x; then
+ xdvi_have_xaw=no
+ else
+ # Now try with libXp
+ AC_CHECK_LIB([Xaw], [XawTextReplace],
+ [x_tool_libs="-lXaw $x_xp_lib"],
+ [xdvi_have_xaw=no],
+ [$x_xp_lib $x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG])
+ fi],
+ [$x_xmu_lib -lXt $X_PRE_LIBS $x_ext_lib $x_xpm_libs -lX11 $X_EXTRA_LIBS $XLFLAG])
+fi
+if test "x$xdvi_have_xaw" = xyes; then
+ prog_extension="xaw"
+ AC_DEFINE([XAW], 1, [Define to use the Xaw toolkit.])
+else
+ AC_MSG_ERROR([Sorry, you will need at least the Xaw header/library files to compile xdvik.])
+fi
+]) # XDVI_CHECK_XAW_LIBRARY
diff --git a/Build/source/texk/xdvik/m4/xdvi-find-motif.m4 b/Build/source/texk/xdvik/m4/xdvi-find-motif.m4
new file mode 100644
index 00000000000..09f8091ce4b
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-find-motif.m4
@@ -0,0 +1,288 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2001 - 2009 Marcin Dalecki <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FIND_MOTIF
+# ---------------
+# Check for Motif libraries and headers.
+# Put Motif include directory in motif_include,
+# put Motif library directory in motif_libdir,
+# and add appropriate flags to X_CFLAGS and X_LIBS.
+# If default_toolkit is not `none', use Xaw as toolkit if Motif isn't found.
+AC_DEFUN([XDVI_FIND_MOTIF],
+[AC_REQUIRE([AC_PATH_XTRA])
+AC_ARG_WITH([motif-include],
+ AS_HELP_STRING([--with-motif-include=DIR],
+ [Specify the location of Motif include files]),
+ [motif_include=$withval], [motif_include=])[]dnl
+AC_ARG_WITH([motif-libdir],
+ AS_HELP_STRING([--with-motif-libdir=DIR],
+ [Specify the location of Motif libraries]),
+ [motif_libdir=$withval], [motif_libdir=])[]dnl
+AC_MSG_CHECKING([for Motif])
+#
+# Search the include files.
+#
+if test "x$motif_include" = x; then
+ _XDVI_FIND_MOTIF_INCLUDES
+fi
+#
+# Add Motif definition to X_CFLAGS (and remember previous value)
+#
+xdvi_motif_save_X_CFLAGS=$X_CFLAGS
+if test "x$motif_include" != xdefault \
+ && test "x$motif_include" != "x$x_includes" && test "x$motif_include" != xno
+then
+ X_CFLAGS="-I$motif_include $X_CFLAGS"
+fi
+#
+# Now for the libraries.
+#
+if test "x$motif_libdir" = x; then
+ _XDVI_FIND_MOTIF_LIBRARIES
+fi
+#
+# Report the results of headers and libraries.
+#
+xdvi_have_motif=yes
+#
+motif_libdir_result=$motif_libdir
+if test "x$motif_libdir_result" = xdefault; then
+ motif_libdir_result="in default path"
+elif test "x$motif_libdir_result" = xno; then
+ motif_libdir_result="(none)"
+ xdvi_have_motif=no
+fi
+#
+motif_include_result=$motif_include
+if test "x$motif_include_result" = xdefault; then
+ motif_include_result="in default path"
+elif test "x$motif_include_result" = xno; then
+ motif_include_result="(none)"
+ xdvi_have_motif=no
+fi
+#
+AC_MSG_RESULT([libraries $motif_libdir_result, headers $motif_include_result])
+#
+if test "x$xdvi_have_motif" = xyes; then
+ #
+ # Add Motif definition to X_LIBS
+ #
+ if test "x$motif_libdir" != xdefault \
+ && test "x$motif_libdir" != "x$x_libraries" && test "x$motif_libdir" != no
+ then
+ case "$X_LIBS" in
+ *-R\ *) X_LIBS="-L$motif_libdir -R $motif_libdir $X_LIBS";;
+ *-R*) X_LIBS="-L$motif_libdir -R$motif_libdir $X_LIBS";;
+ *) X_LIBS="-L$motif_libdir $X_LIBS";;
+ esac
+ fi
+ #
+ prog_extension="motif"
+ AC_DEFINE([MOTIF], 1, [Define to use the Motif toolkit.])
+ x_tool_libs="-lXm"
+ if test "x$x_xp_lib" != x; then
+ # check if libXm requires libXp
+ _XDVI_CHECK_MOTIF_XP
+ fi
+ # now warn if we're using LessTif (see LESSTIF-BUGS for why ...)
+ _XDVI_CHECK_LESSTIF
+ # Check whether to compile for Motif with Xaw Panner.
+ _XDVI_CHECK_PANNER
+elif test "x$default_toolkit" = xnone; then
+ AC_MSG_ERROR([No Motif.])
+else
+ # Restore previous X_CFLAGS
+ X_CFLAGS=$xdvi_motif_save_X_CFLAGS
+ AC_MSG_NOTICE([No Motif, using Xaw.])
+ with_xdvi_x_toolkit="xaw"
+fi
+
+]) # XDVI_FIND_MOTIF
+
+# _XDVI_FIND_MOTIF_INCLUDES
+# -------------------------
+# Search the Xm include files.
+m4_define([_XDVI_FIND_MOTIF_INCLUDES],
+[AC_CACHE_VAL([xdvi_cv_motif_include],
+[xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+#
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+#
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <Xm/Xm.h>]],
+ [[int a;]])],
+ [# Xm/Xm.h is in the standard search path.
+ xdvi_cv_motif_include=default],
+ [# Xm/Xm.h is not in the standard search path.
+ xdvi_cv_motif_include=no
+# Locate it and put its directory in `motif_include'
+#
+# /usr/include/Motif* are used on HP-UX (Motif).
+# /usr/include/X11* are used on HP-UX (X and Athena).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Athena).
+# Other directories are just guesses.
+for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \
+ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \
+ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \
+ /usr/dt/include /usr/openwin/include \
+ /usr/dt/*/include /opt/*/include /usr/include/Motif* \
+ "${prefix}"/*/include /usr/*/include /usr/local/*/include \
+ "${prefix}"/include/* /usr/include/* /usr/local/include/*; do
+ if test -f "$dir/Xm/Xm.h"; then
+ xdvi_cv_motif_include=$dir
+ break
+ fi
+done])
+#
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS])
+motif_include=$xdvi_cv_motif_include
+]) # _XDVI_FIND_MOTIF_INCLUDES
+
+# _XDVI_FIND_MOTIF_LIBRARIES
+# --------------------------
+# Search the Xm library.
+m4_define([_XDVI_FIND_MOTIF_LIBRARIES],
+[AC_CACHE_VAL([xdvi_cv_motif_libdir],
+[xdvi_motif_save_LIBS=$LIBS
+xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+xdvi_motif_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXm $x_xp_lib -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>]],
+ [[XtToolkitInitialize();]])],
+ [# libXm.a is in the standard search path.
+ xdvi_cv_motif_libdir=default],
+ [# libXm.a is not in the standard search path.
+ xdvi_cv_motif_libdir=no
+# Locate it and put its directory in `motif_libdir'
+#
+# /usr/lib/Motif* are used on HP-UX (Motif).
+# /usr/lib/X11* are used on HP-UX (X and Athena).
+# /usr/dt is used on Solaris (Motif).
+# /usr/lesstif is used on Linux (Lesstif).
+# /usr/openwin is used on Solaris (X and Athena).
+# Other directories are just guesses.
+for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \
+ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \
+ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \
+ /usr/dt/lib /usr/openwin/lib \
+ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \
+ /usr/lesstif*/lib /usr/lib/Lesstif* \
+ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \
+ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*; do
+ if test -d "$dir" && test "`ls $dir/libXm.* 2> /dev/null`" != ""; then
+ xdvi_cv_motif_libdir=$dir
+ break
+ fi
+done])
+#
+LIBS=$xdvi_motif_save_LIBS
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS
+LDFLAGS=$xdvi_motif_save_LDFLAGS])
+#
+motif_libdir="$xdvi_cv_motif_libdir"
+]) # _XDVI_FIND_MOTIF_LIBRARIES
+
+# _XDVI_CHECK_MOTIF_XP
+# --------------------
+# Check if libXm (explicitly) requires libXp
+m4_define([_XDVI_CHECK_MOTIF_XP],
+[AC_CACHE_CHECK([if libXm requires libXp],
+ [xdvi_cv_motif_xp],
+[xdvi_motif_save_LIBS=$LIBS
+xdvi_motif_save_CFLAGS=$CFLAGS
+xdvi_motif_save_CPPFLAGS=$CPPFLAGS
+xdvi_motif_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXm -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>]],
+ [[XtToolkitInitialize();]])],
+ [xdvi_cv_motif_xp=no],
+ [xdvi_cv_motif_xp=yes])
+#
+LIBS=$xdvi_motif_save_LIBS
+CFLAGS=$xdvi_motif_save_CFLAGS
+CPPFLAGS=$xdvi_motif_save_CPPFLAGS
+LDFLAGS=$xdvi_motif_save_LDFLAGS])
+if test "x$xdvi_cv_motif_xp" = xyes; then
+ x_tool_libs="$x_tool_libs $x_xp_lib"
+fi
+]) # _XDVI_CHECK_MOTIF_XP
+
+# _XDVI_CHECK_LESSTIF
+# -------------------
+# Check if using LessTif and warn if so.
+m4_define([_XDVI_CHECK_LESSTIF],
+[AC_CACHE_CHECK([for LessTif],
+ [xdvi_cv_using_lesstif],
+[save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Intrinsic.h>
+#include <Xm/Xm.h>]],
+ [[const char *p = LesstifVERSION_STRING;]])],
+ [xdvi_cv_using_lesstif=yes],
+ [xdvi_cv_using_lesstif=no])
+CPPFLAGS=$save_CPPFLAGS])
+if test "x$xdvi_cv_using_lesstif" = xyes; then
+ AC_MSG_WARN([LessTif header detected.
+ *****************************************************************
+ * Warning: You are using LessTif instead of OpenMotif. *
+ * Some GUI elements might be broken; please see the file *
+ * *
+ * texk/xdvik/LESSTIF-BUGS *
+ * *
+ * for more information. *
+ *****************************************************************])
+fi
+]) # _XDVI_CHECK_LESSTIF
+
+# _XDVI_CHECK_PANNER
+# ------------------
+# Check whether to compile for Motif with Xaw Panner.
+m4_define([_XDVI_CHECK_PANNER],
+[AC_CACHE_CHECK([whether to compile in panner (requires Xaw)],
+ [xdvi_cv_use_xaw_panner],
+[save_CPPFLAGS=$CPPFLAGS
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xaw/Reports.h>]])],
+ [xdvi_cv_use_xaw_panner=yes],
+ [xdvi_cv_use_xaw_panner=no])
+CPPFLAGS=$save_CPPFLAGS])
+if test "x$xdvi_cv_use_xaw_panner" = xyes; then
+ AC_DEFINE([USE_XAW_PANNER], 1, [Define to use Xaw panner.])
+fi
+]) # _XDVI_CHECK_PANNER
diff --git a/Build/source/texk/xdvik/m4/xdvi-find-xpm.m4 b/Build/source/texk/xdvik/m4/xdvi-find-xpm.m4
new file mode 100644
index 00000000000..6b89c0c89f2
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-find-xpm.m4
@@ -0,0 +1,214 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2001 - 2009 Marcin Dalecki <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FIND_XPM
+# -------------
+# Put Xpm include directory in xpm_includes,
+# put Xpm library directory in xpm_libraries,
+# define x_xpm_libs,
+# and add appropriate flags to X_CFLAGS and X_LIBS.
+AC_DEFUN([XDVI_FIND_XPM],
+[AC_REQUIRE([AC_PATH_XTRA])
+AC_ARG_WITH([xpm],
+ AS_HELP_STRING([--without-xpm],
+ [Do not use the Xpm library (will disable the toolbar)]))[]dnl
+AC_ARG_WITH([xpm-includes],
+ AS_HELP_STRING([--with-xpm-include=DIR],
+ [Specify the location of Xpm include files]),
+ [xpm_includes=$withval], [xpm_includes=])[]dnl
+AC_ARG_WITH([xpm-libraries],
+ AS_HELP_STRING([--with-xpm-libdir=DIR],
+ [Specify the location of Xpm libraries]),
+ [xpm_libraries=$withval], [xpm_libraries=])[]dnl
+dnl Treat --without-xpm like
+dnl --without-xpm-includes --without-xpm-libraries.
+if test "x$with_xpm" = xno; then
+ xpm_includes=no
+ xpm_libraries=no
+fi
+AC_MSG_CHECKING([for Xpm])
+#
+# Check the headers.
+#
+if test "x$xpm_includes" = x; then
+ _XDVI_FIND_XPM_INCLUDES
+fi
+if test "x$xpm_includes" = xdefault; then
+ AC_DEFINE([HAVE_X11_XPM_H], 1, [Define if you have the <X11/xpm.h> header file.])
+elif test -f "$xpm_includes/X11/xpm.h"; then
+ AC_DEFINE([HAVE_X11_XPM_H], 1)
+elif test -f "$xpm_includes/xpm.h"; then
+ AC_DEFINE([HAVE_XPM_H], 1,
+ [Define if you have the <xpm.h> header file (not in X11, e.g. Solaris 5.8).])
+fi
+#
+# Add Xpm definition to X_CFLAGS (and remember previous value)
+#
+xdvi_xpm_save_X_CFLAGS=$X_CFLAGS
+if test "x$xpm_includes" != xdefault \
+ && test "x$xpm_includes" != "x$x_includes" && test "x$xpm_includes" != xno
+then
+ X_CFLAGS="-I$xpm_includes $X_CFLAGS"
+fi
+#
+# Check the libraries.
+#
+if test "x$xpm_libraries" = x; then
+ _XDVI_FIND_XPM_LIBRARIES
+fi
+#
+# Report the results of headers and libraries.
+#
+xdvi_use_xpm=yes
+#
+#
+xpm_libraries_result=$xpm_libraries
+if test "x$xpm_libraries_result" = xdefault; then
+ xpm_libraries_result="in default path"
+elif test "x$xpm_libraries_result" = xno; then
+ xpm_libraries_result="(none)"
+ xdvi_use_xpm=no
+fi
+#
+xpm_includes_result=$xpm_includes
+if test "x$xpm_includes_result" = xdefault; then
+ xpm_includes_result="in default path"
+elif test "x$xpm_includes_result" = xno; then
+ xpm_includes_result="(none)"
+ xdvi_use_xpm=no
+fi
+#
+AC_MSG_RESULT([libraries $xpm_libraries_result, headers $xpm_includes_result])
+#
+if test "x$xdvi_use_xpm" = xyes; then
+ #
+ # Add Xpm definition to X_LIBS
+ #
+ if test "x$xpm_libraries" != xdefault \
+ && test "x$xpm_libraries" != "x$x_libraries" && test "x$xpm_libraries" != xno
+ then
+ case "$X_LIBS" in
+ *-R\ *) X_LIBS="-L$xpm_libraries -R $xpm_libraries $X_LIBS";;
+ *-R*) X_LIBS="-L$xpm_libraries -R$xpm_libraries $X_LIBS";;
+ *) X_LIBS="-L$xpm_libraries $X_LIBS";;
+ esac
+ fi
+ #
+ AC_DEFINE([USE_XPM], 1, [Define if you want to use the Xpm library])
+ x_xpm_libs="-lXpm"
+else
+ # Restore previous X_CFLAGS
+ X_CFLAGS=$xdvi_xpm_save_X_CFLAGS
+ AC_DEFINE([USE_XPM], 0)
+ x_xpm_libs=
+fi
+AC_SUBST([x_xpm_libs])
+]) # XDVI_FIND_XPM
+
+# _XDVI_FIND_XPM_INCLUDES
+# -----------------------
+# Search the Xpm include files.
+# They can either be in <X11/xpm.h> (as in X11R6), which is dealt with
+# by AC_CHECK_HEADERS([X11/xpm.h]),
+# or in <xpm.h> if installed locally; this is what this test is for.
+m4_define([_XDVI_FIND_XPM_INCLUDES],
+[AC_CACHE_VAL([xdvi_cv_xpm_includes],
+[xdvi_xpm_save_CFLAGS=$CFLAGS
+xdvi_xpm_save_CPPFLAGS=$CPPFLAGS
+#
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+#
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <X11/xpm.h>]],
+ [[int a;]])],
+ [# X11/xpm.h is in the standard search path.
+ xdvi_cv_xpm_includes=default],
+ [# X11/xpm.h is not in the standard search path.
+ xdvi_cv_xpm_includes=no
+# Locate it and put its directory in `xpm_includes'
+#
+# /usr/include/Motif* are used on HP-UX (Motif).
+# /usr/include/X11* are used on HP-UX (X and Xaw).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Xaw).
+# Other directories are just guesses.
+for dir in "$x_includes" "${prefix}/include" /usr/include /usr/local/include \
+ /usr/X11/include /usr/X11R5/include /usr/X11R6/include \
+ /usr/include/Motif2.0 /usr/include/Motif1.2 /usr/include/Motif1.1 \
+ /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 \
+ /usr/dt/include /usr/openwin/include \
+ /usr/dt/*/include /opt/*/include /usr/include/Motif* \
+ "${prefix}"/*/include /usr/*/include /usr/local/*/include \
+ "${prefix}"/include/* /usr/include/* /usr/local/include/*
+do
+ if test -f "$dir/X11/xpm.h"; then
+ xdvi_cv_xpm_includes=$dir
+ break
+ elif test -f "$dir/xpm.h"; then
+ xdvi_cv_xpm_includes=$dir
+ break
+ fi
+done])
+#
+CFLAGS=$xdvi_xpm_save_CFLAGS
+CPPFLAGS=$xdvi_xpm_save_CPPFLAGS])
+#
+xpm_includes=$xdvi_cv_xpm_includes
+]) # _XDVI_FIND_XPM_INCLUDES
+
+# _XDVI_FIND_XPM_LIBRARIES
+# ------------------------
+# Search the Xpm library.
+m4_define([_XDVI_FIND_XPM_LIBRARIES],
+[AC_CACHE_VAL([xdvi_cv_xpm_libraries],
+[xdvi_xpm_save_LIBS=$LIBS
+xdvi_xpm_save_CFLAGS=$CFLAGS
+xdvi_xpm_save_CPPFLAGS=$CPPFLAGS
+xdvi_xpm_save_LDFLAGS=$LDFLAGS
+#
+LIBS="$X_PRE_LIBS -lXpm -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+#
+# We use XtToolkitInitialize() here since it takes no arguments
+# and thus also works with a C++ compiler.
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <X11/Intrinsic.h>
+#include <X11/xpm.h>]],
+ [[XtToolkitInitialize();]])],
+ [# libxpm.a is in the standard search path.
+ xdvi_cv_xpm_libraries=default],
+ [# libXpm.a is not in the standard search path.
+ xdvi_cv_xpm_libraries=no
+# Locate it and put its directory in `xpm_libraries'
+#
+# /usr/lib/Motif* are used on HP-UX (Motif).
+# /usr/lib/X11* are used on HP-UX (X and Xpm).
+# /usr/dt is used on Solaris (Motif).
+# /usr/openwin is used on Solaris (X and Xpm).
+# Other directories are just guesses.
+for dir in "$x_libraries" "${prefix}/lib" /usr/lib /usr/local/lib \
+ /usr/lib/Motif2.0 /usr/lib/Motif1.2 /usr/lib/Motif1.1 \
+ /usr/lib/X11R6 /usr/lib/X11R5 /usr/lib/X11R4 /usr/lib/X11 \
+ /usr/dt/lib /usr/openwin/lib \
+ /usr/dt/*/lib /opt/*/lib /usr/lib/Motif* \
+ "${prefix}"/*/lib /usr/*/lib /usr/local/*/lib \
+ "${prefix}"/lib/* /usr/lib/* /usr/local/lib/*
+do
+ if test -d "$dir" && test "`ls $dir/libXpm.* 2> /dev/null`" != ""; then
+ xdvi_cv_xpm_libraries=$dir
+ break
+ fi
+done])
+#
+LIBS=$xdvi_xpm_save_LIBS
+CFLAGS=$xdvi_xpm_save_CFLAGS
+CPPFLAGS=$xdvi_xpm_save_CPPFLAGS
+LDFLAGS=$xdvi_xpm_save_LDFLAGS])
+#
+xpm_libraries="$xdvi_cv_xpm_libraries"]) # _XDVI_FIND_XPM_LIBRARIES
diff --git a/Build/source/texk/xdvik/m4/xdvi-func-memicmp.m4 b/Build/source/texk/xdvik/m4/xdvi-func-memicmp.m4
new file mode 100644
index 00000000000..b9915a3957e
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-func-memicmp.m4
@@ -0,0 +1,21 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2002 - 2009 Stefan Ulrich <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FUNC_MEMICMP
+# -----------------
+# Check for memicmp(), which some installations have in <string.h>.
+AC_DEFUN([XDVI_FUNC_MEMICMP],
+[AC_CACHE_CHECK([for memicmp],
+ [xdvi_cv_memicmp],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <string.h>]],
+ [[(void)memicmp((char *)NULL, (char *)NULL, 0);]])],
+ [xdvi_cv_memicmp=yes],
+ [xdvi_cv_memicmp=no])])
+if test "x$xdvi_cv_memicmp" = xyes; then
+ AC_DEFINE([HAVE_MEMICMP], 1, [Define if the memicmp() function is in <string.h>])
+fi
+]) # XDVI_FUNC_MEMICMP
diff --git a/Build/source/texk/xdvik/m4/xdvi-func-poll.m4 b/Build/source/texk/xdvik/m4/xdvi-func-poll.m4
new file mode 100644
index 00000000000..30dfcf9542b
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-func-poll.m4
@@ -0,0 +1,23 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 1999 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FUNC_POLL
+# --------------
+# Check for poll().
+AC_DEFUN([XDVI_FUNC_POLL],
+[AC_CACHE_CHECK([for poll.h and poll()],
+ [xdvi_cv_func_poll],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <poll.h>]],
+ [[poll((struct pollfd *) 0, 0, 0);]])],
+ [xdvi_cv_func_poll=yes],
+ [xdvi_cv_func_poll=no])])
+if test "x$xdvi_cv_func_poll" = xyes; then
+ AC_DEFINE([HAVE_POLL], 1, [Define if your system has <poll.h> and poll().])
+else
+ AC_CHECK_HEADERS([sys/select.h select.h])
+fi
+]) # XDVI_FUNC_POLL
diff --git a/Build/source/texk/xdvik/m4/xdvi-func-setsid-in-fork.m4 b/Build/source/texk/xdvik/m4/xdvi-func-setsid-in-fork.m4
new file mode 100644
index 00000000000..8fa2fcb9dc2
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-func-setsid-in-fork.m4
@@ -0,0 +1,58 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2002 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FUNC_SETSID_IN_VFORK
+# -------------------------
+# Check for whether setsid() is allowed within vfork()
+# (Mac OS X 10.3 (Panther, 11/2003) is one O/S which does not allow this).
+AC_DEFUN([XDVI_FUNC_SETSID_IN_VFORK],
+[AS_IF([test "x$ac_cv_func_vfork_works" = xyes],
+[AC_CACHE_CHECK([for whether setsid() is allowed within vfork()],
+ [xdvi_cv_setsid_in_vfork],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+/* Test adapted from Gnu autoconf */
+/* Thanks to Paul Eggert for this test. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_VFORK_H
+#include <vfork.h>
+#endif]],
+ [[
+ pid_t parent = getpid ();
+ pid_t child;
+
+ child = vfork ();
+
+ if (child == 0) {
+ if (setsid () == -1)
+ _exit(1);
+ _exit(0);
+ } else {
+ int status;
+
+ while (wait(&status) != child)
+ ;
+ exit(
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+ );
+ }]])],
+ [xdvi_cv_setsid_in_vfork=yes],
+ [xdvi_cv_setsid_in_vfork=no],
+ [xdvi_cv_setsid_in_vfork=no # safe value for cross-compiling])])
+if test "x$xdvi_cv_setsid_in_vfork" = xyes; then
+ AC_DEFINE([HAVE_GOOD_SETSID_VFORK], 1,
+ [Define if your system allows setsid() within vfork().])
+fi])
+]) # XDVI_FUNC_SETSID_IN_VFORK
diff --git a/Build/source/texk/xdvik/m4/xdvi-func-working-vsnprintf.m4 b/Build/source/texk/xdvik/m4/xdvi-func-working-vsnprintf.m4
new file mode 100644
index 00000000000..73cca6973f4
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-func-working-vsnprintf.m4
@@ -0,0 +1,32 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2002 Paul Vojta <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2002 - 2009 Stefan Ulrich <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FUNC_WORKING_VSNPRINTF
+# ---------------------------
+# Check for a working implementation of (v)snprintf()
+# which should either return a negative result or the size actually needed
+# (latter is C99 standard).
+AC_DEFUN([XDVI_FUNC_WORKING_VSNPRINTF],
+[AC_CACHE_CHECK([for a working implementation of (v)snprintf()],
+ [xdvi_cv_func_good_vsnprintf],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#ifdef IRIX
+#define _XOPEN_SOURCE 500
+#endif
+#include <stdio.h>]],
+ [[char s[2];
+ int retval = snprintf(s, 2, "test");
+ if (retval > -1 && retval != 4) /* neither negative nor desired size, not OK */
+ return 1;]])],
+ [xdvi_cv_func_good_vsnprintf=yes],
+ [xdvi_cv_func_good_vsnprintf=no],
+ [xdvi_cv_func_good_vsnprintf=no # safe value for cross-compiling])])
+if test "x$xdvi_cv_func_good_vsnprintf" = xyes; then
+ AC_DEFINE([HAVE_GOOD_VSNPRINTF], 1, [Define if the vsnprintf function works.])
+fi
+]) # XDVI_FUNC_WORKING_VSNPRINTF
diff --git a/Build/source/texk/xdvik/m4/xdvi-func-xkbbell.m4 b/Build/source/texk/xdvik/m4/xdvi-func-xkbbell.m4
new file mode 100644
index 00000000000..0be2df199f2
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-func-xkbbell.m4
@@ -0,0 +1,29 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2012 Paul Vojta <xdvi-core@lists.sourceforge.net>
+# Adapted from xterm, Copyright 1997-2010,2011 by Thomas E. Dickey
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_FUNC_XKB_BELL
+# -------------------------
+# Check for whether the XkbBell() extension is present in the X libraries.
+
+dnl ### Check for XkbBell() functionality. Adapted from xterm's version.
+AC_DEFUN([XDVI_FUNC_XKB_BELL],[
+AC_CACHE_CHECK([for XKB Bell extension], xdvi_cv_func_xkb_bell,
+[xdvi_save_LIBS=$LIBS
+LIBS="$X_PRE_LIBS"$1" $LIBS $X_LIBS -lX11"
+AC_TRY_LINK([
+#include <X11/X.h>
+#include <X11/XKBlib.h> /* has the prototype */
+],[
+ Atom y;
+ XkbBell((Display *)0, (Window)0, 0, y);
+],[xdvi_cv_func_xkb_bell=yes],[xdvi_cv_func_xkb_bell=no])
+LIBS=$xdvi_save_LIBS])
+if test "$xdvi_cv_func_xkb_bell" = yes; then
+ X_PRE_LIBS="$X_PRE_LIBS"$1
+ AC_DEFINE([HAVE_XKB_BELL_EXT], 1, [Define if your system has XkbBell().])
+fi])
diff --git a/Build/source/texk/xdvik/m4/xdvi-gs-lib-path.m4 b/Build/source/texk/xdvik/m4/xdvi-gs-lib-path.m4
new file mode 100644
index 00000000000..ab5ab1fc1a0
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-gs-lib-path.m4
@@ -0,0 +1,39 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2013 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_GS_LIB_PATH
+# ----------------
+# Find the path to use for GS_LIB.
+
+dnl ### Determine the path to use for GS_LIB.
+
+AC_DEFUN([XDVI_GS_LIB_PATH],
+[AC_ARG_WITH(default-gs-lib-path, [ --with-default-gs-lib-path=PATH
+ set default path for finding font aliases to PATH],
+[AC_DEFINE_UNQUOTED([DEFAULT_GS_LIB_PATH], "$withval",
+ [Define to set the default path for ghostscript-style font searching.])
+],
+[AC_CACHE_CHECK([for the path to be used for Ghostscript searches],
+xdvi_cv_gs_lib_path,
+[if gs -h >/dev/null 2>&1; then
+ ac_tmp="`gs -h \
+ | sed \
+ -e '1,/Search path:/d' \
+ -e '/For more information/,$d' \
+ -e '/Initialization files are compiled/d' \
+ -e 's/$/\/\/\//' \
+ -e 's/^ //' \
+ | tr '\n' '/'`"
+ # Solaris 9 sed doesn't handle incomplete lines at eof
+ xdvi_cv_gs_lib_path=`echo "$ac_tmp" \
+ | sed -e 's/\/\/\/\// /g' -e 's/ *$//' -e 's/ : /:/g'`
+else
+ xdvi_cv_gs_lib_path=/usr/local/share/ghostscript/fonts:/usr/local/lib/ghostscript/fonts:/usr/share/ghostscript/fonts:/var/lib/ghostscript/fonts:/usr/share/cups/fonts:/usr/share/fonts
+ AC_MSG_WARN(Could not determine Ghostscript search path; using $xdvi_cv_gs_lib_path)
+fi])
+AC_DEFINE_UNQUOTED([DEFAULT_GS_LIB_PATH], "$xdvi_cv_gs_lib_path")
+])])
diff --git a/Build/source/texk/xdvik/m4/xdvi-linker-multiple-defns.m4 b/Build/source/texk/xdvik/m4/xdvi-linker-multiple-defns.m4
new file mode 100644
index 00000000000..01f373cdcd6
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-linker-multiple-defns.m4
@@ -0,0 +1,70 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2002 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+# Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holders
+# give unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_LINKER_MULTIPLE_DEFNS
+# --------------------------
+# Check if the --allow-multiple-definition linker flag is
+# available (assuming that we need to use it if it is).
+# If it isn't, check if the linker accepts multiple definitions,
+# and if it doesn't, don't define LD_ALLOWS_MULTIPLE_DEFINITIONS.
+
+AC_DEFUN([XDVI_LINKER_MULTIPLE_DEFNS],
+[AC_CACHE_CHECK(
+ [if linker supports multiple definitions and for required flags],
+ [xdvi_cv_linker_multiple_defns],
+ [xdvi_ld_save_LDFLAGS=$LDFLAGS
+ LDFLAGS="-Xlinker --allow-multiple-definition"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdio.h>]], [[void foo(void);]])],
+ [xdvi_cv_linker_multiple_defns=$LDFLAGS],
+ [xdvi_ld_save_LIBS=$LIBS
+ xdvi_ld_save_CFLAGS=$CFLAGS
+ xdvi_ld_save_CPPFLAGS=$CPPFLAGS
+
+ LIBS="$X_PRE_LIBS -lXt -lX11 $X_EXTRA_LIBS $LIBS"
+ CFLAGS="$X_CFLAGS $CFLAGS"
+ CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+ LDFLAGS="$X_LIBS $xdvi_ld_save_LDFLAGS"
+
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <X11/Intrinsic.h>
+
+ XtIntervalId XtAppAddTimeOut(XtAppContext app,
+ unsigned long interval,
+ XtTimerCallbackProc proc,
+ XtPointer closure)
+ {
+ (void)app; (void)interval; (void)proc; (void)closure;
+ return (XtIntervalId)0;
+ }]],
+ [[XtIntervalId i = 0; XtRemoveTimeOut(i);]])],
+ [xdvi_cv_linker_multiple_defns="none required"],
+ [xdvi_cv_linker_multiple_defns=unsupported])
+
+ LIBS=$xdvi_ld_save_LIBS
+ CFLAGS=$xdvi_ld_save_CFLAGS
+ CPPFLAGS=$xdvi_ld_save_CPPFLAGS])
+ LDFLAGS=$xdvi_ld_save_LDFLAGS])
+
+x_linker_options=""
+AS_CASE([$xdvi_cv_linker_multiple_defns],
+ ["none required"], [AC_DEFINE([LD_ALLOWS_MULTIPLE_DEFINITIONS], 1,
+ [Define if your system allows multiple definitions of functions.])],
+ [unsupported], [AC_MSG_WARN([Linker does not allow multiple definitions.
+ *****************************************************************
+ * Warning: Your linker does not allow multiple definitions. *
+ * This does not make xdvik unusable, but it will cause problems *
+ * with event handling: Some widgets, e.g. the print log window, *
+ * tooltips, statusline messages and hyperlink location markers *
+ * will not be updated until the mouse is moved. *
+ *****************************************************************])],
+ [x_linker_options=$xdvi_cv_linker_multiple_defns
+ AC_DEFINE([LD_ALLOWS_MULTIPLE_DEFINITIONS], 1)])
+AC_SUBST([x_linker_options])
+]) # XDVI_LINKER_MULTIPLE_DEFNS
diff --git a/Build/source/texk/xdvik/m4/xdvi-sys-old-linux.m4 b/Build/source/texk/xdvik/m4/xdvi-sys-old-linux.m4
new file mode 100644
index 00000000000..7b7f80ee483
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-sys-old-linux.m4
@@ -0,0 +1,22 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2001 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_SYS_OLD_LINUX
+# ------------------
+# Check for certain broken versions of Linux.
+AC_DEFUN([XDVI_SYS_OLD_LINUX],
+[AC_CACHE_CHECK([for certain old versions of Linux],
+ [xdvi_cv_sys_old_linux],
+ [AS_CASE(["`(uname -sr) 2>/dev/null`"],
+ [["Linux 2."[01].* | "Linux 2.2."[0-8] | "Linux 2.2."[0-8]-*]],
+ [xdvi_cv_sys_old_linux=yes],
+ [xdvi_cv_sys_old_linux=no])])
+if test "x$xdvi_cv_sys_old_linux" = xyes; then
+ AC_DEFINE([FLAKY_SIGPOLL], 1,
+ [Define if you are using Linux 2.1.xxx -- 2.2.8, or if you find it necessary.])
+fi
+]) # XDVI_SYS_OLD_LINUX
diff --git a/Build/source/texk/xdvik/m4/xdvi-sys-streams.m4 b/Build/source/texk/xdvik/m4/xdvi-sys-streams.m4
new file mode 100644
index 00000000000..b347b4d9223
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-sys-streams.m4
@@ -0,0 +1,25 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 1999 - 2009 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_SYS_STREAMS
+# ----------------
+# Check for at-least-pretend Streams capability.
+AC_DEFUN([XDVI_SYS_STREAMS],
+[AC_CACHE_CHECK([for stropts.h and isastream()],
+ [xdvi_cv_sys_streams],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stropts.h>]],
+ [[#ifndef I_SETSIG
+choke me
+#else
+isastream(0);
+#endif]])],
+ [xdvi_cv_sys_streams=yes],
+ [xdvi_cv_sys_streams=no])])
+if test "x$xdvi_cv_sys_streams" = xyes; then
+ AC_DEFINE([HAVE_STREAMS], 1, [Define if your system has STREAMS (and if X uses it).])
+fi
+]) # XDVI_SYS_STREAMS
diff --git a/Build/source/texk/xdvik/m4/xdvi-xinput-2-1.m4 b/Build/source/texk/xdvik/m4/xdvi-xinput-2-1.m4
new file mode 100644
index 00000000000..7ca32f195a5
--- /dev/null
+++ b/Build/source/texk/xdvik/m4/xdvi-xinput-2-1.m4
@@ -0,0 +1,51 @@
+# Autoconf macros for xdvik.
+# Copyright (C) 2014 Paul Vojta <xdvi-core@lists.sourceforge.net>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# XDVI_XINPUT_2_1
+# ---------------
+# Check for whether XInput version 2.1 is supported in the X libraries.
+
+dnl ### Check for XInput 2.1 functionality.
+AC_DEFUN([XDVI_XINPUT_2_1], [dnl
+AC_ARG_ENABLE([xi2-scrolling],
+AS_HELP_STRING([--enable-xi2-scrolling],
+[Use XInput 2.1 'smooth scrolling' if available (default: disabled
+ for native TL build)]))
+AS_CASE([$enable_xi2_scrolling],
+ [yes | no], [:],
+ [AS_IF([test "x$enable_native_texlive_build" = xyes],
+ [enable_xi2_scrolling=no],
+ [enable_xi2_scrolling=yes])])
+if test "x$enable_xi2_scrolling" = xyes; then
+AC_CACHE_CHECK([for XInput version 2.1 or higher],
+ [xdvi_cv_xinput_2_1], [dnl
+xdvi_xi2_save_LIBS=$LIBS
+xdvi_xi2_save_CFLAGS=$CFLAGS
+xdvi_xi2_save_CPPFLAGS=$CPPFLAGS
+xdvi_xi2_save_LDFLAGS=$LDFLAGS
+LIBS="$X_PRE_LIBS -lXi $X_EXTRA_LIBS $LIBS"
+CFLAGS="$X_CFLAGS $CFLAGS"
+CPPFLAGS="$X_CFLAGS $CPPFLAGS"
+LDFLAGS="$X_LIBS $LDFLAGS"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <X11/extensions/XInput2.h>]],
+ [[Display *DISP; int ndevices;
+XIDeviceInfo *info = XIQueryDevice(DISP, XIAllDevices, &ndevices);
+#if (XI_2_Major < 2 || (XI_2_Major == 2 && XI_2_Minor < 1))
+choke me "XInput version is < 2.1"
+#endif]])],
+ [xdvi_cv_xinput_2_1=yes],
+ [xdvi_cv_xinput_2_1=no])
+LIBS=$xdvi_xi2_save_LIBS
+CFLAGS=$xdvi_xi2_save_CFLAGS
+CPPFLAGS=$xdvi_xi2_save_CPPFLAGS
+LDFLAGS=$xdvi_xi2_save_LDFLAGS])
+if test "x$xdvi_cv_xinput_2_1" = xyes; then
+ AC_DEFINE([HAVE_XI21], 1,
+ [Define if your system has XInput version 2.1 or higher.])
+ X_PRE_LIBS="$X_PRE_LIBS -lXi"
+fi
+fi])
diff --git a/Build/source/texk/xdvik/main.c b/Build/source/texk/xdvik/main.c
new file mode 100644
index 00000000000..87e92fd06c9
--- /dev/null
+++ b/Build/source/texk/xdvik/main.c
@@ -0,0 +1,1321 @@
+/*
+ * Copyright (c) 2013-2014 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "xdvi-config.h"
+
+#include <locale.h>
+
+#include <X11/Intrinsic.h>
+
+#include "kpathsea/proginit.h"
+#include "kpathsea/expand.h"
+
+#include "xdvi.h"
+#include "util.h"
+#include "x_util.h"
+#include "sfSelFile.h"
+#include "my-snprintf.h"
+#include "dvi-init.h"
+#include "filehist.h"
+#include "mag.h"
+#include "message-window.h"
+
+#if FREETYPE
+# include <ft2build.h>
+# include FT_FREETYPE_H
+#endif
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+#ifndef XDVI_KPSE_PROG_NAME
+#define XDVI_KPSE_PROG_NAME xdvi
+#endif
+static const char *xdvi_kpse_prog_name = TOSTRING(XDVI_KPSE_PROG_NAME);
+#undef STRINGIFY
+#undef TOSTRING
+
+static char XtRBool3[] = "Bool3"; /* resource for Bool3 */
+
+/* get these before setting `application_resources' */
+static XtResource xdvirc_resources[] = {
+ {"noInitFile", "NoInitFile", XtRBoolean, sizeof(Boolean),
+ XtOffsetOf(struct x_resources, no_init_file), XtRString, "false"},
+};
+
+
+static XrmOptionDescRec options[] = {
+ {"-q", ".noInitFile", XrmoptionNoArg, (XPointer)"on" },
+ {"+q", ".noInitFile", XrmoptionNoArg, (XPointer)"off" },
+ {"-geometry", ".geometry", XrmoptionSepArg, (XPointer)NULL },
+#ifdef MOTIF
+ /* to make `-font' and `-fn' options work, make them an alias for `fontList' */
+ { "-font", "*fontList", XrmoptionSepArg, (XPointer)NULL },
+ { "-fn", "*fontList", XrmoptionSepArg, (XPointer)NULL },
+#endif
+ {"-s", ".shrinkFactor", XrmoptionSepArg, (XPointer)NULL },
+#ifndef VMS
+ {"-S", ".densityPercent", XrmoptionSepArg, (XPointer)NULL },
+#endif
+ {"-density", ".densityPercent", XrmoptionSepArg, (XPointer)NULL },
+ {"-noomega", ".omega", XrmoptionNoArg, (XPointer)"off" },
+ {"+noomega", ".omega", XrmoptionNoArg, (XPointer)"on" },
+#if COLOR
+ {"-nocolor", ".color", XrmoptionNoArg, (XPointer)"off" },
+ {"+nocolor", ".color", XrmoptionNoArg, (XPointer)"on" },
+#endif
+#ifdef GREY
+ {"-nogrey", ".grey", XrmoptionNoArg, (XPointer)"off" },
+ {"+nogrey", ".grey", XrmoptionNoArg, (XPointer)"on" },
+ {"-gamma", ".gamma", XrmoptionSepArg, (XPointer)NULL },
+ {"-nomatchinverted",".matchInverted", XrmoptionNoArg, (XPointer)"off" },
+ {"+nomatchinverted",".matchInverted", XrmoptionNoArg, (XPointer)"on" },
+ /* {"-invertedfactor", ".invertedFactor", XrmoptionSepArg, (XPointer)NULL }, */
+ {"-install", ".install", XrmoptionNoArg, (XPointer)"on" },
+ {"-noinstall", ".install", XrmoptionNoArg, (XPointer)"off" },
+#endif
+ {"-rulecolor", ".ruleColor", XrmoptionSepArg, (XPointer)NULL },
+ {"-p", ".pixelsPerInch", XrmoptionSepArg, (XPointer)NULL },
+ {"-margins", ".Margin", XrmoptionSepArg, (XPointer)NULL },
+ {"-sidemargin", ".sideMargin", XrmoptionSepArg, (XPointer)NULL },
+ {"-topmargin", ".topMargin", XrmoptionSepArg, (XPointer)NULL },
+ {"-offsets", ".Offset", XrmoptionSepArg, (XPointer)NULL },
+ {"-xoffset", ".xOffset", XrmoptionSepArg, (XPointer)NULL },
+ {"-yoffset", ".yOffset", XrmoptionSepArg, (XPointer)NULL },
+ {"-paper", ".paper", XrmoptionSepArg, (XPointer)NULL },
+ {"-altfont", ".altFont", XrmoptionSepArg, (XPointer)NULL },
+#ifdef MKTEXPK
+ {"-nomakepk", ".makePk", XrmoptionNoArg, (XPointer)"off" },
+ {"+nomakepk", ".makePk", XrmoptionNoArg, (XPointer)"on" },
+#endif
+ {"-mfmode", ".mfMode", XrmoptionSepArg, (XPointer)NULL },
+ {"-editor", ".editor", XrmoptionSepArg, (XPointer)NULL },
+#if FREETYPE
+ {"-notype1fonts", ".type1", XrmoptionNoArg, (XPointer)"off" },
+ {"+notype1fonts", ".type1", XrmoptionNoArg, (XPointer)"on" },
+#endif
+#if HAVE_XI21
+ {"-noxi2scrolling", ".xi2Scrolling", XrmoptionNoArg, (XPointer)"off"},
+ {"+noxi2scrolling", ".xi2Scrolling", XrmoptionNoArg, (XPointer)"on"},
+#endif
+ {"-sourceposition", ".sourcePosition", XrmoptionSepArg, (XPointer)NULL },
+ {"-findstring", ".findString", XrmoptionSepArg, (XPointer)NULL },
+ {"-text-encoding", ".textEncoding", XrmoptionSepArg, (XPointer)NULL },
+ {"-unique", ".unique", XrmoptionNoArg, (XPointer)"on" },
+ {"+unique", ".unique", XrmoptionNoArg, (XPointer)"off" },
+ {"-nofork", ".fork", XrmoptionNoArg, (XPointer)"off" },
+ {"+nofork", ".fork", XrmoptionNoArg, (XPointer)"on" },
+#ifdef RGB_ANTI_ALIASING
+ {"-subpixels", ".subPixels", XrmoptionSepArg, (XPointer)NULL },
+#endif
+ {"-l", ".listFonts", XrmoptionNoArg, (XPointer)"on" },
+ {"+l", ".listFonts", XrmoptionNoArg, (XPointer)"off" },
+ {"-watchfile", ".watchFile", XrmoptionSepArg, (XPointer)NULL },
+ {"-expertmode", ".expertMode", XrmoptionSepArg, (XPointer)NULL },
+ {"-expert", ".expert", XrmoptionNoArg, (XPointer)"on" },
+ {"+expert", ".expert", XrmoptionNoArg, (XPointer)"off" },
+ {"+statusline", ".statusline", XrmoptionNoArg, (XPointer)"off" },
+ {"-statusline", ".statusline", XrmoptionNoArg, (XPointer)"on" },
+ {"+useTeXpages", ".useTeXPages", XrmoptionNoArg, (XPointer)"off" },
+ {"-useTeXpages", ".useTeXPages", XrmoptionNoArg, (XPointer)"on" },
+ {"-mgs", ".magnifierSize1", XrmoptionSepArg, (XPointer)NULL },
+ {"-mgs1", ".magnifierSize1", XrmoptionSepArg, (XPointer)NULL },
+ {"-mgs2", ".magnifierSize2", XrmoptionSepArg, (XPointer)NULL },
+ {"-mgs3", ".magnifierSize3", XrmoptionSepArg, (XPointer)NULL },
+ {"-mgs4", ".magnifierSize4", XrmoptionSepArg, (XPointer)NULL },
+ {"-mgs5", ".magnifierSize5", XrmoptionSepArg, (XPointer)NULL },
+ {"-warnspecials", ".warnSpecials", XrmoptionNoArg, (XPointer)"on" },
+ {"+warnspecials", ".warnSpecials", XrmoptionNoArg, (XPointer)"off" },
+ {"-hush", ".Hush", XrmoptionNoArg, (XPointer)"on" },
+ {"+hush", ".Hush", XrmoptionNoArg, (XPointer)"off" },
+ {"-hushchars", ".hushLostChars", XrmoptionNoArg, (XPointer)"on" },
+ {"+hushchars", ".hushLostChars", XrmoptionNoArg, (XPointer)"off" },
+ {"-hushchecksums", ".hushChecksums", XrmoptionNoArg, (XPointer)"on" },
+ {"+hushchecksums", ".hushChecksums", XrmoptionNoArg, (XPointer)"off" },
+ {"-hushstdout", ".hushStdout", XrmoptionNoArg, (XPointer)"on" },
+ {"+hushstdout", ".hushStdout", XrmoptionNoArg, (XPointer)"off" },
+ {"-hushbell", ".hushBell", XrmoptionNoArg, (XPointer)"on" },
+ {"+hushbell", ".hushBell", XrmoptionNoArg, (XPointer)"off" },
+ {"-safer", ".safer", XrmoptionNoArg, (XPointer)"on" },
+ {"+safer", ".safer", XrmoptionNoArg, (XPointer)"off" },
+ {"-fg", ".foreground", XrmoptionSepArg, (XPointer)NULL },
+ {"-foreground", ".foreground", XrmoptionSepArg, (XPointer)NULL },
+ {"-bg", ".background", XrmoptionSepArg, (XPointer)NULL },
+ {"-background", ".background", XrmoptionSepArg, (XPointer)NULL },
+ {"-hl", ".highlight", XrmoptionSepArg, (XPointer)NULL },
+ {"-cr", ".cursorColor", XrmoptionSepArg, (XPointer)NULL },
+ {"-icongeometry", ".iconGeometry", XrmoptionSepArg, (XPointer)NULL },
+ {"-keep", ".keepPosition", XrmoptionNoArg, (XPointer)"on" },
+ {"+keep", ".keepPosition", XrmoptionNoArg, (XPointer)"off" },
+ {"-copy", ".copy", XrmoptionNoArg, (XPointer)"on" },
+ {"+copy", ".copy", XrmoptionNoArg, (XPointer)"off" },
+ {"-thorough", ".thorough", XrmoptionNoArg, (XPointer)"on" },
+ {"+thorough", ".thorough", XrmoptionNoArg, (XPointer)"off" },
+ {"-fullscreen", ".fullscreen", XrmoptionNoArg, (XPointer)"on" },
+ {"+fullscreen", ".fullscreen", XrmoptionNoArg, (XPointer)"off" },
+ {"-pause", ".pause", XrmoptionNoArg, (XPointer)"on" },
+ {"+pause", ".pause", XrmoptionNoArg, (XPointer)"off" },
+ {"-pausespecial", ".pauseSpecial", XrmoptionSepArg, (XPointer)NULL },
+ {"-wheelunit", ".wheelUnit", XrmoptionSepArg, (XPointer)NULL },
+ {"-mousemode", ".mouseMode", XrmoptionSepArg, (XPointer)NULL },
+#ifdef PS
+ {"-postscript", ".postscript", XrmoptionSepArg, (XPointer)NULL },
+ {"-allowshell", ".allowShell", XrmoptionNoArg, (XPointer)"on" },
+ {"+allowshell", ".allowShell", XrmoptionNoArg, (XPointer)"off" },
+# ifdef PS_DPS
+ {"-nodps", ".dps", XrmoptionNoArg, (XPointer)"off" },
+ {"+nodps", ".dps", XrmoptionNoArg, (XPointer)"on" },
+# endif
+# ifdef PS_NEWS
+ {"-nonews", ".news", XrmoptionNoArg, (XPointer)"off" },
+ {"+nonews", ".news", XrmoptionNoArg, (XPointer)"on" },
+# endif
+# ifdef PS_GS
+ {"-noghostscript", ".ghostscript", XrmoptionNoArg, (XPointer)"off" },
+ {"+noghostscript", ".ghostscript", XrmoptionNoArg, (XPointer)"on" },
+ {"-nogssafer", ".gsSafer", XrmoptionNoArg, (XPointer)"off" },
+ {"+nogssafer", ".gsSafer", XrmoptionNoArg, (XPointer)"on" },
+ {"-gsalpha", ".gsAlpha", XrmoptionNoArg, (XPointer)"on" },
+ {"+gsalpha", ".gsAlpha", XrmoptionNoArg, (XPointer)"off" },
+ {"-interpreter", ".interpreter", XrmoptionSepArg, (XPointer)NULL },
+ {"-gspalette", ".palette", XrmoptionSepArg, (XPointer)NULL },
+# endif
+# ifdef MAGICK
+ {"-magick", ".ImageMagick", XrmoptionNoArg, (XPointer)"on" },
+ {"+magick", ".ImageMagick", XrmoptionNoArg, (XPointer)"off" },
+ {"-magick_cache", ".MagickCache", XrmoptionSepArg, (XPointer)NULL },
+# endif
+#endif /* PS */
+ {"-noscan", ".prescan", XrmoptionNoArg, (XPointer)"off" },
+ {"+noscan", ".prescan", XrmoptionNoArg, (XPointer)"on" },
+ {"-notempfile", ".tempFile", XrmoptionNoArg, (XPointer)"off" },
+ {"+notempfile", ".tempFile", XrmoptionNoArg, (XPointer)"on" },
+ {"-dvipspath", ".dvipsPath", XrmoptionSepArg, (XPointer)NULL },
+ {"-ps2pdfpath", ".ps2pdfPath", XrmoptionSepArg, (XPointer)NULL },
+ {"-debug", ".debugLevel", XrmoptionSepArg, (XPointer)NULL },
+ {"-linkstyle", ".linkStyle", XrmoptionSepArg, (XPointer)NULL },
+ {"-linkcolor", ".linkColor", XrmoptionSepArg, (XPointer)NULL },
+ {"-visitedlinkcolor",".visitedLinkColor", XrmoptionSepArg, (XPointer)NULL },
+ {"-browser", ".wwwBrowser", XrmoptionSepArg, (XPointer)NULL },
+ {"-anchorposition", ".anchorPosition", XrmoptionSepArg, (XPointer)NULL },
+};
+
+/*
+ * Data for options processing.
+ */
+static const char SILENT[] = " "; /* flag value for usage() */
+static const char SUBST[] = "x"; /* another flag value */
+static const char USAGESTR_END_MARKER[] = "__USAGE_END_MARKER__"; /* end marker */
+
+/* Here, list usage values for options that have `XrmoptionSepArg' set.
+ TODO: what does the `^' stand for?
+*/
+static const char *usagestr[] = {
+ /* geometry */ SILENT,
+#ifdef MOTIF
+ /* font */ SILENT,
+ /* f */ SILENT,
+#endif
+ /* shrinkFactor */ "shrink",
+#ifndef VMS
+ /* S */ "density",
+ /* density */ SILENT,
+#else
+ /* density */ "density",
+#endif
+#ifdef GREY
+ /* gamma */ "float",
+#endif
+ /* rulecolor */ "color",
+ /* p */ "pixels",
+ /* margins */ "dimen",
+ /* sidemargin */ "dimen",
+ /* topmargin */ "dimen",
+ /* offsets */ "dimen",
+ /* xoffset */ "dimen",
+ /* yoffset */ "dimen",
+ /* paper */ "papertype",
+ /* altfont */ "font",
+ /* mfmode */ "mode-def",
+ /* editor */ "editor",
+ /* sourceposition */ "linenumber[ ]*filename",
+ /* findstring */ "string",
+ /* textencoding */ "charset",
+#ifdef RGB_ANTI_ALIASING
+ /* subpixels */ "{rgb,bgr}[ i1 i2 i3]",
+#endif
+ /* rv */ "^-l", "-rv",
+ /* watchfile */ "secs",
+ /* expertmode */ "flag",
+ /* mgs */ SUBST,
+ /* mgs1 */ SILENT,
+ /* mgs2 */ SILENT,
+ /* mgs3 */ SILENT,
+ /* mgs4 */ SILENT,
+ /* mgs5 */ SILENT,
+ /* fg */ "color",
+ /* foreground */ SILENT,
+ /* bg */ "color",
+ /* background */ SILENT,
+ /* hl */ "color",
+ /* cr */ "color",
+#ifndef VMS
+ /* display */ "^-cr", "-display <host:display>",
+#else
+ /* display */ "^-cr", "-display <host::display>",
+#endif
+ /* geometry */ "^-cr", "-geometry <geometry>",
+ /* icongeometry */ "geometry",
+ /* iconic */ "^-icongeometry", "-iconic",
+ /* font */ "^-icongeometry", "-font <font>",
+ /* pausespecial */ "string",
+ /* wheelunit */ "pixels",
+ /* mousemode */ "0|1|2",
+#ifdef PS
+ /* postscript */ "0|1|2",
+# ifdef PS_GS
+ /* interpreter */ "path",
+ /* gspalette */ "monochrome|grayscale|color",
+# endif
+# ifdef MAGICK
+ /* magick_cache */ "size[k|K|m|M|g|G]",
+# endif
+#endif
+ /* dvipspath */ "path",
+ /* ps2pdfpath */ "path",
+ /* debug */ "bitmask|string[,string ...]",
+ /* linkstyle */ "0|1|2|3",
+ /* linkcolor */ "color",
+ /* visitedlinkcolor */ "color",
+ /* browser */ "WWWbrowser",
+ /* anchorposition */ "anchor",
+ /* [end marker] */ USAGESTR_END_MARKER
+};
+
+static const char *SUBST_VAL[] = { "-mgs[n] <size>" };
+
+static int
+compare_strings(const void *s, const void *t)
+{
+ const char *const *ss = (const char *const *)s;
+ const char *const *tt = (const char *const *)t;
+
+ return memicmp(*ss, *tt, strlen(*tt) + 1); /* also check for final 0 */
+}
+
+static void
+usage(int exitval)
+{
+ XrmOptionDescRec *opt;
+ const char **usageptr = usagestr;
+ const char **sv = SUBST_VAL;
+ const char *str1;
+ const char *str2;
+ const char *sorted_options[XtNumber(options)];
+ char buf[256];
+ char *s;
+ int col, n;
+ size_t nopt = 0, k;
+
+ for (opt = options; opt < options + XtNumber(options); ++opt) {
+ str1 = opt->option;
+ if (*str1 != '-')
+ continue;
+
+ ASSERT(*usageptr != USAGESTR_END_MARKER, "Too few elements in usageptr[]");
+
+ str2 = NULL;
+ if (opt->argKind != XrmoptionNoArg) {
+ str2 = *usageptr++;
+ if (str2 == SILENT)
+ continue;
+ if (str2 == SUBST) {
+ str1 = *sv++;
+ str2 = NULL;
+ }
+ }
+#if 0
+ fprintf(stderr, "str1: %s, str2: %s\n", str1, str2);
+#endif
+ for (;;) {
+ if (str2 == NULL)
+ sprintf(buf, "[%.80s]", str1);
+ else
+ sprintf(buf, "[%.80s <%.80s>]", str1, str2);
+
+ /* fprintf(stderr, "number of options: %d; len of usagestr: %d\n", */
+ /* XtNumber(options), XtNumber(usagestr)); */
+ ASSERT(nopt < XtNumber(options), "index out of range");
+ /* fprintf(stderr, "sorted: %d=%s\n", nopt, buf); */
+ sorted_options[nopt++] = xstrdup(buf);
+
+ if (**usageptr != '^' || strcmp(*usageptr + 1, opt->option) != 0)
+ break;
+ ++usageptr;
+ str1 = *usageptr++;
+ str2 = NULL;
+ }
+ }
+
+ ASSERT(*usageptr == USAGESTR_END_MARKER, "Too many elements in usageptr[]");
+
+ /* fprintf(stderr, "elems in sorted options: %d\n", nopt); */
+ qsort((void*)sorted_options,
+ nopt,
+ sizeof(sorted_options[0]),
+ compare_strings);
+
+ s = xstrdup("Usage: ");
+ s = xstrcat(s, XDVI_PROGNAME); /* use `xdvi' here, not `xdvik' or `xdvi-xaw.bin' or ... */
+ s = xstrcat(s, " [+[<page>]] [-h | --help] [-v | --version] [-license]");
+
+ col = strlen(s);
+ fputs(s, stdout);
+
+ for (k = 0; k < nopt; ++k) {
+ n = strlen(sorted_options[k]);
+ if (col + n < 80)
+ putc(' ', stdout);
+ else {
+ fputs("\n\t", stdout);
+ col = 8 - 1;
+ }
+ fputs(sorted_options[k], stdout);
+ col += n + 1;
+ }
+
+ /* put this in an extra line, to emphasize that it must come last */
+ fputs("\n\t[dvi_file]\n", stdout);
+
+ xdvi_exit(exitval);
+}
+
+
+static void
+display_bug_reporting_info(void)
+{
+ printf("Please send bug reports, feature requests etc. to one of:\n"
+ " http://sourceforge.net/tracker/?group_id=23164&atid=377580\n"
+ " tex-k@tug.org (http://tug.org/mailman/listinfo/tex-k)\n\n"
+ "\n");
+}
+
+static void
+display_licensing_info(void)
+{
+ fputs("Licenses: X Consortium license, GNU Library General Public\n"
+ "License, GNU General Public License (use option `-license'\n"
+ "for more details). There is NO WARRANTY of anything.\n\n", stdout);
+}
+
+static void
+display_long_licensing_info(void)
+{
+ fputs("The major parts of Xdvik are licensed under the X Consortium license.\n"
+ "Parts (encoding.c) are licensed under the GNU General Public License.\n"
+ "Xdvik uses the following libraries:\n"
+ "- The kpathsea library, licensed in part under the GNU General Public\n"
+ " License, in part under the GNU Library General Public License.\n"
+ "- FreeType2, licensed under the GNU General Public License.\n"
+ "There is NO WARRANTY of anything.\n\n", stdout);
+}
+
+static char *
+is_good_dvi_file(const char *filename, Boolean from_history)
+{
+ static char canonical_path[MAXPATHLEN + 1];
+ Boolean tried_dvi_extension = False;
+ /* following allocates real_filename */
+ char *real_filename = find_dvi_file(filename, &tried_dvi_extension, from_history);
+ char *ret;
+ FILE *f = NULL;
+ dviErrFlagT errflag;
+
+ if (real_filename == NULL)
+ return NULL;
+
+ if ((ret = REALPATH(real_filename, canonical_path)) == NULL) {
+ /* REALPATH failed, use real_filename */
+ size_t n = strlen(real_filename);
+ if (n >= MAXPATHLEN) {
+ n = MAXPATHLEN - 1;
+ }
+
+ memcpy(canonical_path, real_filename, n);
+ canonical_path[n] = '\0';
+ ret = canonical_path;
+ }
+ free(real_filename);
+
+ /* check for correct DVI files */
+ if ((f = XFOPEN(ret, OPEN_MODE)) != NULL) {
+ TRACE_EVENTS((stderr, "watching: new file opened successfully."));
+ if (process_preamble(f, &errflag)
+ && find_postamble(f, &errflag)
+ && read_postamble(f, &errflag, False
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
+ fclose(f);
+ return ret;
+ }
+ fclose(f);
+ if (!from_history)
+ XDVI_FATAL((stderr, "%s: %s.", filename, get_dvi_error(errflag)));
+ return NULL;
+ }
+ else {
+ if (!from_history)
+ XDVI_FATAL((stderr, "Could not open `%s': %s.", filename, strerror(errno)));
+ return NULL;
+ }
+}
+
+
+static char *
+get_filename_from_history(int *pageno)
+{
+ size_t i;
+ /* loop through history, trying to get a good file */
+ for (i = 0; i < file_history_size(); i++) {
+ char *ret, *test;
+
+ if ((test = file_history_get_elem(i, pageno)) == NULL)
+ return NULL;
+ TRACE_FILES((stderr, "HISTORY %lu: |%s|", (unsigned long)i, test));
+ if ((ret = is_good_dvi_file(test, True)) != NULL) {
+ TRACE_FILES((stderr, "SUCCESS: |%s|", test));
+ return ret;
+ }
+ }
+ return NULL;
+}
+
+static void
+warn_about_prerelease_versions(void)
+{
+ int unstable_version = 0;
+ if (strstr(XDVI_VERSION_INFO, "-cvs") != NULL)
+ unstable_version = 1;
+ else if (strstr(XDVI_VERSION_INFO, "-beta") != NULL)
+ unstable_version = 2;
+
+ if (unstable_version > 0) {
+ printf("\n**********************************************************************\n");
+ printf("%s version %s,\n%s version.\n\n", XDVIK_PROGNAME, XDVI_VERSION_INFO,
+ unstable_version == 1 ? "an unstable development" : "a beta testing");
+ printf("Want a stable version instead?\n"
+ " -> please visit one of:\n"
+ " http://xdvi.sourceforge.net/cvs-upgrade.html\n"
+ " http://sourceforge.net/project/showfiles.php?group_id=23164\n\n"
+ "Found a bug?\n"
+ " -> please report it to:\n"
+ " http://sourceforge.net/tracker/?group_id=23164&atid=377580\n\n"
+ "Thanks for your support!\n");
+ printf("**********************************************************************\n");
+ }
+}
+
+/*
+ Initialize internal data (most of them global ...) according to the values
+ of resources/command-line arguments, warning user about illegal values
+ etc.
+*/
+static void
+init_check_resources(void)
+{
+ size_t i;
+
+ if (resource.mfmode != NULL) {
+ char *p;
+
+ p = strrchr(resource.mfmode, ':');
+ if (p != NULL) {
+ unsigned int len;
+ char *p1;
+
+ ++p;
+ len = p - resource.mfmode;
+ p1 = xmalloc(len);
+ memcpy(p1, resource.mfmode, len - 1);
+ p1[len - 1] = '\0';
+ resource.mfmode = p1;
+ resource.pixels_per_inch = atoi(p);
+ }
+ }
+ if (currwin.shrinkfactor < 0) {
+ XDVI_ERROR((stderr, "Invalid shrink factor: %d.", currwin.shrinkfactor));
+ usage(EXIT_FAILURE);
+ }
+ if (resource.density <= 0) {
+ XDVI_ERROR((stderr, "Invalid shrink density: %d.", resource.density));
+ usage(EXIT_FAILURE);
+ }
+ if (resource.pixels_per_inch <= 0) {
+ XDVI_ERROR((stderr, "Invalid dpi value: %d.", resource.pixels_per_inch));
+ usage(EXIT_FAILURE);
+ }
+ if (resource.link_style < 0 || resource.link_style > 3) {
+ XDVI_ERROR((stderr, "Unrecognized value %d for resource \"linkstyle\" (valid range is 0 - 3); assuming 3.",
+ resource.link_style));
+ resource.link_style = 3;
+ }
+ if (currwin.shrinkfactor > 1) {
+ mane.shrinkfactor = currwin.shrinkfactor; /* otherwise it's 1 */
+ }
+
+#ifdef RGB_ANTI_ALIASING
+#warning Note: RGB Anti-aliasing enabled
+ /* subpixel rendering */
+ resource.subpixel_order = SUBPIXEL_NONE;
+ if (resource.sub_pixels != NULL) {
+ int sum;
+
+ if (memicmp(resource.sub_pixels, "rgb", 3) == 0)
+ resource.subpixel_order = SUBPIXEL_RGB;
+ else if (memicmp(resource.sub_pixels, "bgr", 3) == 0)
+ resource.subpixel_order = SUBPIXEL_BGR;
+ else if (memicmp(resource.sub_pixels, "none", 3) == 0)
+ resource.subpixel_order = SUBPIXEL_NONE;
+ else {
+ XDVI_ERROR((stderr,
+ "Unrecognized value \"%s\" for resource subpixels\n"
+ "(possible values are: \"rgb\" or \"bgr\").",
+ resource.sub_pixels));
+ xdvi_exit(EXIT_FAILURE);
+ }
+ /* get the energy distribution */
+ if (resource.subpixel_order == SUBPIXEL_RGB || resource.subpixel_order == SUBPIXEL_BGR) {
+ const char *ptr = resource.sub_pixels + 3;
+ while (isspace(*ptr))
+ ptr++;
+ fprintf(stderr, "ptr: |%s|\n", ptr);
+ resource.subpixel_energy[0] = 33.333;
+ resource.subpixel_energy[1] = 33.333;
+ resource.subpixel_energy[2] = 0.0;
+ if (*ptr != '\0') {
+ if (sscanf(ptr, "%f %f %f",
+ &(resource.subpixel_energy[0]),
+ &(resource.subpixel_energy[1]),
+ &(resource.subpixel_energy[2]))
+ != 3) {
+ XDVI_ERROR((stderr,
+ "Illegal color mask `%s' for resource subpixels (should be: `n n n')\n",
+ ptr));
+ }
+ }
+
+ sum = (int)(resource.subpixel_energy[0] +
+ 2 * resource.subpixel_energy[1] +
+ 2 * resource.subpixel_energy[2]);
+ if (sum < 99 || sum > 100) {
+ XDVI_WARNING((stderr, "energy values %f + 2 * %f + 2 * %f don't sum up to 100%%!\n",
+ resource.subpixel_energy[0], resource.subpixel_energy[1], resource.subpixel_energy[2]));
+ exit(1);
+ }
+
+ resource.subpixel_energy[0] /= 100.0;
+ resource.subpixel_energy[1] /= 100.0;
+ resource.subpixel_energy[2] /= 100.0;
+ fprintf(stderr, "subpixel order: %s = %d; [%f %f %f]\n",
+ resource.sub_pixels, resource.subpixel_order,
+ resource.subpixel_energy[0], resource.subpixel_energy[1], resource.subpixel_energy[2]);
+ }
+ }
+#endif
+
+ /* margins */
+ if (resource.sidemargin)
+ resource.sidemargin_int = atopix(resource.sidemargin);
+ if (resource.topmargin)
+ resource.topmargin_int = atopix(resource.topmargin);
+ resource.xoffset_int = resource.xoffset ? atopix_signed(resource.xoffset)
+ : resource.pixels_per_inch;
+ resource.yoffset_int = resource.yoffset ? atopix_signed(resource.yoffset)
+ : resource.pixels_per_inch;
+
+ /* paper type */
+ if (!set_paper_type(resource.paper)) {
+ const char **p;
+ char *helpmsg = xstrdup("Possible paper types are:\n ");
+ const char **paper_types = get_paper_types();
+ for (p = paper_types; p < paper_types + get_paper_types_size(); p += 2) {
+ if (**p == '\0') { /* next line of list */
+ helpmsg = xstrcat(helpmsg, "\n ");
+ }
+ else {
+ helpmsg = xstrcat(helpmsg, *p);
+ helpmsg = xstrcat(helpmsg, " ");
+ }
+ }
+ helpmsg = xstrcat(helpmsg,
+ "\n(the names ending with `r' are `rotated' or `landscape' variants).\n"
+ "Alternatively, you can specify the dimensions as `WIDTHxHEIGHT', followed "
+ "by a dimension unit (one of: pt pc in bp cm mm dd cc sp).");
+ /* also dump it to stderr ... */
+ fprintf(stderr,
+ "Unrecognized value `%s' for paper type option; using %s instead.\n%s\n",
+ resource.paper, DEFAULT_PAPER, helpmsg);
+
+ popup_message(globals.widgets.top_level,
+ MSG_WARN, helpmsg,
+ "Unrecognized value `%s' for paper type option; using a4 instead.", resource.paper);
+ set_paper_type(DEFAULT_PAPER);
+ }
+
+ /* magnifier sizes */
+ for (i = 0; i < get_magglass_items(); ++i) {
+ if (resource.mg_arg[i] != NULL) {
+ char *s;
+
+ int n = atoi(resource.mg_arg[i]);
+ set_magglass_widht(i, n);
+ set_magglass_height(i, n);
+ s = strchr(resource.mg_arg[i], 'x');
+ if (s != NULL) {
+ set_magglass_height(i, atoi(s + 1));
+ if (get_magglass_height(i) <= 0)
+ set_magglass_widht(i, 0);
+ }
+ }
+ }
+
+#ifdef PS
+ if (resource.safer) {
+ resource.allow_shell = False;
+# ifdef PS_GS
+ resource.gs_safer = True;
+# endif /* PS_GS */
+ }
+# ifdef PS_GS
+ {
+ const char *CGMcgm = "CGMcgm";
+ const char *cgmp;
+
+ cgmp = strchr(CGMcgm, resource.gs_palette[0]);
+ if (cgmp == NULL)
+ XDVI_FATAL((stderr, "Invalid value %s for gs palette option", resource.gs_palette));
+ if (cgmp >= CGMcgm + 3) {
+ static char gsp[] = "x";
+
+ gsp[0] = *(cgmp - 3);
+ resource.gs_palette = gsp;
+ }
+ }
+# endif /* PS_GS */
+#endif /* PS */
+
+ /* The old `-expert' flag overrides resource.expert_mode, `+expert' (or not
+ setting it) just uses expert_mode.
+ */
+ if (resource.expert)
+ resource.expert_mode = XPRT_SHOW_NONE;
+ /* fprintf(stderr, "++++++++ initializing resource.expert_mode: %d\n", resource.expert_mode); */
+ update_expert_mode();
+
+ if (resource.hush) {
+ resource.hush_chars = resource.hush_chk = resource.hush_stdout = resource.hush_bell = True;
+ }
+}
+
+/*
+ a custom error handler that makes it easier to catch X errors in the debugger
+ (by setting a breakpoint to this function, plus using the -sync option).
+ Also, Motif sometimes gives non-fatal errors that we want to ignore ...
+*/
+static int
+x_error_handler(Display *display, XErrorEvent *error)
+{
+ char buf[1024], req_buf[1024];
+
+ if (error->request_code < 128) {
+ char num[LENGTH_OF_INT];
+ sprintf(num, "%d", error->request_code);
+ XGetErrorDatabaseText(display, "XRequest", num, "", req_buf, 1024);
+ }
+ else {
+ req_buf[0] = '\0';
+ }
+
+ XGetErrorText(display, error->error_code, buf, sizeof buf);
+ /* XtCloseDisplay(DISP); */
+ if (error->error_code == BadWindow
+ || error->error_code == BadPixmap
+ || error->error_code == BadCursor
+ || error->error_code == BadFont
+ || error->error_code == BadDrawable
+ || error->error_code == BadColor
+ || error->error_code == BadGC
+ || error->error_code == BadIDChoice
+ || error->error_code == BadValue
+ || error->error_code == BadAtom) {
+ XDVI_WARNING((stderr, "X protocol error: %s\n X Request %d (%s), Value=0x%x.",
+ buf, error->request_code, req_buf, (unsigned int)error->resourceid));
+ }
+ else {
+ XDVI_WARNING((stderr, "X protocol error: %s\n X Request %d (%s).",
+ buf, error->request_code, req_buf));
+ }
+ return 0;
+}
+
+static void
+display_version_info(void)
+{
+ printf("%s version %s ", XDVIK_PROGNAME, XDVI_VERSION);
+#ifdef MOTIF
+ printf("(%s, runtime version %d.%d)\n",
+ /* XmVERSION, XmREVISION, XmUPDATE_LEVEL, */
+ XmVERSION_STRING,
+ xmUseVersion / 1000, xmUseVersion % 1000);
+#else
+ printf("%s\n", XDVI_GUI);
+#endif
+#if FREETYPE
+ printf("Libraries: %s, freetype version %d.%d.%d\n",
+ kpathsea_version_string, FREETYPE_MAJOR, FREETYPE_MINOR, FREETYPE_PATCH);
+#else
+ printf("Libraries: %s\n", kpathsea_version_string);
+#endif
+}
+
+
+static void
+check_early_arguments(int argc, char **argv)
+{
+ /* This checks arguments that need to work before the X machinery is
+ * started (e.g. if no display is available, or for information that is
+ * needed before the X defaults are evaluated), so the `options' structure
+ * can't be used for them.
+ *
+ * We need to loop through all arguments in case xdvi is aliased,
+ * or called via a shell script (like in teTeX) that adds things
+ * like `-name' at the beginning of the arglist.
+ */
+ int i;
+ Boolean install_err_handler = True;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-help") == 0
+ || strcmp(argv[i], "-h") == 0
+ || strcmp(argv[i], "+help") == 0
+ || strcmp(argv[i], "--help") == 0) {
+ printf("%s version %s\n", XDVIK_PROGNAME, XDVI_VERSION_INFO);
+ printf("A DVI file previewer for the X window system.\n\n");
+ display_licensing_info();
+ display_bug_reporting_info();
+ usage(0);
+ }
+ else if (strcmp(argv[i], "-license") == 0) {
+ display_long_licensing_info();
+ xdvi_exit(EXIT_SUCCESS);
+ }
+ else if (strcmp(argv[i], "--version") == 0
+ || strcmp(argv[i], "-version") == 0
+ || strcmp(argv[i], "-v") == 0) {
+ display_version_info();
+ xdvi_exit(EXIT_SUCCESS);
+ }
+ else if (strcmp(argv[i], "--default-xerr-handler") == 0) { /* hook to disable custom handler */
+ install_err_handler = False;
+ }
+ }
+
+ if (install_err_handler) {
+ (void)XSetErrorHandler(x_error_handler);
+ }
+}
+
+/* initialize global variables with default values. */
+static void
+init_globals(void) {
+ globals.program_name = NULL;
+ globals.dvi_name = NULL;
+ globals.cwd = xgetcwd();
+ globals.orig_locale = NULL;
+ globals.debug = 0L;
+ globals.pageno_correct = 1;
+
+ globals.curr_paper = NULL;
+ globals.curr_editor = NULL;
+ globals.curr_browser = NULL;
+
+ globals.ev.flags = EV_IDLE;
+ globals.ev.ctr = 0;
+
+ globals.pausing.num = 0;
+ globals.pausing.num_save = NULL;
+ globals.pausing.flag = False;
+
+ globals.win_expose.min_x = 0;
+ globals.win_expose.max_x = 0;
+ globals.win_expose.min_y = 0;
+ globals.win_expose.max_y = 0;
+
+ globals.gc.rule = NULL;
+ globals.gc.fore = NULL;
+ globals.gc.inverted = NULL;
+ globals.gc.high = NULL;
+ globals.gc.linkcolor = NULL;
+ globals.gc.visited_linkcolor = NULL;
+ globals.gc.fore2 = NULL;
+ globals.gc.fore2_bak = NULL;
+ globals.gc.fore2_bak1 = NULL;
+ globals.gc.copy = NULL;
+ globals.gc.ruler = NULL;
+
+ globals.gc.do_copy = False;
+
+ globals.cursor.flags = 0;
+
+ globals.src.fwd_box_page = -1; /* -1 means no box */
+ globals.src.fwd_string = NULL;
+
+ globals.widgets.top_level = 0;
+ globals.widgets.draw_widget = 0;
+ globals.widgets.draw_background = 0;
+ globals.widgets.clip_widget = 0;
+ globals.widgets.x_bar = 0;
+ globals.widgets.y_bar = 0;
+#ifdef MOTIF
+ globals.widgets.main_window = 0;
+ globals.widgets.main_row = 0;
+ globals.widgets.tool_bar = 0;
+ globals.widgets.top_row = 0;
+ globals.widgets.menu_bar = 0;
+#else
+ globals.widgets.vport_widget = 0;
+ globals.widgets.form_widget = 0;
+ globals.widgets.paned = 0;
+#endif
+
+ globals.page.w = 0;
+ globals.page.h = 0;
+ globals.page.unshrunk_w = 0;
+ globals.page.unshrunk_h = 0;
+
+ globals.dvi_file.dirname = NULL;
+ globals.dvi_file.dirlen = 0;
+ globals.dvi_file.bak_fp = NULL;
+ globals.dvi_file.time = 0;
+
+#if defined(LESSTIF_VERSION)
+ globals.broken_motif_event_handling = True;
+#elif defined(MOTIF) /* was: && XmVersion <= 1002 - better use runtime information:*/
+ if (xmUseVersion <= 1002)
+ globals.broken_motif_event_handling = True;
+ else
+ globals.broken_motif_event_handling = False;
+#else
+ globals.broken_motif_event_handling = False;
+#endif
+
+}
+
+
+#ifdef GREY
+/*
+ * Convert string to yes/no/maybe. Adapted from the X toolkit.
+ */
+
+static Boolean
+XdviCvtStringToBool3(Display *dpy,
+ XrmValuePtr args, Cardinal *num_args,
+ XrmValuePtr fromVal, XrmValuePtr toVal,
+ XtPointer *closure_ret)
+{
+ String str = (String) fromVal->addr;
+ static Bool3 value;
+
+ UNUSED(args);
+ UNUSED(num_args);
+ UNUSED(closure_ret);
+
+ if (memicmp(str, "true", 5) == 0
+ || memicmp(str, "yes", 4) == 0
+ || memicmp(str, "on", 3) == 0 || memicmp(str, "1", 2) == 0)
+ value = True;
+
+ else if (memicmp(str, "false", 6) == 0
+ || memicmp(str, "no", 3) == 0
+ || memicmp(str, "off", 4) == 0 || memicmp(str, "0", 2) == 0)
+ value = False;
+
+ else if (memicmp(str, "maybe", 6) == 0)
+ value = Maybe;
+
+ else {
+ XtDisplayStringConversionWarning(dpy, str, XtRBoolean);
+ return False;
+ }
+
+ if (toVal->addr != NULL) {
+ if (toVal->size < sizeof(Bool3)) {
+ toVal->size = sizeof(Bool3);
+ return False;
+ }
+ *(Bool3 *) (toVal->addr) = value;
+ }
+ else
+ toVal->addr = (XPointer) & value;
+
+ toVal->size = sizeof(Bool3);
+ return True;
+}
+#endif
+
+/*
+************************************************************
+************************************************************
+main routine
+************************************************************
+************************************************************
+*/
+
+int
+main(int argc, char **argv)
+{
+ int i;
+ static struct startup_info info;
+ const char *file_name = NULL;
+ const char *file_name2 = NULL;
+
+ /* Hack to have command-line options override ~/.xdvirc stuff:
+ * Parse and merge them again from argv_bak, a copy of the command-line options,
+ * via XrmParseCommand(). I think the only alternative would be to merge in all
+ * resources manually instead of using XtInitialize(), similar to what's done in gv,
+ * but that looks like too much trouble.
+ */
+#define COMMANDLINE_OVERRIDE_HACK 1
+
+#if COMMANDLINE_OVERRIDE_HACK
+ int argc_bak;
+ char **argv_bak;
+#endif
+
+ setup_signal_handlers(True); /* catch USR1 early */
+
+ info.file_idx = 0;
+ info.page_arg = NULL;
+
+ /* BEGIN_TIMER_LOOP; */
+
+ init_globals();
+
+ /*
+ * Step 1: Process command-line options and resources.
+ */
+
+ globals.program_name = xstrdup(argv[0]);
+ { /* get filename from program_name if it contains a path */
+ char sep;
+ char *ptr;
+#ifdef VMS
+ sep = ']';
+#else
+ sep = '/';
+#endif
+ if ((ptr = strrchr(globals.program_name, sep)) != NULL) {
+ globals.program_name = ++ptr;
+ }
+#ifdef VMS
+ if ((ptr = strchr(globals.program_name, '.')) != NULL)
+ *ptr = '\0';
+#endif
+ }
+
+#if COMMANDLINE_OVERRIDE_HACK
+ /* create a copy of argv[] */
+ argc_bak = argc;
+ argv_bak = xmalloc((1 + argc_bak) * sizeof *argv_bak);
+ for (i = 0; i < argc_bak; i++) {
+ argv_bak[i] = xstrdup(argv[i]);
+ }
+ argv_bak[i] = NULL;
+#endif
+
+ /*
+ Arguments that need to be checked early, like `help', `version' and `sync'.
+ The former don't even require an X connection.
+ */
+ check_early_arguments(argc, argv);
+
+ warn_about_prerelease_versions();
+
+ /* We need to set up SIGALRM before calling XtAppAddTimeOut() (inside sfSelFile, or
+ called from XtInitialize() in Motif), otherwise we'll die with the error message
+ `Alarm clock'. However, we mustn't install SIGPOLL before the forking is done
+ below, otherwise xdvi may hang forever waiting for input. So the signal handler setup
+ is split in 2 parts: setup_sigalarm(), and setup_signal_handlers() below.
+ */
+ setup_sigalarm();
+
+ /* get the debug value (if any) from the environment
+ (it's too early to get it from the command line) */
+ globals.debug = parse_debugging_option(getenv("XDVIDEBUG"));
+
+ /* to make input of non-latin characters work */
+ XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL);
+
+ globals.widgets.top_level = XtInitialize(globals.program_name, "XDvi", options, XtNumber(options),
+ &argc, argv);
+
+ globals.app = XtWidgetToApplicationContext(globals.widgets.top_level);
+
+ XtAppAddActions(globals.app, get_actions(), get_num_actions());
+
+ /* create_magnifier(); */
+
+ if ((globals.orig_locale = setlocale(LC_ALL, "")) != NULL)
+ globals.orig_locale = xstrdup(globals.orig_locale); /* note: never free'd */
+ else /* fallback */
+ globals.orig_locale = xstrdup(setlocale(LC_ALL, NULL));
+
+ /* Override LC_NUMERIC, otherwise sscanf(), strtod() etc. won't work for floats
+ inside specials for locales like LANG=de_DE which uses `,' instead of `.' as
+ decimal separator. (Strangely, using
+ LC_CTYPE | LC_COLLATE
+ doesn't work?)
+ Regression:
+ xdvik/regression/special-pics/pictest.dvi
+ */
+ setlocale(LC_NUMERIC, "C");
+
+ /* at this point, all known options will have been consumed; so the
+ only ones remaining should be: +pageno, and the dvi name. Exit with
+ usage message if this is not the case. The convention is that the last
+ argument is always treated as filename (even if it starts with '-'),
+ so we throw an error if there's more than one unknown argument at the end.
+ */
+ for (i = 1; i < argc; i++) { /* skip argv[0] */
+ if (*(argv[i]) == '+') {
+ if (info.page_arg != NULL) {
+ XDVI_ERROR((stderr, "Unrecognized option `%s'.", argv[i]));
+ usage(EXIT_FAILURE);
+ }
+ else {
+ info.page_arg = argv[i] + 1;
+ }
+ }
+ else if (file_name == NULL) {
+ file_name = xstrdup(argv[i]); /* leaks, but never mind ... */
+ }
+ else {
+ /* we had already seen a filename */
+ XDVI_ERROR((stderr, "Unrecognized option `%s'.", argv[i - 1])); /* safe because we started at argv[1] */
+ usage(EXIT_FAILURE);
+ }
+ }
+
+ DISP = XtDisplay(globals.widgets.top_level);
+ SCRN = XtScreen(globals.widgets.top_level);
+
+#ifdef GREY
+ XtSetTypeConverter(XtRString, XtRBool3, XdviCvtStringToBool3,
+ NULL, 0, XtCacheNone, NULL);
+#endif
+
+#ifdef MOTIF
+ /* we'll take care of that ourselves */
+ XtVaSetValues(globals.widgets.top_level, XmNdeleteResponse, XmDO_NOTHING, NULL);
+
+ {
+ /* Hack to work around #884290 (drag&drop freezes file selector, see comment
+ in xm_filesel.c): Disable drag&drop altogether (we don't need it).
+ Could also be done via Xdefaults as follows:
+ XDvi*dragInitiatorProtocolStyle: XmDRAG_NONE
+ XDvi*dragReceiverProtocolStyle: XmDRAG_NONE
+ */
+ Widget display = XmGetXmDisplay(DISP);
+ XtVaSetValues(display,
+ XmNdragInitiatorProtocolStyle, XmDRAG_NONE,
+ XmNdragReceiverProtocolStyle, XmDRAG_NONE,
+ NULL);
+ }
+#else
+ G_accels_cr = XtParseAcceleratorTable("<Key>Return:set()notify()unset()\n"
+ "<Key>q:set()notify()unset()\n"
+ "<Key>Escape: set()notify()unset()");
+#endif
+
+ /* get the no_init_file resource first: This needs to be done
+ * before the call to XtGetApplicationResources() below, which populates
+ * the `resource' struct with the actual application resources (which
+ * may be merged from ~/.xdvirc). */
+ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource,
+ xdvirc_resources, XtNumber(xdvirc_resources),
+ (ArgList)NULL, 0);
+
+ if (!resource.no_init_file) { /* Read user preferences from ~/.xdvirc. */
+ read_user_preferences(globals.widgets.top_level, ".xdvirc");
+ }
+
+#if COMMANDLINE_OVERRIDE_HACK /* see above */
+ {
+ XrmDatabase cmdline_db = XrmGetDatabase(DISP);
+ XrmParseCommand(&cmdline_db, options, XtNumber(options),
+ "xdvi", &argc_bak, argv_bak);
+
+ for (i = 0; i < argc_bak; i++) {
+ free(argv_bak[i]);
+ }
+ free(argv_bak);
+ argc_bak = 0;
+ }
+#endif /* COMMANDLINE_OVERRIDE_HACK */
+
+ load_app_resources(False);
+
+ /* musn't do this, 0 is 'fit to window' (bug #1454648) */
+ /* if (resource.shrinkfactor == 0) /\* protect against division by 0 *\/ */
+ /* resource.shrinkfactor = 1; */
+ currwin.shrinkfactor = resource.shrinkfactor;
+ globals.curr_use_color = resource.use_color;
+ globals.curr_gamma = resource.gamma;
+ globals.curr_paper = xstrdup(resource.paper); /* never free()d */
+ globals.curr_editor = NULL;
+ globals.curr_browser = NULL;
+ globals.curr_mode = NO_MODE_ACTIVE;
+
+ /* Initialize `globals.debug' as early as possible. Note: earlier
+ * calls to TRACE_* or tests for `if (globals.debug)' will only work if the
+ * XDVIDEBUG environment variable is set!
+ */
+ globals.debug |= parse_debugging_option(resource.debug_arg);
+ kpathsea_debug = globals.debug / DBG_STAT;
+
+ if (globals.debug)
+ fprintf(stderr, "KPATHSEA_DEBUG = %d\n", kpathsea_debug);
+
+ kpse_init_prog("XDVI", resource.pixels_per_inch, resource.mfmode, resource.alt_font);
+
+ TRACE_FILES((stderr, "Initializing kpathsearch with program name '%s'",
+ xdvi_kpse_prog_name));
+ kpse_set_program_name(argv[0], xdvi_kpse_prog_name);
+
+ if (globals.debug & DBG_EXPAND) {
+ const char *texmfcnf = kpse_path_expand("$TEXMFCNF");
+ const char *texmfmain = kpse_path_expand("$TEXMFMAIN");
+ fprintf(stderr, "\n%s:%d: KPATHSEA variables:\n", __FILE__, __LINE__);
+ fprintf(stderr, "%s:%d: SELFAUTOLOC=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTOLOC"));
+ fprintf(stderr, "%s:%d: SELFAUTODIR=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTODIR"));
+ fprintf(stderr, "%s:%d: SELFAUTOPARENT=\"%s\"\n", __FILE__, __LINE__, getenv("SELFAUTOPARENT"));
+ fprintf(stderr, "%s:%d: TEXMFCNF=\"%s\"\n", __FILE__, __LINE__, texmfcnf);
+ fprintf(stderr, "%s:%d: TEXMFMAIN=\"%s\"\n\n", __FILE__, __LINE__, texmfmain);
+ }
+
+ if (resource.regression) {
+ /* currently it just turns on everything; what we'd like here is
+ output that's usable for automatic diffs (e.g. independent
+ of window manager state) */
+ globals.debug = DBG_ALL;
+ }
+
+ /* Check early for whether to pass off to a different xdvi process
+ * (-sourceposition argument for reverse source special lookup).
+ */
+ property_initialize();
+
+#if 0 /* def RGB_ANTI_ALIASING */
+ /* error checking and setting of resources according to command line arguments */
+ if (resource.sub_pixels != NULL && memicmp(resource.sub_pixels, "unknown", 4) == 0) {
+#ifdef __GNUC__
+#warning TODO: implement callbacks
+#endif
+ choice_dialog_sized(globals.widgets.top_level,
+ MSG_QUESTION,
+ SIZE_MEDIUM,
+ NULL,
+#ifndef MOTIF
+ NULL, /* TODO: xaw ret_action_str */
+#endif
+ NULL, NULL, /* pre callback */
+ "Enable", NULL, NULL,
+ "Disable", NULL, NULL,
+ "This version of xdvi can optimize the anti-aliased font display "
+ "when running on an LCD monitor, such as a notebook screen or a TFT flat screen."
+ "\n\n"
+ "If you are using such a monitor, click `Enable' to enable optimized display; otherwise click `Disable'."
+ "\n\n"
+ "You can change this setting later via the Menu `Options -> Anti-Aliasing'.");
+ /* enter event loop */
+ do_pages();
+ }
+ else {
+#endif
+ init_check_resources();
+
+ TRACE_FILES((stderr, "file history: |%s|", resource.file_history));
+ file_history_init();
+
+#if !DELAYED_MKTEXPK
+ /* Notify users that fonts might be created. This is just a hack
+ and no replacement for true asynchronous font creation since it
+ doesn't give details (is just invoked if startup takes somewhat
+ longer) and freezes during font creation.
+ */
+/* register_font_popup(); */
+#endif
+
+ if (file_name == NULL) { /* no filename argument */
+
+ if (resource.no_file_arg_use_history) {
+ static char buf[LENGTH_OF_INT]; /* so that we can pass its address */
+ int pageno;
+ if ((file_name = get_filename_from_history(&pageno)) != NULL) {
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", pageno + 1); /* pageno is 0-based */
+ info.page_arg = buf;
+ }
+ }
+
+ TRACE_FILES((stderr, "got from history: |%s|", file_name));
+
+ if (file_name != NULL) {
+ run_dvi_file(file_name, &info);
+ }
+ else { /* get filename from file selector */
+ /* static so that we can pass its address */
+ static struct filesel_callback cb = {
+ NULL, NULL, "Xdvi: Open file", "Open file:", "OK", "Cancel",
+ NULL, "*.dvi", True, True, NULL, NULL
+ };
+ cb.func_ptr = run_dvi_file;
+ cb.data = &info;
+ cb.browse_fname = xt_strdup(globals.cwd);
+
+ if (cb.shell == NULL)
+ cb.shell = XsraSelFile(globals.widgets.top_level, &cb);
+ XsraSelFilePopup(&cb);
+ /* enter event loop */
+ do_pages();
+ }
+ }
+ else if ((file_name2 = is_good_dvi_file(file_name, False)) != NULL) {
+ run_dvi_file(file_name2, &info);
+ }
+#if 0 /* def RGB_ANTI_ALIASING */
+ }
+#endif
+ /* notreached */
+ return 0;
+}
diff --git a/Build/source/texk/xdvik/mime.c b/Build/source/texk/xdvik/mime.c
new file mode 100644
index 00000000000..278a5fe10ad
--- /dev/null
+++ b/Build/source/texk/xdvik/mime.c
@@ -0,0 +1,661 @@
+/* Copyright (c) 1994-1999 All rights reserved. */
+/* Written from scratch July 30, 1994, by A. P. Smith. */
+
+/* Copyright (c) 2003-2004 the xdvik development team */
+
+/*
+ Read mime.types and mailcap entries to check what
+ viewers to invoke on a new file.
+
+ Patch by Allin Cottrell (cottrell@ricardo.ecn.wfu.edu) to
+ invokeviewer applied 30/11/98.
+
+ Patched further in january 1999 by Nicolai Langfeldt
+ (janl@math.uio.no) to allow saner mime typing.
+
+ Rewritten by Stefan Ulrich <stefanulrich@users.sourceforge.net>
+ on 2003/03/25 for better RFC 1343 conformance.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "hypertex.h"
+#include "xdvi-debug.h"
+#include "util.h"
+#include "string-utils.h"
+#include "mime.h"
+#include "browser.h"
+#include "message-window.h"
+
+#include <ctype.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/variable.h"
+#include "kpathsea/c-pathmx.h"
+
+/* default settings if $EXTENSIONMAPS and $MAILCAPS is not set */
+
+static const char *const DEFAULT_EXTENSIONMAPS =
+"$HOME/.mime.types:/etc/mime.types:/usr/etc/mime.types:/usr/local/etc/mime.types";
+
+static const char *const DEFAULT_MAILCAPS =
+"$HOME/.mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap";
+
+struct mime_map {
+ char *content_type;
+ char *extensions;
+};
+
+static struct mime_map default_mimemap[] = {
+ {"application/postscript", "ai eps epsf ps",},
+ {"application/octet-stream", "bin",},
+ {"application/oda", "oda",},
+ {"application/pdf", "pdf",},
+ {"application/rtf", "rtf",},
+ {"application/x-mif", "mif",},
+ {"application/x-csh", "csh",},
+ {"application/x-dvi", "dvi Dvi DVI",},
+ {"application/x-hdf", "hdf",},
+ {"application/x-latex", "latex",},
+ {"application/x-netcdf", "nc cdf",},
+ {"application/x-sh", "sh",},
+ {"application/x-tcl", "tcl",},
+ {"application/x-tex", "tex",},
+ {"application/x-texinfo", "texinfo texi",},
+ {"application/x-troff", "t tr roff",},
+ {"application/x-troff-man", "man",},
+ {"application/x-troff-me", "me",},
+ {"application/x-troff-ms", "ms",},
+ {"application/x-wais-source", "src",},
+ {"application/zip", "zip",},
+ {"application/x-bcpio", "bcpio",},
+ {"application/x-cpio", "cpio",},
+ {"application/x-gtar", "gtar",},
+ {"application/x-shar", "shar",},
+ {"application/x-sv4cpio", "sv4cpio",},
+ {"application/x-sv4crc", "sv4crc",},
+ {"application/x-tar", "tar",},
+ {"application/x-ustar", "ustar",},
+ {"audio/basic", "au snd",},
+ {"audio/x-aiff", "aif aiff aifc",},
+ {"audio/x-wav", "wav",},
+ {"image/gif", "gif",},
+ {"image/ief", "ief",},
+ {"image/jpeg", "jpeg jpg jpe",},
+ {"image/tiff", "tiff tif",},
+ {"image/x-cmu-raster", "ras",},
+ {"image/x-portable-anymap", "pnm",},
+ {"image/x-portable-bitmap", "pbm",},
+ {"image/x-portable-graymap", "pgm",},
+ {"image/x-portable-pixmap", "ppm",},
+ {"image/x-rgb", "rgb",},
+ {"image/x-xbitmap", "xbm",},
+ {"image/x-xpixmap", "xpm",},
+ {"image/x-xwindowdump", "xwd",},
+ {"text/html", "html htm sht shtml",},
+ {"text/plain", "txt",},
+ {"text/richtext", "rtx",},
+ {"text/tab-separated-values", "tsv",},
+ {"text/x-setext", "etx",},
+ {"video/mpeg", "mpeg mpg mpe",},
+ {"video/quicktime", "qt mov",},
+ {"video/x-msvideo", "avi",},
+ {"video/x-sgi-movie", "movie",},
+ {"application/gzip", "gz",},
+ {"application/compress", "Z",},
+ {"application/bzip", "bz",},
+ {"application/bzip2", "bz2",},
+};
+
+
+struct mailcap_map {
+ char *content_type;
+ const char *command; /* command string */
+ const char *testcmd; /* value of the `test=' field, or NULL if no test field present */
+ Boolean needsterminal; /* whether the `needsterminal' flag has been specified for this entry */
+ const char *format_string; /* format specifier ("%s" or "%u" or "") */
+};
+
+static struct mailcap_map default_mailcap[] = {
+ {"audio/*", "showaudio %s", NULL, False, "%s"},
+ {"image/*", "xv %s", NULL, False, "%s"},
+ {"video/mpeg", "mpeg_play %s", NULL, False, "%s"},
+ {"application/pdf", "acroread %s", NULL, False, "%s"},
+ {"text/html", "netscape-raise -remote 'openURL(%s,new-window)'", NULL, False, "%s"},
+ {"application/postscript", "ghostview %s", NULL, False, "%s"},
+ {"application/x-dvi", "xdvi %s", NULL, False, "%s"},
+};
+
+static struct mime_map *m_mimemap = NULL;
+static int m_mimemap_currlen = 0;
+static int m_mimemap_size = 0;
+
+static struct mailcap_map *m_mailcap = NULL;
+static int m_mailcap_currlen, m_mailcap_size = 0;
+
+static const size_t MIME_ALLOC_STEP = 64;
+
+/* Utility function:
+ Read a line from a config file, dealing with continued lines
+ (ending with '\[ \t]*').
+ The *linebuf argument is re-alloced as needed from its initial size alloc_len.
+ The length of the read line is returned as ret_len.
+ The lineno int is by the number of lines read.
+ Trailing whitespace and newline is removed, and either the line,
+ or NULL for EOF is returned.
+*/
+static char *
+read_config_line(const char *filename, FILE *fp, char **linebuf,
+ size_t alloc_len, size_t *ret_len,
+ int *lineno)
+{
+ Boolean read_complete_line = False;
+ *ret_len = 0;
+ while (!read_complete_line) {
+ if ((fgets((*linebuf) + *ret_len, alloc_len - *ret_len, fp)) == NULL) {
+ if (*ret_len == 0) /* at EOF */
+ return NULL;
+ else /* nothing read, but we have a result from previous loop iteration */
+ return *linebuf;
+ }
+ (*lineno)++;
+ *ret_len = strlen(*linebuf);
+ if (*ret_len > 0 && (*linebuf)[*ret_len - 1] != '\n') {
+ /* catch the special case of missing NL at EOF */
+ if (*ret_len < alloc_len - 1) {
+ XDVI_WARNING((stderr, "%s, line %d: missing newline at end of file.", filename, *lineno));
+ return *linebuf;
+ }
+ /* buffer too short, need to re-allocate */
+ alloc_len *= 2;
+ *linebuf = xrealloc(*linebuf, alloc_len);
+ }
+ else if (*ret_len > 2
+ && (*linebuf)[*ret_len - 1] == '\n'
+ && ((*linebuf)[*ret_len - 2] == '\\'
+ || isspace((int)(*linebuf)[*ret_len - 2]))) {
+ /* we may have a continued line */
+ /* chop off trailing whitespace */
+ while (*ret_len > 1 && isspace((int)(*linebuf)[*ret_len - 2]))
+ (*ret_len)--;
+ if (*ret_len > 1 && (*linebuf)[*ret_len - 2] != '\\') { /* no continued line */
+ read_complete_line = True;
+ }
+ else /* overwrite backslash and newline at next read */
+ *ret_len -= 2;
+ }
+ else
+ read_complete_line = True;
+ }
+ /* chop off trailing NL */
+ (*linebuf)[--(*ret_len)] = '\0';
+ return *linebuf;
+}
+
+static void
+read_mime_file(FILE *fp, const char *filename, int *mime_line)
+{
+ int i;
+ const size_t line_len = 1024;
+ size_t ret_len = 0;
+ char *linebuf = xmalloc(line_len);
+ char *cp, *cp2;
+
+ int dummy = 0;
+ TRACE_HTEX((stderr, "reading mime file \"%s\"", filename));
+ while ((read_config_line(filename, fp, &linebuf, line_len, &ret_len, &dummy)) != NULL) {
+ if (linebuf[ret_len] == '\n')
+ linebuf[ret_len] = '\0';
+
+ cp = linebuf;
+ while (isspace((int)*cp))
+ cp++;
+ if (*cp == '#')
+ continue;
+
+ /* split either on tab or on whitespace */
+ if ((cp2 = strchr(cp, '\t')) == NULL && (cp2 = strchr(cp, ' ')) == NULL)
+ continue;
+ *cp2 = '\0'; /* Terminate cp string */
+ cp2++;
+ while (isspace((int)*cp2))
+ cp2++;
+ if (*cp2 == '\0')
+ continue; /* No extensions list */
+ if (*mime_line >= m_mimemap_size) {
+ m_mimemap_size += MIME_ALLOC_STEP;
+ m_mimemap = xrealloc(m_mimemap, m_mimemap_size * sizeof *m_mimemap);
+ for (i = *mime_line; i < m_mimemap_size; i++) {
+ m_mimemap[i].content_type = m_mimemap[i].extensions = NULL;
+ }
+ }
+#if 0
+ fprintf(stderr, "========== type %d: |%s| extension: |%s|\n", *mime_line, cp, cp2);
+#endif
+ free(m_mimemap[*mime_line].content_type);
+ m_mimemap[*mime_line].content_type = xstrdup(cp);
+ free(m_mimemap[*mime_line].extensions);
+ m_mimemap[*mime_line].extensions = xstrdup(cp2);
+
+ (*mime_line)++;
+ }
+ free(linebuf);
+}
+
+static char *
+maybe_expand_homedir(const char *path)
+{
+ char *newpath = NULL;
+ TRACE_HTEX((stderr, "maybe_expand_homedir: |%s|", path));
+ if (memcmp(path, "$HOME", strlen("$HOME")) == 0) {
+ newpath = xstrdup(getenv("HOME"));
+ newpath = xstrcat(newpath, path + strlen("$HOME"));
+ }
+ else if (path[0] == '~') {
+ newpath = expand_homedir(path);
+ if (newpath == NULL) {
+ XDVI_WARNING((stderr, "Couldn't expand path `%s'", path));
+ }
+ }
+ TRACE_HTEX((stderr, "maybe_expand_homedir: after expansion: |%s|", newpath ? newpath : "<NULL>"));
+ return newpath;
+}
+
+
+static void
+read_mailcap(FILE *fp, const char *filename, int *mailcap_line)
+{
+ size_t alloc_len = 1024;
+ size_t ret_len = 0;
+ char *linebuf = xmalloc(alloc_len);
+ int lineno = 0;
+
+ TRACE_HTEX((stderr, "reading mailcap file \"%s\"", filename));
+
+ while ((read_config_line(filename, fp, &linebuf, alloc_len, &ret_len, &lineno)) != NULL) {
+ Boolean error = False;
+ int i;
+ size_t n, num_items;
+ char **items;
+ char *ptr = linebuf;
+
+ while (isspace((int)*ptr)) {
+ ptr++;
+ ret_len--;
+ }
+ if (*ptr == '#' || *ptr == '\0') /* comments or empty lines */
+ continue;
+
+ /* split line into fields */
+ items = split_line(ptr, ';', 0, ret_len, &num_items);
+
+ if (num_items == 0) {
+ XDVI_WARNING((stderr, "%s, line %d: skipping malformed line \"%s\" (no command specified)",
+ filename, lineno, linebuf));
+ error = True;
+ }
+ else if (num_items == 1 || (num_items >= 2 && strlen(items[1]) == 0)) {
+ XDVI_WARNING((stderr, "%s, line %d: skipping malformed line \"%s\" (empty command)",
+ filename, lineno, linebuf));
+ error = True;
+ }
+
+ if (error) {
+ for (n = 0; n < num_items; n++)
+ free(items[n]);
+ free(items);
+ continue;
+ }
+
+ /* resize m_mailcap */
+ while (*mailcap_line >= m_mailcap_size) {
+ m_mailcap_size += MIME_ALLOC_STEP;
+ m_mailcap = xrealloc(m_mailcap, m_mailcap_size * sizeof *m_mailcap);
+ for (i = *mailcap_line; i < m_mailcap_size; i++) {
+ m_mailcap[i].content_type = NULL;
+ m_mailcap[i].command = NULL;
+ m_mailcap[i].needsterminal = False;
+ m_mailcap[i].testcmd = NULL;
+ }
+ }
+
+ for (n = 0; n < num_items; n++) {
+ if (n == 0) { /* first field: content-type */
+ m_mailcap[*mailcap_line].content_type = items[n];
+ /*
+ * add \/\* to content-type if it only consists of one field
+ * (it's not clear to me from RFC 1343 how this should be handled)
+ */
+ if (strchr(m_mailcap[*mailcap_line].content_type, '/') == NULL) {
+ m_mailcap[*mailcap_line].content_type = xstrcat(m_mailcap[*mailcap_line].content_type, "/*");
+ }
+ }
+ else if (memcmp(items[n], "test=", strlen("test=")) == 0) {
+ m_mailcap[*mailcap_line].testcmd = xstrdup(items[n] + strlen("test="));
+ free(items[n]);
+ }
+ else if (memcmp(items[n], "needsterminal", strlen("needsterminal")) == 0) { /* set flag */
+ m_mailcap[*mailcap_line].needsterminal = True;
+ free(items[n]);
+ }
+ else if (memcmp(items[n], "copiousoutput", strlen("copiousoutput")) == 0
+ || memcmp(items[n], "compose=", strlen("compose=")) == 0
+ || memcmp(items[n], "composetyped=", strlen("composetyped=")) == 0
+ || memcmp(items[n], "print=", strlen("print=")) == 0
+ || memcmp(items[n], "edit=", strlen("edit=")) == 0
+ || memcmp(items[n], "x11-bitmap=", strlen("x11-bitmap=")) == 0
+ || memcmp(items[n], "description=", strlen("description=")) == 0) {
+ free(items[n]);
+ continue;
+ }
+ else { /* command field */
+ m_mailcap[*mailcap_line].command = items[n];
+
+ if (find_format_str(m_mailcap[*mailcap_line].command, "%s") != NULL)
+ m_mailcap[*mailcap_line].format_string = "%s";
+ else if (find_format_str(m_mailcap[*mailcap_line].command, "%u") != NULL)
+ m_mailcap[*mailcap_line].format_string = "%u";
+ else
+ m_mailcap[*mailcap_line].format_string = "";
+ }
+ }
+ free(items);
+
+ (*mailcap_line)++;
+ }
+ free(linebuf);
+}
+
+/* parse mime or mailcap file, return true if successful. */
+static Boolean
+parse_mime_mailcap(const char *env_var,
+ const char *default_var_value,
+ int *lines,
+ void(*parse_func)(FILE *fp, const char *filename, int *mime_line))
+{
+ const char *path = NULL;
+ char **path_elems;
+ size_t elem_cnt, i;
+ FILE *fp;
+ Boolean success = False;
+
+ if ((path = getenv(env_var)) == NULL) {
+ path = default_var_value;
+ }
+
+ path_elems = split_line(path, ':', 0, strlen(path), &elem_cnt);
+ for (i = 0; i < elem_cnt; i++) {
+ char *newpath;
+ /* expand paths */
+ if ((newpath = maybe_expand_homedir(path_elems[i])) != NULL) {
+ free(path_elems[i]);
+ path_elems[i] = newpath;
+ }
+
+ if ((fp = XFOPEN(path_elems[i], FOPEN_R_MODE)) != NULL) {
+ parse_func(fp, path_elems[i], lines);
+ success = True;
+ }
+ free(path_elems[i]);
+ }
+ free(path_elems);
+ return success;
+}
+
+static void
+parsemimes(void)
+{
+ static Boolean already_called = False;
+
+ if (already_called)
+ return;
+ already_called = True;
+
+ m_mimemap_currlen = 0;
+
+ if (!parse_mime_mailcap("EXTENSIONMAPS", DEFAULT_EXTENSIONMAPS, &m_mimemap_currlen, read_mime_file)) {
+ m_mimemap_currlen = XtNumber(default_mimemap);
+ m_mimemap = default_mimemap;
+ }
+}
+
+
+/*
+ Partial parsing of mailcap file.
+
+ Currently not implemented:
+ - specifiers %t, %{xyz}, %n, %F
+ - realplayer's %u is treated as %s (couldn't find any documentation on %u)
+*/
+static void
+parsemailcap(void)
+{
+ static Boolean already_called = False;
+
+ if (already_called)
+ return;
+
+ already_called = True;
+
+ m_mailcap_currlen = 0;
+
+ if (!parse_mime_mailcap("MAILCAPS", DEFAULT_MAILCAPS, &m_mailcap_currlen, read_mailcap)) {
+ m_mailcap_currlen = XtNumber(default_mailcap);
+ m_mailcap = default_mailcap;
+ }
+}
+
+
+/*
+ Try to match test against a content type definition pattern.
+ The strings have one of the following formats (ignore spaces around `/'
+ - these are just to avoid breaking the C comment syntax):
+ * / *
+ text / *
+ * / plain
+ text / plain
+ where * matches everything.
+*/
+static Boolean
+match_content_type(const char *pattern, const char *test)
+{
+ /* chop both strings into parts at the '/' */
+ char *subtype_pattern, *subtype_test;
+ if ((subtype_pattern = strchr(pattern, '/')) == NULL) { /* malformed string? */
+ XDVI_WARNING((stderr, "Malformed content-type \"%s\" (should be \"type/subtype\")", pattern));
+ return False;
+ }
+ subtype_pattern++;
+ if ((subtype_test = strchr(test, '/')) == NULL) { /* malformed string? */
+ XDVI_WARNING((stderr, "Malformed content-type \"%s\" (should be \"type/subtype\")", test));
+ return False;
+ }
+ subtype_test++;
+ /* check whether it either matches the strings or a wildcard */
+ if ((*pattern == '*' && *subtype_pattern == '*') ||
+ (*pattern == '*' && strcmp(subtype_pattern, subtype_test) == 0) ||
+ (*subtype_pattern == '*' && memcmp(pattern, test, subtype_test - test) == 0) ||
+ (strcmp(subtype_pattern, subtype_test) == 0 && memcmp(pattern, test, subtype_test - test) == 0)) {
+ return True;
+ }
+ return False;
+}
+
+static Boolean
+run_test_command(const char *cmd, const char *arg)
+{
+ int retval;
+ const char *ptr;
+ size_t len;
+ char *syscmd = NULL;
+
+ UNUSED(arg); /* FIXME */
+ if (cmd == NULL)
+ return True;
+
+ syscmd = xmalloc(strlen(cmd) + strlen(arg) + 1);
+ if ((ptr = find_format_str(cmd, "%s")) != NULL) {
+ len = 2;
+ }
+ else if ((ptr = find_format_str(cmd, "%u")) != NULL) {
+ len = 2;
+ }
+ else {
+ len = 0;
+ ptr = strchr(cmd, '\0');
+ }
+ /* build system command */
+ memcpy(syscmd, cmd, ptr - cmd);
+ if (len > 0) { /* append argument */
+ strcpy(syscmd + (ptr - cmd), arg);
+ strcpy(syscmd + (ptr - cmd) + strlen(arg), ptr + len);
+ }
+ else {
+ syscmd[ptr - cmd] = '\0';
+ }
+
+ retval = system(syscmd);
+ TRACE_HTEX((stderr, "Execution of test command `%s' returned value %d", syscmd, retval));
+ free(syscmd);
+ return retval == 0;
+}
+
+char *
+figure_viewer(const char *content_type, const char **format_string, Boolean *needs_terminal, const char *arg)
+{
+ int i;
+
+ /* Hardwire xdvi for this MIME type so that xdvizilla isn't used,
+ which would be too dangerous since xdvizilla tries to unlink
+ the DVI file by default. There might be other DVI viewers, but
+ since the user invoking this from xdvi anyway ...
+
+ FIXME: A better way would be to always copy the original file, like
+ e.g. Acroread does it; see comment in launch_program(), hypertex.c.
+
+ Furthermore, xdvizilla has been retired in the meantime.
+ */
+ /* FIXME: why do we actually need format_string - why not sprintf()
+ directly into the target?
+ */
+ if (strcmp(content_type, "application/x-dvi") == 0) {
+ *format_string = "%s";
+ *needs_terminal = False;
+ return xstrdup("xdvi %s");
+ }
+ /* try each command from our mailcap list */
+ for (i = 0; i < m_mailcap_currlen; i++) {
+ if (globals.debug & DBG_HTEX) {
+ fprintf(stderr, "type |%s| viewer |%s| needsterminal=%s testcmd |%s|\n",
+ m_mailcap[i].content_type, m_mailcap[i].command,
+ m_mailcap[i].needsterminal ? "yes" : "no",
+ m_mailcap[i].testcmd ? m_mailcap[i].testcmd : "None");
+ }
+ if (match_content_type(m_mailcap[i].content_type, content_type)
+ && run_test_command(m_mailcap[i].testcmd, arg)) {
+ *format_string = m_mailcap[i].format_string;
+ *needs_terminal = m_mailcap[i].needsterminal;
+ return xstrdup(m_mailcap[i].command);
+ }
+ }
+ /* failure */
+ return NULL;
+}
+
+
+/* return the mime type for filename, or default types
+ for non-recognized extensions/no extensions */
+char *
+figure_mime_type(const char *filename)
+{
+ int i;
+ char *extension, *cp;
+ char *content_type = NULL;
+
+ /* First check for the mailcap and mime files */
+ parsemimes();
+ parsemailcap();
+
+ if (globals.debug & DBG_HTEX)
+ fprintf(stderr, "figure_mime_type: Called to find type of %s\n",
+ filename);
+
+ /* See if this is a directory */
+ if (filename[strlen(filename) - 1] == '/') {
+ if (globals.debug & DBG_HTEX)
+ fprintf(stderr, "It's a directory, returning unknownExtensionMimeType: %s\n",
+ resource.unknown_mime_suffix);
+ return resource.unknown_mime_suffix;
+ }
+
+ /* See if filename extension is on the mime list: */
+ extension = strrchr(filename, '.');
+
+ if (extension == NULL) {
+ TRACE_HTEX((stderr,
+ "No extension, defaulting to noExtensionMimeType: %s\n",
+ resource.no_mime_suffix));
+ return resource.no_mime_suffix;
+ }
+ extension++;
+ /*
+ * corrupt URLs might have empty extensions; we need to catch this,
+ * since the while loop below would not terminate in that case:
+ */
+ if (strcmp(extension, "") == 0) {
+ XDVI_WARNING((stderr, "Empty extension for file name or URL `%s'\n", filename));
+ return resource.no_mime_suffix;
+ }
+
+ for (i = 0; i < m_mimemap_currlen; i++) {
+ /*
+ * find extension in m_mimemap[i].extensions, a space-separated list
+ * of extension strings.
+ */
+ cp = m_mimemap[i].extensions;
+ while ((cp = strstr(cp, extension)) != NULL) {
+ if ((cp - m_mimemap[i].extensions > 0) && (cp[-1] != ' ')) {
+ cp++;
+ continue;
+ }
+ cp += strlen(extension);
+ if ((*cp != ' ') && (*cp != '\0'))
+ continue;
+ content_type = m_mimemap[i].content_type;
+ break;
+ }
+ if (content_type != NULL)
+ break;
+ }
+
+ if (content_type == NULL) {
+ content_type = xstrdup(resource.unknown_mime_suffix);
+ TRACE_HTEX((stderr,
+ "Unknown extension, defaulting to unknownExtensionMimeType: %s",
+ content_type));
+ }
+ else {
+ TRACE_HTEX((stderr, "Found mime type: %s", content_type));
+ }
+
+ return content_type;
+}
+
diff --git a/Build/source/texk/xdvik/mime.h b/Build/source/texk/xdvik/mime.h
new file mode 100644
index 00000000000..a637e2bd87f
--- /dev/null
+++ b/Build/source/texk/xdvik/mime.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef MIME_H_
+#define MIME_H_
+
+extern char *figure_mime_type(const char *filename);
+extern char *figure_viewer(const char *mime_type, const char **format_string, Boolean *needs_terminal, const char *arg);
+
+#endif /* MIME_H_ */
diff --git a/Build/source/texk/xdvik/mksedscript b/Build/source/texk/xdvik/mksedscript
new file mode 100755
index 00000000000..7238513d453
--- /dev/null
+++ b/Build/source/texk/xdvik/mksedscript
@@ -0,0 +1,119 @@
+#! /bin/sh
+
+srcdir=$1
+
+# Values from c-auto.h
+
+mk_GREY=
+mk_PS_GS=
+mk_GS_PATH='gs'
+mk_PS_DPS=
+mk_PS_NEWS=
+mk_A4=
+mk_MOTIF=
+mk_COLOR=
+mk_HAVE_XI21=
+
+# T1 is always true
+mk_T1=1
+
+# Kpathsea defaults, they are #if'ed in the source but there is no
+# config option to disable them.
+mk_KPATHSEA=1
+
+# Optional values from CFLAGS
+
+mk_MFMODE='unspecified'
+mk_BDPI=600
+mk_DEFAULT_FONT_SIZES='m0:m0.5:m1:m2:m3:m4:m5'
+mk_SHRINK=8
+
+# Get arguments from CFLAGS
+
+for mk_arg
+do
+ case "$mk_arg" in
+ -D*=*)
+ eval "`echo \"$mk_arg\" | sed 's/^-D/mk_/'`"
+ ;;
+ -D*)
+ eval "`echo \"$mk_arg\" | sed 's/^-D/mk_/'`=1"
+ ;;
+ esac
+done
+
+# Get arguments from c-auto.h
+
+# Skip all problematic #define's
+# such as: #define ICONV_CHAR_PPTR_TYPE char **
+# or: #define PACKAGE_STRING "xdvik 22.85"
+eval "`awk '/^#define/ { if (NF == 3) print "mk_"$2"="$3 }' c-auto.h`"
+
+# eval "`cat c-auto.h \
+# | grep '^[ ]*#[ ]*define[ ]' \
+# | sed 's/^[ ]*#[ ]*define[ ][ ]*/mk_/' \
+# | sed 's/[ ][ ]*/=/'`"
+
+# Process simple boolean arguments. Their values are empty or nonempty
+
+if test -z "$mk_COLOR"; then echo '/^#ifcolor/,/^#/d'; fi
+if test -z "$mk_GREY"; then echo '/^#ifgrey/,/^#/d'; fi
+if test -z "$mk_PS_DPS"; then echo '/^#ifdps/,/^#/d'; fi
+if test -z "$mk_PS_NEWS"; then echo '/^#ifnews/,/^#/d'; fi
+if test -z "$mk_T1"; then echo '/^#ift1/,/^#/d'; fi
+if test -z "$mk_HAVE_XI21"; then echo '/^#ifxi21/,/^#/d'; fi
+if test -z "$mk_MOTIF"; then echo '/^#ifmotif/,/^#/d';
+ else echo '/^#ifxaw/,/^#/d'; fi
+
+if test -z "$mk_KPATHSEA"; then echo '/^#ifkpathsea/,/^#/d';
+ else echo '/^#ifnokpathsea/,/^#/d'; fi
+
+# Process remaining PostScript emulation arguments
+
+if test -z "$mk_PS_GS"; then
+ echo '/^#ifghost/,/^#/d'
+else
+ echo "s^@GS_PATH@^$mk_GS_PATH^"
+fi
+
+if test -n "$mk_PS_GS" || test -n "$mk_PS_DPS" || test -n "$mk_PS_NEWS"; then
+ mk_PS=y
+ echo '/^#ifnops/,/^#/d'
+else
+ mk_PS=
+ echo '/^#ifps/,/^#/d'
+fi
+
+# get version info and release date from CHANGES file
+
+spacetab=' '
+XDVI_VERSION_INFO=`egrep "^[$spacetab]+\*" $srcdir/CHANGES | sed 1q | awk '{print $2 " " $3}'`
+XDVI_VERSION=`echo $XDVI_VERSION_INFO | awk '{print $1}'`
+XDVI_DATE=`echo $XDVI_VERSION_INFO | awk '{print $2}' | sed 's/[():]//g'`
+
+# Miscellaneous args
+
+if test -n "$mk_A4"; then
+ echo 's/@DEFAULT_PAGE_SIZE@/21 x 29.7 cm (A4 size)/'
+ echo 's/@DEFAULT_UNIT@/cm " (centimeters)"/'
+else
+ echo 's/@DEFAULT_PAGE_SIZE@/8.5 x 11 inches/'
+ echo 's/@DEFAULT_UNIT@/in " (inches)"/'
+fi
+
+echo "s^@MFMODE@^$mk_MFMODE^"
+echo "s/@BDPI@/$mk_BDPI/"
+echo "s/@SHRINK@/$mk_SHRINK/"
+echo "s/@XDVI_VERSION@/$XDVI_VERSION/"
+echo "s^@XDVI_DATE@^$XDVI_DATE^"
+
+echo "s/@DEFAULT_FONT_SIZES@/$mk_DEFAULT_FONT_SIZES/" | sed -e "s/:/ :\\\\\\
+/g"
+
+# Remove all remaining '#' lines
+
+echo '/^#/d'
+
+# Done
+
+exit 0
diff --git a/Build/source/texk/xdvik/my-snprintf.c b/Build/source/texk/xdvik/my-snprintf.c
new file mode 100644
index 00000000000..6bf2e5a3f30
--- /dev/null
+++ b/Build/source/texk/xdvik/my-snprintf.c
@@ -0,0 +1,60 @@
+/*------------------------------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------*/
+
+#include "xdvi-config.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#include "xdvi.h"
+#include "my-vsnprintf.h"
+#include "my-snprintf.h"
+
+#ifndef HAVE_SNPRINTF
+/*------------------------------------------------------------
+ * my_snprintf - emulation of glibc2.1 snprintf, use if
+ * snprintf is not available
+ *
+ * Arguments:
+ * char *str - buffer to print <format> string into
+ * int size - print only len characters of <format>
+ * char *format - variable format list
+ *
+ * Returns:
+ * int size - number of characters that would have been
+ * written if enough space had been available
+ *
+ * Purpose:
+ * Implementation of snprintf function, using my_vsnprintf
+ * (which see).
+ *------------------------------------------------------------*/
+int my_snprintf(char *str, size_t size, const char *format, ...)
+{
+ va_list args;
+ int retVal;
+
+ va_start(args, format);
+ retVal = VSNPRINTF(str, size, format, args);
+ va_end(args);
+
+ return retVal;
+}
+#endif
diff --git a/Build/source/texk/xdvik/my-snprintf.h b/Build/source/texk/xdvik/my-snprintf.h
new file mode 100644
index 00000000000..5a5bbe6f275
--- /dev/null
+++ b/Build/source/texk/xdvik/my-snprintf.h
@@ -0,0 +1,36 @@
+/*------------------------------------------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------*/
+
+#ifndef MY_SNPRINTF_H_
+#define MY_SNPRINTF_H_
+
+#ifdef HAVE_SNPRINTF
+
+#define SNPRINTF snprintf
+
+#else
+
+#define SNPRINTF my_snprintf
+int SNPRINTF(char *str, size_t size, const char *format, ...);
+
+#endif /* HAVE_SNPRINTF */
+#endif /* MY_VSNPRINTF_H_ */
+
diff --git a/Build/source/texk/xdvik/my-vsnprintf.c b/Build/source/texk/xdvik/my-vsnprintf.c
new file mode 100644
index 00000000000..44bf6d9255f
--- /dev/null
+++ b/Build/source/texk/xdvik/my-vsnprintf.c
@@ -0,0 +1,102 @@
+/*------------------------------------------------------------
+
+written by Stefan Ulrich <stefanulrich@users.sourceforge.net> 2001/02/25
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------*/
+
+#include "xdvi-config.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#include "xdvi.h"
+#include "my-vsnprintf.h"
+
+#if !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF
+/*------------------------------------------------------------
+ * my_vsnprintf - emulation of glibc2.1 vsnprintf, use if
+ * vsnprintf is not available
+ *
+ * Arguments:
+ * char *buf - buffer to print <format> string into
+ * int len - print only len characters of <format>
+ * char *format - format string
+ * va_list argp - variable argument list
+ *
+ * Returns:
+ * int size - number of characters that would have been
+ * written if enough space had been available
+ *
+ * Purpose:
+ * Implementation of GNU's vsnprintf using POSIX pipes (less
+ * portable and much slower than the original, but also much
+ * easier to implement ;-):
+ * Print the formatted string to a pipe and read back
+ * at most len-1 characters, appending a '\0' at the end.
+ *------------------------------------------------------------*/
+
+int
+my_vsnprintf(char *buf, size_t len, const char *format, va_list argp)
+{
+ int pipe_fd[2];
+ FILE *fd;
+ int size;
+#ifdef DEBUG
+ printf("=============my_vsnprintf called!\n");
+#endif
+ if (len > 0) {
+ len--; /* for the trailing '\0' */
+ }
+
+ /* create a pipe for reading/writing */
+ if (xpipe(pipe_fd) == -1) {
+ perror("my_vsnprintf: pipe");
+ xdvi_exit(EXIT_FAILURE);
+ }
+ if ((fd = try_fdopen(pipe_fd[1], "w")) == NULL) {
+ perror("my_vsnprintf: fdopen");
+ xdvi_exit(EXIT_FAILURE);
+ }
+ /* instead of setting fd to non-buffering:
+ setvbuf(fd, NULL, _IONBF, BUFSIZ);
+ flush it explicitly: */
+ size = vfprintf(fd, format, argp);
+ fflush(fd);
+
+ /* according to C99, buf may be NULL, in which case
+ just return correct number of chars. Also, don't
+ write anything if there had been an output error. */
+ if (buf != NULL && size >= 0) {
+ /* wrote less characters than len -> adjust len for the subsequent read */
+ if ((size_t)size < len) {
+ len = size;
+ }
+ read(pipe_fd[0], buf, len);
+ buf[len] = '\0'; /* always null-terminate */
+ }
+
+ fclose(fd);
+ close(pipe_fd[0]);
+ close(pipe_fd[1]);
+
+ return size;
+}
+
+#endif /* !HAVE_VSNPRINTF || !HAVE_GOOD_VSNPRINTF */
diff --git a/Build/source/texk/xdvik/my-vsnprintf.h b/Build/source/texk/xdvik/my-vsnprintf.h
new file mode 100644
index 00000000000..a5e6d3c39f3
--- /dev/null
+++ b/Build/source/texk/xdvik/my-vsnprintf.h
@@ -0,0 +1,44 @@
+/*------------------------------------------------------------
+
+written by S. Ulrich (ulrich@cis.uni-muenchen.de) 2001/02/25
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------*/
+
+#ifndef MY_VSNPRINTF_H__
+#define MY_VSNPRINTF_H__
+
+#include "xdvi.h"
+
+#if HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF
+
+#include <stdio.h>
+#include <stdarg.h>
+#define VSNPRINTF(buf, len, format, args) vsnprintf(buf, len, format, args)
+
+#else /* HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF */
+
+#include <unistd.h> /* for pipe() */
+#include "util.h" /* for xpipe() etc. */
+extern int my_vsnprintf(char *, size_t, const char *, va_list);
+#define VSNPRINTF(buf, len, format, args) my_vsnprintf(buf, len, format, args)
+
+#endif /* HAVE_VSNPRINTF && HAVE_GOOD_VSNPRINTF */
+
+#endif /* MY_VSNPRINTF_H__ */
diff --git a/Build/source/texk/xdvik/pagehist.c b/Build/source/texk/xdvik/pagehist.c
new file mode 100644
index 00000000000..4341b5089c1
--- /dev/null
+++ b/Build/source/texk/xdvik/pagehist.c
@@ -0,0 +1,563 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ Very simple page history (i.e. stack of visited pages) for xdvik
+*/
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "util.h"
+#include "dl_list.h"
+#include "string-utils.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "statusline.h"
+#include "message-window.h"
+#include "xm_toolbar.h"
+#include "pagehist.h"
+
+/****************************************************************************
+ *
+ * File-scope globals
+ *
+ ****************************************************************************/
+
+/* maximum number of items to print before truncating (10 left and right) */
+static const int HISTORY_MAX_CONTEXT = 21;
+
+/* list of pages in history */
+static struct dl_list *m_page_history = NULL;
+
+/* pointer to the head of the list, which only gets changed when
+ truncating the head (when list has reached its max size). */
+static struct dl_list *m_page_history_head = NULL;
+
+/* current size of the list */
+static int m_page_history_length = 0;
+
+/* current position in the list */
+static int m_page_history_currpos = 0;
+
+/* lookup table of filenames visited so far */
+static char **m_filename_list = NULL;
+static size_t m_filename_size = 0;
+
+/* item in above list */
+struct page_history {
+ int pageno;
+ int file_idx; /* index in file_list */
+};
+
+#define DEBUG 0
+
+/****************************************************************************
+ *
+ * Private functions
+ *
+ ****************************************************************************/
+
+static void
+page_history_show(struct dl_list *head, const struct dl_list *curr)
+{
+#if DEBUG
+ int n;
+ for (n = 0; head != NULL; head = head->next, n++) {
+ struct page_history *item = (struct page_history *)(head->item);
+ if (head == curr) {
+ fprintf(stderr, "item %d: <%d>\n", n, item->pageno);
+ }
+ else {
+ fprintf(stderr, "item %d: %d\n", n, item->pageno);
+ }
+ }
+#else
+ UNUSED(head);
+ UNUSED(curr);
+#endif /* DEBUG */
+}
+
+/* like above, but output goes to the statusline, and it prints only up to HISTORY_MAX_CONTEXT
+ items around the current one.
+*/
+static void
+page_history_show_statusline(struct dl_list *head,
+ const struct dl_list *curr,
+ const char *msg)
+{
+#define HIST_LEN 1024 /* should be ample since statusline is limited to 512 MAX_LEN */
+
+ int file_idx = 0;
+
+ int n;
+ char history[HIST_LEN];
+ char *ptr = history;
+ int tot_len = m_page_history_length;
+ int curr_pos = m_page_history_currpos;
+ int initial_offset = 0;
+ int printed_len = 0;
+
+#if DEBUG
+ fprintf(stderr, "tot_len: %d, curr_pos: %d\n", tot_len, curr_pos);
+#endif
+
+ if (!(resource.expert_mode & XPRT_SHOW_STATUSLINE)) {
+ /* too distracting for stdout */
+ return;
+ }
+
+ if (head == NULL){
+ strcpy(ptr, "Page history empty.");
+ ptr += strlen("Page history empty.");
+ }
+ else {
+ strcpy(ptr, "Page history:");
+ ptr += strlen("Page history:");
+ }
+
+ /* check if we need to truncate at the beginning or end */
+ if (tot_len > HISTORY_MAX_CONTEXT) {
+ /* need to truncate, try to make first and second chunk around current position of same length */
+ int good_pos = HISTORY_MAX_CONTEXT / 2.0 + 0.5;
+ while (curr_pos > good_pos /* && */
+ /* m_page_history_length - m_page_history_currpos > good_pos */) {
+#if DEBUG
+ fprintf(stderr, "%d > %d; %d > %d\n", curr_pos, good_pos,
+ m_page_history_length - m_page_history_currpos, good_pos);
+#endif
+ curr_pos--;
+ initial_offset++;
+ }
+#if DEBUG
+ fprintf(stderr, "initial offset: %d\n", initial_offset);
+#endif
+ /* if we're more to the end, adjust good_pos and initial_offset */
+ while (good_pos - 1 > m_page_history_length - m_page_history_currpos) {
+#if DEBUG
+ fprintf(stderr, "%d > %d\n", m_page_history_length - m_page_history_currpos, good_pos);
+#endif
+ initial_offset--;
+ good_pos--;
+ }
+#if DEBUG
+ fprintf(stderr, "initial offset adjusted: %d\n", initial_offset);
+#endif
+ }
+
+ for (n = 0; head != NULL; head = head->next, n++) {
+ struct page_history *item;
+ /* skip initial offset, and insert truncation marker at beginning/end */
+ if (initial_offset == 1 || printed_len >= HISTORY_MAX_CONTEXT) {
+ strcpy(ptr, " ...");
+ ptr += strlen(" ...");
+ if (printed_len >= HISTORY_MAX_CONTEXT)
+ break;
+ }
+ if (initial_offset > 0) {
+ initial_offset--;
+ continue;
+ }
+
+ printed_len++;
+
+ item = (struct page_history *)(head->item);
+
+ /* insert a marker if item is in different file ... */
+ if (item->file_idx != file_idx) {
+ if (n > 0) { /* ... but only if we're not at the beginning of the list */
+#if 1
+ strcpy(ptr, " -");
+ ptr += 2;
+#else
+ char *fname = m_filename_list[item->file_idx];
+ char *tmp;
+ if ((tmp = strrchr(m_filename_list[item->file_idx], '/')) != NULL)
+ fname = tmp + 1;
+ strcpy(ptr, " [");
+ ptr += 2;
+ strcpy(ptr, fname);
+ ptr += strlen(fname);
+ strcpy(ptr, "]");
+ ptr++;
+#endif
+ }
+ file_idx = item->file_idx;
+ }
+
+ if (head == curr) {
+ xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__,
+ m_page_history_currpos == n + 1,
+ "%d == %d + 1", m_page_history_currpos, n);
+ sprintf(ptr, " [%d]", item->pageno + 1);
+ ptr += 3 + length_of_int(item->pageno + 1);
+ }
+ else {
+ sprintf(ptr, " %d", item->pageno + 1);
+ ptr += 1 + length_of_int(item->pageno + 1);
+ }
+ }
+#if DEBUG
+ fprintf(stderr, "Statusline string: |%s|; printed len: %d\n", history, printed_len);
+#endif
+ statusline_info(STATUS_MEDIUM, "%s %s", history, msg ? msg : "");
+#undef HIST_LEN
+}
+
+static void
+goto_location(const char *filename)
+{
+#if DEBUG
+ fprintf(stderr, "going to file %s\n", filename);
+#endif
+ if (strcmp(globals.dvi_name, filename) != 0) { /* it's a different file */
+ Boolean tried_dvi_ext = True;
+ char *new_dvi_name;
+#if DEBUG
+ fprintf(stderr, "different file: |%s|\n", filename);
+#endif
+ if ((new_dvi_name = open_dvi_file_wrapper(filename, True, False,
+ &tried_dvi_ext, True)) == NULL) {
+ statusline_append(STATUS_MEDIUM,
+ "Re-opening file",
+ "Re-opening file \"%s\" failed!", filename);
+#if DEBUG
+ fprintf(stderr, "Re-opening file \"%s\" failed!\n", filename);
+#endif
+ page_history_delete(1);
+ return;
+ }
+ else {
+ dviErrFlagT errflag;
+ if (load_dvi_file(
+#if !DELAYED_MKTEXPK
+ True,
+#endif
+ &errflag)) {
+ set_dvi_name(new_dvi_name);
+
+ globals.ev.flags |= EV_NEWDOC;
+ globals.ev.flags |= EV_PAGEHIST_GOTO_PAGE;
+#if DEBUG
+ fprintf(stderr, "Back to file: \"%s\"\n", globals.dvi_name);
+#endif
+ }
+ else { /* re-open old file */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Could not open `%s': %s.\n"
+ /* "Removing this file from the history." */,
+ globals.dvi_name, get_dvi_error(errflag));
+
+ if (!internal_open_dvi(globals.dvi_name, &errflag, True
+#if DELAYED_MKTEXPK
+ , True
+#endif
+ )) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Couldn't reopen `%s': %s.\n"
+ /* "Removing this file from the history." */,
+ globals.dvi_name, get_dvi_error(errflag));
+ }
+ else {
+ globals.ev.flags |= EV_NEWPAGE;
+ }
+ page_history_delete(1);
+ }
+ }
+ }
+ else {
+ globals.ev.flags |= EV_PAGEHIST_GOTO_PAGE;
+ }
+}
+
+/****************************************************************************
+ *
+ * Exported functions
+ *
+ ****************************************************************************/
+
+/*
+ Move n elements in page history; n == 0 doesn't move,
+ n < 0 moves n items back, n > 0 moves n items forward.
+*/
+void page_history_move(int n)
+{
+ struct dl_list *pos;
+ struct page_history *item;
+ const char *msg = NULL;
+
+ page_history_show(m_page_history_head, m_page_history);
+
+ if (resource.page_history_size == 0)
+ return;
+
+ if (m_page_history_head == NULL)
+ m_page_history_head = m_page_history;
+
+ if (n < 0) { /* move backwards */
+ for (pos = NULL; n < 0; n++) {
+ if (m_page_history != NULL)
+ pos = m_page_history->prev;
+ if (pos == NULL) {
+ xdvi_bell();
+ msg = " - at begin of page history.";
+ break;
+ }
+ else {
+ m_page_history = pos;
+ m_page_history_currpos--;
+ }
+ }
+ }
+ else { /* move forward */
+ for (pos = NULL; n > 0; n--) {
+ if (m_page_history != NULL)
+ pos = m_page_history->next;
+ if (pos == NULL) {
+ xdvi_bell();
+ msg = " - at end of page history.";
+ break;
+ }
+ else {
+ m_page_history = pos;
+ m_page_history_currpos++;
+ }
+ }
+ }
+ item = (struct page_history *)m_page_history->item;
+#if DEBUG
+ fprintf(stderr, "going to page %d\n", item->pageno);
+#endif
+ goto_location(m_filename_list[item->file_idx]);
+
+#if defined(MOTIF) && HAVE_XPM
+ tb_set_pagehist_back_sensitivity(m_page_history->prev != NULL);
+ tb_set_pagehist_forward_sensitivity(m_page_history->next != NULL);
+#endif
+
+ page_history_show(m_page_history_head, m_page_history);
+ page_history_show_statusline(m_page_history_head, m_page_history, msg);
+ page_history_update_toolbar_navigation();
+}
+
+int
+page_history_get_page(void)
+{
+ return ((struct page_history *)m_page_history->item)->pageno;
+}
+
+/* add page n to the page history */
+void page_history_insert(int n)
+{
+ struct page_history *item = NULL;
+ static char *current_filename = NULL;
+ static size_t filename_idx = 0; /* index of current filename */
+
+#if DEBUG
+ fprintf(stderr, "inserting into history: %d\n", n);
+#endif
+ page_history_show(m_page_history_head, m_page_history);
+ /* do nothing if no history is used */
+ if (resource.page_history_size == 0)
+ return;
+
+ if (m_page_history_head == NULL)
+ m_page_history_head = m_page_history;
+
+ item = xmalloc(sizeof *item);
+ /* first call, or filename changed -> update file_list */
+ if (current_filename == NULL || strcmp(current_filename, globals.dvi_name) != 0) {
+ size_t i;
+ current_filename = xstrdup(globals.dvi_name);
+
+ for (i = 0; i < m_filename_size; i++) {
+#if DEBUG
+ fprintf(stderr, "comparing %d: |%s|%s|\n", i, current_filename, m_filename_list[i]);
+#endif
+ if (strcmp(current_filename, m_filename_list[i]) == 0) { /* found */
+ filename_idx = i;
+ break;
+ }
+ }
+
+ if (i >= m_filename_size) { /* not found, insert into file list */
+ m_filename_list = xrealloc(m_filename_list, (m_filename_size + 1) * sizeof *m_filename_list);
+ m_filename_list[m_filename_size] = filename_append_dvi(current_filename);
+ filename_idx = m_filename_size++;
+#if DEBUG
+ fprintf(stderr, "NEW file %d: %s\n", filename_idx, current_filename);
+#endif
+ }
+ }
+
+#if DEBUG
+ fprintf(stderr, "-------- %d >= %d?\n", m_page_history_length, resource.page_history_size - 1);
+#endif
+ if (m_page_history_length >= resource.page_history_size - 1) { /* truncate history */
+ free(m_page_history_head->item);
+ m_page_history_head = dl_list_truncate_head(m_page_history_head);
+ }
+ else {
+ m_page_history_length++;
+ }
+
+ item->pageno = n;
+ item->file_idx = filename_idx;
+
+#if DEBUG
+ fprintf(stderr, "inserting %d\n", item->pageno);
+#endif
+ m_page_history = dl_list_insert(m_page_history, item);
+ m_page_history_currpos++;
+
+#if DEBUG
+ fprintf(stderr, "head: %p, curr: %p\n", (void *)m_page_history_head, (void *)m_page_history);
+#endif
+ page_history_show(m_page_history_head, m_page_history);
+ page_history_update_toolbar_navigation();
+}
+
+void
+page_history_update_toolbar_navigation(void)
+{
+#if defined(MOTIF) && HAVE_XPM
+ tb_set_htex_back_sensitivity(m_page_history->prev != NULL);
+ tb_set_htex_forward_sensitivity(m_page_history->next != NULL);
+#endif
+}
+
+void
+page_history_clear(void)
+{
+ struct dl_list *pos, *curr;
+
+ if (resource.page_history_size == 0)
+ return;
+
+ m_page_history_head = m_page_history;
+
+ for (curr = m_page_history; curr != NULL && curr->prev != NULL; curr = pos) {
+ pos = curr->prev;
+ free(curr->item);
+ (void)dl_list_remove_item(&curr);
+ m_page_history_length--;
+ page_history_show(m_page_history_head, m_page_history);
+ page_history_show_statusline(m_page_history_head, m_page_history, NULL);
+ }
+
+ /* for (curr = m_page_history; curr != NULL && curr->next != NULL; curr = pos) { */
+ /* pos = curr->next; */
+ /* free(curr->item); */
+ /* (void)dl_list_remove_item(&curr); */
+ /* m_page_history_length--; */
+ /* page_history_show(m_page_history_head, m_page_history); */
+ /* } */
+
+
+}
+
+/*
+ Delete n elements from the page history.
+ If n < 0, delete current and n-1 previous items and move to the item before them.
+ If n > 0, delete current and n-1 next items and move to the item after them.
+ E.g. (with current position marked by `<>'):
+
+ a b <c> d e
+ -> page_history_delete(-2)
+ -> <a> d e
+
+ a b <c> d e
+ -> page_history_delete(2)
+ -> a b <e>
+
+ Prints an error to the statusline if number of deletions exceeds the limits
+ of the list.
+*/
+void page_history_delete(int n)
+{
+ struct dl_list *pos;
+ struct page_history *item;
+ const char *msg = NULL;
+
+ if (resource.page_history_size == 0)
+ return;
+
+ if (m_page_history_head == NULL)
+ m_page_history_head = m_page_history;
+
+ /* fprintf(stderr, "deleting items: |%d|\n", n); */
+
+ if (n < 0) { /* delete backwards */
+ for (pos = NULL; n < 0; n++) {
+ if (m_page_history != NULL)
+ pos = m_page_history->prev;
+ if (pos == NULL) {
+ xdvi_bell();
+ msg = " - at begin of page history.";
+ break;
+ }
+ else {
+ /* remove item */
+ free(m_page_history->item);
+ (void)dl_list_remove_item(&m_page_history);
+ m_page_history = pos;
+ m_page_history_currpos--;
+ m_page_history_length--;
+ }
+ }
+ }
+ else { /* delete forward */
+ for (pos = NULL; n > 0; n--) {
+ if (m_page_history != NULL)
+ pos = m_page_history->next;
+ if (pos == NULL) {
+ xdvi_bell();
+ msg = " - at end of page history.";
+ break;
+ }
+ else {
+ /* remove item */
+ free(m_page_history->item);
+ if (m_page_history->prev == NULL) { /* at head */
+ m_page_history_head = m_page_history = dl_list_truncate_head(m_page_history);
+ }
+ else {
+ (void)dl_list_remove_item(&m_page_history);
+ m_page_history = pos;
+ }
+ /* Note: m_page_history_currpos remains unchanged here */
+ m_page_history_length--;
+ }
+ }
+ }
+ item = (struct page_history *)m_page_history->item;
+#if DEBUG
+ fprintf(stderr, "going to page %d\n", item->pageno);
+#endif
+ goto_location(m_filename_list[item->file_idx]);
+ page_history_show(m_page_history_head, m_page_history);
+ page_history_show_statusline(m_page_history_head, m_page_history, msg);
+}
+
diff --git a/Build/source/texk/xdvik/pagehist.h b/Build/source/texk/xdvik/pagehist.h
new file mode 100644
index 00000000000..ee21eaaf48a
--- /dev/null
+++ b/Build/source/texk/xdvik/pagehist.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2004 Stefan Ulrich
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PAGEHIST_H_
+#define PAGEHIST_H_
+
+extern void page_history_move(int n);
+extern void page_history_insert(int n);
+extern void page_history_delete(int n);
+extern void page_history_update_toolbar_navigation(void);
+extern void page_history_clear(void);
+extern int page_history_get_page(void);
+
+#endif /* PAGEHIST_H_ */
+
diff --git a/Build/source/texk/xdvik/pixmaps/drag_horiz.xbm b/Build/source/texk/xdvik/pixmaps/drag_horiz.xbm
new file mode 100644
index 00000000000..39cd20118fd
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_horiz.xbm
@@ -0,0 +1,8 @@
+#define drag_horiz_width 17
+#define drag_horiz_height 7
+#define drag_horiz_x_hot 8
+#define drag_horiz_y_hot 3
+static unsigned char drag_horiz_bits[] = {
+ 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x04, 0x40, 0x00, 0xfe, 0xff, 0x00,
+ 0x04, 0x40, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00};
+
diff --git a/Build/source/texk/xdvik/pixmaps/drag_horiz_mask.xbm b/Build/source/texk/xdvik/pixmaps/drag_horiz_mask.xbm
new file mode 100644
index 00000000000..cd81e08115c
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_horiz_mask.xbm
@@ -0,0 +1,8 @@
+#define drag_horiz_mask_width 17
+#define drag_horiz_mask_height 7
+#define drag_horiz_mask_x_hot 8
+#define drag_horiz_mask_y_hot 3
+static unsigned char drag_horiz_mask_bits[] = {
+ 0x08, 0x20, 0x00, 0x0c, 0x60, 0x00, 0xfe, 0xff, 0x00, 0xff, 0xff, 0x01,
+ 0xfe, 0xff, 0x00, 0x0c, 0x60, 0x00, 0x08, 0x20, 0x00};
+
diff --git a/Build/source/texk/xdvik/pixmaps/drag_omni.xbm b/Build/source/texk/xdvik/pixmaps/drag_omni.xbm
new file mode 100644
index 00000000000..8b81c97e5da
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_omni.xbm
@@ -0,0 +1,10 @@
+#define drag_omni_width 17
+#define drag_omni_height 17
+#define drag_omni_x_hot 8
+#define drag_omni_y_hot 8
+static unsigned char drag_omni_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0x40, 0x05, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x08, 0x21, 0x00, 0x04, 0x41, 0x00,
+ 0xfe, 0xff, 0x00, 0x04, 0x41, 0x00, 0x08, 0x21, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x40, 0x05, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00};
diff --git a/Build/source/texk/xdvik/pixmaps/drag_omni_mask.xbm b/Build/source/texk/xdvik/pixmaps/drag_omni_mask.xbm
new file mode 100644
index 00000000000..60feeb54c79
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_omni_mask.xbm
@@ -0,0 +1,10 @@
+#define drag_omni_mask_width 17
+#define drag_omni_mask_height 17
+#define drag_omni_mask_x_hot 8
+#define drag_omni_mask_y_hot 8
+static unsigned char drag_omni_mask_bits[] = {
+ 0x00, 0x01, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x07, 0x00, 0xe0, 0x0f, 0x00,
+ 0x80, 0x03, 0x00, 0x88, 0x23, 0x00, 0x8c, 0x63, 0x00, 0xfe, 0xff, 0x00,
+ 0xff, 0xff, 0x01, 0xfe, 0xff, 0x00, 0x8c, 0x63, 0x00, 0x88, 0x23, 0x00,
+ 0x80, 0x03, 0x00, 0xe0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0x03, 0x00,
+ 0x00, 0x01, 0x00};
diff --git a/Build/source/texk/xdvik/pixmaps/drag_vert.xbm b/Build/source/texk/xdvik/pixmaps/drag_vert.xbm
new file mode 100644
index 00000000000..65e0eddc302
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_vert.xbm
@@ -0,0 +1,7 @@
+#define drag_vert_width 7
+#define drag_vert_height 17
+#define drag_vert_x_hot 3
+#define drag_vert_y_hot 8
+static unsigned char drag_vert_bits[] = {
+ 0x00, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x2a, 0x1c, 0x08, 0x00};
diff --git a/Build/source/texk/xdvik/pixmaps/drag_vert_mask.xbm b/Build/source/texk/xdvik/pixmaps/drag_vert_mask.xbm
new file mode 100644
index 00000000000..d7a461a7743
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/drag_vert_mask.xbm
@@ -0,0 +1,7 @@
+#define drag_vert_mask_width 7
+#define drag_vert_mask_height 17
+#define drag_vert_mask_x_hot 3
+#define drag_vert_mask_y_hot 8
+static unsigned char drag_vert_mask_bits[] = {
+ 0x08, 0x1c, 0x3e, 0x7f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
+ 0x1c, 0x7f, 0x3e, 0x1c, 0x08};
diff --git a/Build/source/texk/xdvik/pixmaps/fist.xbm b/Build/source/texk/xdvik/pixmaps/fist.xbm
new file mode 100644
index 00000000000..260b8917264
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/fist.xbm
@@ -0,0 +1,6 @@
+#define fist_width 16
+#define fist_height 16
+static unsigned char fist_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xf2,
+ 0x0f, 0xd0, 0x0f, 0xc0, 0x0b, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xe0,
+ 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0};
diff --git a/Build/source/texk/xdvik/pixmaps/fist_mask.xbm b/Build/source/texk/xdvik/pixmaps/fist_mask.xbm
new file mode 100644
index 00000000000..64ae49821ff
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/fist_mask.xbm
@@ -0,0 +1,6 @@
+#define fist_mask_width 16
+#define fist_mask_height 16
+static unsigned char fist_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0d, 0xf8, 0x3f,
+ 0xf8, 0x7f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x3f,
+ 0xfc, 0x3f, 0xf8, 0x1f, 0xf0, 0x1f, 0xf0, 0x1f};
diff --git a/Build/source/texk/xdvik/pixmaps/hand.xbm b/Build/source/texk/xdvik/pixmaps/hand.xbm
new file mode 100644
index 00000000000..3fb8dbcb9aa
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/hand.xbm
@@ -0,0 +1,6 @@
+#define hand_width 16
+#define hand_height 16
+static unsigned char hand_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x67, 0xf2, 0x67, 0xf2, 0x4f, 0xb2,
+ 0x4f, 0x92, 0x1f, 0x90, 0x19, 0x80, 0x11, 0xc0, 0x03, 0xc0, 0x07, 0xc0,
+ 0x07, 0xe0, 0x0f, 0xe0, 0x1f, 0xf0, 0x3f, 0xf0};
diff --git a/Build/source/texk/xdvik/pixmaps/hand_mask.xbm b/Build/source/texk/xdvik/pixmaps/hand_mask.xbm
new file mode 100644
index 00000000000..37fa6ef6d2b
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/hand_mask.xbm
@@ -0,0 +1,6 @@
+#define hand_mask_width 16
+#define hand_mask_height 16
+static unsigned char hand_mask_bits[] = {
+ 0x00, 0x00, 0x80, 0x01, 0xd8, 0x0f, 0xfc, 0x1f, 0xfc, 0x5f, 0xf8, 0xff,
+ 0xf8, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfc, 0x7f,
+ 0xfc, 0x3f, 0xf8, 0x3f, 0xf0, 0x1f, 0xe0, 0x1f};
diff --git a/Build/source/texk/xdvik/pixmaps/magglass.xbm b/Build/source/texk/xdvik/pixmaps/magglass.xbm
new file mode 100644
index 00000000000..fca92ba1a46
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/magglass.xbm
@@ -0,0 +1,10 @@
+#define magglass_width 20
+#define magglass_height 20
+#define magglass_x_hot 7
+#define magglass_y_hot 7
+static unsigned char magglass_bits[] = {
+ 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x18, 0x0c, 0x00, 0x04, 0x13, 0x00,
+ 0x04, 0x14, 0x00, 0x02, 0x28, 0x00, 0x02, 0x28, 0x00, 0x02, 0x20, 0x00,
+ 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00,
+ 0x18, 0x6c, 0x00, 0xe0, 0xdb, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x60, 0x03,
+ 0x00, 0xc0, 0x06, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
diff --git a/Build/source/texk/xdvik/pixmaps/magglass_mask.xbm b/Build/source/texk/xdvik/pixmaps/magglass_mask.xbm
new file mode 100644
index 00000000000..1c26d193421
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/magglass_mask.xbm
@@ -0,0 +1,10 @@
+#define magglass_mask_width 20
+#define magglass_mask_height 20
+#define magglass_mask_x_hot 7
+#define magglass_mask_y_hot 7
+static unsigned char magglass_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x0f, 0x00, 0x1c, 0x1f, 0x00,
+ 0x0c, 0x1c, 0x00, 0x06, 0x38, 0x00, 0x06, 0x38, 0x00, 0x06, 0x30, 0x00,
+ 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x0c, 0x18, 0x00, 0x1c, 0x3c, 0x00,
+ 0xf8, 0x7f, 0x00, 0xe0, 0xfb, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03,
+ 0x00, 0xc0, 0x07, 0x00, 0x80, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
diff --git a/Build/source/texk/xdvik/pixmaps/time16.xbm b/Build/source/texk/xdvik/pixmaps/time16.xbm
new file mode 100644
index 00000000000..d7f13f29244
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/time16.xbm
@@ -0,0 +1,8 @@
+#define time16_width 16
+#define time16_height 16
+#define time16_x_hot 7
+#define time16_y_hot 7
+static unsigned char time16_bits[] = {
+ 0x00, 0x00, 0xfe, 0x7f, 0x14, 0x28, 0x14, 0x28, 0x14, 0x28, 0xe4, 0x27,
+ 0xc4, 0x23, 0x84, 0x21, 0x84, 0x21, 0x44, 0x22, 0x24, 0x24, 0x94, 0x29,
+ 0xd4, 0x2b, 0xf4, 0x2f, 0xfe, 0x7f, 0x00, 0x00};
diff --git a/Build/source/texk/xdvik/pixmaps/time16_mask.xbm b/Build/source/texk/xdvik/pixmaps/time16_mask.xbm
new file mode 100644
index 00000000000..d550e73dac2
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/time16_mask.xbm
@@ -0,0 +1,6 @@
+#define time16_mask_width 16
+#define time16_mask_height 16
+static unsigned char time16_mask_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xf6, 0x6f,
+ 0xe6, 0x67, 0xc6, 0x63, 0xc6, 0x63, 0xe6, 0x67, 0xf6, 0x6f, 0xfe, 0x7f,
+ 0xfe, 0x7f, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff};
diff --git a/Build/source/texk/xdvik/pixmaps/toolbar.xpm b/Build/source/texk/xdvik/pixmaps/toolbar.xpm
new file mode 100644
index 00000000000..a9dd124e668
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/toolbar.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char * toolbar_xpm[] = {
+/* width height colors colordepth */
+" 378 18 16 1 0 0",
+" s none c None",
+". m white c red",
+"+ m black c #000000",
+"$ m none c #ADADAD",
+"% m black c #232323",
+"& m none c #FFFFFF",
+": m black c #FFFFFF",
+", m none c #DEDEDE",
+"y m black c #DEDEDE",
+"' m black c #13A706",
+"t s bottomShadowColor c #636363",
+"w m black c #125006",
+"N m none c #C9C9C9",
+"O m none c #949494",
+"` m none c #404040",
+"Y m none c #303030",
+/* pixels */ /*
+ ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */
+" ",
+" ++++++++ YY YY ++++++++ ",
+" +++++++++ t+++t ++++ ++++ .... +&&&&&+&+ ttt &$Y &$Y $%%%%$ +&&&&&&+ ttttt ",
+" +&&&&&&+&+ t++++++ %% % % % % %% +,,,,+ +,,,,+ + + ........ +&&&&&+&&+ t , `YY `YY $%%%%%%$ +&&&&&&+ +++++ t+++t ",
+" +&&&&&&+&&+ +++t t+ %% %% %% %% %% %% +,,&,,,+ +,,&,,,+ ++ ++ .......... +&&&&&++++ ,,, ......... %%%%%%%%% %%%%%%%%% %%%%%%%%% ttt Y$ttt %%$ $%% ' +&&&&&&+ t++t ++ ",
+" +&&&&&&++++ t++t +t %% %%% %%% %%% %%% %% +,,&&,,+ +,,&&,,+ +:+ +:+ ...&....&... +&&&&&&&&+ ttt tYYYYtYtYYYY` %% %% ''+&&&&&&+ ++++ t++t ",
+" +++&&&&&&&&&+++ +++ %% %%%% %%%% %%%% %%%% %% +,,,,,,+ +,,,,,,+ +++ +::++++++++++++++:y+ +++ ..&&&..&&&.. ++&&&&&&&&++ t , t$&&$t$t`t&&$t` %% $%% '''&&&++&+ t+tt+t + + ",
+" +,+&&&&&&&&&+t+ +++++++ + %% %%%%% %%%%% %%%%% %%%%% %% +,,,,,,+ +,,,,,,+ +$&$+ +:yy::::::++:::::::yy+ +$&$+ ....&&&&&&.... +$+&&&&&&&&+t+t %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `&&&$t&$`&&&$tY $%%$ ''''''''''&&++&+ ++ ++ t+ +t ",
+"+++++++++++++,+t+ +++++ +++ %% %%%%%% %%%%%% %%%%%% %%%%%% %% +,,,,+t +,,,,+t +&&$+ +:yyyyyyyyy++:yyyyyyyyy+ +&&$+ .....&&&&..... ++++++++++++$t+t ttt ttt `&$$tt```t&&$tY $%%$ '''''''''''&&&&+ t+t t+t +t t+ ",
+"+$&&&&&&&&&&&++t+ +++ +++++ %% %%%%% %%%%% %%%%% %%%%% %% ++++t++ ++++t++ +$$$+ +yyyyyyyyy++:yyyyyyyy+ +$$$+ .....&&&&..... +&&&&&&&&&&&&&,t+ t , t , `&``YY&$t```ttY %%$ ''''''''''w&&&&+ ++++++++ t+++++++ ",
+" +,$$$$$$$$$$t+t+ + +++++++ %% %%%% %%%% %%%% %%%% %% %% +++ +++ +++ +yy++++++++++++++yy+ +++ ....&&&&&&.... +&$$$$$$$$$$$$$t+ ,,, ......... %%%%%%%%% ,,, ......... %%%%%%%%% `&$tY ``$`&$tY %% wwwwww'''w&&&&&+ t+tttttt+t +t t+ ",
+" +$,$$$$$$$$$$+t+ +++ %% %%% %%% %%% %%% %% %% ++% ++% +y+ +y+ ..&&&..&&&.. +&tttttttttttt$t+ ttt `&$tY `&$tY %% ''w&&&&&&+ +t t+ t+ +t ",
+" +,$$$$$$$$$$t++ t+ t++t %% %% %% %% %% %% %%%%%% %% %%%%%% %% ++ ++ ...&....&... +&t++++++++++&$t+ t , `&$tY `&$tY 'w+&&&&&&+ ++t t++t +t t+ ",
+" +$,$$$$$$$$$$++ +t t+++ %% % % % % %% %%%%%% %%%%%% + + .......... +&&&&&&&&&&&&&$t+ %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `tt`Y `tt`Y w +&&&&&$+ t++++ t++++ t++++ t++++ ",
+" +$ttttttttttt+ ++++++t %% ........ +Ottttttttttttt++ `&$tY `&$tY %% +&&&N$O+ ",
+" ++++++++++++++ t+++t %% .... +++++++++++++++ ````` ````` %% +&N$Ott+ ",
+" ++++++++ ",
+" "}; /*
+ ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */
diff --git a/Build/source/texk/xdvik/pixmaps/toolbar2.xpm b/Build/source/texk/xdvik/pixmaps/toolbar2.xpm
new file mode 100644
index 00000000000..0245a01dac1
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/toolbar2.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static const char * tools2_xpm[] = {
+/* width height colors colordepth */
+" 378 18 15 1 0 0",
+" m none c None",
+". m white c red",
+"+ m black c #000000",
+"$ m none c #ADADAD",
+"% m black c #232323",
+"& m none c #FFFFFF",
+", m none c #DEDEDE",
+"' m black c #13A706",
+"k m black c #737373",
+"t m none c #636363",
+"w m black c #125006",
+"N m none c #C9C9C9",
+"O m none c #949494",
+"` m none c #404040",
+"Y m none c #303030",
+/* pixels */ /*
+ ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */
+" ",
+" ++++++++ YY YY ++++++++ ",
+" +++++++++ t+++t $++++$ $++++$ .... +&&&&&+&+ kkk &$Y &$Y $%%%%$ +&&&&&&+ ttttt ",
+" +&&&&&&+&+ t++++++ $+,,,,+$ $+,,,,+$ '' '' ........ +&&&&&+&&+ k , `YY `YY $%%%%%%$ +&&&&&&+ +++++ t+++t ",
+" +&&&&&&+&&+ +++t t+ %% $% $% %$ %$ %% +,,& ,,+ +,,& ,,+ ''' ''' .......... +&&&&&++++ ,,, ......... %%%%%%%%% %%%%%%%%% %%%%%%%%% kkk Y$kkk %%$ $%% ' +&&&&&&+ t++t ++ ",
+" +&&&&&&++++ t++t +t %% $%% $%% %%$ %%$ %% +,,&&,,+ +,,&&,,+ '''' '''' ...&....&... +&&&&&&&&+ kkk kYYYYkYkYYYY` %% %% ''+&&&&&&+ ++++ t++t ",
+" +++&&&&&&&&&+++ +++ %% $%%% $%%% %%%$ %%%$ %% +,,,,,,+ +,,,,,,+ '''''''' ''''''''' ..&&&..&&&.. ++&&&&&&&&++ k , k$&&$k$k`k&&$k` %% $%% '''&&&++&+ t+tt+t + + ",
+" +,+&&&&&&&&&+k+ +++++++ + %% $%%%% $%%%% %%%%$ %%%%$ %% +,,,,,,+ +,,,,,,+ '''''''''w '''''''''' ....&&&&&&.... +$+&&&&&&&&+k+t %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `&&&$k&$`&&&$kY $%%$ ''''''''''&&++&+ ++ ++ t+ +t ",
+"+++++++++++++,+k+ +++++ +++ %% $%%%%% $%%%%% %%%%%$ %%%%%$ %% $+,,,,+k $+,,,,+k ''''''''''w ''''''''''' .....&&&&..... ++++++++++++$k+t kkk kkk `&$$kk```k&&$kY $%%$ '''''''''''&&&&+ t+t t+t +t t+ ",
+"+$&&&&&&&&&&&++k+ +++ +++++ %% $%%%%% $%%%%% %%%%%$ %%%%%$ %% $++++k++ $++++k++ ''''''''''w ''''''''''w .....&&&&..... +&&&&&&&&&&&&&,k+ k , k , `&``YY&$k```kkY %%$ ''''''''''w&&&&+ ++++++++ t+++++++ ",
+"$+,$$$$$$$$$$k+k+ + +++++++ %% $%%%% $%%%% %%%%$ %%%%$ %% %% +++ +++ '''''''''w '''''''''w ....&&&&&&.... +&$$$$$$$$$$$$$k+ ,,, ......... %%%%%%%%% ,,, ......... %%%%%%%%% `&$kY ``$`&$kY %% wwwwww'''w&&&&&+ t+tttttt+t +t t+ ",
+" +$,$$$$$$$$$$+k+ +++ %% $%%% $%%% %%%$ %%%$ %% %% ++% ++% ''''wwwww wwwww'''w ..&&&..&&&.. +&kkkkkkkkkkkk$k+ kkk `&$kY `&$kY %% ''w&&&&&&+ +t t+ t+ +t ",
+" $+,$$$$$$$$$$k++ t+ t++t %% $%% $%% %%$ %%$ %% %%%%%% %% %%%%%% %% '''w '''w ...&....&... +&k++++++++++&$k+ k , `&$kY `&$kY 'w+&&&&&&+ ++t t++k +t t+ ",
+" +$,$$$$$$$$$$++ +t t+++ %% $% $% %$ %$ %% %%%%%% %%%%%% ''w ''w .......... +&&&&&&&&&&&&&$k+ %%%%%%%%% ,,, ......... %%%%%%%%% %%%%%%%%% `kk`Y `kk`Y w +&&&&&$+ t++++ t++++ t++++ t++++ ",
+" +$kkkkkkkkkkk+ ++++++t %% 'w 'w ........ +Okkkkkkkkkkkkk++ `&$kY `&$kY %% +&&&N$O+ ",
+" ++++++++++++++ t+++t %% .... +++++++++++++++ ````` ````` %% +&N$Okt+ ",
+" ++++++++ ",
+" "}; /*
+ ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** ***************** */
diff --git a/Build/source/texk/xdvik/pixmaps/xdvi16x16.xpm b/Build/source/texk/xdvik/pixmaps/xdvi16x16.xpm
new file mode 100644
index 00000000000..8a722b80ca0
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/xdvi16x16.xpm
@@ -0,0 +1,100 @@
+/* XPM */
+static const char * xdvi16x16_xpm[] = {
+"16 16 81 1",
+" c None",
+". c #616060",
+"+ c #161311",
+"@ c #7B7A7B",
+"# c #0F0C0A",
+"$ c #6F7178",
+"% c #FFD549",
+"& c #D39A2D",
+"* c #C4BBB6",
+"= c #000006",
+"- c #6B6D72",
+"; c #7C5A20",
+"> c #8B621A",
+", c #D79C2E",
+"' c #FFCC41",
+") c #DCD0BF",
+"! c #D8D1C9",
+"~ c #FFFFFF",
+"{ c #FCB529",
+"] c #DA9E2E",
+"^ c #CE9834",
+"/ c #8C5B0B",
+"( c #96702C",
+"_ c #626874",
+": c #D3B276",
+"< c #F4B73C",
+"[ c #FDBF42",
+"} c #8B6727",
+"| c #C5A469",
+"1 c #AD915D",
+"2 c #D19F3C",
+"3 c #D7A542",
+"4 c #FFC640",
+"5 c #7E4C00",
+"6 c #CBA153",
+"7 c #ECB03B",
+"8 c #F4BB48",
+"9 c #FFC54A",
+"0 c #785A2B",
+"a c #CCA25E",
+"b c #A8874E",
+"c c #FABD41",
+"d c #CEA55A",
+"e c #845E1D",
+"f c #D8A23D",
+"g c #F5BB48",
+"h c #DBA339",
+"i c #DEA53A",
+"j c #EBB345",
+"k c #856226",
+"l c #A28352",
+"m c #F3B63C",
+"n c #F9BF4B",
+"o c #EAB345",
+"p c #382205",
+"q c #785820",
+"r c #DEA539",
+"s c #987C51",
+"t c #8C6625",
+"u c #F9BA3D",
+"v c #9B8769",
+"w c #FFD049",
+"x c #8E6826",
+"y c #BA8A30",
+"z c #D9A139",
+"A c #A77C2D",
+"B c #F8BB41",
+"C c #FDC24C",
+"D c #FFC646",
+"E c #FFBF40",
+"F c #6E5128",
+"G c #FEC24C",
+"H c #707279",
+"I c #5E6678",
+"J c #596276",
+"K c #482E09",
+"L c #AD894C",
+"M c #777777",
+"N c #090503",
+"O c #04050A",
+"P c #636976",
+".+++. .+.",
+" @###$%% & *=- ",
+" @##=;>,';&=;) ",
+" @#=!~{;]%^%/(",
+" _#!=~~:<;[} ",
+" |12345~=678;90",
+" a%b%%ccdefghi;j",
+" %k%lmccggg8;gn;",
+" opqrsccctc;8;uv",
+" wxyccccxccz;n;j",
+" wyAxAyccBC8;n;",
+" '''wDEEFp%G;j",
+" H=I hJ==K%;L",
+" MNM @#O=P ",
+".NM @###.",
+"+. .+++"};
diff --git a/Build/source/texk/xdvik/pixmaps/xdvi32x32.xpm b/Build/source/texk/xdvik/pixmaps/xdvi32x32.xpm
new file mode 100644
index 00000000000..143ff6dca05
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/xdvi32x32.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static const char * xdvi32x32_xpm[] = {
+"32 32 20 1",
+" c None",
+". c #767A87",
+"X c #030203",
+"o c #626162",
+"O c #2F1C0F",
+"+ c #160807",
+"@ c #4D310F",
+"# c #FDCB4F",
+"$ c #FEE75B",
+"% c #EFB647",
+"& c #94681D",
+"* c #775117",
+"= c #DCA234",
+"- c #FEFEFE",
+"; c #B0A799",
+": c #937B54",
+"> c #B4852E",
+", c #A48B69",
+"< c #D8D3CA",
+"1 c #D8A847",
+" .XXXXXXX. .XXXo ",
+" OXXXXXX+ @@@ .OXXO ",
+" +XXXXXX.@###O X X oXXX ",
+" XXXXXXX.#+##@O$@%O&.XXX. ",
+" .XXXXXXX%&+#&##O#O#*O+@ ",
+" OXXXXXX&@&###O#O##O&#++ & ",
+" XXXXXXX@@@##%###O####+&=@",
+" XXXXX@--;@:@=#O##&O#+@%>",
+" XXXX@--;:&--@=##&+##+#X ",
+" **:,@-XX;----@#*X##X&#O*",
+" ,&######=@+&--<<-@##%#X&#O& ",
+" ,##########=@--++@=######+#&O",
+" o&#>##>######=@-OO=####+++&&#&",
+" #@&#>###@####%=@@==#######$++@",
+" #*X&#@>@#################++#$@",
+" ##X@@@###############%++###+% ",
+" #@##@>@##############*+++##O ",
+" *@#############+###O####@O@* ",
+" ##+###########+#####+++###O&+",
+" ###++#######++###+&###++###=&",
+" &###+++++++#####%+++##++++&@",
+" ,#############O%%##+#####& ",
+" >*&#%1#%#%#==1@%%%%+#&+%#O",
+" .+X&%=>=*= O@@+%+##+#+@& ",
+" OXX+.,= % XXX@X&#+##+= ",
+" oXXX. XXXX>#+&#+=*",
+" .X+X. o+XXO+X;@& ",
+" XXXo OXXXXXX ",
+" XXXO XXXX+Xo ",
+" oXXX o+XXXXX ",
+" .XXX. XX+XXX+ ",
+" .XXXo XXXXXXo "};
diff --git a/Build/source/texk/xdvik/pixmaps/xdvi48x48.xpm b/Build/source/texk/xdvik/pixmaps/xdvi48x48.xpm
new file mode 100644
index 00000000000..c65fa3347fd
--- /dev/null
+++ b/Build/source/texk/xdvik/pixmaps/xdvi48x48.xpm
@@ -0,0 +1,86 @@
+/* XPM */
+static const char * xdvi48x48_xpm[] = {
+"48 48 35 1",
+" c None",
+". c #848484",
+"+ c #080808",
+"@ c #343434",
+"# c #808080",
+"$ c #3C3B3C",
+"% c #7D7D7D",
+"& c #505050",
+"* c #946924",
+"= c #FDC54E",
+"- c #523611",
+"; c #2F261C",
+"> c #6D4E1E",
+", c #665641",
+"' c #EBB345",
+") c #9F896C",
+"! c #B78833",
+"~ c #626262",
+"{ c #A9A5A2",
+"] c #FEFEFE",
+"^ c #DAD6D1",
+"/ c #D7A03A",
+"( c #C7BFB5",
+"_ c #493415",
+": c #64471A",
+"< c #E9B345",
+"[ c #8D7757",
+"} c #696159",
+"| c #EFEEEE",
+"1 c #8F7C5A",
+"2 c #65513A",
+"3 c #9C9C9B",
+"4 c #D59E39",
+"5 c #444444",
+"6 c #4C4C4C",
+".+++++++++++@ @++@ ",
+" #++++++++++++ +++$ ",
+" $+++++++++++@ @+++ ",
+" @+++++++++++% +++++ ++ ++ &+++ ",
+" ++++++++++++ +*===+ +==+ +==+ -.+++. ",
+" +++++++++++@ +==;>=+===+ +==++++++, ",
+" #+++++++++++& +'>;==+===+==+=+==+=+ ++ ",
+" @+++++++++++ +'*>=+==+==+==+=+'+++''+ ",
+" ++++++++++++ )+========+==+===-''+''+ ",
+" +++++++++++@ ----!========+===-=+''+'+ ",
+" @+++++++++++~-{]]^-=/========!-=++++='+ ",
+" +++++++++++-{]]]]-)---!======!+!''*++ ",
+" ++++++++++-]);](-(]]^-!====!+=====+- ",
+" +++++;-->-];;)-^]]]]^-===/+==*-*=+=+ ",
+" *-_:!/===<-^(--^]]]]]]-===+=!>++/=+'+ ",
+" **==========!---[]]]^^](-=====+++!=+''+ ",
+" *==============/*}]]^;;|-/===/+-!==+!++* ",
+" *==**/===========/-^]^;;}-=========+!'''- ",
+" *+=*===============!-^]^^-======++++!=+'='-",
+" ='+===*/============/----==============+++ ",
+" !*--=*====+*/=====================++++===+}",
+" ''>+>===++/==========================++===+",
+" '''++++>=======================++=====+=++ ",
+" '*-*+''++======================+++====+ ",
+" +'*==++''+!======================+++===+ ",
+" =;+====+!============-==============++=++ ",
+" /==+================-+=====+++========+=> ",
+" !==+==============-+========+++=======++}",
+" ===+-/==========-+======+====+++======+ ",
+" !===>++*======-+-=======-+======++++=+ ",
+" !=====++++++++=====-=====+++======++= ",
+" !=================+======++======++- ",
+" 1#/============+-====+==+++======+ ",
+" .+++/=/====++++++++==+====+==-==+2 ",
+" .+++@>=>=-=- @++++'-==+===+===-=+ ",
+" @+++3[>->4- @++++'-=+===+===-=+ ",
+" ~+++. +++++===++==+===-=+ ",
+" .+++# ++++++==++++===-+ ",
+" +++5 #+++++++++++++++ ",
+" @+++. @++++++++++- ",
+" 6+++ +++++++++++& ",
+" .+++# +++++++++++. ",
+" +++# @+++++++++++ ",
+" +++5 +++++++++++@ ",
+" @+++. +++++++++++~ ",
+" 6+++. +++++++++++# ",
+" #+++# +++++++++++& ",
+" +++++++++++."};
diff --git a/Build/source/texk/xdvik/pk.c b/Build/source/texk/xdvik/pk.c
new file mode 100644
index 00000000000..3f408390621
--- /dev/null
+++ b/Build/source/texk/xdvik/pk.c
@@ -0,0 +1,387 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+/*
+ * PK font reading routines.
+ * Public routines are read_PK_index and read_PK_char.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "dvi-init.h"
+#include "util.h"
+
+#define PK_ID 89
+#define PK_CMD_START 240
+#define PK_X1 240
+#define PK_X2 241
+#define PK_X3 242
+#define PK_X4 243
+#define PK_Y 244
+#define PK_POST 245
+#define PK_NOOP 246
+#define PK_PRE 247
+
+static int PK_flag_byte;
+static unsigned PK_input_byte;
+static int PK_bitpos;
+static int PK_dyn_f;
+static int PK_repeat_count;
+
+static int
+PK_get_nyb(FILE *fp)
+{
+ unsigned temp;
+ if (PK_bitpos < 0) {
+ PK_input_byte = get_byte(fp);
+ PK_bitpos = 4;
+ }
+ temp = PK_input_byte >> PK_bitpos;
+ PK_bitpos -= 4;
+ return (temp & 0xf);
+}
+
+
+static int
+PK_packed_num(FILE *fp)
+{
+ int i, j;
+
+ if ((i = PK_get_nyb(fp)) == 0) {
+ do {
+ j = PK_get_nyb(fp);
+ ++i;
+ }
+ while (j == 0);
+ while (i > 0) {
+ j = (j << 4) | PK_get_nyb(fp);
+ --i;
+ }
+ return (j - 15 + ((13 - PK_dyn_f) << 4) + PK_dyn_f);
+ }
+ else {
+ if (i <= PK_dyn_f)
+ return i;
+ if (i < 14)
+ return (((i - PK_dyn_f - 1) << 4) + PK_get_nyb(fp)
+ + PK_dyn_f + 1);
+ if (i == 14)
+ PK_repeat_count = PK_packed_num(fp);
+ else
+ PK_repeat_count = 1;
+ return PK_packed_num(fp);
+ }
+}
+
+
+static void
+PK_skip_specials(struct font *fontp)
+{
+ int i, j;
+ FILE *fp = fontp->file;
+
+ do {
+ PK_flag_byte = get_byte(fp);
+ if (PK_flag_byte >= PK_CMD_START) {
+ switch (PK_flag_byte) {
+ case PK_X1:
+ case PK_X2:
+ case PK_X3:
+ case PK_X4:
+ i = 0;
+ for (j = PK_CMD_START; j <= PK_flag_byte; ++j)
+ i = (i << 8) | get_byte(fp);
+ while (i--)
+ (void)get_byte(fp);
+ break;
+ case PK_Y:
+ (void)get_bytes(fp, 4);
+ case PK_POST:
+ case PK_NOOP:
+ break;
+ default:
+ XDVI_FATAL((stderr, "Unexpected %d in PK file %s", PK_flag_byte,
+ fontp->filename));
+ break;
+ }
+ }
+ }
+ while (PK_flag_byte != PK_POST && PK_flag_byte >= PK_CMD_START);
+}
+
+/*
+ * Public routines
+ */
+
+static void
+read_PK_char(struct font *fontp,
+ wide_ubyte ch)
+{
+ int i, j;
+ int n;
+ int row_bit_pos;
+ Boolean paint_switch;
+ bmUnitT *cp;
+ struct glyph *g;
+ FILE *fp = fontp->file;
+ long fpwidth;
+ bmUnitT word = 0;
+ int word_weight, bytes_wide;
+ int rows_left, h_bit, count;
+
+ g = &fontp->glyph[ch];
+ PK_flag_byte = g->x2;
+ PK_dyn_f = PK_flag_byte >> 4;
+ paint_switch = ((PK_flag_byte & 8) != 0);
+ PK_flag_byte &= 0x7;
+ if (PK_flag_byte == 7)
+ n = 4;
+ else if (PK_flag_byte > 3)
+ n = 2;
+ else
+ n = 1;
+
+ if (globals.debug & DBG_PK)
+ printf("loading pk char %d, char type %d ", ch, n);
+
+ /*
+ * now read rest of character preamble
+ */
+ if (n != 4)
+ fpwidth = get_bytes(fp, 3);
+ else {
+ fpwidth = get_lbytes(fp, 4);
+ (void)get_bytes(fp, 4); /* horizontal escapement */
+ }
+ (void)get_bytes(fp, n); /* vertical escapement */
+ {
+ unsigned long w, h;
+
+ w = get_bytes(fp, n);
+ h = get_bytes(fp, n);
+ /* bitmap.w and bitmap.h are of type `unsigned short', so check for possible
+ overflow here. USHRT_MAX should be sufficient, since a character of
+ 30pt at 1200dpi requires about 560 x 560 pixels; and the maximum
+ bitmap of size USHRT_MAX * USHRT_MAX would consume USHRT_MAX * USHRT_MAX / 8
+ bytes ~= 530MB of RAM (per character/font!)
+ */
+ if (w > USHRT_MAX || h > USHRT_MAX)
+ XDVI_FATAL((stderr, "Character %d too large (%ld x %ld, max is %d x %d) in file %s",
+ ch, w, h, USHRT_MAX, USHRT_MAX, fontp->fontname));
+ g->bitmap.w = w;
+ g->bitmap.h = h;
+ }
+ g->x = get_lbytes(fp, n);
+ g->y = get_lbytes(fp, n);
+
+ g->dvi_adv = fontp->dimconv * fpwidth;
+
+ if (globals.debug & DBG_PK) {
+ if (g->bitmap.w != 0)
+ printf(", size=%dx%d, dvi_adv=%ld", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+ putchar('\n');
+ }
+
+ alloc_bitmap(&g->bitmap);
+ cp = (bmUnitT *) g->bitmap.bits;
+
+ /*
+ * read character data into *cp
+ */
+ bytes_wide = ROUNDUP((int)g->bitmap.w, BMBITS) * BMBYTES;
+ PK_bitpos = -1;
+ if (PK_dyn_f == 14) { /* get raster by bits */
+ memset(g->bitmap.bits, 0, (int)g->bitmap.h * bytes_wide);
+ for (i = 0; i < (int)g->bitmap.h; i++) { /* get all rows */
+ cp = ADD(g->bitmap.bits, i * bytes_wide);
+#ifndef WORDS_BIGENDIAN
+ row_bit_pos = -1;
+#else
+ row_bit_pos = BMBITS;
+#endif
+ for (j = 0; j < (int)g->bitmap.w; j++) { /* get one row */
+ if (--PK_bitpos < 0) {
+ word = get_byte(fp);
+ PK_bitpos = 7;
+ }
+#ifndef WORDS_BIGENDIAN
+ if (++row_bit_pos >= BMBITS) {
+ cp++;
+ row_bit_pos = 0;
+ }
+#else
+ if (--row_bit_pos < 0) {
+ cp++;
+ row_bit_pos = BMBITS - 1;
+ }
+#endif
+ if (word & (1 << PK_bitpos))
+ *cp |= 1 << row_bit_pos;
+ }
+ }
+ }
+ else { /* get packed raster */
+ rows_left = g->bitmap.h;
+ h_bit = g->bitmap.w;
+ PK_repeat_count = 0;
+ word_weight = BMBITS;
+ word = 0;
+ while (rows_left > 0) {
+ count = PK_packed_num(fp);
+ while (count > 0) {
+ if (count < word_weight && count < h_bit) {
+#ifndef WORDS_BIGENDIAN
+ if (paint_switch)
+ word |= bit_masks[count] << (BMBITS - word_weight);
+#endif
+ h_bit -= count;
+ word_weight -= count;
+#ifdef WORDS_BIGENDIAN
+ if (paint_switch)
+ word |= bit_masks[count] << word_weight;
+#endif
+ count = 0;
+ }
+ else if (count >= h_bit && h_bit <= word_weight) {
+ if (paint_switch)
+ word |= bit_masks[h_bit] <<
+#ifndef WORDS_BIGENDIAN
+ (BMBITS - word_weight);
+#else
+ (word_weight - h_bit);
+#endif
+ *cp++ = word;
+ /* "output" row(s) */
+ for (i = PK_repeat_count * bytes_wide / BMBYTES; i > 0; --i) {
+ *cp = *SUB(cp, bytes_wide);
+ ++cp;
+ }
+ rows_left -= PK_repeat_count + 1;
+ PK_repeat_count = 0;
+ word = 0;
+ word_weight = BMBITS;
+ count -= h_bit;
+ h_bit = g->bitmap.w;
+ }
+ else {
+ if (paint_switch)
+#ifndef WORDS_BIGENDIAN
+ word |= bit_masks[word_weight] <<
+ (BMBITS - word_weight);
+#else
+ word |= bit_masks[word_weight];
+#endif
+ *cp++ = word;
+ word = 0;
+ count -= word_weight;
+ h_bit -= word_weight;
+ word_weight = BMBITS;
+ }
+ }
+ paint_switch = 1 - paint_switch;
+ }
+ if (cp != ((bmUnitT *) (g->bitmap.bits + bytes_wide * g->bitmap.h)))
+ XDVI_FATAL((stderr, "Wrong number of bits stored: char. %d, font %s", ch,
+ fontp->fontname));
+ if (rows_left != 0 || h_bit != g->bitmap.w)
+ XDVI_FATAL((stderr, "Bad pk file (%s), too many bits", fontp->fontname));
+ }
+}
+
+void
+read_PK_index(struct font *fontp, wide_bool hushcs)
+{
+ int hppp, vppp;
+ long checksum;
+
+ fontp->read_char = read_PK_char;
+ if (globals.debug & DBG_PK)
+ printf("Reading PK pixel file %s\n", fontp->filename);
+
+ fseek(fontp->file, (long)get_byte(fontp->file), SEEK_CUR); /* skip comment */
+
+ (void)get_bytes(fontp->file, 4); /* skip design size */
+ checksum = get_bytes(fontp->file, 4);
+ if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0
+ && !hushcs)
+ XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, pk = %lu) in font file %s",
+ fontp->checksum, checksum, fontp->filename));
+ hppp = get_lbytes(fontp->file, 4);
+ vppp = get_lbytes(fontp->file, 4);
+ if (hppp != vppp && (globals.debug & DBG_PK))
+ printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp);
+ /*
+ * Prepare glyph array.
+ */
+ fontp->glyph = xmalloc(256 * sizeof(struct glyph));
+ memset((char *)fontp->glyph, 0, 256 * sizeof(struct glyph));
+ /*
+ * Read glyph directory (really a whole pass over the file).
+ */
+ for (;;) {
+ int bytes_left, flag_low_bits;
+ unsigned int ch;
+
+ PK_skip_specials(fontp);
+ if (PK_flag_byte == PK_POST)
+ break;
+ flag_low_bits = PK_flag_byte & 0x7;
+ if (flag_low_bits == 7) {
+ bytes_left = get_bytes(fontp->file, 4);
+ ch = get_bytes(fontp->file, 4);
+ }
+ else if (flag_low_bits > 3) {
+ bytes_left = ((flag_low_bits - 4) << 16) + get_bytes(fontp->file, 2);
+ ch = get_byte(fontp->file);
+ }
+ else {
+ bytes_left = (flag_low_bits << 8) + get_byte(fontp->file);
+ ch = get_byte(fontp->file);
+ }
+ fontp->glyph[ch].addr = ftell(fontp->file);
+ fontp->glyph[ch].x2 = PK_flag_byte;
+#ifdef linux
+# ifndef SHORTSEEK
+# define SHORTSEEK 2048
+# endif
+ /* A bug in Linux libc (as of 18oct94) makes a short read faster
+ than a short forward seek. Totally non-intuitive. */
+ if (bytes_left > 0 && bytes_left < SHORTSEEK) {
+ char *dummy = xmalloc(bytes_left);
+ (void)fread(dummy, 1, bytes_left, fontp->file);
+ free(dummy);
+ }
+ else
+ /* seek backward, or long forward */
+#endif /* linux */
+ fseek(fontp->file, (long)bytes_left, SEEK_CUR);
+ if (globals.debug & DBG_PK)
+ printf("Scanning pk char %u, at %ld.\n", ch, fontp->glyph[ch].addr);
+ }
+}
diff --git a/Build/source/texk/xdvik/print-internal.c b/Build/source/texk/xdvik/print-internal.c
new file mode 100644
index 00000000000..dfa6f9a4ff8
--- /dev/null
+++ b/Build/source/texk/xdvik/print-internal.c
@@ -0,0 +1,872 @@
+/*
+ * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * SU: Printing/saving backend code (all the non-GUI stuff),
+ * adapted from non-k xdvi's popups.c.
+ *
+ * Implementation notes:
+ * All inter-process communication happens in an asynchronous
+ * fasion, so that the GUI remains responsive. This means that if
+ * there are several processes in sequence (e.g. dvips invocation,
+ * then ps2pdf invocation), the latter must be called by the child
+ * watching procedure of the former (e.g. ps2pdf_exited by the
+ * fork_process() callback in call_ps2pdf()), else we can't catch its
+ * return status, do cleanup afterwards etc., because the code inside
+ * the caller may be executed *before* the child has finished. (Note
+ * e.g. how unlink()ing the temporary PS file is done inside
+ * ps2pdf_exited() and not in the callers). This is the reason why we
+ * often need to pass information to the subprocess via a data pointer.
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "dvisel.h" /* for select_pages_info struct */
+#include "print-internal.h"
+#include "print-log.h"
+#include "search-internal.h"
+#include "events.h"
+#include "message-window.h"
+#include "util.h"
+#include "x_util.h"
+#include "string-utils.h"
+#include "my-snprintf.h"
+
+#include <errno.h>
+#include <signal.h>
+#include <sys/stat.h>
+
+/* if POSIX O_NONBLOCK is not available, use O_NDELAY */
+#if !defined(O_NONBLOCK) && defined(O_NDELAY)
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#ifdef EWOULDBLOCK
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN)
+# else
+# define AGAIN_CONDITION (errno == EWOULDBLOCK)
+# endif
+#else /* EWOULDBLOCK */
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EAGAIN)
+# endif
+#endif /* EWOULDBLOCK */
+
+#if HAVE_POLL
+# include <poll.h>
+# define XIO_IN POLLIN
+# define XIO_OUT POLLOUT
+#else
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif /* HAVE_POLL */
+
+static struct xchild print_child = {NULL, 0, "dvips", NULL, NULL, SIGKILL, NULL
+ };
+
+static char *read_from_dvips(int, void *);
+
+static struct xio print_xio = { NULL, 0, XIO_IN,
+#if HAVE_POLL
+ NULL,
+#endif
+ read_from_dvips,
+ NULL, /* write proc - not needed */
+ NULL /* data */
+};
+
+static void dvips_alarm(struct xtimer *this, void *data);
+
+static struct xtimer dvips_timer = {NULL, {0, 0}, XTM_DEFAULT, dvips_alarm, NULL
+#if XDVI_XT_TIMER_HACK
+ , NULL, NULL
+#endif
+};
+
+static int dvips_sig; /* SIGINT or SIGKILL */
+
+static int dvips_status;
+static const int DVIPS_STAT_NONE = 0;
+static const int DVIPS_STAT_RUN = 1;
+static const int DVIPS_STAT_WAIT = 2;
+
+/*
+ FIXME: implement this in terms of fork_process()!
+ Currently it doesn't work since the DVI file and the
+ output file are realized via redirecting stdin/stdout.
+ This also obscures the log output (the I/O redirection
+ isn't visible to users).
+
+ TODO: Remove the detailed log output, and implement
+ a progress window that only shows the page numbers.
+ The detailed log should go to an `xdvi log output' page.
+*/
+
+static void
+fork_dvips(char **argv, struct save_or_print_info *info, childProcT proc)
+{
+ int print_io[2];
+ int i;
+ struct file_info *finfo = info->finfo;
+ /* printlog_append(argv[0], strlen(argv[0])); */
+ FILE *fout = NULL;
+
+ if (info->act == FILE_SAVE || info->print_target == TO_FILE) { /* printing to PS file, open file for writing */
+ const char *out_file;
+
+ if (info->print_target == TO_FILE || info->fmt == FMT_PS)
+ out_file = finfo->out_file;
+ else
+ out_file = finfo->tmp_ps_file;
+
+ if ((fout = XFOPEN(out_file, "w")) == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL, "Could not open %s for writing: %s.",
+ out_file,
+ strerror(errno));
+ return;
+ }
+ }
+
+ printlog_popup(info);
+
+ printlog_append_str(info, "Calling: `");
+ printlog_append_str(info, argv[0]);
+
+ for (i = 1; argv[i] != NULL; i++) {
+ printlog_append_str(info, " ");
+ printlog_append_str(info, argv[i]);
+ }
+ printlog_append_str(info, "'\n");
+
+ if (xpipe(print_io) != 0) {
+ perror("[xdvi] pipe");
+ return;
+ }
+
+ /* Fork process */
+
+ /* flush output buffers to avoid double buffering (i.e. data
+ waiting in the output buffer being written twice, by the parent
+ and the child) */
+ fflush(stderr);
+ fflush(stdout);
+
+ print_child.name = xstrdup(argv[0]);
+ print_child.proc = proc;
+ print_child.data = info;
+ print_child.pid = fork();
+ if (print_child.pid == 0) { /* if child */
+ /* change into dir of DVI file so that included image files etc. are found */
+ (void)chdir(globals.dvi_file.dirname);
+
+ /* make the input file pointer the STDIN of the dvips process */
+ if (info->page_selection == PAGE_MARKED) { /* printing selected pages from temporary file */
+ ASSERT(finfo->tmp_dvi_fp != NULL, "tmp fp mustn't be NULL!");
+ (void)dup2(fileno(finfo->tmp_dvi_fp), STDIN_FILENO);
+ }
+ else { /* printing from main or backup file */
+ (void)dup2(fileno(finfo->in_fp), STDIN_FILENO);
+ }
+ (void)lseek(0, 0, SEEK_SET);
+
+ if (fout != NULL) { /* printing to file, make stdout of child go to fout */
+ (void)dup2(fileno(fout), STDOUT_FILENO);
+ (void)close(fileno(fout));
+ }
+ else { /* printing to printer, make stdout of child go to print_io[1] */
+ (void)dup2(print_io[1], STDOUT_FILENO);
+ }
+
+ /* make stderr of child go to print_io[1] */
+ (void)dup2(print_io[1], STDERR_FILENO);
+ (void)close(print_io[1]);
+ (void)close(print_io[0]);
+
+ if (setsid() == -1) { /* so we can kill the process group */
+ perror("setsid");
+ fflush(stderr);
+ _exit(1);
+ }
+ (void)execvp(*argv, argv);
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL,
+ "Execution of \"%s\" failed: %s.\n", *argv, strerror(errno));
+ fflush(stderr);
+ _exit(1);
+ }
+
+ if (fout != NULL)
+ fclose(fout);
+
+ if (print_child.pid == -1) { /* error */
+ perror("[xdvi] vfork");
+ return;
+ }
+
+ set_chld(&print_child);
+ dvips_sig = SIGINT;
+
+ (void)close(print_io[1]);
+
+ /* Set up file descriptor for non-blocking I/O */
+ prep_fd(print_io[0], True);
+ print_xio.fd = print_io[0];
+ print_xio.data = info;
+ set_io(&print_xio);
+
+ dvips_status = DVIPS_STAT_RUN; /* running */
+}
+
+/*
+ * Create an argument list for dvips, using information from info
+ * and X resources. Returns the result list in freshly allocated
+ * memory.
+ */
+static char **
+create_dvips_argv(const struct save_or_print_info *info, Boolean do_pdf)
+{
+ const struct select_pages_info *pinfo = info->pinfo;
+
+ size_t argv_len = 128; /* should be ample ... */
+ char **argv = xmalloc(argv_len * sizeof *argv);
+ size_t idx = 0;
+ const char *printer_options = info->printer_options;
+ const char *dvips_options = info->dvips_options;
+ char from_page[LENGTH_OF_INT];
+ char to_page[LENGTH_OF_INT];
+
+ TRACE_GUI((stderr, "dvips options: |%s|", dvips_options));
+
+ argv[idx++] = xstrdup(resource.dvips_path);
+
+ if (dvips_options != NULL) {
+ char **dvips_args = get_separated_list(dvips_options, " \t", True); /* this allocates dvips_args */
+ int i;
+ for (i = 0; dvips_args[i] != NULL; i++) {
+ argv[idx++] = dvips_args[i];
+ }
+ free(dvips_args);
+ }
+
+ if (do_pdf)
+ argv[idx++] = xstrdup("-Ppdf");
+
+ argv[idx++] = xstrdup("-f");
+
+ if (info->print_target == TO_PRINTER && printer_options != NULL) { /* printing to printer */
+ char **printer_args = get_separated_list(printer_options, " \t", True); /* this allocates printer_args */
+ int i;
+ ASSERT(*printer_args != NULL, "args should contain at least the string \"lpr\"");
+ argv[idx] = xstrdup("-o!");
+ argv[idx] = xstrcat(argv[idx], printer_args[0]);
+ free(printer_args[0]);
+ /* now append everything to the printer pipe command, so that dvips doesn't see it as an option */
+ for (i = 1; printer_args[i] != NULL; i++) {
+ argv[idx] = xstrcat(argv[idx], " ");
+ argv[idx] = xstrcat(argv[idx], printer_args[i]);
+ free(printer_args[i]);
+ }
+ free(printer_args);
+ idx++;
+ }
+
+ if (info->page_selection == PAGE_RANGE) {
+ /* convert back from 0-based to 1-based, also taking globals.pageno_correct into accout
+ * (which is 1 by default, so we need to add 2) */
+ argv[idx] = xstrdup("-p=");
+ SNPRINTF(from_page, LENGTH_OF_INT, "%d", pinfo->from - globals.pageno_correct + 2);
+ argv[idx] = xstrcat(argv[idx], from_page);
+ idx++;
+ argv[idx] = xstrdup("-l=");
+ SNPRINTF(to_page, LENGTH_OF_INT, "%d", pinfo->to - globals.pageno_correct + 2);
+ argv[idx] = xstrcat(argv[idx], to_page);
+ idx++;
+ }
+
+ argv[idx] = NULL; /* terminate it */
+ ASSERT(idx <= argv_len, "Too many elements");
+ return argv;
+}
+
+/* Check if selecting pages worked, report error else */
+static Boolean
+select_pages_report_error(const struct save_or_print_info *info)
+{
+ if (info->pinfo->errflag == NO_ERROR)
+ return False;
+
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ NULL,
+ "Could not save DVI file to %s: %s.",
+ info->finfo->tmp_dvi_file,
+ get_dvi_error(info->pinfo->errflag));
+ return True;
+}
+
+
+/*
+ * Collect dvips output, appending to print log.
+ * Currently return value is a dummy (NULL); TODO: return
+ * the output, for later filtering.
+ */
+static char *
+read_from_dvips(int ignored, void *data)
+{
+ int bytes;
+ char line[80];
+ struct save_or_print_info *info = data;
+
+ UNUSED(ignored);
+
+ for (;;) {
+#ifndef MOTIF
+ bytes = read(print_xio.fd, line, sizeof line);
+#else
+ bytes = read(print_xio.fd, line, sizeof line - 1);
+#endif
+ if (bytes < 0) {
+ if (AGAIN_CONDITION)
+ break;
+ perror("xdvi: read_from_dvips");
+ break;
+ }
+
+ if (bytes == 0)
+ break;
+ else {
+#ifdef MOTIF
+ line[bytes] = '\0';
+#endif
+ printlog_append(info, line, bytes);
+ }
+ }
+ return NULL; /* TODO */
+}
+
+/*
+ * Report dvips exit status, and remove temporary DVI file if needed.
+ */
+static void
+dvips_exited(int exitval, struct xchild *child)
+{
+ char str[128] = "";
+ int ms;
+
+ struct save_or_print_info *info = (struct save_or_print_info *)child->data;
+
+ read_from_dvips(0, info);
+ clear_io(&print_xio);
+ (void)close(print_xio.fd);
+
+ if (WIFEXITED(exitval)) {
+ if (WEXITSTATUS(exitval) == 0) {
+ if (info->act == FILE_SAVE || info->print_target == TO_FILE) {
+ printlog_append_str(info, "\nCreated Postscript file ");
+ printlog_append_str(info, info->finfo->out_file);
+ printlog_append_str(info, ".\n");
+ }
+ else {
+ printlog_append_str(info, "Done.\n");
+ }
+
+ /* remove temporary DVI file if it exists */
+ if (info->finfo->tmp_dvi_file != NULL) {
+ if (globals.debug & DBG_GUI)
+ TRACE_GUI((stderr, "NOT removing temporary DVI file: |%s|", info->finfo->tmp_dvi_file));
+ else {
+ if (info->finfo->tmp_dvi_fp != NULL) {
+ fclose(info->finfo->tmp_dvi_fp);
+ info->finfo->tmp_dvi_fp = NULL;
+ }
+ unlink(info->finfo->tmp_dvi_file);
+ info->finfo->tmp_dvi_file = NULL;
+ }
+ }
+ }
+ else
+ sprintf(str, "\nDvips returned exit code %d.\n", WEXITSTATUS(exitval));
+ }
+ else if (WIFSIGNALED(exitval))
+ sprintf(str, "\nDvips terminated by signal %d.\n", WTERMSIG(exitval));
+ else
+ sprintf(str, "\nDvips returned unknown status 0x%x.\n", exitval);
+
+ ms = resource.dvips_hang;
+ if (str[0] != '\0') {
+ xdvi_bell();
+ ms = resource.dvips_fail_hang;
+ printlog_append_str(info, str);
+ }
+
+ if (ms > 0) {
+ dvips_timer.data = info;
+ set_timer(&dvips_timer, ms);
+ dvips_status = DVIPS_STAT_WAIT;
+ }
+ else {
+ dvips_status = DVIPS_STAT_NONE;
+ }
+
+ printlog_enable_closebutton(info);
+}
+
+/*
+ * Report pd2pdf exit status, and remove temporary PS file if needed.
+ */
+static void
+ps2pdf_exited(int status, struct xchild *this)
+{
+ char *err_msg = NULL;
+ int ms = resource.dvips_hang;
+ struct save_or_print_info *info = (struct save_or_print_info *)this->data;
+
+ /* if child exited with error and xio struct is available for child,
+ print error text */
+ if (this->io != NULL && (WIFEXITED(status) != 0)) {
+ if ((WEXITSTATUS(status) != 0)
+ && (err_msg = (this->io->read_proc)(this->io->fd, NULL)) != NULL) {
+ char buf[LENGTH_OF_INT];
+ SNPRINTF(buf, LENGTH_OF_INT, "%d", WEXITSTATUS(status));
+ ms = resource.dvips_fail_hang;
+ xdvi_bell();
+ printlog_append_str(info, "\n\nError calling ");
+ if (this->name != NULL) {
+ printlog_append_str(info, "\"");
+ printlog_append_str(info, this->name);
+ printlog_append_str(info, "\" ");
+ }
+ printlog_append_str(info, "\nCommand exited with error code ");
+ printlog_append_str(info, buf);
+ printlog_append_str(info, ":\n");
+ printlog_append_str(info, err_msg);
+ free(err_msg);
+ }
+ else {
+ int retval;
+ printlog_append_str(info, "\nCreated PDF file ");
+ printlog_append_str(info, info->finfo->out_file);
+ printlog_append_str(info, ".\n");
+ TRACE_FILES((stderr, "Removing temporary PS file: `%s'",
+ info->finfo->tmp_ps_file));
+ retval = unlink(info->finfo->tmp_ps_file);
+ if (retval != 0) {
+ fprintf(stderr, "Could not unlink `%s': %s.\n",
+ info->finfo->tmp_ps_file, strerror(errno));
+ }
+ }
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, REPORT_XDVI_BUG_TEMPLATE,
+ "Internal error: ps2pdf_exited() called while child still running?");
+ }
+ if (ms > 0) {
+ dvips_timer.data = info;
+ set_timer(&dvips_timer, ms);
+ dvips_status = DVIPS_STAT_WAIT;
+ }
+ else {
+ dvips_status = DVIPS_STAT_NONE;
+ }
+
+ printlog_enable_closebutton(info);
+
+ free(this->name);
+ free(this->io);
+ free(this);
+}
+
+static void
+call_ps2pdf(const char *path, const struct save_or_print_info *info)
+{
+ const char *argv[5];
+ size_t idx = 0;
+
+ argv[idx++] = path;
+ argv[idx++] = info->finfo->tmp_ps_file;
+ argv[idx++] = info->finfo->out_file;
+ argv[idx++] = NULL;
+
+ /* need to run this in globals.xdvi_dir again, since the dvips conversion directory
+ globals.dvi_file.dirname may not be writable! */
+ if (!fork_process("ps2pdf", True, globals.cwd, ps2pdf_exited, (void *)info,
+ 0, (char **)argv)) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL, "Couldn't fork %s process: %s\n", argv[0], strerror(errno));
+ }
+}
+
+static void
+dvips_ps2pdf(int exitval, struct xchild *child)
+{
+ char str[128] = "";
+ int ms;
+ struct save_or_print_info *info = (struct save_or_print_info *)child->data;
+
+ read_from_dvips(0, info);
+ clear_io(&print_xio);
+ (void)close(print_xio.fd);
+
+ if (WIFEXITED(exitval)) {
+ if (WEXITSTATUS(exitval) == 0) {
+ /* dvips ended OK; call ps2pdf: */
+ TRACE_GUI((stderr, "Created temporary PS file |%s|", info->finfo->tmp_ps_file));
+ printlog_append_str(info, "\nCalling ");
+ printlog_append_str(info, resource.ps2pdf_path);
+ printlog_append_str(info, " ...");
+
+ /* remove temporary DVI file if it exists */
+ if (info->finfo->tmp_dvi_file != NULL) {
+ if (globals.debug & DBG_GUI)
+ TRACE_GUI((stderr, "NOT removing temporary DVI file: |%s|", info->finfo->tmp_dvi_file));
+ else {
+ if (info->finfo->tmp_dvi_fp != NULL) {
+ fclose(info->finfo->tmp_dvi_fp);
+ info->finfo->tmp_dvi_fp = NULL;
+ }
+ unlink(info->finfo->tmp_dvi_file);
+ info->finfo->tmp_dvi_file = NULL;
+ }
+ }
+ /* invoke ps2pdf conversion */
+ call_ps2pdf(resource.ps2pdf_path, info);
+ }
+ else
+ sprintf(str, "\nPrint process returned exit code %d.\n",
+ WEXITSTATUS(exitval));
+ }
+ else if (WIFSIGNALED(exitval))
+ sprintf(str, "\nPrint process terminated by signal %d.\n",
+ WTERMSIG(exitval));
+ else
+ sprintf(str, "\nPrint process returned unknown status 0x%x.\n",
+ exitval);
+
+ /* enable close button only if dvips conversion already failed */
+ ms = resource.dvips_hang;
+ if (str[0] != '\0') {
+ xdvi_bell();
+ ms = resource.dvips_fail_hang;
+ printlog_append_str(info, str);
+
+ if (ms > 0) {
+ dvips_timer.data = info;
+ set_timer(&dvips_timer, ms);
+ dvips_status = DVIPS_STAT_WAIT;
+ }
+ else {
+ dvips_status = DVIPS_STAT_NONE;
+ }
+
+ printlog_enable_closebutton(info);
+ }
+}
+
+
+static void
+dvips_alarm(struct xtimer *this, void *data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)data;
+ UNUSED(this);
+
+ printlog_popdown(info, False);
+
+ dvips_status = DVIPS_STAT_NONE;
+}
+
+
+
+static void
+cb_dvips_keep(Widget w, XtPointer client_data, XtPointer call_data)
+{
+
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(call_data);
+
+ /* use negative value so that we don't loose the value itself */
+ TRACE_GUI((stderr, "toggling resource from %d to %d, %d to %d",
+ resource.dvips_hang, -resource.dvips_hang,
+ resource.dvips_fail_hang, -resource.dvips_fail_hang));
+ resource.dvips_hang = -resource.dvips_hang;
+ resource.dvips_fail_hang = -resource.dvips_fail_hang;
+
+ store_preference(NULL, "dvipsHangTime", "%d", resource.dvips_hang);
+ store_preference(NULL, "dvipsFailHangTime", "%d", resource.dvips_fail_hang);
+
+
+ if (dvips_status == DVIPS_STAT_WAIT) {
+ dvips_status = DVIPS_STAT_NONE;
+ cancel_timer(&dvips_timer);
+ }
+}
+
+/* if user selects the window manager destroy button */
+static void
+cb_dvips_destroy(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ if (dvips_status == DVIPS_STAT_RUN) {
+ kill(print_child.pid, dvips_sig);
+ dvips_sig = SIGKILL;
+ printlog_append_str(info, "^C");
+ }
+
+ if (dvips_status == DVIPS_STAT_WAIT) {
+ dvips_status = DVIPS_STAT_NONE;
+ cancel_timer(&dvips_timer);
+ }
+
+ printlog_reset(info);
+ printlog_popdown(info, True);
+}
+
+static void
+cb_dvips_cancel(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ if (dvips_status != DVIPS_STAT_RUN)
+ return; /* How did we get here? */
+
+ kill(print_child.pid, dvips_sig);
+ dvips_sig = SIGKILL;
+ printlog_append_str(info, "^C");
+}
+
+static void
+cb_dvips_close(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ struct save_or_print_info *info = (struct save_or_print_info *)client_data;
+
+ UNUSED(w);
+ UNUSED(call_data);
+
+ if (dvips_status == DVIPS_STAT_RUN)
+ return; /* How did we get here? */
+
+ if (dvips_status == DVIPS_STAT_WAIT) {
+ dvips_status = DVIPS_STAT_NONE;
+ cancel_timer(&dvips_timer);
+ }
+
+ printlog_popdown(info, True);
+}
+
+
+void
+internal_save(struct save_or_print_info *info)
+{
+ struct file_info *finfo = info->finfo;
+ static struct callback_info cinfo = {
+ cb_dvips_close, cb_dvips_cancel, cb_dvips_destroy, cb_dvips_keep
+ };
+ int tmp_fd;
+ char **argv = NULL;
+ int i;
+ childProcT dvips_exit_proc = dvips_exited; /* default procedure to call after fork_dvips() */
+ Boolean do_pdf = False; /* force `-Ppdf' for dvips? (used for ps2pdf conversion) */
+
+ ASSERT(info->fmt != FMT_NONE, "No valid output format selected!");
+
+ /* fprintf(stderr, "INTERNAL SAVE - format: %d; selection: %d\n", info->fmt, info->page_selection); */
+
+ info->callbacks = &cinfo;
+
+ switch (info->fmt) {
+
+ case FMT_DVI:
+ /* here we first create a temporary file, and if that succeeded,
+ move it to the final position */
+ select_pages(info);
+
+ if (!select_pages_report_error(info)) {
+ /*
+ * ... else, move the temporary file to its final destination. For that, we
+ * try the more efficient rename() first; if this fails, try copying the file
+ * (rename() will e.g. fail if the tmp directory is on a different file
+ * system). We could perhaps examine errno after the renaming attempt to
+ * find out whether we need to do the copy attempt in the first place, but
+ * that'd be rather error-prone ... */
+ ASSERT(finfo->tmp_dvi_file != NULL, "filename mustn't be NULL");
+ if (rename(finfo->tmp_dvi_file, finfo->out_file) != 0
+ && !copy_file(finfo->tmp_dvi_file, finfo->out_file)) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL, "Creating %s failed: %s",
+ finfo->out_file, strerror(errno));
+ }
+ else { /* moving worked */
+ TRACE_GUI((stderr, "renamed %s to %s\n", finfo->tmp_dvi_file, finfo->out_file));
+
+ if (info->pinfo->warn_files.stack_len > 0) { /* do we need to warn user about referenced files? */
+ char *warn_files = xstrdup("");
+ size_t i;
+ for (i = 0; i < info->pinfo->warn_files.stack_len; i++) {
+ warn_files = xstrcat(warn_files, info->pinfo->warn_files.items[i].content);
+ warn_files = xstrcat(warn_files, "\n");
+ }
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ "The files listed in the message (probably images) are not part "
+ "of the newly created DVI file; they are only referenced by that file. "
+ "Therefore, if you want to distribute this file or use it on a different computer,"
+ "you will need to distribute all the referenced files, too.\n\n"
+ "Tip: A better format for distributing files is Postscript or PDF. "
+ "To create a Postscript file, use the `File->Print' menu, "
+ "then select `Print to file' in the dialog window.",
+ "Created %s.\n"
+ "Please note that the following files are referenced by this file, "
+ "and are needed for displaying or printing it correctly:\n%s\n",
+ finfo->out_file, warn_files);
+ free(warn_files);
+ }
+ else {
+/* char *ptr = strrchr(finfo->out_file, '/'); */
+/* if (ptr == NULL) */
+/* ptr = finfo->out_file; */
+/* else */
+/* ptr++; */
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ NULL,
+ "Created DVI file:\n%s.", finfo->out_file);
+ }
+ if (info->finfo->tmp_dvi_fp != NULL) {
+ fclose(info->finfo->tmp_dvi_fp);
+ info->finfo->tmp_dvi_fp = NULL;
+ }
+ unlink(finfo->tmp_dvi_file);
+ info->finfo->tmp_dvi_file = NULL;
+ }
+ }
+ break;
+
+ case FMT_PS2PDF:
+ free(finfo->tmp_ps_file);
+ finfo->tmp_ps_file = NULL;
+ tmp_fd = xdvi_temp_fd(&(finfo->tmp_ps_file)); /* this allocates finfo->tmp_ps_file */
+ if (tmp_fd == -1) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR, NULL,
+ "Couldn't create temporary PS file for conversion to PDF: %s",
+ strerror(errno));
+ return;
+ }
+ else {
+ TRACE_GUI((stderr, "name of temporary PS file: |%s|", finfo->tmp_ps_file));
+ }
+ dvips_exit_proc = dvips_ps2pdf; /* call ps2pdf conversion after dvips exited */
+ do_pdf = True;
+ /* fall through */
+ case FMT_PS:
+ if (info->page_selection == PAGE_MARKED) { /* want to save selected pages? */
+ ASSERT(info->pinfo->callback != NULL, "Callback musn't be NULL!");
+ ASSERT(finfo->tmp_dvi_fp != NULL, "Temporary file pointer musn't be NULL!");
+ ASSERT(finfo->tmp_dvi_file != NULL, "Temporary filename musn't be NULL!");
+ select_pages(info);
+ }
+ if (info->printlog == NULL)
+ printlog_create(info, "Xdvik: Saving", "Automatically close this window after file has been saved");
+ else
+ printlog_enable_cancelbutton(info);
+
+ if ((argv = create_dvips_argv(info, do_pdf)) == NULL) {
+ /* something went *really* wrong; assume user has already been warned about it */
+ return;
+ }
+ fork_dvips(argv, info, dvips_exit_proc);
+
+ /* dellocate argv */
+ for (i = 0; argv[i] != NULL; i++) {
+ free(argv[i]);
+ }
+ free(argv);
+
+ break;
+ case FMT_ISO_8859_1:
+ case FMT_UTF8:
+ if (search_extract_text(info)) {
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ NULL,
+ "Created text file %s.", finfo->out_file);
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_INFO,
+ NULL,
+ "Extracting text from DVI file failed!");
+ }
+ break;
+ case FMT_NONE:
+ break;
+ }
+}
+
+void
+internal_print(struct save_or_print_info *info)
+{
+ static struct callback_info cinfo = {
+ cb_dvips_close, cb_dvips_cancel, cb_dvips_destroy, cb_dvips_keep
+ };
+ char **argv = NULL;
+ int i;
+
+ info->callbacks = &cinfo;
+
+ if (info->page_selection == PAGE_MARKED) { /* want to print selected pages? */
+ ASSERT(info->pinfo->callback != NULL, "Callback musn't be NULL!");
+ ASSERT(info->finfo->tmp_dvi_fp != NULL, "Temporary file pointer musn't be NULL!");
+ ASSERT(info->finfo->tmp_dvi_file != NULL, "Temporary filename musn't be NULL!");
+ select_pages(info);
+ }
+ if (info->printlog == NULL)
+ printlog_create(info, "Xdvik: Printing", "Automatically close this window when printing finishes");
+ else
+ printlog_enable_cancelbutton(info);
+
+ if ((argv = create_dvips_argv(info, False)) == NULL) {
+ /* something went *really* wrong; assume user has already been warned about it */
+ return;
+ }
+
+ fork_dvips(argv, info, dvips_exited);
+
+ /* dellocate argv */
+ for (i = 0; argv[i] != NULL; i++) {
+ free(argv[i]);
+ }
+ free(argv);
+}
diff --git a/Build/source/texk/xdvik/print-internal.h b/Build/source/texk/xdvik/print-internal.h
new file mode 100644
index 00000000000..078f38f1b02
--- /dev/null
+++ b/Build/source/texk/xdvik/print-internal.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2002-2004 Paul Vojta and the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL ANY AUTHO OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef PRINT_INTERNAL_H_
+#define PRINT_INTERNAL_H_
+
+#include "dvi-init.h"
+
+typedef enum { FMT_PS, FMT_PS2PDF, FMT_DVI, FMT_ISO_8859_1, FMT_UTF8, FMT_NONE } outputFormatT;
+
+/* collection of all file IOs used in printing/saving */
+struct file_info {
+ char *tmp_dvi_file; /* temporary DVI file */
+ FILE *tmp_dvi_fp; /* FILE * for temporary DVI file */
+ char *tmp_ps_file; /* temporary PS file */
+ char *out_file; /* final output file */
+ /* FILE *out_fp; */ /* FILE * for final output file */
+ FILE *in_fp; /* FILE * for input file */
+};
+
+/* stacks for communication with selection routines */
+struct specials_stack_elem {
+ char *content; /* string content */
+};
+
+struct specials_stack {
+ size_t stack_len;
+ struct specials_stack_elem *items;
+};
+
+typedef enum printRadioT_ {
+ NO_PRINT_VAL = -1,
+ TO_PRINTER = 1,
+ TO_FILE
+} printRadioT;
+
+
+typedef enum pageRadioT_ {
+ NO_PAGE_VAL = -1,
+ PAGE_ALL = 1,
+ PAGE_MARKED,
+ PAGE_RANGE
+} pageRadioT;
+
+struct save_or_print_info; /* forward declaration */
+
+/* wrapper struct which stores information about values the user has
+ selected in the dialog.
+*/
+struct select_pages_info {
+ int from; /* lower bound of page range to be selected */
+ int to; /* upper bound of page range to be selected */
+/* struct file_info *finfo; \/\* additional file info pointer \*\/ */
+ /* callback function that says whether a page should be selected or not;
+ will be passed a pointer to the current struct save_or_print_info,
+ and the current page */
+ Boolean (*callback)(struct save_or_print_info *info, int page);
+ struct specials_stack warn_files; /* collect warnings about included files */
+ dviErrFlagT errflag; /* collect all kinds of errors that can happen while copying */
+};
+
+typedef enum { FILE_PRINT = 0, FILE_SAVE = 1 } printOrSaveActionT;
+
+
+struct callback_info {
+ XtCallbackProc cb_close;
+ XtCallbackProc cb_cancel;
+ XtCallbackProc cb_destroy;
+ XtCallbackProc cb_keep;
+};
+
+struct save_or_print_info {
+ printOrSaveActionT act; /* whether we're printing or saving */
+ outputFormatT fmt; /* DVI/PS/... */
+ printRadioT print_target; /* to printer or to file */
+ pageRadioT page_selection; /* which pages: all/marked/range */
+ char *printer_options; /* printer name + options from text field */
+ char *dvips_options; /* dvips options from text field */
+ Widget shell;
+ Widget message_popup;
+ Widget printlog;
+ struct select_pages_info *pinfo;
+ struct callback_info *callbacks;
+ struct file_info *finfo;
+};
+
+extern void internal_print(struct save_or_print_info *info);
+extern void internal_save(struct save_or_print_info *info);
+
+#endif /* PRINT_INTERNAL_H_ */
+
diff --git a/Build/source/texk/xdvik/psdps.c b/Build/source/texk/xdvik/psdps.c
new file mode 100644
index 00000000000..ca9cd042cc3
--- /dev/null
+++ b/Build/source/texk/xdvik/psdps.c
@@ -0,0 +1,869 @@
+/*========================================================================*\
+
+Copyright (c) 1994-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTES:
+This code was originally written by Ricardo Telichevesky
+(ricardo@rle-vlsi-mit.edu) and Luis Miguel Silveira
+(lms@rle-vlsi-mit.edu).
+It was largely influenced by similar code in the SeeTeX/XTeX
+package by Dirk Grunwald (grunwald@colorado.edu).
+
+\*========================================================================*/
+
+#ifdef PS_DPS /* entire file */
+
+
+#include "xdvi-config.h"
+#include "special.h"
+#include "util.h"
+#include "xdvi.h"
+
+#include <setjmp.h>
+#include <signal.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <DPS/XDPSlib.h>
+#include <DPS/dpsXclient.h>
+#include <DPS/dpsexcept.h>
+#include <DPS/dpsclient.h>
+
+#ifdef X_NOT_STDC_ENV
+ extern int errno;
+#endif
+
+#if defined(sun) || defined(__sun)
+#ifndef SUNHACK
+#define SUNHACK 1
+#endif
+#endif
+
+
+#include "dvi-init.h"
+#include "dvi-draw.h"
+#include "events.h"
+
+/*
+ * This string reads chunks (delimited by %%xdvimark).
+ * The first character of a chunk tells whether a given chunk
+ * is to be done within save/restore or not.
+ * The `H' at the end tells it that the first group is a
+ * header; i.e., no save/restore.
+ */
+#if !SUNHACK
+static char preamble[] =
+"/xdvi$line 81 string def "
+"/xdvi$run {{$error null ne {$error /newerror false put}if "
+" currentfile cvx stopped "
+" $error null eq {false} {$error /newerror get} ifelse and "
+" {handleerror} if} stopped pop} def "
+"/xdvi$dslen countdictstack def "
+"{currentfile read not {exit} if 72 eq "
+" {xdvi$run} "
+" {/xdvi$sav save def xdvi$run "
+" clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} "
+" ifelse "
+" {(%%xdvimark) currentfile xdvi$line {readline} stopped "
+" {clear} {pop eq {exit} if} ifelse }loop "
+" (xdvi$Ack\n) print flush "
+"}loop\nH";
+#else /* SUNHACK */
+static char preamble[] =
+"/xdvi$line 81 string def "
+"/xdvi$run {{$error null ne {$error /newerror false put}if "
+"currentfile cvx stopped "
+"$error null eq {false} {$error /newerror get} ifelse and "
+"{handleerror} if} stopped pop} def "
+"/xdvi$dslen countdictstack def "
+"/xdvi$ack {{(%%xdvimark) currentfile xdvi$line {readline} stopped "
+" {clear} {pop eq {exit} if} ifelse }loop "
+" (xdvi$Ack\n) print flush} bind def "
+"errordict begin /interrupt{(xdvi$Int\n) print flush stop}bind def "
+"end "
+"{{currentfile read not {exit} if 72 eq "
+" {xdvi$run} "
+" {/xdvi$sav save def xdvi$run "
+" clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} "
+" ifelse "
+" xdvi$ack "
+" }loop "
+"xdvi$ack "
+"}loop\nH";
+#endif /* SUNHACK */
+
+extern const char psheader[];
+extern unsigned psheaderlen;
+
+
+/* global procedures (besides initDPS) */
+
+static void toggleDPS(int flag);
+static void destroyDPS(void);
+static void interruptDPS(void);
+static void endpageDPS(void);
+static void drawbeginDPS(int, int, const char *);
+static void drawbeginDPS_box(int, int, const char *);
+static void drawrawDPS(const char *);
+static void drawfileDPS(const char *, FILE *);
+static void drawendDPS(const char *);
+static void beginheaderDPS(void);
+static void endheaderDPS(void);
+static void newdocDPS(void);
+
+static struct psprocs dps_procs = {
+ /* toggle */ toggleDPS,
+ /* destroy */ destroyDPS,
+ /* interrupt */ interruptDPS,
+ /* endpage */ endpageDPS,
+ /* drawbegin */ drawbeginDPS,
+ /* drawraw */ drawrawDPS,
+ /* drawfile */ drawfileDPS,
+ /* drawend */ drawendDPS,
+ /* beginheader */ beginheaderDPS,
+ /* endheader */ endheaderDPS,
+ /* newdoc */ newdocDPS
+};
+
+#define DPS_MASK_NORMAL EV_GE_NEWPAGE
+#define DPS_MASK_HEADER EV_GE_PS_TOGGLE
+#define DPS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE)
+
+static DPSContext DPS_ctx = NULL;
+static DPSSpace DPS_space = NULL;
+static unsigned long DPS_mag; /* magnification currently in use */
+static int DPS_shrink; /* shrink factor currently in use */
+static Boolean DPS_active; /* if we've started a page */
+static int DPS_pending; /* number of ack's we're expecting */
+static Boolean DPS_in_header; /* if we're sending a header */
+static Boolean DPS_in_doc; /* if we've sent header information */
+
+static int DPS_ev_mask = DPS_MASK_NORMAL; /* events for which we'll stop */
+
+
+#if 0
+static void DPSErrorProcHandler(void);
+#else
+#define DPSErrorProcHandler DPSDefaultErrorProc
+#endif
+
+
+static char ackstr[] = "xdvi$Ack\n";
+#if SUNHACK
+static char intstr[] = "xdvi$Int\n";
+static char intstr2[] = "xdvi$In2\n";
+#endif
+
+#define LINELEN 81
+#define BUFLEN (LINELEN + sizeof ackstr)
+static char line[BUFLEN + 1];
+static char *linepos = line;
+
+static void
+TextProc(DPSContext ctxt, char *buf, unsigned long count)
+{
+ unsigned long i;
+ char *p;
+ char *p0;
+
+ UNUSED(ctxt);
+
+ while (count > 0) {
+ i = line + BUFLEN - linepos;
+ if (i > count)
+ i = count;
+ memmove(linepos, buf, i);
+ linepos += i;
+ buf += i;
+ count -= i;
+ p0 = line;
+ for (;;) {
+ if (p0 >= linepos) {
+ linepos = line;
+ break;
+ }
+ p = memchr(p0, '\n', linepos - p0);
+ if (p == NULL) {
+ if (p0 != line) {
+ memmove(line, p0, linepos - p0);
+ linepos -= p0 - line;
+ }
+ else if (linepos == line + BUFLEN) {
+ char c;
+
+ c = line[LINELEN];
+ line[LINELEN] = '\0';
+ printf("DPS: %s\n", line);
+ line[LINELEN] = c;
+ linepos -= LINELEN;
+ memmove(line, line + LINELEN, linepos - line);
+ }
+ break;
+ }
+ if (p >= p0 + 8 && memcmp(p - 8, ackstr, 9) == 0) {
+ --DPS_pending;
+ if (DPS_pending == 0)
+ globals.ev.flags |= EV_ACK;
+ if (globals.debug & DBG_PS)
+ printf("Got DPS ack; %d pending.\n", DPS_pending);
+ ++p;
+ memmove(p, p - 9, p, linepos - p);
+ linepos -= 9;
+ continue;
+ }
+#if SUNHACK
+ if (p >= p0 + 8 && memcmp(p - 8, intstr, 9) == 0) {
+ if (globals.debug & DBG_PS)
+ puts("Got DPS int.");
+ ++p;
+ memmove(p - 9, p, linepos - p);
+ linepos -= 9;
+ globals.ev.flags |= EV_ACK;
+ continue;
+ }
+ if (p >= p0 + 8 && memcmp(p - 8, intstr2, 9) == 0) {
+ if (globals.debug & DBG_PS)
+ puts("Got DPS int 2.");
+ ++p;
+ memmove(p - 9, p, linepos - p);
+ linepos -= 9;
+ DPS_pending = 3;
+
+ continue;
+ }
+#endif /* SUNHACK */
+ *p = '\0';
+ printf("DPS: %s\n", p0);
+ p0 = p + 1;
+ }
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ waitack()
+
+ Arguments: none.
+
+ Returns: (void)
+
+ Description:
+ Waits until the requisite number of acknowledgements has been received from
+ the context.
+
+ +----------------------------------------------------------------------------*/
+
+#if SUNHACK
+static void DPS_alarm(struct xtimer *this, void *data);
+
+static struct xtimer DPS_timer = {NULL, {0, 0}, XTM_DEFAULT, DPS_alarm, NULL
+#if XDVI_XT_TIMER_HACK
+ , NULL, NULL
+#endif
+};
+
+static Boolean DPS_timer_set;
+
+static void DPS_alarm(struct xtimer *this, void *data)
+{
+ UNUSED(this);
+ UNUSED(data);
+ if (globals.debug & DBG_PS)
+ puts("Received DPS alarm");
+
+ DPS_timer_set = False;
+ globals.ev.flags |= EV_ACK;
+}
+#endif /* SUNHACK */
+
+static void
+waitack(void)
+{
+ if (DPS_pending <= 0)
+ return;
+
+ DPSFlushContext(DPS_ctx);
+ if (read_events(DPS_ev_mask | EV_ACK) & EV_ACK) {
+ globals.ev.flags &= ~EV_ACK;
+ return;
+ }
+
+ if (globals.debug & DBG_PS)
+ printf("Interrupting DPS in waitack(); code is now %d %x\n",
+ XDPSGetContextStatus(DPS_ctx), globals.ev.flags);
+
+ DPS_active = DPS_in_header = DPS_in_doc = False;
+ DPS_ev_mask = DPS_MASK_NORMAL;
+
+ /*
+ * I would really like to use DPSInterruptContext() here, but (at least
+ * on an RS6000) I can't get it to work.
+ */
+
+#if SUNHACK
+
+ /*
+ * On the other hand, under OpenWindows 3.3 (at least), destroying and
+ * re-creating contexts has a nasty habit of crashing the server.
+ */
+
+ DPS_pending = 32767;
+ DPSInterruptContext(DPS_ctx);
+ DPSFlushContext(DPS_ctx);
+ (void) read_events(EV_GE_TERM | EV_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ XSync(DISP, False);
+ DPSPrintf(DPS_ctx, " stop\n%%%%xdvimark\n stop\n%%%%xdvimark\n");
+ DPSPrintf(DPS_ctx, " (xdvi$In2\n) print flush stop\n%%%%xdvimark\n");
+ DPSPrintf(DPS_ctx, " stop\n%%%%xdvimark\n stop\n%%%%xdvimark\n");
+ DPSFlushContext(DPS_ctx);
+
+ if (globals.debug & DBG_PS)
+ puts("Setting DPS timer");
+
+ DPS_timer_set = True;
+ set_timer(&DPS_timer, 500);
+ (void) read_events(EV_GE_TERM | EV_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ if (DPS_pending <= 0) {
+ if (DPS_timer_set) {
+ cancel_timer(&DPS_timer);
+ }
+
+ return;
+ }
+
+ /*
+ * However, under Solaris 2.6 (at least), sometimes interrupting the
+ * context leaves it in an uncommunicative state, so destruction
+ * is the only alternative.
+ */
+
+ if (globals.debug & DBG_PS)
+ puts("Plan B: Destroying DPS context");
+
+#endif /* SUNHACK */
+
+ DPSDestroyContext(DPS_ctx);
+ DPS_ctx = NULL;
+ DPS_pending = 0;
+}
+
+
+/*---------------------------------------------------------------------------*
+ initDPS()
+
+ Arguments: (none)
+ Returns: (void)
+ Side-Effects: DPS_ctx may be set as well as other static variables.
+
+ Description:
+ Initializes variables from the application main loop. Checks to see if
+ a connection to the DPS server can be opened.
+
+ +----------------------------------------------------------------------------*/
+
+static int
+get_shift(Pixel mask)
+{
+ int k;
+
+ for (k = 0; (mask & 1) == 0; ++k)
+ mask >>= 1;
+ return k;
+}
+
+Boolean initDPS(void)
+{
+
+ /* Try to create a context */
+
+#if GREY
+
+ if (G_colormap == DefaultColormapOfScreen(SCRN))
+ DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0,
+ TextProc, DPSDefaultErrorProc, NULL);
+ else {
+ static XStandardColormap *ccube = NULL;
+ static XStandardColormap *grayramp = NULL;
+ int shift;
+
+ if (grayramp == NULL) {
+ grayramp = XAllocStandardColormap();
+ if (grayramp == NULL)
+ return False;
+ }
+
+ if (ccube == NULL) {
+ ccube = XAllocStandardColormap();
+ if (ccube == NULL)
+ return False;
+ }
+
+ shift = get_shift(G_visual->red_mask);
+ ccube->red_max = G_visual->red_mask >> shift;
+ ccube->red_mult = 1 << shift;
+
+ shift = get_shift(G_visual->green_mask);
+ ccube->green_max = G_visual->green_mask >> shift;
+ ccube->green_mult = 1 << shift;
+
+ shift = get_shift(G_visual->blue_mask);
+ ccube->blue_max = G_visual->blue_mask >> shift;
+ ccube->blue_mult = 1 << shift;
+
+ grayramp->red_max = ccube->red_max & ccube->green_max & ccube->blue_max;
+ grayramp->red_mult = ccube->red_mult + ccube->green_mult
+ + ccube->blue_mult;
+
+ ccube->colormap = grayramp->colormap = G_colormap;
+ ccube->visualid = grayramp->visualid = G_visual->visualid;
+
+ DPS_ctx = XDPSCreateContext(DISP, mane.win, globals.gc.copy, 0, 0,
+ 0, grayramp, ccube,
+ /* actual */
+ (ccube->red_max + 1) * (ccube->green_max +
+ 1) *
+ (ccube->blue_max + 1), TextProc,
+ DPSDefaultErrorProc, NULL);
+ }
+
+#else /* not GREY */
+
+ DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0,
+ TextProc, DPSDefaultErrorProc, NULL);
+
+#endif /* not GREY */
+
+ if (DPS_ctx == NULL)
+ return False;
+
+ DPS_mag = DPS_shrink = -1;
+ DPS_active = False;
+ DPS_pending = 1;
+
+ DPS_space = DPSSpaceFromContext(DPS_ctx);
+ DPSWritePostScript(DPS_ctx, preamble, (sizeof preamble) - 1);
+ DPSWritePostScript(DPS_ctx, (char *)psheader, psheaderlen);
+ DPSPrintf(DPS_ctx, "matrix setmatrix stop\n%%%%xdvimark\n");
+ DPSFlushContext(DPS_ctx);
+
+ psp = dps_procs;
+ return True;
+}
+
+
+/*---------------------------------------------------------------------------*
+ toggleDPS(int flag)
+
+ Arguments: flag for toggling PostScript
+ Returns: (void)
+ Side-Effects: psp.drawbegin is changed.
+
+ Description:
+ Used to toggle the rendering of PostScript by the DPS server
+ This routine may be called from within read_events().
+
+ +----------------------------------------------------------------------------*/
+
+static void
+toggleDPS(int flag)
+{
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "Toggling DPS to %d", flag);
+
+ switch (flag) {
+ case 0:
+ psp.drawbegin = drawbegin_none;
+ break;
+ case 1:
+ psp.drawbegin = drawbeginDPS;
+ break;
+ default:
+ psp.drawbegin = drawbeginDPS_box;
+ break;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ destroyDPS()
+
+ Arguments: none
+ Returns: (void)
+ Side-Effects: the context is nulled out and destroyed.
+
+ Description:
+ Close the connection to the DPS server; used when rendering is terminated
+ in any way.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+destroyDPS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Calling destroyDPS()");
+ if (linepos > line) {
+ *linepos = '\0';
+ printf("DPS: %s\n", line);
+ }
+ if (DPS_space != NULL)
+ DPSDestroySpace(DPS_space);
+ psp = no_ps_procs;
+ scanned_page = scanned_page_ps = scanned_page_reset;
+}
+
+
+/*---------------------------------------------------------------------------*
+ interruptDPS()
+
+ Arguments: none
+ Returns: (void)
+ Side-Effects: the context may be nulled out and destroyed.
+
+ Description:
+ Close the connection to the DPS server; used when rendering is terminated
+ because of an interruption in the viewing of the current page.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+interruptDPS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running interruptDPS()");
+
+ if (DPS_pending <= 0)
+ return; /* nothing to do */
+
+ if (DPS_active) {
+ DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n");
+ DPS_active = False;
+ }
+
+ waitack();
+}
+
+
+/*---------------------------------------------------------------------------*
+ endpageDPS()
+
+ Arguments: none
+ Returns: (void)
+ Side-Effects: the DPS_active variable is cleared.
+
+ Description:
+ Should be called at the end of a page to end this chunk for the DPS server.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+endpageDPS(void)
+{
+ if (DPS_active) {
+ if (globals.debug & DBG_PS)
+ puts("Endpage sent to context");
+ DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n");
+ DPS_active = False;
+ waitack();
+ }
+}
+
+
+/*
+ * checkDPS - Check that the DPS interpreter is still running.
+ * Return True for success, False for failure.
+ */
+
+static Boolean
+checkDPS(void)
+{
+ /* static char faulty_display_vs[]
+ * ="DECWINDOWS DigitalEquipmentCorporation UWS4.2LA"; */
+
+ if (DPS_ctx == NULL) {
+ DPS_ctx = XDPSCreateSimpleContext(DISP, mane.win, globals.gc.copy, 0, 0,
+ TextProc, DPSErrorProcHandler, DPS_space);
+ if (DPS_ctx == NULL) {
+ psp = no_ps_procs;
+ draw_bbox();
+ return False;
+ }
+ DPSWritePostScript(DPS_ctx, preamble, (sizeof preamble) - 1);
+ /* it already has psheader */
+ DPSPrintf(DPS_ctx, "matrix setmatrix stop\n%%%%xdvimark\n");
+ DPS_mag = DPS_shrink = -1;
+ DPS_active = False;
+ DPS_pending = 1;
+ }
+
+ return True;
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawbeginDPS ()
+
+ Arguments: xul, yul - coordinates of the upper left corner of the figure
+ cp - string with the bounding box line data
+ Returns: (void)
+ Side-Effects: DPS_ctx is set is set and connection to DPS server is
+ opened.
+
+ Description:
+ Opens a connection to the DPS server and send in the preamble and the
+ bounding box information after correctly computing resolution factors.
+ In case no rendering is to be done, outlines the figure.
+ An outline is also generated whenever the a context cannot be allocated
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawbeginDPS(int xul, int yul, const char *cp)
+{
+ if (globals.debug & DBG_PS)
+ printf("Begin drawing at xul= %d, yul= %d.\n", xul, yul);
+
+ if (!checkDPS()) return;
+
+ if (!DPS_active) {
+ /* send initialization to context */
+ if (magnification != DPS_mag) {
+ DPSPrintf(DPS_ctx, "H TeXDict begin /DVImag %d 1000 div def "
+ "end stop\n%%%%xdvimark\n", DPS_mag = magnification);
+ ++DPS_pending;
+ }
+ if (mane.shrinkfactor != DPS_shrink) {
+ DPSPrintf(DPS_ctx, "H TeXDict begin %d %d div dup "
+ "/Resolution X /VResolution X "
+ "end stop\n%%%%xdvimark\n", resource.pixels_per_inch, DPS_shrink = mane.shrinkfactor);
+ ++DPS_pending;
+ }
+ DPSPrintf(DPS_ctx, " TeXDict begin\n");
+ DPS_active = True;
+ ++DPS_pending;
+ }
+
+ if (globals.ev.flags & DPS_MASK_NORMAL)
+ longjmp(globals.ev.canit, 1);
+
+ DPSPrintf(DPS_ctx, "%d %d moveto\n", xul, yul);
+ DPSPrintf(DPS_ctx, "%s\n", cp);
+}
+
+static void
+drawbeginDPS_box(int xul, int yul, const char *cp)
+{
+ drawbeginDPS(xul, yul, cp);
+ draw_bbox();
+}
+
+/*---------------------------------------------------------------------------*
+
+drawrawDPS()
+
+Arguments: cp - the raw string to be sent to the postscript interpreter
+Returns: (void)
+Side-Effects: (none)
+
+Description:
+If there is a valid postscript context, just send the string to the
+interpreter, else leave.
+
++----------------------------------------------------------------------------*/
+
+static void
+drawrawDPS(const char *cp)
+{
+ if (!DPS_active || (globals.ev.flags & DPS_ev_mask))
+ return;
+
+ if (globals.debug & DBG_PS)
+ printf("Sending raw PS to context: %s\n", cp);
+
+ DPSPrintf(DPS_ctx, "%s\n", cp);
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawfileDPS()
+
+ Arguments: cp - string with the postscript file pathname
+ psfile - opened file pointer
+ Returns: (void)
+ Side-Effects: none
+
+ Description:
+ Postscript file containing the figure is opened and sent to the DPS server.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawfileDPS(const char *cp, FILE *psfile)
+{
+ char buffer[1025];
+ int blen;
+
+ if (DPS_active && !(read_events(EV_NOWAIT) & DPS_ev_mask)) {
+ if (globals.debug & DBG_PS)
+ printf("sending file %s\n", cp);
+ for (;;) {
+ blen = fread(buffer, sizeof(char), 1024, psfile);
+ if (blen == 0) break;
+ DPSWritePostScript(DPS_ctx, buffer, blen);
+ if (read_events(EV_NOWAIT) & DPS_ev_mask) {
+ /* ||| stop at a good place */
+ if (globals.debug & DBG_PS)
+ puts("Interrupting in drawfileDPS");
+ break;
+ }
+ }
+ }
+
+ fclose(psfile);
+
+ if (globals.ev.flags & DPS_ev_mask)
+ longjmp(globals.ev.canit, 1);
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawendDPS()
+
+ Arguments: cp - string with indication of the end of the special
+ Returns: (void)
+ Side-Effects: none
+
+ Description:
+ Sends the indication of end of the figure PostScript code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawendDPS(const char *cp)
+{
+ if (!DPS_active || (globals.ev.flags & DPS_MASK_NORMAL))
+ return;
+
+ if (globals.debug & DBG_PS)
+ printf("End PS: %s\n", cp);
+ DPSPrintf(DPS_ctx, "%s\n", cp);
+}
+
+
+/*---------------------------------------------------------------------------*
+ beginheaderDPS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Prepares the PostScript interpreter for receipt of header code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+beginheaderDPS(void)
+{
+ if (globals.ev.flags & DPS_MASK_HEADER || !checkDPS())
+ return;
+
+ if (globals.debug & DBG_PS)
+ puts("Running beginheaderDPS()");
+
+ if (DPS_active) {
+ if (!DPS_in_header)
+ XDVI_FATAL((stderr, "Internal error in beginheaderDPS()."));
+ return;
+ }
+
+ DPS_in_header = True;
+ DPS_ev_mask = DPS_MASK_HEADER;
+
+ if (DPS_in_doc)
+ DPSPrintf(DPS_ctx, "H");
+ else {
+ DPSPrintf(DPS_ctx, "Hsave /xdvi$doc exch def\n");
+ DPS_in_doc = True;
+ }
+ DPS_active = True;
+ ++DPS_pending;
+}
+
+
+/*---------------------------------------------------------------------------*
+ endheaderDPS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Prepares the PostScript interpreter for receipt of header code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+endheaderDPS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running endheaderDPS()");
+
+ if (DPS_active) {
+ DPSPrintf(DPS_ctx, "stop\n%%%%xdvimark\n");
+ DPS_active = False;
+ waitack();
+ DPS_in_header = False;
+ DPS_ev_mask = DPS_MASK_NORMAL;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ newdocDPS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Clears out headers stored from the previous document.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+newdocDPS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running newdocDPS()");
+
+ if (DPS_in_doc) {
+ DPSPrintf(DPS_ctx, "H xdvi$doc restore stop\n%%%%xdvimark\n");
+ ++DPS_pending;
+ DPS_mag = DPS_shrink = -1;
+ DPS_in_doc = False;
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* PS_DPS */
diff --git a/Build/source/texk/xdvik/psdps.h b/Build/source/texk/xdvik/psdps.h
new file mode 100644
index 00000000000..0d2be7a72e2
--- /dev/null
+++ b/Build/source/texk/xdvik/psdps.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PSDPS_H_
+#define PSDPS_H_
+
+extern Boolean initDPS(void);
+
+#endif /* PSDPS_H_ */
diff --git a/Build/source/texk/xdvik/psgs.c b/Build/source/texk/xdvik/psgs.c
new file mode 100644
index 00000000000..4d82c5182cb
--- /dev/null
+++ b/Build/source/texk/xdvik/psgs.c
@@ -0,0 +1,1085 @@
+/*========================================================================*\
+
+Copyright (c) 1994-2019 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+\*========================================================================*/
+
+#ifdef PS_GS /* entire file */
+
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "psgs.h"
+
+#include <setjmp.h>
+#include <X11/Xatom.h>
+#include <sys/time.h> /* for timeval */
+
+#include <signal.h>
+
+/* Condition for retrying a write */
+#include <errno.h>
+#include <string.h>
+
+#include "kpathsea/c-pathmx.h"
+#include "dvi-init.h"
+#include "dvi-draw.h"
+#include "events.h"
+#include "statusline.h"
+#include "special.h"
+#include "util.h"
+
+
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+#endif
+
+#ifdef EWOULDBLOCK
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN)
+# else
+# define AGAIN_CONDITION (errno == EWOULDBLOCK)
+# endif
+#else
+# ifdef EAGAIN
+# define AGAIN_CONDITION (errno == EAGAIN)
+# endif
+#endif
+
+#if HAVE_POLL
+# include <poll.h>
+# define XIO_IN POLLIN
+# define XIO_OUT POLLOUT
+#else
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif
+
+#ifdef MOTIF
+# include <Xm/Xm.h>
+#endif
+
+extern const char psheader[];
+extern unsigned psheaderlen;
+
+Boolean gs_postpone_prescan = False;
+
+/* global procedures (besides initGS) */
+
+static void toggle_gs(int flag);
+static void destroy_gs(void);
+static void interrupt_gs(void);
+static void endpage_gs(void);
+static void drawbegin_gs(int, int, const char *);
+static void drawbegin_gs_box(int, int, const char *);
+void drawraw_gs(const char *);
+static void drawfile_gs(const char *, FILE *);
+static void drawend_gs(const char *);
+static void beginheader_gs(void);
+static void endheader_gs(void);
+static void newdoc_gs(void);
+
+static struct psprocs gs_procs = {
+ /* toggle */ toggle_gs,
+ /* destroy */ destroy_gs,
+ /* interrupt */ interrupt_gs,
+ /* endpage */ endpage_gs,
+ /* drawbegin */ drawbegin_gs,
+ /* drawraw */ drawraw_gs,
+ /* drawfile */ drawfile_gs,
+ /* drawend */ drawend_gs,
+ /* beginheader */ beginheader_gs,
+ /* endheader */ endheader_gs,
+ /* newdoc */ newdoc_gs
+};
+
+static int std_io[2];
+Pixmap bpixmap;
+
+#define GS_fd (std_io[0])
+
+/* some arguments are filled in later */
+static char arg4[] = "-dDEVICEWIDTH=xxxxxxxxxx";
+static char arg5[] = "-dDEVICEHEIGHT=xxxxxxxxxx";
+
+static const char *argv[] = {
+ NULL, NULL, "-dNOPAUSE", "-q", arg4, arg5,
+ "-dDEVICEXRESOLUTION=72",
+ "-dDEVICEYRESOLUTION=72",
+ "-dNOSAFER", "-dNOEPS", NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+static unsigned int GS_page_w; /* how big our current page is */
+static unsigned int GS_page_h;
+static Boolean GS_alpha; /* remember if we are using the alpha driver */
+static unsigned long GS_mag; /* magnification currently in use */
+static int GS_shrink; /* shrink factor currently in use */
+static Boolean GS_active; /* if we've started a page yet */
+static int GS_pending; /* number of ack's we're expecting */
+static char GS_outb[257]; /* circular output buffer */
+static char *GS_outb_in; /* next position in output buffer */
+static char *GS_outb_out; /* next byte to come out of buffer */
+#define GS_outb_limit (GS_outb + sizeof GS_outb) /* last+1 byte */
+static int GS_write_ack; /* flag to set when done writing */
+static Boolean GS_in_header; /* if we're sending a header */
+static Boolean GS_in_doc; /* if we've sent header information */
+static Boolean GS_page_dirty = False; /* if we've drawn since last erase */
+static int GS_ev_mask; /* events for which we'll stop */
+static int GS_die_ack = 0; /* flags to set when GS dies */
+static Boolean GS_timer_set; /* if there's a timer set */
+
+#define GS_MASK_NORMAL EV_GE_NEWPAGE
+#define GS_MASK_HEADER EV_GE_PS_TOGGLE
+#define GS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE)
+
+static Atom gs_atom;
+static Atom gs_colors_atom;
+
+#define Landscape 90
+
+#define LINELEN 81
+static char line[LINELEN + 1];
+static char *linepos = line;
+static char ackstr[] = "\347\310\376";
+
+static void gs_died(int, struct xchild *);
+
+static char *read_from_gs(int, void *);
+static void write_to_gs(int, void *);
+
+static struct xio gs_xio = {NULL, 0, XIO_IN,
+#if HAVE_POLL
+ NULL,
+#endif
+ read_from_gs, write_to_gs,
+ NULL /* data */
+};
+
+static struct xchild gs_child = { NULL, 0, NULL, NULL, NULL, SIGKILL, gs_died };
+#define GS_pid (gs_child.pid)
+
+/* It seems that XtTimers don't work reliably with xdvi's event treatment;
+ so use custom timers for the time being. Search for TIMER_PROBLEM_FIXED
+ to locate the relevant code parts.
+*/
+
+#if TIMER_PROBLEM_FIXED
+static XtIntervalId gs_timeout_id = 0;
+static void gs_timer_proc(XtPointer client_data, XtIntervalId * id);
+static struct xtimer gs_timer = {NULL, {0, 0}, gs_timer_proc, NULL
+#if XDVI_XT_TIMER_HACK
+ , NULL, NULL
+#endif
+};
+
+#else
+static void gs_alarm(struct xtimer *this, void *data);
+static struct xtimer gs_timer = {NULL, {0, 0}, XTM_DEFAULT, gs_alarm, NULL
+#if XDVI_XT_TIMER_HACK
+ , NULL, NULL
+#endif
+};
+#endif
+
+
+static void
+showto(char *q)
+{
+ char *p = line;
+ char *p1;
+
+ while (p < q) {
+ p1 = memchr(p, '\n', q - p);
+ if (p1 == NULL)
+ p1 = q;
+ *p1 = '\0';
+ printf("gs: %s\n", p);
+ p = p1 + 1;
+ }
+}
+
+static char *
+read_from_gs(int fd, void *data)
+{
+ int bytes;
+ char *line_end = NULL;
+ char *p;
+
+ UNUSED(data);
+
+ for (;;) {
+
+ bytes = read(fd, linepos, line + LINELEN - linepos);
+ if (bytes < 0) {
+ if (AGAIN_CONDITION)
+ break;
+ perror("xdvik: read_from_gs");
+ break;
+ }
+ line_end = linepos + bytes;
+
+ if (bytes == 0) {
+ if (GS_pid != 0)
+ XDVI_WARNING((stderr, "Read_from_gs returned 0 bytes"));
+ break;
+ }
+
+ /* Check for ack strings */
+ for (p = line; p < line_end - 2; ++p) {
+ p = memchr(p, '\347', line_end - p - 2);
+ if (p == NULL) break;
+ if (memcmp(p, ackstr, 3) == 0) {
+ --GS_pending;
+ if (GS_pending == 0)
+ globals.ev.flags |= EV_ACK;
+ if (globals.debug & DBG_PS)
+ printf("Got GS ack; %d pending.\n", GS_pending);
+ } else
+ continue;
+
+ showto(p);
+ p += 3;
+ memmove(line, p, line_end - p);
+ line_end -= p - line;
+ linepos = p = line;
+ --p;
+ }
+ *line_end = '\0';
+ p = strrchr(linepos, '\n');
+ if (p != NULL) {
+ ++p;
+ showto(p);
+ memmove(line, p, line_end - p);
+ line_end -= p - line;
+ }
+ linepos = line_end;
+ /*
+ * Normally we'd hold text until a newline character, but the
+ * buffer is full. So we flush it, being careful not to cut up an
+ * ack string.
+ */
+ if (linepos >= line + LINELEN) {
+ p = line + LINELEN;
+ if ((*--p != '\347' && *--p != '\347' && *--p != '\347')
+ || memcmp(p, ackstr, line + LINELEN - p) != 0)
+ p = line + LINELEN;
+ *p = '\0';
+ printf("gs: %s\n", line);
+ *p = '\347';
+ linepos = line;
+ while (p < line + LINELEN)
+ *linepos++ = *p++;
+ }
+ }
+ return line_end; /* dummy */
+}
+
+static void
+write_to_gs(int fd, void *data)
+{
+ char *send_end;
+ int bytes;
+
+ UNUSED(fd);
+ UNUSED(data);
+
+ for (;;) {
+ send_end = GS_outb_in;
+ if (send_end < GS_outb_out)
+ send_end = GS_outb_limit;
+ bytes = write(GS_fd, GS_outb_out, send_end - GS_outb_out);
+
+ if (bytes < 0) {
+ if (AGAIN_CONDITION)
+ break;
+ perror("xdvik: write_to_gs");
+ break;
+ }
+
+ GS_outb_out += bytes;
+ if (GS_outb_out == GS_outb_limit)
+ GS_outb_out = GS_outb;
+ if (GS_outb_out == GS_outb_in) { /* if buffer is empty */
+ gs_xio.xio_events = XIO_IN;
+#if HAVE_POLL
+ if (gs_xio.pfd != NULL) /* write_to_gs is called directly */
+ gs_xio.pfd->events = XIO_IN;
+#endif
+ break;
+ }
+ }
+ globals.ev.flags |= GS_write_ack;
+ GS_write_ack = 0;
+}
+
+/*
+ * Main routine for writing to the GS interpreter.
+ */
+
+static void
+gs_send(const char *cp, size_t len)
+{
+ const char *cp_end = cp + len;
+ char *send_end;
+ size_t bytes;
+ char *old_out;
+ Boolean interrupting;
+
+ if (GS_pid == 0 || (globals.ev.flags & GS_ev_mask))
+ return;
+
+ /*
+ * Because cp might reside on the stack, don't return until we've
+ * copied all of it to our circular output buffer.
+ * Note that GS_outb_out == GS_outb_in means that the buffer is empty.
+ */
+
+ GS_timer_set = interrupting = False;
+ for (;;) {
+ send_end = GS_outb_out;
+ if (send_end == GS_outb)
+ send_end = GS_outb_limit;
+ --send_end;
+ if (send_end < GS_outb_in)
+ send_end = GS_outb_limit;
+ bytes = send_end - GS_outb_in;
+ if (bytes > 0) {
+ if (bytes >= (unsigned)(cp_end - cp))
+ bytes = cp_end - cp;
+ memcpy(GS_outb_in, cp, bytes);
+ cp += bytes;
+ GS_outb_in += bytes;
+ if (GS_outb_in == GS_outb_limit)
+ GS_outb_in = GS_outb;
+ if (cp < cp_end)
+ continue;
+ }
+
+ /* The buffer is now full --or-- we've run out of data */
+ old_out = GS_outb_out;
+ if (!(gs_xio.xio_events & XIO_OUT)) { /* restart output */
+ gs_xio.xio_events = XIO_IN | XIO_OUT;
+#if HAVE_POLL
+ if (gs_xio.pfd != NULL)
+ gs_xio.pfd->events = POLLIN | POLLOUT;
+#endif
+ write_to_gs(GS_fd, NULL);
+ if (GS_outb_out != old_out) {
+ if (cp == cp_end)
+ break;
+ else
+ continue;
+ }
+ }
+
+ if (cp == cp_end)
+ break;
+
+ GS_die_ack = GS_write_ack = EV_ACK;
+ for (;;) { /* loop because there may be stray ACKs */
+ if (!interrupting) {
+ (void) read_events(GS_ev_mask | EV_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ if (GS_pid == 0) { /* if GS died */
+ GS_die_ack = 0;
+ return;
+ }
+
+ if (GS_outb_out != old_out) /* if more room in buffer */
+ break;
+
+ if (globals.ev.flags & GS_ev_mask) { /* if a serious event */
+ if (globals.debug & DBG_PS)
+ puts("Setting timeout in gs_send()");
+
+ set_timer(&gs_timer, resource.gs_timeout);
+ GS_timer_set = interrupting = True;
+ }
+ }
+ else {
+ (void) read_events(EV_GE_TERM | EV_PS_TOGGLE | EV_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ if (GS_outb_out != old_out) /* if more room in buffer */
+ break;
+
+ if (GS_timer_set) /* if timer still set */
+ cancel_timer(&gs_timer);
+
+ destroy_gs();
+ GS_die_ack = 0;
+ return;
+ }
+ }
+ }
+
+ if (GS_timer_set) /* if timer still set */
+ cancel_timer(&gs_timer);
+
+ GS_die_ack = GS_write_ack = 0;
+}
+
+static void
+#if TIMER_PROBLEM_FIXED
+gs_timer_proc(XtPointer client_data, XtIntervalId * id)
+#else
+ gs_alarm(struct xtimer *this, void *data)
+#endif
+{
+ UNUSED(this);
+ UNUSED(data);
+
+ if (globals.debug & DBG_PS)
+ puts("GS timeout expired");
+
+ globals.ev.flags |= EV_ACK;
+ GS_timer_set = False;
+#if TIMER_PROBLEM_FIXED
+ gs_timeout_id = 0;
+#endif
+}
+
+/*
+ * Wait for acknowledgement from GS.
+ */
+
+static void
+waitack(void)
+{
+ if (GS_pending == 0) {
+ globals.ev.flags &= ~EV_ACK;
+ return;
+ }
+
+ GS_die_ack = EV_ACK;
+
+ for (;;) { /* loop because there might be stray ACKs. */
+ /* fprintf(stderr, "looping for stray ACKs, page %d\n", current_page); */
+ (void) read_events(EV_GE_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ if (GS_pending == 0) {
+ GS_die_ack = 0;
+ return;
+ }
+ if (globals.ev.flags & EV_GE_ACK)
+ break;
+ }
+
+ if (globals.debug & DBG_PS)
+ puts("Setting timeout in waitack()");
+
+#if TIMER_PROBLEM_FIXED
+ if (gs_timeout_id)
+ XtRemoveTimeOut(gs_timeout_id);
+ gs_timeout_id = XtAppAddTimeOut(globals.app, resource.gs_timeout,
+ gs_timer_proc, (XtPointer) NULL);
+#else
+ set_timer(&gs_timer, resource.gs_timeout);
+#endif
+ GS_timer_set = True;
+
+ (void) read_events(EV_GE_TERM | EV_PS_TOGGLE | EV_ACK);
+ globals.ev.flags &= ~EV_ACK;
+
+ if (GS_timer_set) {
+#if TIMER_PROBLEM_FIXED
+ XtRemoveTimeOut(gs_timeout_id);
+ gs_timeout_id = 0;
+#else
+ cancel_timer(&gs_timer);
+#endif
+ }
+ GS_die_ack = 0;
+
+ if (GS_pending > 0)
+ destroy_gs();
+}
+
+
+/*
+ * Fork a process to run ghostscript. This is done using the
+ * x11 device (which needs to be compiled in). Normally the x11
+ * device uses ClientMessage events to communicate with the calling
+ * program, but we don't do this. The reason for using the ClientMessage
+ * events is that otherwise ghostview doesn't know when a non-conforming
+ * postscript program calls showpage. That doesn't affect us here,
+ * since in fact we disable showpage.
+ *
+ * SAFER mode is handled by providing both the -dNOSAFER and -dSAFER
+ * options. Ghostscript versions 7.04 and earlier ignore -dNOSAFER and use
+ * -dSAFER; the code in strsafe is ignored since .locksafe is not present.
+ * In versions 7.04 and higher, -dNOSAFER overrides -dSAFER; SAFER mode is
+ * optionally turned on by sending the strsafe string. It is possible in some
+ * versions of gs prior to 7.04 to use -dDELAYSAFER instead of -dNOSAFER, but
+ * there's no point in doing that since .locksafe is not defined in those
+ * versions. I don't know where 7.03 fits in on all of this (but it works with
+ * that version as well).
+ */
+
+Boolean
+initGS(void)
+{
+ char buf[100];
+ static Boolean did_putenv = False;
+ /*
+ * This string reads chunks (delimited by %%xdvimark).
+ * The first character of a chunk tells whether a given chunk
+ * is to be done within save/restore or not.
+ * The `H' at the end tells it that the first group is a
+ * header; i.e., no save/restore.
+ * `execute' is unique to ghostscript.
+ */
+
+ static const char strsafe[] =
+ "{ << /PermitFileReading [ (*) ] /PermitFileWriting [ ] /PermitFileControl [ ] "
+ ">> setuserparams .locksafe "
+ "} stopped pop\n";
+ static const char str1[] =
+ "/xdvi$run "
+ "{$error /newerror false put currentfile cvx stopped {handleerror} if} "
+ "def "
+ "/xdvi$ack (\347\310\376) def "
+ "/xdvi$dslen countdictstack def "
+ "{currentfile read pop 72 eq "
+ "{xdvi$run} "
+ "{/xdvi$sav save def xdvi$run "
+ "clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} "
+ "ifelse "
+ "{(%%xdvimark) currentfile =string {readline} stopped "
+ "{clear} {pop eq {exit} if} ifelse }loop "
+ "flushpage xdvi$ack print flush "
+ "}loop\nH";
+
+ static const char str2[] =
+ "[0 1 1 0 0 0] concat\n"
+ "stop\n%%xdvimark\n";
+
+ /*
+ * If we're prescanning *before* setting up the widgets (to get the
+ * page size, for example), then postpone starting up ghostscript.
+ */
+ if (mane.win == (Window)0) {
+ if (globals.debug & DBG_PS)
+ puts("Hit PS header in early prescan; postponing.");
+ psp = no_ps_procs;
+ gs_postpone_prescan = True;
+ return True;
+ }
+
+ if (globals.debug & DBG_PS)
+ puts("Running initGS ...");
+
+ gs_atom = XInternAtom(DISP, "GHOSTVIEW", False);
+ /* send bpixmap, orientation, bbox (in pixels), and h & v resolution */
+ sprintf(buf, "%ld %d 0 0 %u %u 72 72",
+ bpixmap, /* bpixmap */
+ Landscape, /* orientation */
+ GS_page_h = globals.page.h, GS_page_w = globals.page.w);
+
+ XChangeProperty(DISP, mane.win, gs_atom, XA_STRING, 8,
+ PropModeReplace, (unsigned char *)buf, strlen(buf));
+ GS_alpha = resource.gs_alpha;
+
+ gs_colors_atom = XInternAtom(DISP, "GHOSTVIEW_COLORS", False);
+ sprintf(buf, "%s %ld %ld", resource.gs_palette,
+ color_data[0].pixel, color_data[1].pixel);
+
+ XChangeProperty(DISP, mane.win, gs_colors_atom, XA_STRING, 8,
+ PropModeReplace, (unsigned char *)buf, strlen(buf));
+
+ if (!did_putenv) {
+ sprintf(buf, "%ld", mane.win);
+ xputenv("GHOSTVIEW", buf);
+ did_putenv = True;
+ }
+
+ XSync(DISP, False); /* update the window */
+
+ if (xpipe(std_io) != 0) {
+ perror("[xdvik] pipe");
+ return False;
+ }
+ fflush(stderr); /* to avoid double flushing */
+ GS_pid = vfork();
+ if (GS_pid == 0) { /* child */
+ const char **argvp = argv + 10;
+
+ argv[1] = resource.gs_alpha ? "-sDEVICE=x11alpha" : "-sDEVICE=x11";
+ sprintf(arg4 + 14, "%u", GS_page_w);
+ sprintf(arg5 + 15, "%u", GS_page_h);
+ if (resource.gs_safer)
+ *argvp++ = "-dSAFER";
+
+#if 0
+ if (resource.gs_alpha) {
+ *argvp++ = "-dGraphicsAlphaBits=4";
+ *argvp++ = "-dTextAlphaBits=4";
+ *argvp++ = "-dMaxBitmap=0";
+ }
+#endif
+
+ *argvp = "-";
+ (void) close(std_io[0]);
+ (void) dup2(std_io[1], 0);
+ (void) dup2(std_io[1], 1);
+ (void) dup2(std_io[1], 2);
+ (void) close(std_io[1]);
+
+ (void)execvp(argv[0] = resource.gs_path, (char *const *)argv);
+ /*TODO: use fork_process here?? */
+ XDVI_ERROR((stderr, "Execvp of %s failed: %s", argv[0], strerror(errno)));
+ _exit(EXIT_FAILURE);
+ }
+
+ (void)close(std_io[1]);
+
+ if (GS_pid == -1) { /* error */
+ GS_pid = 0;
+ perror("[xdvik] vfork");
+ (void)close(GS_fd);
+
+ return False;
+ }
+
+ prep_fd(GS_fd, True); /* Set file descriptor for non-blocking I/O */
+
+ gs_child.name = xstrdup("gs");
+ gs_child.io = &gs_xio;
+ set_chld(&gs_child);
+
+ psp = gs_procs;
+ GS_active = False;
+ GS_in_header = True;
+ GS_page_dirty = False;
+ GS_pending = 1;
+ GS_mag = GS_shrink = -1;
+ gs_xio.fd = GS_fd;
+ gs_xio.xio_events = XIO_IN;
+ GS_write_ack = 0;
+ GS_outb_in = GS_outb_out = GS_outb;
+ set_io(&gs_xio);
+ GS_ev_mask = GS_MASK_INIT;
+ (void) signal(SIGPIPE, SIG_IGN);
+
+ if (resource.gs_safer)
+ gs_send(strsafe, (sizeof strsafe) - 1);
+ gs_send(str1, (sizeof str1) - 1);
+ gs_send(psheader, psheaderlen);
+ gs_send(str2, (sizeof str2) - 1);
+ waitack();
+ GS_in_header = False;
+ GS_ev_mask = GS_MASK_NORMAL;
+
+ if (GS_pid == 0) { /* if something happened */
+ destroy_gs();
+ return False;
+ }
+ if (resource.postscript == 0)
+ toggle_gs(0); /* if we got a 'v' already */
+ else {
+ scanned_page = scanned_page_ps = scanned_page_reset;
+ globals.ev.flags |= EV_NEWPAGE; /* ||| redraw the page */
+ longjmp(globals.ev.canit, 1);
+ }
+ return True;
+}
+
+static void
+toggle_gs(int flag) /* this routine is callable from within read_events(). */
+{
+ if (globals.debug & DBG_PS)
+ fprintf(stdout, "Toggling GS to %d", flag);
+
+ switch (flag) {
+ case 0:
+ psp.drawbegin = drawbegin_none;
+ break;
+ case 1:
+ psp.drawbegin = drawbegin_gs;
+ break;
+ default:
+ psp.drawbegin = drawbegin_gs_box;
+ break;
+ }
+}
+
+void
+gs_resume_prescan(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Resuming prescan");
+
+ gs_postpone_prescan = False;
+ if (!initGS()) /* this may not return */
+ psp = no_ps_procs;
+}
+
+void
+gs_erase_page(void)
+{
+ static const char str[] = " erasepage stop\n%%xdvimark\n";
+
+ if (!GS_page_dirty) return;
+
+ if (globals.debug & DBG_PS)
+ puts("Erasing gs page");
+
+ if (GS_active)
+ XDVI_FATAL((stderr, "Internal error in gs_erase_page()."));
+
+ ++GS_pending;
+ gs_send(str, sizeof(str) - 1);
+ waitack();
+}
+
+static void
+gs_died(int status, struct xchild *child)
+{
+ UNUSED(status);
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "process %s died\n", child->name);
+ GS_pid = 0;
+ (child->io->read_proc)(child->io->fd, NULL);
+ if (linepos > line) {
+ *linepos = '\0';
+ printf("%s: %s\n", child->name, line);
+ linepos = line;
+ }
+ clear_io(child->io);
+ (void)close(child->io->fd);
+
+ scanned_page = scanned_page_ps = scanned_page_reset;
+ GS_active = GS_in_doc = GS_page_dirty = False;
+ GS_pending = 0;
+ globals.ev.flags |= GS_die_ack;
+}
+
+static void
+destroy_gs(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Destroying GS process");
+ if (GS_pid != 0) {
+ if (kill(GS_pid, SIGKILL) < 0 && errno != ESRCH)
+ perror("xdvik: destroy_gs");
+ GS_pid = 0;
+ clear_chld(&gs_child);
+ read_from_gs(GS_fd, NULL);
+ if (linepos > line) {
+ *linepos = '\0';
+ printf("gs: %s\n", line);
+ linepos = line;
+ }
+ clear_io(&gs_xio);
+ (void) close(GS_fd);
+
+ scanned_page = scanned_page_ps = scanned_page_reset;
+ }
+ GS_active = GS_in_doc = GS_page_dirty = False;
+ GS_pending = 0;
+}
+
+static void
+deactivate(void)
+{
+ static const char str[] = " stop\n%%xdvimark\n";
+ int saved_mask;
+
+ saved_mask = GS_ev_mask;
+ GS_ev_mask = 0;
+ gs_send(str, (sizeof str) - 1);
+ GS_ev_mask = saved_mask;
+
+ GS_active = False;
+}
+
+static void
+interrupt_gs(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running interrupt_gs()");
+ /*
+ FIXME: added this special case, since otherwise EV_ACK might not get
+ reset at all, and hang xdvi forever when scrolling quickly through
+ a file that should be reloaded.
+ */
+ if (GS_pending == 0) {
+ /* fprintf(stderr, "+++++++++ 1st case; waitack: %d\n", globals.ev.flags & EV_ACK); */
+ globals.ev.flags &= ~EV_ACK;
+ return;
+ }
+ else if (GS_pending < 0) {
+ /* fprintf(stderr, "GS_pending: %d; waitack: %d\n", GS_pending, globals.ev.flags & EV_ACK); */
+ return; /* nothing to do */
+ }
+
+ /*
+ * ||| what I'd really like to do here is cause gs to execute
+ * the interrupt routine in errordict. But so far (gs 2.6.1)
+ * that has not been implemented in ghostscript.
+ */
+
+ if (GS_active)
+ deactivate();
+ waitack();
+}
+
+static void
+endpage_gs(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running endpage_gs()");
+ if (GS_active) {
+ deactivate();
+ waitack();
+ }
+}
+
+/*
+ * Checks that the GS interpreter is running correctly.
+ */
+
+static void
+checkgs(Boolean in_header)
+{
+ char buf[150];
+
+ /*
+ * For geometry changes, we pretty much have to restart Ghostscript.
+ * This is what Ghostview does (for example, in gv-3.7.4
+ * this occurs in Setup() in Ghostview.c).
+ */
+ if (globals.page.w > GS_page_w || globals.page.h > GS_page_h
+ || GS_alpha != resource.gs_alpha)
+ destroy_gs();
+
+ if (GS_pid == 0)
+ (void)initGS();
+
+ if (!GS_active) {
+ if (magnification != GS_mag) {
+ if (globals.ev.flags & GS_ev_mask)
+ longjmp(globals.ev.canit, 1);
+ ++GS_pending;
+ sprintf(buf,
+ "H TeXDict begin /DVImag %ld 1000 div def end stop\n"
+ "%%%%xdvimark\n",
+ GS_mag = magnification);
+ gs_send(buf, strlen(buf));
+ }
+
+ if (mane.shrinkfactor != GS_shrink) {
+ if (globals.ev.flags & GS_ev_mask)
+ longjmp(globals.ev.canit, 1);
+ ++GS_pending;
+ sprintf(buf,
+ "H TeXDict begin %d %d div dup /Resolution X /VResolution X end stop\n"
+ "%%%%xdvimark\n",
+ resource.pixels_per_inch,
+ GS_shrink = mane.shrinkfactor);
+ gs_send(buf, strlen(buf));
+ }
+ }
+}
+
+static void
+drawbegin_gs(int xul, int yul, const char *cp)
+{
+ char buf[32];
+ static const char str[] = " TeXDict begin\n";
+
+ checkgs(False);
+
+ if (!GS_active) {
+ if (globals.ev.flags & GS_ev_mask)
+ longjmp(globals.ev.canit, 1);
+ ++GS_pending;
+ gs_send(str, (sizeof str) - 1);
+ GS_active = True;
+ }
+
+ /* This allows the X side to clear the page */
+ XSync(DISP, False);
+
+ sprintf(buf, "%d %d moveto\n", xul, yul);
+ gs_send(buf, strlen(buf));
+ /* gs_send(clear_bg, strlen(clear_bg)); */
+ if (globals.debug & DBG_PS)
+ printf("drawbegin at %d,%d: sending `%s'\n", xul, yul, cp);
+
+ /*
+ * added SU 2000/12/18:
+ * Try to detect some simple PS rotating commands, and warn about them.
+ * There are surely more than that ...
+ */
+ if (strstr(cp, "rotate") != NULL /* used by graphics.sty */
+ || strstr(cp, "RotBegin") != NULL /* used by pstricks */
+ ) {
+ statusline_error(STATUS_SHORT,
+ "Warning: PS code on page %d may contain rotation, "
+ "which is not supported by xdvi", current_page + 1);
+ }
+
+ gs_send(cp, strlen(cp));
+}
+
+static void
+drawbegin_gs_box(int xul, int yul, const char *cp)
+{
+ drawbegin_gs(xul, yul, cp);
+}
+
+
+void
+drawraw_gs(const char *cp)
+{
+ if (!GS_active)
+ return;
+ if (globals.debug & DBG_PS)
+ printf("raw ps sent to context: %s\n", cp);
+ GS_page_dirty = True;
+ gs_send(cp, strlen(cp));
+ gs_send("\n", 1);
+}
+
+static void
+drawfile_gs(const char *cp, FILE *f)
+{
+ char canonical_path[MAXPATHLEN + 1];
+ char *ret;
+
+ fclose(f); /* don't need it */
+
+ if (!GS_active)
+ return;
+
+ if (globals.debug & DBG_PS)
+ printf("original path: |%s|\n", cp);
+ /* drawraw_gs("newpath 0 0 moveto 0 1000 rlineto 1000 0 rlineto 0 -1000 rlineto closepath 1 setgray fill"); */
+#if 0
+ /* if expand_symlinks or remove_dots from kpathsea were public,
+ we could use the following: */
+ ret = remove_dots(expand_symlinks(cp));
+#endif
+
+ ret = REALPATH(cp, canonical_path);
+ if (ret == NULL)
+ XDVI_WARNING((stderr, "Couldn't canonicalize path \"%s\": %s. Sending to gs unchanged.",
+ cp, strerror(errno)));
+ else
+ cp = canonical_path;
+
+ if (globals.debug & DBG_PS)
+ printf("expanded path: |%s|\n", cp);
+
+ GS_page_dirty = True;
+ gs_send("(", 1);
+ gs_send(cp, strlen(cp));
+ gs_send(")run\n", 5);
+ /* { */
+ /* char *clear_bg = "newpath 0 0 moveto 0 1000 rlineto 1000 0 rlineto 0 -1000 rlineto closepath .4 setgray fill\n"; */
+ /* gs_send(clear_bg, strlen(clear_bg)); */
+ /* } */
+}
+
+static void
+drawend_gs(const char *cp)
+{
+ if (!GS_active)
+ return;
+ if (globals.debug & DBG_PS)
+ printf("end ps: %s\n", cp);
+ gs_send(cp, strlen(cp));
+ gs_send("\n", 1);
+ save_bbox();
+}
+
+static void
+beginheader_gs(void)
+{
+ static const char str[] = "Hsave /xdvi$doc exch def\n";
+
+ if (globals.debug & DBG_PS)
+ puts("Running beginheader_gs()");
+
+ checkgs(True);
+
+ if (GS_active) {
+ if (!GS_in_header)
+ XDVI_FATAL((stderr, "Internal error in beginheader_gs()."));
+ return;
+ }
+
+ if (globals.ev.flags & GS_ev_mask) {
+ /* fprintf(stderr, "longjmp!"); */
+ longjmp(globals.ev.canit, 1);
+ }
+
+ GS_in_header = True;
+ GS_ev_mask = GS_MASK_HEADER;
+ ++GS_pending;
+ if (GS_in_doc)
+ gs_send("H", 1);
+ else {
+ gs_send(str, (sizeof str) - 1);
+ GS_in_doc = True;
+ }
+ GS_active = True;
+}
+
+static void
+endheader_gs(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running endheader_gs()");
+
+ if (GS_active) {
+ deactivate();
+ waitack();
+ GS_in_header = False;
+ GS_ev_mask = GS_MASK_NORMAL;
+ }
+}
+
+static void
+newdoc_gs(void)
+{
+ static const char str[] = "Hxdvi$doc restore stop\n%%xdvimark\n";
+
+ if (globals.debug & DBG_PS)
+ puts("Running newdoc_gs()");
+
+ if (GS_in_doc) {
+ ++GS_pending;
+ gs_send(str, (sizeof str) - 1);
+ GS_mag = GS_shrink = -1;
+ GS_in_doc = False;
+
+ GS_page_w = GS_page_h = 0;
+ }
+}
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* PS_GS */
diff --git a/Build/source/texk/xdvik/psgs.h b/Build/source/texk/xdvik/psgs.h
new file mode 100644
index 00000000000..6b0764554e6
--- /dev/null
+++ b/Build/source/texk/xdvik/psgs.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2002-2019 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PSGS_H_
+#define PSGS_H_
+
+extern Boolean initGS(void);
+extern void gs_resume_prescan(void);
+extern void restart_gs(void);
+extern void gs_erase_page(void);
+
+#endif /* PSGS_H_ */
diff --git a/Build/source/texk/xdvik/psheader.txt b/Build/source/texk/xdvik/psheader.txt
new file mode 100644
index 00000000000..43986ab4133
--- /dev/null
+++ b/Build/source/texk/xdvik/psheader.txt
@@ -0,0 +1,248 @@
+%% These are from tex.lpro
+/TeXDict 250 dict def % define a working dictionary ( IBM: color - 200->250 )
+TeXDict begin % start using it.
+/N {def} def
+/B {bind def} N
+/S {exch} N
+/X { S N } B
+/TR {translate} N
+/vsize 11 72 mul N
+end % TeXDict
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% header for the \special command
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The structure of the PostScript produced by dvips for \special is:
+% @beginspecial
+% - any number of @hsize, @hoffset, @hscale, etc., commands
+% @setspecial
+% - the user's file of PostScript commands
+% @endspecial
+
+TeXDict begin
+/SDict 200 dict N
+SDict begin
+
+/@SpecialDefaults
+ { /hs 612 N
+ /vs 792 N
+ /ho 0 N
+ /vo 0 N
+ /hsc 1 N
+ /vsc 1 N
+ /ang 0 N
+ /CLIP 0 N
+ /rwiSeen false N
+ /rhiSeen false N
+ /letter {} N /note {} N /a4 {} N /legal {} N
+ } B
+
+%
+% The following definition sets up the units that hscale/vscale are in.
+% For certain sites this might require change, but it is
+% recommended instead that any macro packages that require
+% hscale/vscale set the units appropriately via
+%
+% \special{! /@scaleunit 1 def }
+%
+% if global, or
+%
+% \special{" /@scaleunit 1 def }
+%
+% before each instance if multiple macro packages with
+% different requirements are being used.
+%
+/@scaleunit 100 N
+% s @hscale - set scale factor
+/@hscale {@scaleunit div /hsc X} B
+/@vscale {@scaleunit div /vsc X} B
+
+% d @hsize - specify a horizontal clipping dimension
+/@hsize {/hs X /CLIP 1 N} B
+/@vsize {/vs X /CLIP 1 N} B
+
+/@clip {/CLIP 2 N} B
+
+% d @hoffset - specify a shift for the figure
+/@hoffset {/ho X} B
+/@voffset {/vo X} B
+
+% a @angle - set rotation angle
+/@angle {/ang X} B
+
+%
+% Here we handle bounding box calculations, if necessary.
+%
+/@rwi { 10 div /rwi X /rwiSeen true N } B % rwi will be real width after scaling
+/@rhi { 10 div /rhi X /rhiSeen true N } B % rhi will be real height after scaling
+/@llx { /llx X } B
+/@lly { /lly X } B
+/@urx { /urx X } B
+/@ury { /ury X } B
+
+/magscale true def
+
+end % of SDict
+
+/@MacSetUp
+ { userdict /md known % if md is defined
+ { userdict /md get type /dicttype eq % and if it is a dictionary
+ {
+ userdict begin % expand it if necessary
+ md length 10 add md maxlength ge
+ {/md md dup length 20 add dict copy def}if
+ end
+ md begin % then redefine some stuff
+ /letter {} N
+ /note {} N
+ /legal {} N
+ /od{txpose
+ 1 0 mtx defaultmatrix dtransform S atan/pa X
+ newpath clippath mark
+ {transform{itransform moveto}}
+ {transform{itransform lineto}}
+ { 6 -2 roll transform
+ 6 -2 roll transform
+ 6 -2 roll transform
+ { itransform 6 2 roll
+ itransform 6 2 roll
+ itransform 6 2 roll
+ curveto
+ }
+ }
+ {{closepath}}
+ pathforall newpath counttomark array astore /gc xdf
+ pop ct 39 0 put
+ 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if
+ }N
+ /txpose{
+ pxs pys scale ppr aload pop
+ por {
+ noflips {
+ pop S neg S TR pop 1 -1 scale
+ }if
+ xflip yflip and {
+ pop S neg S TR 180 rotate 1 -1 scale
+ ppr 3 get ppr 1 get neg sub neg ppr 2 get
+ ppr 0 get neg sub neg TR
+ }if
+ xflip yflip not and {
+ pop S neg S TR pop 180 rotate
+ ppr 3 get ppr 1 get neg sub neg 0 TR
+ }if
+ yflip xflip not and {
+ ppr 1 get neg ppr 0 get neg TR
+ }if
+ }
+ {
+ noflips {
+ TR pop pop 270 rotate 1 -1 scale
+ }if
+ xflip yflip and {
+ TR pop pop 90 rotate 1 -1 scale
+ ppr 3 get ppr 1 get neg sub neg ppr 2 get
+ ppr 0 get neg sub neg TR
+ }if
+ xflip yflip not and {
+ TR pop pop 90 rotate ppr 3 get
+ ppr 1 get neg sub neg 0 TR
+ }if
+ yflip xflip not and {
+ TR pop pop 270 rotate ppr 2 get
+ ppr 0 get neg sub neg 0 S TR
+ }if
+ }ifelse
+ scaleby96 {
+ ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy
+ TR .96 dup scale neg S neg S TR
+ }if
+ }N
+ /cp {pop pop showpage pm restore}N
+ end
+ }if
+ } if
+ } N
+
+%
+% The following procedure brings us back to PostScript size. It takes
+% into account the current global dvi magnification, so graphics
+% scale with the document.
+%
+/normalscale {
+ Resolution 72 div VResolution 72 div neg scale
+ magscale { DVImag dup scale } if
+ 0 setgray
+} N
+%
+% this will be invoked as the result of a \special command (for the
+% inclusion of PostScript graphics). The basic idea is to change all
+% scaling and graphics back to defaults, but to shift the origin
+% to the current position on the page.
+
+/@beginspecial % - @beginspecial - -- enter special mode
+ {
+ /SpecialSave save N
+ SDict begin
+ gsave
+ normalscale
+ currentpoint TR %set the current point as the user's origin
+ @SpecialDefaults % setup default offsets, scales, sizes, and angle
+ count /ocount X /dcount countdictstack N
+ } N
+
+/@setspecial % to setup user specified offsets, scales, sizes (for clipping)
+ {
+ CLIP 1 eq
+ { newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+ closepath clip }
+ if
+ ho vo TR
+ hsc vsc scale
+ ang rotate
+ rwiSeen {
+ rwi urx llx sub div
+ rhiSeen { rhi ury lly sub div } { dup } ifelse
+ scale llx neg lly neg TR
+ } {
+ rhiSeen { rhi ury lly sub div dup scale llx neg lly neg TR } if
+ } ifelse
+ CLIP 2 eq
+ { newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto
+ closepath clip }
+ if
+ /showpage {} N
+ /erasepage {} N
+ /copypage {} N
+ /setpagedevice {pop} def
+ newpath
+ } N
+
+/@endspecial % - @endspecial - -- leave special mode
+ { count ocount sub {pop} repeat
+ countdictstack dcount sub {end} repeat
+ grestore SpecialSave restore
+ end
+ } N
+
+% xdvik special treatment for saving definitions made in SDict (while using
+% the bang special; try to guarantee that the dictionary stack is ok!
+% xdvik should not systematically bracket code within save/restore pairs,
+% anyway: such bracketing breaks a lot of code (many packages do change
+% TeXDict from with ps: specials for instance) and we should only guarantee
+% that bracketing is done within @beginspecial and @endspecial. -- YA
+
+/@xdvisavestate
+ {
+ userdict /xdvi$sav save put
+ } N
+
+/@defspecial
+ {
+ SDict begin
+ } N
+/@fedspecial
+ {
+ end
+ @xdvisavestate
+ } B
+end % revert to previous dictionary
diff --git a/Build/source/texk/xdvik/psnews.c b/Build/source/texk/xdvik/psnews.c
new file mode 100644
index 00000000000..44b26d6b26e
--- /dev/null
+++ b/Build/source/texk/xdvik/psnews.c
@@ -0,0 +1,951 @@
+/*========================================================================*\
+
+Copyright (c) 1994-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTES:
+This code was originally written by Ricardo Telichevesky
+(ricardo@rle-vlsi-mit.edu) and Luis Miguel Silveira
+(lms@rle-vlsi-mit.edu).
+It was largely influenced by similar code in the SeeTeX/XTeX
+package by Dirk Grunwald (grunwald@colorado.edu).
+
+\*========================================================================*/
+
+ /* ||| To do:
+ * ALWAYS_CLOSE_SERVER_CONNECTION?
+ * Is there some way of interrupting a process?
+ * fork
+ * extra bytes on input
+ */
+
+#ifdef PS_NEWS /* whole file */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "dvi-draw.h"
+
+#include <signal.h>
+#include <sys/file.h> /* this defines FASYNC */
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#undef SYSV /* To avoid defined SYSV_{WAIT,UCONTEXT} in xview/notify.h. */
+#include <NeWS/psio.h>
+#include <xvps/pscanvas.h>
+
+ /* Condition for retrying a write */
+#include <errno.h>
+#include <setjmp.h>
+
+ /* if POSIX O_NONBLOCK is not available, use O_NDELAY */
+#if !defined(O_NONBLOCK) && defined(O_NDELAY)
+#define O_NONBLOCK O_NDELAY
+#endif
+
+#ifdef X_NOT_STDC_ENV
+ extern int errno;
+#endif
+
+#ifdef EWOULDBLOCK
+#ifdef EAGAIN
+#define AGAIN_CONDITION (errno == EWOULDBLOCK || errno == EAGAIN)
+#else /* EAGAIN */
+#define AGAIN_CONDITION (errno == EWOULDBLOCK)
+#endif /* EAGAIN */
+#else /* EWOULDBLOCK */
+#ifdef EAGAIN
+#define AGAIN_CONDITION (errno == EAGAIN)
+#endif /* EAGAIN */
+#endif /* EWOULDBLOCK */
+
+#if HAVE_POLL
+# include <poll.h>
+# define XIO_IN POLLIN
+# define XIO_OUT POLLOUT
+#else
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif
+
+
+#if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC)
+# define FLAKY_SIGPOLL 1
+#endif
+
+char *strtok(char *, const char *);
+
+/* define ALWAYS_CLOSE_SERVER_CONNECTION if you want to close the server
+ connection all the time */
+#undef ALWAYS_CLOSE_SERVER_CONNECTION
+
+
+/*
+ * Some setup code.
+ */
+static const char str0[] =
+"/OW2? version cvi 2 eq def "
+"OW2? "
+"{ /setlinewidth { pop } def} "
+"{ /NeWS 3 0 findpackage beginpackage "
+" /X11 3 0 findpackage beginpackage} "
+"ifelse "
+"currentcanvas /Color get "
+"currentcanvas /Colormap get getcubedescription null eq and "
+" {8 {{currentcanvas /Colormap get 1 index dup dup dup newcube} stopped "
+" {pop pop pop pop pop} {exit} ifelse "
+" 2 div cvi dup 1 eq {exit} if} loop pop} "
+"if\n";
+/*
+ * This string reads chunks (delimited by %%xdvimark).
+ * The first character of a chunk tells whether a given chunk
+ * is to be done within save/restore or not.
+ * The `H' at the end tells it that the first group is a
+ * header; i.e., no save/restore.
+ */
+static const char preamble[] =
+"/xdvi$line 81 string def "
+"/xdvi$run {$error null ne {$error /newerror false put} if "
+" {currentfile cvx stopped "
+" $error null eq {false} {$error /newerror get} ifelse and "
+" {handleerror} if} stopped pop} def "
+"/xdvi$dslen countdictstack def "
+"{currentfile read not {exit} if 72 eq "
+" {xdvi$run} "
+" {/xdvi$sav save def xdvi$run "
+" clear countdictstack xdvi$dslen sub {end} repeat xdvi$sav restore} "
+" ifelse "
+" {(%%xdvimark) currentfile xdvi$line {readline} stopped "
+" {clear} {{eq {false exit} if} {true exit} ifelse} ifelse }loop {exit} if "
+" 58 tagprint flush "
+"}loop\nH";
+
+extern const char psheader[];
+extern int psheaderlen;
+
+static const char preamble2[] = " stop\n%%xdvimark\n";
+#define stopstring preamble2
+
+/* global procedures (besides initNeWS) */
+
+static void toggleNeWS(int flag);
+static void destroyNeWS(void);
+static void interruptNeWS(void);
+static void endpageNeWS(void);
+static void drawbeginNeWS(int, int, const char *);
+static void drawbeginNeWS_box(int, int, const char *);
+static void drawrawNeWS(const char *);
+static void drawrawNeWS_box(const char *);
+static void drawfileNeWS(const char *, FILE *);
+static void drawendNeWS(const char *);
+static void beginheaderNeWS(void);
+static void endheaderNeWS(void);
+static void newdocNeWS(void);
+
+static struct psprocs news_procs = {
+ /* toggle */ toggleNeWS,
+ /* destroy */ destroyNeWS,
+ /* interrupt */ interruptNeWS,
+ /* endpage */ endpageNeWS,
+ /* drawbegin */ drawbeginNeWS,
+ /* drawraw */ drawrawNeWS,
+ /* drawfile */ drawfileNeWS,
+ /* drawend */ drawendNeWS,
+ /* beginheader */ beginheaderNeWS,
+ /* endheader */ endheaderNeWS,
+ /* newdoc */ newdocNeWS
+};
+
+/* define local static variables */
+static int NeWS_mag; /* magnification currently in use */
+static int NeWS_shrink; /* shrink factor currently in use */
+static unsigned int NeWS_page_w; /* how big our current page is */
+static unsigned int NeWS_page_h;
+static Boolean NeWS_active; /* if we've started a page yet */
+static int NeWS_pending; /* number of ack's we're expecting */
+static const char *NeWS_send_byte; /* next byte to send to NeWS */
+static const char *NeWS_send_end; /* last + 1 byte to send */
+static Boolean NeWS_in_header; /* if we're sending a header */
+static Boolean NeWS_in_doc; /* if we've sent header information */
+static int NeWS_ev_mask; /* events for which we'll stop */
+static Boolean NeWS_destroyed = False;
+
+#define NEWS_MASK_NORMAL EV_GE_NEWPAGE
+#define NEWS_MASK_HEADER EV_GE_PS_TOGGLE
+#define NEWS_MASK_INIT (EV_GE_TERM | EV_PS_TOGGLE)
+
+
+/*
+ * NeWS I/O code. This should send PS code to NeWS,
+ * receive acknowledgements, and receive X events in the meantime.
+ * It also checks for SIGPIPE errors.
+ */
+
+static void read_from_NeWS(void);
+static void write_to_NeWS(void);
+
+static struct xio NeWS_xout = {NULL, 0, XIO_IN,
+#if HAVE_POLL
+ NULL,
+#endif
+ read_from_NeWS, write_to_NeWS, NULL};
+
+static struct xio NeWS_xin = {NULL, 0, XIO_IN,
+#if HAVE_POLL
+ NULL,
+#endif
+ read_from_NeWS, NULL, NULL};
+
+
+/*---------------------------------------------------------------------------*
+ psio_sigpipe_handler ()
+
+ Arguments: sig, code, scp, addr (see man page for signal)
+ Returns: (void)
+ Side-Effects: SIGPIPE signal is flagged as sigpipe_error variable is set.
+
+ Description:
+ Handler for SIGPIPE error generated by a broken pipe in the connection
+ to the NeWS server; this may be duer to some abnormal condition, or some
+ hairy PostScript code containing commands not implemented by the server.
+
+ +----------------------------------------------------------------------------*/
+
+static Boolean sigpipe_error = False;
+
+static struct sigaction psio_sigpipe_handler_struct;
+/* initialized to {psio_sigpipe_handler, (sigset_t) 0, 0} in initNeWS */
+
+static RETSIGTYPE
+psio_sigpipe_handler(int sig, int code, struct sigcontext *scp, char *addr)
+{
+ sigpipe_error = True;
+}
+
+
+/*
+ * read_from_NeWS - This does the actual retrieving of acknowledgements.
+ * If other bytes appear on the file - tough.
+ */
+
+static void
+read_from_NeWS(void)
+{
+ for (;;) {
+ int retval;
+
+ retval = ps_checkfor(PostScriptInput, PSIO_FIND_TAG, 58);
+ if (retval == 0)
+ break;
+ if (retval < 0) {
+ fprintf(stderr, "[xdvik] ps_checkfor: %d\n", retval);
+ return;
+ }
+ (void)ps_checkfor(PostScriptInput, PSIO_WAIT_TAG, 58);
+ --NeWS_pending;
+ if (NeWS_pending == 0)
+ globals.ev.flags |= EV_ACK;
+ if (globals.debug & DBG_PS)
+ printf("Got NeWS ack; %d pending.\n", NeWS_pending);
+ }
+}
+
+
+/*
+ * write_to_NeWS - Write to the PostScript interpreter.
+ */
+
+static void
+write_to_NeWS(void)
+{
+ int old_flags;
+ int bytes;
+
+ old_flags = fcntl(PostScript->file, F_GETFL, 0);
+ if (old_flags < 0) return;
+ /* set to be non-blocking */
+ if (fcntl(PostScript->file, F_SETFL, old_flags | O_NONBLOCK) < 0)
+ return;
+
+ for (;;) {
+ bytes = write(PostScript->file, NeWS_send_byte,
+ NeWS_send_end - NeWS_send_byte);
+ if (bytes < 0) {
+ if (AGAIN_CONDITION)
+ break;
+ perror("xdvi NeWS_send");
+ break;
+ }
+ NeWS_send_byte += bytes;
+ if (NeWS_send_byte == NeWS_send_end) {
+ NeWS_send_byte = NULL;
+ NeWS_xout.xio_events &= ~XIO_OUT;
+#if HAVE_POLL
+ /* This check is necessary, since write_to_NeWS can be called
+ directly. */
+ if (NeWS_xout.pfd != NULL)
+ NeWS_xout.pfd->events &= ~POLLOUT;
+ globals.ev.flags |= EV_ACK;
+ break;
+#endif
+ }
+ }
+
+ fcntl(PostScript->file, F_SETFL, old_flags);
+}
+
+
+/*
+ * Clean up after NeWS_send()
+ */
+
+static void
+post_send(void)
+{
+ if (sigpipe_error) {
+ fputs("NeWS died unexpectedly.\n", stderr);
+ destroyNeWS();
+ draw_bbox();
+ }
+}
+
+
+/*
+ * Main routine for writing to the NeWS interpreter.
+ */
+
+static void
+NeWS_send(const char *cp, size_t len)
+{
+ struct sigaction orig;
+
+ if (PostScript == (PSFILE *) NULL || (globals.ev.flags & NeWS_ev_mask))
+ return;
+
+ (void) sigaction(SIGPIPE, &psio_sigpipe_handler_struct, &orig);
+ sigpipe_error = False;
+
+ NeWS_send_byte = cp;
+ NeWS_send_end = cp + len;
+ NeWS_xout.xio_events |= XIO_OUT;
+#if HAVE_POLL
+ if (NeWS_xout.pfd != NULL)
+ NeWS_xout.pfd->events |= POLLOUT;
+#endif
+
+ write_to_NeWS();
+ (void) read_events(NeWS_ev_mask | EV_ACK);
+
+ if (!(globals.ev.flags & EV_ACK)) { /* if interrupted */
+ /* ||| Do somthing more severe here */
+ }
+
+ globals.ev.flags &= ~EV_ACK;
+
+ /* put back generic handler for SIGPIPE */
+ (void) sigaction(SIGPIPE, &orig, (struct sigaction *) NULL);
+
+ if (!NeWS_in_header)
+ post_send();
+}
+
+/*
+ * Wait for acknowledgement from NeWS. With NeWS we have no choice but
+ * to wait (||| I think).
+ */
+
+static void
+waitack(void)
+{
+ if (PostScript == (PSFILE *) NULL)
+ return;
+
+ if (NeWS_pending > 0)
+ (void) read_events(EV_GE_ACK);
+
+ if (globals.ev.flags & EV_ACK) {
+ globals.ev.flags &= ~EV_ACK;
+ return;
+ }
+
+ /* ||| Do something more serious here */
+}
+
+
+/*---------------------------------------------------------------------------*
+ initNeWS()
+
+ Arguments: None.
+ Returns: True if and only if initialization succeeded
+ Side-Effects: Static variables may be set.
+
+ Description:
+ Initializes variables for the application main loop.
+
+ +----------------------------------------------------------------------------*/
+
+Boolean initNeWS(void)
+{
+ static NeWStoken newstoken;
+
+ /* now try to open the connection to the NeWS server */
+ if (ps_open_PostScript() == (PSFILE *) NULL)
+ return False;
+
+ psio_sigpipe_handler_struct.sa_handler = psio_sigpipe_handler;
+ sigemptyset(&psio_sigpipe_handler_struct.sa_mask);
+
+#if !FLAKY_SIGPOLL
+ if (fcntl(PostScript->file, F_SETOWN, getpid()) == -1)
+ perror("xdvi: fcntl F_SETOWN");
+ if (fcntl(PostScript->file, F_SETFL,
+ fcntl(PostScript->file, F_GETFL, 0) | FASYNC) == -1)
+ perror("xdvi: fcntl F_SETFL");
+#endif /* not FLAKY_SIGPOLL */
+ if (PostScriptInput->file != PostScript->file) {
+#if !FLAKY_SIGPOLL
+ if (fcntl(PostScriptInput->file, F_SETOWN, getpid()) == -1)
+ perror("xdvi: fcntl F_SETOWN");
+ if (fcntl(PostScriptInput->file, F_SETFL,
+ fcntl(PostScriptInput->file, F_GETFL, 0) | FASYNC) == -1)
+ perror("xdvi: fcntl F_SETFL");
+#endif /* not FLAKY_SIGPOLL */
+ NeWS_xout.xio_events &= ~XIO_IN;
+ NeWS_xin.fd = PostScriptInput->file;
+ set_io(&NeWS_xin);
+ }
+ NeWS_xout.fd = PostScript->file;
+ set_io(&NeWS_xout);
+
+ NeWS_active = False;
+ NeWS_in_header = True;
+ NeWS_ev_mask = NEWS_MASK_INIT;
+ NeWS_pending = 1;
+
+ ps_flush_PostScript();
+ NeWS_send(str0, (sizeof str0) - 1);
+ /* get xid of window, then make this window the NeWS canvas */
+ (void)ps_token_from_xid(mane.win, &newstoken);
+ if (newstoken != -1) {
+ ps_setcanvas(newstoken);
+ ps_flush_PostScript();
+
+ NeWS_send(preamble, (sizeof preamble) - 1);
+ NeWS_send(psheader, psheaderlen);
+ NeWS_send(preamble2, (sizeof preamble2) - 1);
+ NeWS_in_header = False;
+ post_send();
+ waitack();
+ }
+
+ if (NeWS_destroyed)
+ return False;
+
+ /* success */
+
+ NeWS_mag = NeWS_shrink = -1;
+ NeWS_page_w = globals.page.w;
+ NeWS_page_h = globals.page.h;
+
+ psp = news_procs;
+ if (!resource.postscript)
+ toggleNeWS(0); /* if we got a 'v' already */
+
+ return True;
+}
+
+
+/*---------------------------------------------------------------------------*
+ toggleNeWS(int flag)
+
+ Arguments: flag for toggling PostScript
+ Returns: (void)
+ Side-Effects: psp.drawbegin is changed
+
+ Description:
+ Used to toggle the rendering of PostScript by the NeWS server
+ Callable from within read_events().
+
+ +----------------------------------------------------------------------------*/
+
+static void
+toggleNeWS(int flag)
+{
+ if (globals.debug & DBG_PS)
+ fprintf(stdout, "Toggling NeWS to %d", flag);
+
+ switch (flag) {
+ case 0:
+ psp.drawbegin = drawbegin_none;
+ break;
+ case 1:
+ psp.drawbegin = drawbeginNeWS;
+ break;
+ default:
+ psp.drawbegin = drawbeginNeWS_box;
+ break;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ destroyNeWS()
+
+ Arguments: none
+ Returns: (void)
+ Side-Effects: the pointer to the NeWS file is nulled
+
+ Description:
+ Close the connection to the NeWS server; used when rendering is terminated
+ in any way.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+destroyNeWS(void)
+{
+ psp = no_ps_procs;
+ NeWS_destroyed = True;
+ scanned_page = scanned_page_ps = scanned_page_reset;
+}
+
+
+/*---------------------------------------------------------------------------*
+ interruptNeWS()
+
+ Arguments: none
+ Returns: void
+
+ Description:
+ Close the connection to the NeWS server; used when rendering is terminated
+ because of an interruption in the viewing of the current page.
+ ||| It would be nice if we could asynchronously ``wake up'' a NeWS process
+ (preferably by sending something along the X socket); then we could do
+ better than just to wait.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+interruptNeWS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("Running interruptNeWS()");
+ if (NeWS_pending <= 0) return; /* if nothing to do */
+
+ if (NeWS_active) {
+ NeWS_send(stopstring, (sizeof stopstring) - 1);
+ NeWS_active = False;
+ }
+
+ for (;;) {
+ ps_flush_PostScript();
+ if (NeWS_pending <= 0) break;
+ waitack();
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ endpageNeWS()
+
+ Arguments: none
+ Returns: (void)
+ Side-Effects: the NeWS_active variable is cleared.
+
+ Description:
+ Should be called at the end of a page to end this chunk for the NeWS server.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+endpageNeWS(void)
+{
+ if (globals.debug & DBG_PS)
+ puts("endpage sent to NeWS Server");
+ if (NeWS_active) {
+ NeWS_send(stopstring, (sizeof stopstring) - 1);
+ NeWS_active = False;
+ waitack();
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawbeginNeWS ()
+
+ Arguments: xul, yul - coordinates of the upper left corner of the figure
+ cp - string with the bounding box line data
+ Returns: (void)
+
+ Description:
+ Opens a connection to the NeWS server and send in the preamble and the
+ bounding box information after correctly computing resolution factors.
+ In case no rendering is to be done, outlines the figure. An outline is
+ also generated whenever the PostScript code is too hairy and generates
+ a SIGPIPE signal.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawbeginNeWS(int xul, int yul, const char *cp)
+{
+ char buf[100];
+ static const char str[] = " TeXDict begin\n";
+ static const char str2[] = "Hinitgraphics stop\n%%xdvimark\n";
+
+ if (globals.debug & DBG_PS) {
+ printf("xul= %d yul= %d\n", xul, yul);
+ printf("String = < %s >\n", cp);
+ }
+
+ /* catch up on the X side */
+ XSync(DISP, False);
+
+ if (!NeWS_active) {
+ /* send initialization to NeWS server */
+ if (NeWS_page_w < globals.page.w || NeWS_page_h < globals.page.h) {
+ if (globals.ev.flags & NEWS_MASK_NORMAL)
+ longjmp(globals.ev.canit, 1);
+ ++NeWS_pending;
+ NeWS_page_w = globals.page.w;
+ NeWS_page_h = globals.page.h;
+ NeWS_send(str2, (sizeof str2) - 1);
+ }
+ if (magnification != NeWS_mag) {
+ if (globals.ev.flags & NEWS_MASK_NORMAL)
+ longjmp(globals.ev.canit, 1);
+ ++NeWS_pending;
+ sprintf(buf, "H TeXDict begin /DVImag %d 1000 div def "
+ "end stop\n%%%%xdvimark\n",
+ NeWS_mag = magnification);
+ NeWS_send(buf, strlen(buf));
+ }
+ if (mane.shrinkfactor != NeWS_shrink) {
+ if (globals.ev.flags & NEWS_MASK_NORMAL)
+ longjmp(globals.ev.canit, 1);
+ ++NeWS_pending;
+ sprintf(buf, "H TeXDict begin %d %d div dup "
+ "/Resolution X /VResolution X "
+ "end stop\n%%%%xdvimark\n",
+ resource.pixels_per_inch,
+ NeWS_shrink = mane.shrinkfactor);
+ NeWS_send(buf, strlen(buf));
+ }
+ if (globals.ev.flags & NEWS_MASK_NORMAL)
+ longjmp(globals.ev.canit, 1);
+ ++NeWS_pending;
+ NeWS_send(str, (sizeof str) - 1);
+ NeWS_active = True;
+ }
+
+ sprintf(buf, "%d %d moveto\n", xul, yul);
+ NeWS_send(buf, strlen(buf));
+ NeWS_send(cp, strlen(cp));
+}
+
+static void
+drawbeginNeWS_box(int xul, int yul, const char *cp)
+{
+ drawbeginNeWS(xul, yul, cp);
+ draw_bbox();
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawrawNeWS()
+
+ Arguments: origcp - the raw string to be sent to the postscript interpreter
+ Returns: (void)
+ Side-Effects: (none)
+
+ Description:
+ If there is a valid connection to the NeWS server, just send the string to
+ the interpreter, else leave.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawrawNeWS(const char *origcp)
+{
+ const char *pt, *ptm1, *ocp1;
+ static char *cp;
+ char *cp1;
+ static unsigned int cplen = 0;
+ unsigned int len;
+ double angle;
+ Boolean found = False;
+
+ if (!NeWS_active)
+ return;
+
+ if (globals.debug & DBG_PS)
+ printf("Raw PS sent to context: <%s>\n", origcp);
+
+ /* take a look at the string: NeWS bums on certain rotations */
+ len = strlen(origcp) + 4;
+ if (cplen < len) {
+ if (cplen != 0)
+ free(cp);
+ cplen = len;
+ cp = xmalloc(cplen);
+ }
+ ocp1 = origcp;
+ pt = origcp;
+ while (*pt == ' ' || *pt == '\t')
+ ++pt;
+ cp1 = cp;
+ for (;;) {
+ ptm1 = pt;
+ while (*pt != '\0' && *pt != ' ' && *pt != '\t')
+ ++pt;
+ if (*pt == '\0')
+ break;
+ while (*pt == ' ' || *pt == '\t')
+ ++pt;
+ if (strncmp(pt, "rotate", 6) == 0
+ && (pt[6] == '\0' || pt[6] == ' ' || pt[6] == '\t')) {
+ /* found rotate; check angle */
+ if (sscanf(ptm1, "%lf", &angle) >= 1) {
+ found = True;
+ while (angle > 360.0)
+ angle -= 360;
+ while (angle < -360.0)
+ angle += 360;
+ if (angle == 90.0) {
+ angle = 89.999;
+ (void)memcpy(cp1, ocp1, ptm1 - ocp1);
+ cp1 += ptm1 - ocp1;
+ strcpy(cp1, "89.999 rotate ");
+ cp1 += strlen(cp1);
+ while (*pt != '\0' && *pt != ' ' && *pt != '\t')
+ ++pt;
+ while (*pt == ' ' || *pt == '\t')
+ ++pt;
+ ocp1 = pt;
+ }
+ else if (angle == -90.0) {
+ angle = -89.999;
+ (void)memcpy(cp1, ocp1, ptm1 - ocp1);
+ cp1 += ptm1 - ocp1;
+ strcpy(cp1, "-89.999 rotate ");
+ cp1 += strlen(cp1);
+ while (*pt != '\0' && *pt != ' ' && *pt != '\t')
+ ++pt;
+ while (*pt == ' ' || *pt == '\t')
+ ++pt;
+ ocp1 = pt;
+ }
+ else if (angle == 0.0) {
+ (void)memcpy(cp1, ocp1, ptm1 - ocp1);
+ cp1 += ptm1 - ocp1;
+ while (*pt != '\0' && *pt != ' ' && *pt != '\t')
+ ++pt;
+ while (*pt == ' ' || *pt == '\t')
+ ++pt;
+ ocp1 = pt;
+ }
+ }
+ }
+ }
+ strcpy(cp1, ocp1);
+ if ((globals.debug & DBG_PS) && found) {
+ printf("String is now <%s>\n", cp);
+ printf("Found rotate string. Angle is %g degrees.\n", angle);
+ }
+
+ len = strlen(cp);
+ cp[len] = '\n';
+ NeWS_send(cp, len + 1);
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawfileNeWS()
+
+ Arguments: cp - string with the postscript file pathname
+ psfile - file, already opened
+ Returns: (void)
+ Side-Effects: none
+
+ Description:
+ Postscript file containing the figure is opened and sent to the NeWS server.
+ Figure is outlined in case hairy code produces a SIGPIPE signal.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawfileNeWS(const char *cp, FILE *psfile)
+{
+ char buffer[1025];
+ int blen;
+ struct sigaction orig;
+
+ if (!NeWS_active) {
+ fclose(psfile);
+ return;
+ }
+
+ if (globals.debug & DBG_PS)
+ printf("printing file %s\n", cp);
+
+ sigpipe_error = False;
+ for (;;) {
+ blen = fread(buffer, sizeof(char), 1024, psfile);
+ if (blen == 0) break;
+ NeWS_send(buffer, blen);
+ if (sigpipe_error || (globals.ev.flags & NeWS_ev_mask))
+ break;
+ }
+ fclose(psfile);
+
+ if (sigpipe_error) {
+ fputs("NeWS died unexpectedly.\n", stderr);
+ destroyNeWS();
+ draw_bbox();
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ drawendNeWS()
+
+ Arguments: cp - string with indication of the end of the special
+ Returns: (void)
+
+ Description:
+ Sends the indication of end of the figure PostScript code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+drawendNeWS(const char *cp)
+{
+ if (!NeWS_active)
+ return;
+
+ if (globals.debug & DBG_PS)
+ puts("drawend sent to NeWS Server");
+ NeWS_send(cp, strlen(cp));
+ NeWS_send("\n", 1);
+}
+
+
+/*---------------------------------------------------------------------------*
+ beginheaderNeWS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Prepares the PostScript interpreter for receipt of header code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+beginheaderNeWS(void)
+{
+ static const char str[] = "Hsave /xdvi$doc exch def\n";
+
+ if (globals.debug & DBG_PS)
+ puts("Running beginheaderNeWS()");
+
+ if (NeWS_active) {
+ if (!NeWS_in_header)
+ XDVI_FATAL((stderr, "Internal error in beginheaderNeWS()."));
+ return;
+ }
+
+ if (globals.ev.flags & NEWS_MASK_HEADER)
+ longjmp(globals.ev.canit, 1);
+
+ NeWS_in_header = True;
+ NeWS_ev_mask = NEWS_MASK_HEADER;
+ ++NeWS_pending;
+ if (NeWS_in_doc)
+ NeWS_send("H", 1);
+ else {
+ NeWS_send(str, (sizeof str) - 1);
+ NeWS_in_doc = True;
+ }
+ NeWS_active = True;
+}
+
+
+/*---------------------------------------------------------------------------*
+ endheaderNeWS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Prepares the PostScript interpreter for receipt of header code.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+endheaderNeWS(void)
+{
+ static const char str[] = "stop\n%%xdvimark\n";
+
+ if (globals.debug & DBG_PS)
+ puts("Running endheaderNeWS()");
+
+ if (NeWS_active) {
+ NeWS_send(str, (sizeof str) - 1);
+ NeWS_active = False;
+ post_send();
+ waitack();
+ NeWS_in_header = False;
+ NeWS_ev_mask = NEWS_MASK_NORMAL;
+ }
+}
+
+
+/*---------------------------------------------------------------------------*
+ newdocNeWS()
+
+ Arguments: none
+ Returns: (void)
+
+ Description:
+ Clears out headers stored from the previous document.
+
+ +----------------------------------------------------------------------------*/
+
+static void
+newdocNeWS(void)
+{
+ static const char str[] = "H xdvi$doc restore stop\n%%xdvimark\n";
+
+ if (globals.debug & DBG_PS)
+ puts("Running newdocNeWS()");
+
+ if (NeWS_in_doc) {
+ ++NeWS_pending;
+ NeWS_send(str, (sizeof str) - 1);
+ NeWS_mag = NeWS_shrink = -1;
+ NeWS_in_doc = False;
+ }
+}
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* PS_NEWS */
diff --git a/Build/source/texk/xdvik/psnews.h b/Build/source/texk/xdvik/psnews.h
new file mode 100644
index 00000000000..4fe42e80550
--- /dev/null
+++ b/Build/source/texk/xdvik/psnews.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PSNEWS_H_
+#define PSNEWS_H_
+
+extern Boolean initNeWS(void);
+
+#endif /* PSNEWS_H_ */
diff --git a/Build/source/texk/xdvik/search-internal.c b/Build/source/texk/xdvik/search-internal.c
new file mode 100644
index 00000000000..719deaa3f00
--- /dev/null
+++ b/Build/source/texk/xdvik/search-internal.c
@@ -0,0 +1,2076 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ How dvi search works:
+
+ (1) Map the search string passed by the user from resource.text_encoding
+ to UTF-8 (currently only maps ISO_8859-1), and create a regexp from
+ the string if needed.
+
+ If case-insensitive matching is activated and regexp search is not
+ active, the search string is converted to lowercase. For regexp
+ searches, the flag available with regcomp to ignore case is used.
+
+ (2) Scan 2 adjacent pages (so that we can also find matches across page
+ boundaries), collecting the text into a char *buffer.
+ This involves the following steps:
+
+ - Map characters from wide_ubyte to uint32_t encoding (ucs-4),
+ using and Adobe names lookup table (for Postscript Type1
+ fonts) or font-specific character info (for Metafont fonts).
+
+ This step also maps accented glyphs to composite glyphs,
+ expands ligatures to separate characters (e.g. `ffi' to
+ `f'`f'`i'), and tries to detect word boundaries and line
+ breaks.
+
+ If case-insensitive matching is activated, the characters are
+ also lowercased in this step.
+
+ Optionally, hyphenation can be removed in this step.
+
+ Routine: do_char() in dvi-draw.c (must be in dvi_draw.c since
+ we need access to drawing-related stuff like `currinf' to get
+ information about the current font, position in the DVI file
+ etc.).
+
+ - Save the uint32_t characters into a char *buffer, mapping to
+ utf-8.
+
+ (3) Search the buffer from (2) for the string from (1). If a match
+ has been found, the page is scanned again to store the bounding
+ box information of the matched text for highlighting it.
+*/
+
+
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#define SWITCH_TO_UTF8 1
+
+#if HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+#if HAVE_ICONV_H
+#include <iconv.h>
+#endif
+
+#include <locale.h>
+
+#if USE_LANGINFO
+#include <langinfo.h>
+#endif
+
+#include <ctype.h>
+
+#include <X11/keysym.h>
+
+#include "dvi-init.h" /* for total_pages */
+#include "dvi-draw.h"
+#include "search-internal.h"
+
+#include "search-dialog.h"
+#include "message-window.h"
+#include "statusline.h"
+#include "events.h"
+#include "encodings.h"
+#include "pagesel.h"
+#include "events.h"
+#include "util.h"
+#include "x_util.h"
+#include "string-utils.h"
+#include "mag.h"
+#include "pagehist.h"
+#include "translations.h"
+
+#define DEBUG_SEARCH 0
+/* #define MATCH_HIGHLIGHT_INVERTED 1 */
+
+
+/* margins for highlighting the match */
+const int BBOX_LOWER_MARGIN = 2;
+const int BBOX_UPPER_MARGIN = 1;
+
+#if 0
+#define GET_BBOX(bbox, shrink, x, y, w, h) \
+ x = (bbox.ulx / (double)shrink + 0.5) - BBOX_UPPER_MARGIN; \
+ y = (bbox.uly / (double)shrink + 0.5) - BBOX_UPPER_MARGIN; \
+ w = ((bbox.lrx - bbox.ulx) / (double)shrink) + 0.5 \
+ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 1; \
+ h = ((bbox.lry - bbox.uly) / (double)shrink) + 0.5 \
+ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 2;
+#endif /* 0 */
+/* use integer arithmetic */
+#define GET_BBOX(bbox, shrink, x, y, w, h) \
+ x = (bbox.ulx + shrink / 2) / shrink - BBOX_UPPER_MARGIN; \
+ y = (bbox.uly + shrink / 2) / shrink - BBOX_UPPER_MARGIN; \
+ w = (bbox.lrx - bbox.ulx + shrink - 1) / shrink \
+ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 1; \
+ h = (bbox.lry - bbox.uly + shrink - 1) / shrink \
+ + BBOX_UPPER_MARGIN + BBOX_LOWER_MARGIN + 2;
+
+/* access from drawing routines */
+static struct word_info *m_info = NULL;
+static int m_match_page = -1;
+
+/* Force restarting search if user switches pages. E.g. if
+ the current match is the last of 3 matches on the page,
+ and user re-selects the page, the search should start again
+ with match 1. Similarly, if current page is second of two
+ pages scanned, and user clicks on first, search shouldn't continue
+ on second page but restart on current one.
+*/
+static Boolean m_changed_page = False;
+
+static Boolean m_highlight_region_changed = True;
+
+void
+search_signal_page_changed(void)
+{
+ m_changed_page = True;
+}
+
+
+static void
+reset_info(struct word_info *w_info)
+{
+ if (w_info == NULL)
+ return;
+
+ free(w_info->txt_buf);
+ w_info->txt_buf = NULL;
+ w_info->txt_buf_size = 0;
+ w_info->curr_buf_idx = 0;
+
+ free(w_info->bboxes);
+ w_info->bboxes = NULL;
+ w_info->bboxes_size = 0;
+ w_info->bboxes_idx = 0;
+
+ m_highlight_region_changed = True;
+}
+
+
+static void
+generate_highlight_expose(const struct word_info *info)
+{
+ int x1 = INT_MAX, y1 = INT_MAX, x2 = 0, y2 = 0;
+ size_t i;
+ for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) {
+ if (info->bboxes[i].ulx < x1)
+ x1 = info->bboxes[i].ulx;
+ if (info->bboxes[i].uly < y1)
+ y1 = info->bboxes[i].uly;
+ if (info->bboxes[i].lrx > x2)
+ x2 = info->bboxes[i].lrx;
+ if (info->bboxes[i].lry > y2)
+ y2 = info->bboxes[i].lry;
+ }
+#if 0
+ fprintf(stderr, "region for exposure: %d,%d to %d,%d\n",
+ x1, y1, x2, y2);
+#endif /* 0 */
+ x1 -= MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) - 2;
+ y1 -= MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) - 2;
+ x2 += MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) + 2;
+ y2 += MAX(BBOX_UPPER_MARGIN, BBOX_LOWER_MARGIN) + 2;
+ clearexpose(&mane, x1, y1, x2 - x1, y2 - y1);
+}
+
+static void
+draw_bboxes(const struct word_info *info)
+{
+ size_t i;
+ static GC bboxGC = 0;
+ static Boolean highlight_inverted_bak;
+
+ if (bboxGC != 0 && highlight_inverted_bak != resource.match_highlight_inverted) {
+ XFreeGC(DISP, bboxGC);
+ bboxGC = 0;
+ }
+ highlight_inverted_bak = resource.match_highlight_inverted;
+
+ if (resource.match_highlight_inverted) {
+ if (MAGNIFIER_ACTIVE && !INSIDE_MANE_WIN)
+ return;
+
+ TRACE_FIND((stderr, "-- EXPOSED region: x %d, y %d, w %d, h %d",
+ globals.win_expose.min_x, globals.win_expose.min_y, globals.win_expose.max_x - globals.win_expose.min_x, globals.win_expose.max_y - globals.win_expose.min_y));
+
+ if (bboxGC == 0) {
+ XGCValues values;
+ unsigned long valuemask;
+
+ values.function = GXinvert; /* was: GXxor; see bug #850788 */
+ if (values.function == GXinvert) {
+ valuemask = GCFunction;
+ }
+ else {
+ values.foreground = WhitePixelOfScreen(SCRN) ^ BlackPixelOfScreen(SCRN);
+ /* fprintf(stderr, "foreground: 0x%lx, white pixel: 0x%lx, black pixel: 0x%lx\n", */
+ /* values.foreground, WhitePixelOfScreen(SCRN), BlackPixelOfScreen(SCRN)); */
+ valuemask = GCFunction | GCForeground;
+ }
+ bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level), valuemask, &values);
+ }
+ }
+ else if (bboxGC == 0) {
+ XGCValues values;
+ values.function = GXcopy;
+ values.line_width = 2;
+ values.cap_style = CapRound;
+ values.foreground = resource.hl_Pixel;
+ values.background = resource.back_Pixel;
+ bboxGC = XCreateGC(DISP, XtWindow(globals.widgets.top_level),
+ GCFunction | GCLineWidth | GCCapStyle | GCForeground | GCBackground, &values);
+ }
+
+ TRACE_FIND((stderr, "bboxes_idx: %lu", (unsigned long)info->bboxes_idx));
+ for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) {
+ int x, y, w, h;
+
+ if (info->bboxes[i].ulx > 10000 || info->bboxes[i].uly > 10000) {
+ TRACE_FIND((stderr, "skipping box: x %d, y %d",
+ info->bboxes[i].ulx, info->bboxes[i].uly));
+ continue;
+ }
+
+ GET_BBOX(info->bboxes[i], currwin.shrinkfactor, x, y, w, h);
+ TRACE_FIND((stderr, "DRAWING box: x %d, y %d, w %d, h %d; shrink: %d",
+ x, y, w, h, currwin.shrinkfactor));
+ if (resource.match_highlight_inverted) {
+ if (clip_region(&x, &y, &w, &h)) {
+ TRACE_FIND((stderr, "CLIPPED box: x %d, y %d, w %d, h %d",
+ x, y, w, h));
+ TEST_DELAY("Redrawing BBOX ............... ");
+ XFillRectangle(DISP, mane.win, bboxGC, x, y, w, h);
+ TEST_DELAY("Inverting BBOX ............... ");
+ }
+ }
+ /* XDrawRectangle(DISP, mane.win, globals.gc.high, x, y, w + 0, h + 0); */
+ /* clearexpose(&mane, x, y, w + 3, h + 3); */
+ /* XDrawRectangle(DISP, mane.win, globals.gc.high, x, y, w + 2, h + 2); */
+ /* XDrawRectangle(DISP, mane.win, globals.gc.high, x + 1, y + 1, w, h); */
+ else {
+ static XPoint points[5] = { {0,0}, {0,0}, {0,0}, {0,0}, {0,0} };
+
+ h++;
+
+ points[0].x = x;
+ points[0].y = y;
+
+ points[1].x = w;
+
+ points[2].y = h;
+
+ points[3].x = -w;
+
+ points[4].y = -h;
+
+ XDrawLines(DISP, mane.win, bboxGC, points, 5, CoordModePrevious);
+ }
+
+ if (!MAGNIFIER_ACTIVE) {
+ /* note: inverted y_max y_min, since we want to display the full box here */
+ scroll_page_if_needed(x + w, x, y + h, y);
+ }
+ }
+}
+
+/* return true if we have a match on page pageno */
+Boolean
+search_have_match(int pageno)
+{
+ /* fprintf(stderr, "pageno: %d --- m_info: %p\n", pageno, m_info); */
+ /* fprintf(stderr, "m_match_page: %d\n", m_match_page); */
+ return m_info != NULL && m_match_page == pageno;
+}
+
+/* TODO: Speed this up, by doing something like bsearch? */
+/*
+ Returns 2 if we're at the 1st or last character of the bbox, 1 if
+ inside the bbox, and 0 else (currently the return value 2 is unused).
+*/
+int
+search_inside_bbox_match(int x, int y)
+{
+ size_t i;
+
+ ASSERT(m_info != NULL, "inside_match musn't be called with m_info == NULL!");
+ TRACE_FIND((stderr, "m_info->bboxes: %p; idx: %lu", (void *)m_info->bboxes, (unsigned long)m_info->bboxes_idx));
+ for (i = 0; m_info->bboxes != NULL && i <= m_info->bboxes_idx && m_info->bboxes[i].ulx < INT_MAX; i++) {
+ TRACE_FIND((stderr, "inside_bbox_match: %d, %d", x, y));
+ TRACE_FIND((stderr, "x: %d, y: %d, x2: %d, y2: %d",
+ (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5),
+ (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5),
+ (int)(m_info->bboxes[i].lrx / (double)currwin.shrinkfactor + 0.5),
+ (int)(m_info->bboxes[i].lry / (double)currwin.shrinkfactor + 0.5)));
+
+ if (x >= (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5)
+ && x <= (int)(m_info->bboxes[i].lrx / (double)currwin.shrinkfactor + 0.5)
+ && y >= (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5)
+ && y <= (int)(m_info->bboxes[i].lry / (double)currwin.shrinkfactor + 0.5)) {
+ TRACE_FIND((stderr, "%d == %d",
+ x - 1, (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5)));
+ TRACE_FIND((stderr, "%d == %d",
+ y - 1, (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5)));
+ if (x - 1 == (int)(m_info->bboxes[i].ulx / (double)currwin.shrinkfactor + 0.5)
+ && y - 1 == (int)(m_info->bboxes[i].uly / (double)currwin.shrinkfactor + 0.5))
+ return 2;
+ else
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void
+search_draw_inverted_regions(void)
+{
+ if (m_info != NULL) {
+ draw_bboxes(m_info);
+ }
+}
+
+
+/*
+ * shift everything in info down by 1 pages, so that info for page 1 becomes
+ * info for page 0.
+ */
+static void
+shift_info_down(struct search_info *searchinfo, struct word_info *info, struct page_mapping *page_mapping)
+{
+ size_t initial_offset = 0;
+ if (page_mapping[0].offset != -1) { /* remember value */
+ initial_offset = page_mapping[0].offset;
+ }
+
+ if (globals.debug & DBG_FIND) {
+ int i;
+ fprintf(stderr, "current page_mapping:\n");
+ for (i = 0; i < 2; i++) {
+ fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset);
+ }
+ }
+
+ TRACE_FIND((stderr, "initial offset: %lu", (unsigned long)initial_offset));
+
+ page_mapping[0].offset = page_mapping[1].offset - initial_offset;
+ page_mapping[0].pageno = page_mapping[1].pageno;
+ ASSERT(page_mapping[0].offset >= 0, "new index mustn't be negative!\n");
+ page_mapping[1].offset = page_mapping[1].pageno = -1;
+
+ TRACE_FIND((stderr, "new val at 0: %d; curr_idx: %lu, len: %lu",
+ page_mapping[0].offset,
+ (unsigned long)(info->curr_buf_idx - initial_offset),
+ (unsigned long)(strlen(info->txt_buf + initial_offset))));
+
+ /* move the text buffer down, and update its current index accordingly */
+ ASSERT(info->curr_buf_idx >= initial_offset, "info->curr_buf_idx mustn't become negative!");
+ memmove(info->txt_buf, info->txt_buf + initial_offset, info->curr_buf_idx - initial_offset + 1);
+ info->curr_buf_idx -= initial_offset;
+ TRACE_FIND((stderr, "new index: %lu", (unsigned long)info->curr_buf_idx));
+
+ searchinfo->from_pos -= initial_offset;
+ searchinfo->to_pos -= initial_offset;
+ if (searchinfo->from_pos < 0)
+ searchinfo->from_pos = 0;
+ if (searchinfo->to_pos < 0)
+ searchinfo->to_pos = 0;
+ TRACE_FIND((stderr, "new offsets: from=%d, to=%d", searchinfo->from_pos, searchinfo->to_pos));
+}
+
+/*
+ * shift everything in info up by 1 page, so that info for page 0 becomes info
+ * for page 1.
+ */
+static void
+shift_info_up(struct word_info *info, struct page_mapping *page_mapping)
+{
+ if (globals.debug & DBG_FIND) {
+ int i;
+ fprintf(stderr, "current page_mapping:\n");
+ for (i = 0; i < 2; i++) {
+ fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset);
+ }
+ }
+
+ ASSERT(page_mapping[0].offset > 0, "info->curr_buf_idx mustn't become negative!");
+ info->curr_buf_idx = page_mapping[0].offset;
+ TRACE_FIND((stderr, "new index: %lu", (unsigned long)info->curr_buf_idx));
+
+ page_mapping[1].offset = page_mapping[0].offset;
+ page_mapping[1].pageno = page_mapping[0].pageno;
+ page_mapping[0].offset = page_mapping[0].pageno = -1;
+
+}
+
+static void
+append_to_info(struct word_info *info, const char *str)
+{
+ size_t len = strlen(str);
+ size_t new_size = info->txt_buf_size;
+ while (len >= new_size) { /* space for trailing 0 */
+ new_size++;
+ }
+ if (new_size > info->txt_buf_size) {
+ info->txt_buf_size = new_size;
+ info->txt_buf = xrealloc(info->txt_buf, sizeof *(info->txt_buf) * info->txt_buf_size);
+ }
+ memcpy(info->txt_buf + info->curr_buf_idx, str, len + 1); /* also copy trailing 0 */
+ info->curr_buf_idx += len;
+}
+
+/* append info2 to info1, enlarging info1 as needed. */
+static void
+append_info(struct word_info *info1, const struct word_info *info2)
+{
+ if (info2->txt_buf_size > 0) {
+ info1->txt_buf = xrealloc(info1->txt_buf, sizeof *(info1->txt_buf)
+ * (info1->txt_buf_size + info2->txt_buf_size));
+ memcpy(info1->txt_buf + info1->curr_buf_idx, info2->txt_buf, info2->txt_buf_size);
+ info1->txt_buf_size += info2->txt_buf_size;
+ info1->curr_buf_idx += info2->curr_buf_idx;
+ }
+}
+
+/* prepend info1 to info2, enlarging info2 as needed. */
+static void
+prepend_info(const struct word_info *info1, struct word_info *info2)
+{
+ if (info1->txt_buf_size > 0) {
+ info2->txt_buf = xrealloc(info2->txt_buf, sizeof *(info2->txt_buf)
+ * (info2->txt_buf_size + info1->txt_buf_size + 1));
+ memmove(info2->txt_buf + info1->curr_buf_idx, info2->txt_buf, info2->curr_buf_idx);
+ info2->txt_buf[info1->curr_buf_idx + info2->curr_buf_idx] = '\0';
+ memcpy(info2->txt_buf, info1->txt_buf, info1->curr_buf_idx);
+ /* TRACE_FIND((stderr, "prepend_info: info2->txt_buf is: |%s|", info2->txt_buf)); */
+ info2->txt_buf_size += info1->txt_buf_size;
+ info2->curr_buf_idx += info1->curr_buf_idx;
+ }
+}
+
+#if HAVE_REGEX_H
+/* convert the encoding part (between the `.' and the `@') of the
+ locale string passed as argument to UTF-8, and return the result
+ in a newly allocated string which the caller is responsible for
+ free()ing.
+*/
+static char *
+locale_to_utf8(const char *locale)
+{
+ char *utf8_locale = xstrdup(locale);
+ char *ptr;
+ if ((ptr = strchr(utf8_locale, '.')) != NULL) {
+ char *ptr2, *rest = "";
+ if ((ptr2 = strchr(utf8_locale, '@')) != NULL)
+ rest = xstrdup(ptr2);
+
+ utf8_locale = xrealloc(utf8_locale,
+ ptr - utf8_locale + strlen(".utf8") + strlen(rest) + 1);
+ *ptr = '\0';
+ utf8_locale = strcat(utf8_locale, ".utf8");
+ if (ptr2 != NULL) {
+ utf8_locale = strcat(utf8_locale, rest);
+ free(rest);
+ }
+ }
+ else {
+ utf8_locale = xstrcat(utf8_locale, ".utf8");
+ }
+ return utf8_locale;
+}
+#endif /* HAVE_REGEX_H */
+
+static Boolean
+is_utf8_ideograph(const unsigned char *p)
+{
+ int len;
+ uint32_t ucs4;
+
+ if ((len = utf8_to_ucs4((const char *)p, &ucs4, strlen((const char*)p))) <= 0)
+ return False;
+
+ return is_ideograph(ucs4);
+}
+
+
+static void
+dump_buffer(const struct word_info *info, size_t offset, FILE *fp, outputFormatT fmt)
+{
+ size_t i = offset, len, tot_len;
+
+ if (info->txt_buf == NULL)
+ return;
+
+ tot_len = strlen(info->txt_buf);
+ while (i < tot_len) {
+ if (fmt == FMT_UTF8) { /* just dump as-is */
+ fputc(info->txt_buf[i++], fp);
+ }
+ else { /* convert to iso-latin1, rendering unknown characters as `?' */
+ uint32_t ucs4;
+ const char *ret;
+
+ /* first apply normalization heurisitcs also used by search */
+ len = utf8_to_ucs4(info->txt_buf + i, &ucs4, strlen(info->txt_buf + i));
+ if ((ret = search_normalize_chars(ucs4)) != NULL)
+ fputs(ret, fp);
+ else if (ucs4 <= 0xff) /* in iso-latin1 range */
+ fputc((unsigned char)ucs4, fp);
+ else
+ fprintf(fp, "\\%.4lX", (unsigned long)ucs4);
+ i += len;
+ }
+ }
+}
+
+static void
+scan_page(FILE *fp, int pageno, struct word_info *w_info)
+{
+ off_t pos_save;
+ static ubyte my_scan_buffer[DVI_BUFFER_LEN];
+ struct drawinf currinf_save;
+ struct scan_info info;
+ ubyte maxchar_save;
+
+ reinit_text_scan(); /* to reset scanning heuristics (linebreaks etc.) */
+ info.data = (void *)w_info;
+ info.geom_special = NULL; /* no procedure here */
+
+ /* Save file position */
+ pos_save = save_file_status(globals.dvi_file.bak_fp, &currinf_save, &maxchar_save);
+
+ lseek(fileno(fp), pageinfo_get_offset(pageno), SEEK_SET);
+ memset((char *)&currinf.data, 0, sizeof currinf.data);
+ currinf.tn_table_len = TNTABLELEN;
+ currinf.tn_table = tn_table;
+ currinf.tn_head = tn_head;
+
+ /* point currinf to our own buffer: */
+ G_dvi_buf_ptr = my_scan_buffer;
+
+ currinf.pos = currinf.end = G_dvi_buf_ptr;
+ currinf.virtual = NULL;
+
+ geom_scan(text_do_char, fp, &info, pageno);
+
+ /* Restore file status. */
+ restore_file_status(globals.dvi_file.bak_fp, currinf_save, maxchar_save, pos_save);
+}
+
+
+static Boolean
+do_scan_page(struct word_info *w_info, struct search_settings *settings,
+ struct page_mapping *page_mapping, int buffer_offset, int pageno,
+ searchDirectionT direction)
+{
+ struct word_info page_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, True, False };
+ page_info.settings = settings;
+ ASSERT(buffer_offset >= 0, "buffer_offset must have been initialized");
+ page_info.buffer_offset = buffer_offset;
+ TRACE_FIND((stderr, "scanning page: %d; from_pos: %d", pageno, settings->searchinfo->from_pos));
+
+ if (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL) {
+ TRACE_FIND((stderr, "interrupted!!"));
+ return False;
+ }
+
+ scan_page(globals.dvi_file.bak_fp, pageno, &page_info);
+
+ /* TRACE_FIND((stderr, "scanned buffer of length %d on page %d; contents: |%s|", */
+ /* page_info.curr_buf_idx, pageno, page_info.txt_buf)); */
+
+ /* terminate page */
+ append_to_info(&page_info, "\n");
+ if (direction == SEARCH_DOWN) {
+ /* append to existing info */
+ append_info(w_info, &page_info);
+ page_mapping->offset = w_info->curr_buf_idx;
+ }
+ else {
+ prepend_info(&page_info, w_info);
+ /* TRACE_FIND((stderr, "buffer after prepending: |%s|", w_info->txt_buf)); */
+ page_mapping->offset = page_info.curr_buf_idx;
+ }
+ page_mapping->pageno = pageno;
+
+ return True;
+}
+
+#if HAVE_REGEX_H
+static void
+report_regexp_error(int errcode, regex_t *regex, const char *term, int flag)
+{
+ size_t n = regerror(errcode, regex, NULL, 0);
+ char *err_buf = xmalloc(n);
+ regerror(errcode, regex, err_buf, n);
+ xdvi_bell();
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ NULL,
+ "Could not %s regular expression \"%s\": %s\n",
+ flag == 0 ? "compile" : "execute",
+ term, err_buf);
+ free(err_buf);
+}
+#endif /* HAVE_REGEX_H */
+
+static void
+try_match(const struct word_info *info,
+ const struct search_settings *settings)
+{
+ char *res = NULL;
+ size_t from_pos = 0;
+ struct search_info *searchinfo = settings->searchinfo;
+
+ ASSERT(info->curr_buf_idx == strlen(info->txt_buf), "");
+ TRACE_FIND((stderr, "buffer index: %lu, len: %lu; from: %lu",
+ (unsigned long)info->curr_buf_idx,
+ (unsigned long)strlen(info->txt_buf),
+ (unsigned long)searchinfo->from_pos));
+ if (searchinfo->from_pos != -1)
+ from_pos = searchinfo->from_pos;
+
+ if (settings->direction == SEARCH_DOWN) {
+ TRACE_FIND((stderr, "trying to match |%s| from %lu; total: %lu",
+ settings->utf8_term,
+ (unsigned long)from_pos,
+ (unsigned long)strlen(info->txt_buf)));
+
+ res = strstr(info->txt_buf + from_pos, settings->utf8_term);
+ }
+ else {
+ size_t curr_pos = 0;
+ char *res_bak = NULL;
+
+ TRACE_FIND((stderr, "UP; trying to match |%s| from %lu, %lu",
+ settings->utf8_term,
+ (unsigned long)curr_pos, (unsigned long)from_pos));
+ TRACE_FIND((stderr, "buf: |%s|", info->txt_buf + curr_pos));
+ while (curr_pos <= from_pos) {
+ res_bak = res;
+ res = strstr(info->txt_buf + curr_pos, settings->utf8_term);
+ if (res != NULL) {
+ curr_pos = res - info->txt_buf + strlen(settings->utf8_term);
+ }
+ else {
+ break;
+ }
+ }
+ res = res_bak;
+ }
+ if (res != NULL) {
+ searchinfo->have_match = True;
+ searchinfo->from_pos = res - info->txt_buf;
+ searchinfo->to_pos = searchinfo->from_pos + strlen(settings->utf8_term);
+ }
+ else {
+ searchinfo->have_match = False;
+ }
+}
+
+#if HAVE_REGEX_H
+static Boolean
+try_regexp_match(regex_t *regex,
+ const struct word_info *info,
+ const struct search_settings *settings)
+{
+ int have_match;
+ regmatch_t re_match;
+ size_t from_pos = 0;
+ Boolean retval = True;
+
+ struct search_info *searchinfo = settings->searchinfo;
+
+#if SWITCH_TO_UTF8
+ /* switch to UTF-8 encoding, as for regcomp() */
+ char *utf8_locale = locale_to_utf8(globals.orig_locale);
+ TRACE_FIND((stderr, "current locale: |%s|, utf8 version: |%s|", globals.orig_locale, utf8_locale));
+ setlocale(LC_ALL, utf8_locale);
+#endif
+
+ re_match.rm_so = re_match.rm_eo = -1;
+
+ if (searchinfo->from_pos != -1)
+ from_pos = searchinfo->from_pos;
+
+ if (settings->direction == SEARCH_DOWN) {
+ Boolean search_again = True;
+
+ while (search_again && from_pos < info->curr_buf_idx) {
+ searchinfo->have_match = False;
+ search_again = False;
+
+ /* TRACE_FIND((stderr, "search string: |%s|, from_pos: %d", info->txt_buf + from_pos, from_pos)); */
+ have_match = regexec(regex, info->txt_buf + from_pos, 1, &re_match, 0);
+
+ if (have_match == 0) { /* match */
+ TRACE_FIND((stderr, "match from %d to %d", (int)re_match.rm_so, (int)re_match.rm_eo));
+ if (re_match.rm_so == re_match.rm_eo) { /* skip zero-length matches */
+ from_pos += re_match.rm_so + 1;
+ search_again = True;
+ }
+ else {
+ searchinfo->from_pos = re_match.rm_so + from_pos;
+ searchinfo->to_pos = re_match.rm_eo + from_pos;
+ searchinfo->have_match = True;
+ }
+ }
+ else if (have_match != REG_NOMATCH) { /* error */
+ report_regexp_error(have_match, regex, settings->term, 1);
+ retval = False;
+ break;
+ }
+ }
+ }
+ else { /* searching backwards */
+ size_t curr_pos = 0, prev_pos = 0;
+ regmatch_t re_match_bak;
+ Boolean search_again = True;
+ searchinfo->have_match = False;
+ TRACE_FIND((stderr, "UP; trying to match |%s| from %lu, %lu",
+ settings->utf8_term,
+ (unsigned long)curr_pos, (unsigned long)from_pos));
+
+ re_match_bak.rm_so = re_match_bak.rm_eo = -1;
+
+ while (search_again && curr_pos <= from_pos) {
+ search_again = False;
+
+ /* remember previous match data */
+ re_match_bak.rm_so = prev_pos + re_match.rm_so;
+ re_match_bak.rm_eo = prev_pos + re_match.rm_eo;
+
+ TRACE_FIND((stderr, "backup values: %d, %d; curr_pos: %lu",
+ (int)re_match_bak.rm_so, (int)re_match_bak.rm_eo, (unsigned long)curr_pos));
+
+ /* TRACE_FIND((stderr, "text buf: |%s|", info->txt_buf + curr_pos)); */
+ have_match = regexec(regex, info->txt_buf + curr_pos, 1, &re_match, 0);
+ while (have_match == 0 && re_match.rm_so == re_match.rm_eo) { /* skip zero-length matches */
+ have_match = regexec(regex, info->txt_buf + ++curr_pos, 1, &re_match, 0);
+ }
+
+
+ if (have_match == 0) { /* match */
+ TRACE_FIND((stderr, "match from %d to %d", (int)re_match.rm_so, (int)re_match.rm_eo));
+ TRACE_FIND((stderr, "updating pos: %lu -> %lu; from_pos: %lu",
+ (unsigned long)curr_pos,
+ (unsigned long)(curr_pos + re_match.rm_eo),
+ (unsigned long)from_pos));
+ prev_pos = curr_pos;
+ curr_pos += re_match.rm_eo;
+ search_again = True;
+ }
+ else if (have_match != REG_NOMATCH) { /* error */
+ report_regexp_error(have_match, regex, settings->term, 1);
+ retval = False;
+ break;
+ }
+ }
+ if (retval) {
+ re_match.rm_so = re_match_bak.rm_so;
+ re_match.rm_eo = re_match_bak.rm_eo;
+
+ if (re_match.rm_so != -1) {
+ TRACE_FIND((stderr, "remembering from-to: %d - %d", (int)re_match.rm_so, (int)re_match.rm_eo));
+ searchinfo->from_pos = re_match.rm_so;
+ searchinfo->to_pos = re_match.rm_eo;
+ searchinfo->have_match = True;
+ }
+ }
+ }
+
+#if SWITCH_TO_UTF8
+ /* switch back to original encoding */
+ setlocale(LC_ALL, globals.orig_locale);
+ setlocale(LC_NUMERIC, "C");
+ free(utf8_locale);
+#endif
+
+ return retval;
+}
+#endif /* HAVE_REGEX_H */
+
+/* Erase exising highlighting. TODO: Move this into dvi-draw so that
+ there's no big delay between erasing and drawing the next marker.
+*/
+static void
+erase_match_highlighting(struct word_info *info, Boolean flag)
+{
+ size_t i;
+
+ if (info == NULL || (MAGNIFIER_ACTIVE && !INSIDE_MANE_WIN))
+ return;
+
+ for (i = 0; info->bboxes != NULL && i <= info->bboxes_idx && info->bboxes[i].ulx < INT_MAX; i++) {
+ int x, y, w, h;
+ GET_BBOX(info->bboxes[i], currwin.shrinkfactor, x, y, w, h);
+ if (resource.match_highlight_inverted) {
+ if (flag || m_highlight_region_changed) {
+ clearexpose(&mane, x, y, w, h);
+ }
+ else if (clip_region(&x, &y, &w, &h)) {
+ TRACE_FIND((stderr, "ERASING box: x %d, y %d, w %d, h %d",
+ x, y, w, h));
+ TEST_DELAY("Showing BBOX ............... ");
+ XClearArea(DISP, mane.win, x, y, w, h, False);
+ TEST_DELAY("Clearing BBOX ............... ");
+ }
+ }
+ else if (flag) {
+ /* erase only the existing marks, not the entire bounding box, to avoid flashing of
+ the text inside the bounding box. 1 pixel added to w, h just to make sure in case of
+ rounding errors. */
+ h++;
+ clearexpose(&mane, x - 1, y - 1, 2, h + 2);
+ clearexpose(&mane, x - 1, y - 1, w + 2, 2);
+ clearexpose(&mane, x + w - 1, y - 1, 2, h + 2);
+ clearexpose(&mane, x - 1, y + h - 1, w + 2, 2);
+ }
+ }
+ if (flag) {
+ reset_info(info);
+ info = NULL;
+ }
+ else
+ m_highlight_region_changed = False;
+}
+
+static void
+highlight_match(struct search_settings *settings,
+ const struct word_info *w_info,
+ const struct page_mapping *page_mapping)
+{
+ const int context = 10;
+ int match_page, i, j = 0;
+ static struct word_info curr_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, True, False, False };
+ struct search_info *searchinfo = settings->searchinfo;
+ Boolean match_wrapped = False;
+
+ curr_info.settings = settings;
+ curr_info.page_mapping = page_mapping;
+
+ TRACE_FIND((stderr, "MATCH from pos %d to %d:",
+ searchinfo->from_pos, searchinfo->to_pos));
+
+ if (globals.debug & DBG_FIND) {
+ fprintf(stderr, "current page_mapping:\n");
+ for (i = 0; i < 2; i++) {
+ fprintf(stderr, "%d: %d\n", page_mapping[i].pageno, page_mapping[i].offset);
+ }
+ }
+
+ TRACE_FIND((stderr, "to_pos: %d, %d", searchinfo->to_pos, page_mapping[0].offset));
+ if (searchinfo->from_pos < page_mapping[0].offset) {
+ match_page = page_mapping[0].pageno;
+ if (searchinfo->to_pos > page_mapping[0].offset) {
+ match_wrapped = True;
+ }
+ }
+ else {
+ if (searchinfo->from_pos >= page_mapping[1].offset) {
+ XDVI_ERROR((stderr, "to_pos (%d) should be smaller than page_mapping[1].offset (%d)!",
+ searchinfo->from_pos, page_mapping[1].offset));
+ }
+ ASSERT(searchinfo->from_pos < page_mapping[1].offset, "to_pos should be smaller than page_mapping[1].offset!");
+ match_page = page_mapping[1].pageno;
+ if (searchinfo->to_pos > page_mapping[1].offset) {
+ match_wrapped = True;
+ }
+ }
+ if (!settings->isearchterm) {
+ if (match_wrapped)
+ statusline_info(STATUS_MEDIUM, "Match from page %d to %d", match_page + 1, match_page + 2);
+ else
+ statusline_info(STATUS_MEDIUM, "Match on page %d", match_page + 1);
+
+ if (settings->wrapcnt > 0)
+ statusline_append(STATUS_MEDIUM, " (wrapped)", " (wrapped)");
+ }
+ if (globals.debug & DBG_FIND) {
+ fprintf(stderr, "*** match_page: %d, adding: %d\n", match_page, searchinfo->page_offset);
+
+ for (j = searchinfo->from_pos - context; j < searchinfo->from_pos; j++) {
+ if (j >= 0)
+ fputc(w_info->txt_buf[j], stderr);
+ else
+ fputc(' ', stderr);
+ }
+ fputs("\n >>", stderr);
+ for (j = searchinfo->from_pos; j < searchinfo->to_pos; j++) {
+ fputc(w_info->txt_buf[j], stderr);
+ }
+ fputs("<<\n ", stderr);
+ for (j = searchinfo->from_pos; j < searchinfo->to_pos; j++) {
+ fputc(' ', stderr);
+ }
+ for (j = searchinfo->to_pos; j < (int)w_info->curr_buf_idx; j++) {
+ fputc(w_info->txt_buf[j], stderr);
+ if (w_info->txt_buf[j] == '\n')
+ break;
+ }
+ fputc('\n', stderr);
+ }
+
+ if (match_page != current_page) {
+ goto_page(match_page, resource.keep_flag ? NULL : home, False);
+ page_history_insert(match_page);
+ /* globals.ev.flags |= EV_NEWPAGE; */
+ }
+ /* don't raise the window - this can obscure the search popup */
+ /* XMapRaised(DISP, XtWindow(globals.widgets.top_level)); */
+
+ /* this erases contents of m_info, so be careful - contents of curr_info
+ will be indirectly erased by this ... */
+ erase_match_highlighting(m_info, True);
+
+ /* now rescan the page to get bounding box info for the match */
+ scan_page(globals.dvi_file.bak_fp, match_page, &curr_info);
+ m_info = &curr_info;
+
+ m_match_page = match_page;
+
+ do_autoscroll = True; /* enable scrolling to match */
+ /* create an expose event so that the region gets highlighted */
+ if (m_info != NULL) {
+ generate_highlight_expose(m_info);
+ }
+}
+
+#if HAVE_REGEX_H
+
+/*
+ * A mapping of Perl-style character classes to POSIX-style character classes.
+ */
+static struct perl2posix_mapping {
+ const char *perl_class;
+ const char *posix_class;
+} perl2posix_map[] = {
+ { "\\w", "[[:alnum:]]" },
+ { "\\W", "[^[:alnum:]]" },
+ { "\\d", "[[:digit:]]" },
+ { "\\D", "[^[:digit:]]" },
+ { "\\s", "[[:space:]]" },
+ { "\\S", "[^[:space:]]" },
+ { NULL, NULL } /* terminate */
+};
+
+/*
+ * Convert `perl_regex', a regexp using Perl-style character classes,
+ * to a regexp using POSIX-style character classes. Return the latter
+ * in freshly allocated memory, which the caller is responsible to free().
+ * Uses the perl2posix_map table.
+ */
+static char *
+perl2posix(const char *perl_regex)
+{
+ char *posix_regex = xstrdup(perl_regex);
+ size_t i;
+
+ for (i = 0; perl2posix_map[i].perl_class != NULL; i++) {
+ const char *ptr;
+ size_t offset = 0;
+ TRACE_FIND((stderr, "searching for |%s| at offset %lu", perl2posix_map[i].perl_class, (unsigned long)offset));
+ while ((ptr = find_format_str(posix_regex + offset, perl2posix_map[i].perl_class)) != NULL) {
+ size_t len1 = ptr - posix_regex; /* length up to match */
+ size_t len2 = strlen(perl2posix_map[i].posix_class);
+ TRACE_FIND((stderr, "Regexp: mapping %s to %s",
+ perl2posix_map[i].perl_class,
+ perl2posix_map[i].posix_class));
+ /* -1 since -2 for perl format string, +1 for trailing '\0' */
+ posix_regex = xrealloc(posix_regex, strlen(posix_regex) + len2 - 1);
+ /* make space for new format string */
+ memmove(posix_regex + len1 + len2, posix_regex + len1 + 2, strlen(posix_regex + len1 + 2) + 1);
+ /* copy in new format string */
+ memcpy(posix_regex + len1, perl2posix_map[i].posix_class, len2);
+ TRACE_FIND((stderr, "Expanded regex: |%s|", posix_regex));
+ offset = len1 + len2;
+ TRACE_FIND((stderr, "searching again for |%s| at offset %lu",
+ perl2posix_map[i].perl_class,
+ (unsigned long)offset));
+ }
+ }
+ return posix_regex;
+}
+
+#endif /* HAVE_REGEX_H */
+
+char *
+get_text_selection(int *len, int ulx, int uly, int lrx, int lry)
+{
+ struct word_info txt_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, True };
+ struct bbox text_bbox;
+
+ text_bbox.ulx = ulx;
+ text_bbox.uly = uly;
+ text_bbox.lrx = lrx;
+ text_bbox.lry = lry;
+
+ txt_info.bboxes = &text_bbox;
+
+ /* initialize buffer with empty string */
+ txt_info.txt_buf_size = 1;
+ txt_info.txt_buf = xmalloc(txt_info.txt_buf_size);
+ txt_info.txt_buf[0] = '\0';
+
+ /* this enlarges the buffer as needed */
+ scan_page(globals.dvi_file.bak_fp, current_page, &txt_info);
+
+ *len = txt_info.txt_buf_size;
+ return txt_info.txt_buf;
+
+#if 0
+ /* fprintf(stderr, "========== SELECTION (len %d):\n", txt_info.curr_buf_idx); */
+ /* dump_buffer(&txt_info, 0, stderr, FMT_ISO_8859_1); */
+ /* fprintf(stderr, "==========\n"); */
+
+ buf = xmalloc(4 * txt_info.curr_buf_idx + 1); /* just in case we get many non-printables */
+ while (i < txt_info.curr_buf_idx) {
+ uint32_t ucs4;
+ const char *ret;
+
+ /* first apply normalization heurisitcs also used by search */
+ size_t len = utf8_to_ucs4(txt_info.txt_buf + i, &ucs4, strlen(txt_info.txt_buf + i));
+ if ((ret = search_normalize_chars(ucs4)) != NULL) {
+ size_t len_ret = strlen(ret);
+ memcpy(buf + offset, ret, len_ret);
+ offset += len_ret;
+ }
+ else if (ucs4 <= 0xff) { /* in iso-latin1 range */
+ buf[offset++] = (unsigned char)ucs4;
+ }
+ else {
+ sprintf(buf + offset, "\\%.4lX", ucs4);
+ offset += 4;
+ }
+ i += len;
+ }
+ buf[offset] = '\0';
+ free(txt_info.txt_buf);
+ return buf;
+#endif /* 0 */
+}
+
+Boolean
+search_extract_text(struct save_or_print_info *info)
+{
+ int i;
+ FILE *fp;
+
+ if ((fp = XFOPEN(info->finfo->out_file, "wb")) == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ NULL, "Could not open %s for writing: %s.",
+ info->finfo->out_file,
+ strerror(errno));
+ return False;
+ }
+
+ for (i = 0; i < total_pages; i++) {
+ if (info->pinfo->callback == NULL || info->pinfo->callback(info, i)) {
+ struct word_info txt_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, False };
+ scan_page(globals.dvi_file.bak_fp, i, &txt_info);
+
+ dump_buffer(&txt_info, 0, fp, info->fmt);
+
+ free(txt_info.txt_buf);
+
+ fputs("\n\n", fp); /* two newlines for page breaks */
+ }
+ }
+
+ fclose(fp);
+ return True;
+}
+
+void
+search_erase_highlighting(Boolean reset)
+{
+ erase_match_highlighting(m_info, reset);
+}
+
+static void
+message_search_ended(XtPointer arg)
+{
+ struct search_settings *settings = (struct search_settings *)arg;
+
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos = -1;
+ TRACE_FIND((stderr, "search ended; current_page: %d", current_page));
+ settings->from_page = current_page;
+ search_signal_page_changed();
+ settings->message_window = 0;
+ /* statusline_append(STATUS_SHORT, " stopped."); */
+ if (!settings->isearchterm)
+ statusline_info(STATUS_SHORT, "Search stopped.");
+}
+
+
+void
+search_restart(XtPointer arg)
+{
+ struct search_settings *settings = (struct search_settings *)arg;
+ Widget popup, textfield;
+ char *searchterm = NULL;
+ char *textfield_name = NULL;
+
+ TRACE_FIND((stderr, "restart search!"));
+
+ /* Update the search term (user might have changed it before
+ hitting `Return' to restart the search). We need to start
+ from the toplevel widget since this method may be called
+ from a different window (e.g. confirmation popup).
+ */
+#if defined(MOTIF) && USE_COMBOBOX
+ textfield_name = "Text";
+#else
+ textfield_name = Xdvi_SEARCHBOX_INPUT_NAME;
+#endif /* defined(MOTIF) && USE_COMBOBOX */
+ if (!settings->isearchterm
+ && get_widget_by_name(&popup, globals.widgets.top_level, Xdvi_SEARCH_POPUP_NAME, True)
+ && get_widget_by_name(&textfield, popup, textfield_name, True)) {
+ XtVaGetValues(textfield,
+#ifdef MOTIF
+ XmNvalue,
+#else
+ XtNstring,
+#endif
+ &searchterm, NULL);
+ if (searchterm == NULL) {
+ XDVI_WARNING((stderr, "Got NULL searchterm in search_restart()!"));
+ return;
+ }
+ settings->term = searchterm;
+ }
+
+ if (settings->direction == SEARCH_DOWN) {
+ settings->from_page = 0;
+ }
+ else {
+ settings->from_page = total_pages - 1;
+ }
+ if (settings->direction == SEARCH_DOWN)
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos = -1;
+ else
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos = INT_MAX;
+
+ settings->message_window = 0;
+ search_signal_page_changed();
+ search_dvi((XtPointer)settings);
+}
+
+static void
+normalize_newline(char *str)
+{
+ size_t i, j;
+ for (i = 0, j = 0; str[i] != '\0'; i++, j++) {
+ if (str[i] == '\\' && str[i + 1] == 'n') {
+ if (i > 0 && str[i - 1] == '\\') {
+ str[j] = 'n';
+ i++;
+ }
+ else {
+ str[j] = '\n';
+ i++;
+ }
+ }
+ else {
+ str[j] = str[i];
+ }
+ }
+ str[j] = str[i]; /* copy terminating '\0' */
+}
+
+
+static Boolean
+reinit_searchterm(struct search_settings *settings, const char *encoding)
+{
+ struct search_info *searchinfo = settings->searchinfo;
+
+ free(settings->utf8_term);
+ settings->utf8_term = NULL;
+
+ if (memicmp(encoding, "iso-8859-1", strlen("iso-8859-1")) == 0
+ || memicmp(encoding, "iso8859-1", strlen("iso8859-1")) == 0) {
+ int conv_len = (strlen(settings->term) + 1) * 2;
+ int ret_len;
+ char *ptr = xmalloc(conv_len);
+ if ((ret_len = str_iso_8859_1_to_utf8(settings->term, ptr, conv_len)) < 0) {
+ xdvi_bell();
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ NULL,
+ "Shouldn't happen: search term `%s' is too long (> %d)", settings->term, conv_len);
+ searchinfo->locked = False;
+ free(ptr);
+ settings->utf8_term = xstrdup("");
+ return False;
+ }
+ settings->utf8_term = ptr;
+ }
+ else if (memicmp(encoding, "utf-8", strlen("utf-8")) == 0
+ || memicmp(encoding, "utf8", strlen("utf8")) == 0) {
+ settings->utf8_term = xstrdup(settings->term);
+ }
+ else {
+ if ((settings->utf8_term = iconv_convert_string(encoding, "utf-8", settings->term)) == NULL) {
+ return False;
+ }
+ }
+
+ TRACE_FIND((stderr, "UTF-8 search term: |%s|", settings->utf8_term));
+ normalize_newline(settings->utf8_term);
+ TRACE_FIND((stderr, "UTF-8 search term after normalizing newline: |%s|", settings->utf8_term));
+
+#if 0
+ /* lowercasing for regexps is dealt with by REG_ICASE */
+ if (!settings->case_sensitive && !settings->use_regexp) {
+ if (!utf8_lowercase(settings->utf8_term))
+ return False;
+ TRACE_FIND((stderr, "Lowercased UTF-8 search term: |%s|", settings->utf8_term));
+ }
+#else /* always lowercase, since REG_ICASE is broken with UTF-8(?) */
+ if (!settings->case_sensitive && !utf8_lowercase(settings->utf8_term))
+ return False;
+ TRACE_FIND((stderr, "Lowercased UTF-8 search term: |%s|", settings->utf8_term));
+#endif /* 1 */
+
+ /* remove spaces/newlines before/after an ideographic char */
+ {
+ unsigned char *p = (unsigned char *)settings->utf8_term;
+ unsigned char *q;
+ int l, len = strlen((char *)p);
+ uint32_t ucs4;
+ Boolean had_ideograph;
+
+ had_ideograph = False;
+ while (len > 0) {
+ if (*p == ' ' || *p == '\n') {
+ q = p + 1;
+ while (*q == ' ' || *q == '\n')
+ q++;
+ len -= q - p;
+ if (had_ideograph || is_utf8_ideograph(q))
+ memmove(p, q, len + 1); /* remove spaces/newlines */
+ else
+ p = q; /* preserve spaces/newlines */
+ }
+ else {
+ if ((l = utf8_to_ucs4((char *)p, &ucs4, len)) <= 0)
+ break;
+ len -= l;
+ had_ideograph = is_ideograph(ucs4);
+ p += l;
+ }
+ }
+
+ settings->utf8_term = xrealloc(settings->utf8_term, strlen(settings->utf8_term) + 1);
+ }
+
+ return True;
+}
+
+void
+search_reset_info(void)
+{
+ TRACE_FIND((stderr, "resetting info!"));
+ reset_info(m_info);
+ m_info = NULL;
+}
+
+
+#if HAVE_REGEX_H
+static Boolean
+do_recompile_regexp(struct search_settings *settings,
+ regex_t *regex)
+{
+ int re_retval;
+ /* use extended POSIX, and make `.' not match newlines (otherwise it's
+ often too unintuitive because of the greediness of '+'/'*' */
+ int re_flags = REG_EXTENDED | REG_NEWLINE;
+ TRACE_FIND((stderr, "compiling regexp ..."));
+
+ if (settings->posix_term != NULL) {
+ TRACE_FIND((stderr, "freeing old regexp ..."));
+ free(settings->posix_term);
+ regfree(regex);
+ }
+ settings->posix_term = perl2posix(settings->utf8_term);
+
+#if 0 /* this is broken with e.g. german umlauts; maybe it can't deal with UTF-8 encoding? */
+ /* compile regexp from search term */
+ if (!settings->case_sensitive)
+ re_flags |= REG_ICASE;
+#endif
+
+ { /* change the encoding part of the locale to UTF-8 to match encoding
+ of the search string and the search buffer */
+#if SWITCH_TO_UTF8
+ char *utf8_locale = locale_to_utf8(globals.orig_locale);
+ TRACE_FIND((stderr, "current locale: |%s|, utf8 version: |%s|", globals.orig_locale, utf8_locale));
+ setlocale(LC_ALL, utf8_locale);
+#endif
+ re_retval = regcomp(regex, settings->posix_term, re_flags);
+#if SWITCH_TO_UTF8
+ setlocale(LC_ALL, globals.orig_locale);
+ setlocale(LC_NUMERIC, "C");
+ free(utf8_locale);
+#endif
+ }
+
+ if (re_retval != 0) {
+ report_regexp_error(re_retval, regex, settings->term, 0);
+ settings->searchinfo->locked = False;
+ return False;
+ }
+
+ return True;
+}
+
+#else /* HAVE_REGEX_H */
+
+static void
+warn_no_regex(void)
+{
+ xdvi_bell();
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_WARN,
+ NULL,
+ "POSIX regular expression support (regex.h) is not available on this platform; "
+ "using ordinary string matching instead.");
+}
+#endif /* HAVE_REGEX_H */
+
+/*
+ Scan at most two adjacent pages, writing results in to page_mapping.
+ Return False if user cancelled the search, True else.
+*/
+static Boolean
+scan_two_pages(struct search_settings *settings,
+ struct word_info *info,
+ struct page_mapping *page_mapping,
+ int curr_page)
+{
+ Boolean cancelled = False;
+ struct search_info *searchinfo = settings->searchinfo;
+
+ if (curr_page != page_mapping[0].pageno
+ && curr_page != page_mapping[1].pageno) { /* none of 2 pages scanned yet */
+ reset_info(info);
+ if (settings->direction == SEARCH_DOWN) {
+ if (!do_scan_page(info, settings, &(page_mapping[0]),
+ 0, curr_page, settings->direction)
+ || (curr_page + 1 < total_pages &&
+ !do_scan_page(info, settings, &(page_mapping[1]),
+ page_mapping[0].offset, curr_page + 1, settings->direction)))
+ cancelled = True;
+ }
+ else {
+ if (!do_scan_page(info, settings, &(page_mapping[1]),
+ 0, curr_page, settings->direction)
+ || (curr_page > 0 &&
+ !do_scan_page(info, settings, &(page_mapping[0]),
+ page_mapping[1].offset, curr_page - 1, settings->direction)))
+ cancelled = True;
+ else if (page_mapping[0].offset != -1) {
+ page_mapping[1].offset += page_mapping[0].offset;
+ if (searchinfo->from_pos != INT_MAX)
+ searchinfo->from_pos += page_mapping[0].offset;
+ }
+ }
+ }
+ else if (curr_page != page_mapping[0].pageno) { /* current page scanned as page_mapping[1] */
+ if (settings->direction == SEARCH_DOWN && curr_page + 1 < total_pages) {
+ shift_info_down(searchinfo, info, page_mapping);
+ if (!do_scan_page(info, settings, &(page_mapping[1]),
+ page_mapping[0].offset, curr_page + 1, settings->direction))
+ cancelled = True;
+ }
+ else if (curr_page - 1 != page_mapping[0].pageno && curr_page > 0) {
+ if (!do_scan_page(info, settings, &(page_mapping[0]),
+ 0, curr_page - 1, settings->direction))
+ cancelled = True;
+ else {
+ page_mapping[1].offset += page_mapping[0].offset;
+ if (searchinfo->from_pos != INT_MAX)
+ searchinfo->from_pos += page_mapping[0].offset;
+ }
+ }
+ }
+ else if (curr_page != page_mapping[1].pageno) { /* current page scanned as page_mapping[0] */
+ if (settings->direction == SEARCH_UP && curr_page > 0) {
+ shift_info_up(info, page_mapping);
+ if (!do_scan_page(info, settings, &(page_mapping[0]),
+ 0, curr_page - 1, settings->direction))
+ cancelled = True;
+ else {
+ page_mapping[1].offset += page_mapping[0].offset;
+ if (searchinfo->from_pos != INT_MAX) {
+ searchinfo->from_pos += page_mapping[0].offset;
+ searchinfo->to_pos += page_mapping[0].offset;
+ }
+ TRACE_FIND((stderr, "new offsets: from=%d, to=%d", searchinfo->from_pos, searchinfo->to_pos));
+ }
+ }
+ else if (curr_page + 1 != page_mapping[1].pageno && curr_page + 1 < total_pages) {
+ if (!do_scan_page(info, settings, &(page_mapping[1]),
+ page_mapping[0].offset, curr_page + 1, settings->direction))
+ cancelled = True;
+ }
+ }
+
+ return !cancelled;
+}
+
+static void
+search_over_pages(struct search_settings *settings,
+ struct page_mapping *page_mapping,
+ struct word_info *w_info,
+ int *from_pos_bak,
+ Boolean adjust_hyphen_offset
+#if HAVE_REGEX_H
+ , regex_t *regex
+#endif
+ )
+{
+ int curr_page = settings->from_page; /* page on which we're currently on */
+
+ for (;;) { /* scan pages, try to match */
+ if (settings->isearchterm) {
+ const char *prefix = "";
+ if (settings->wrapcnt > 0)
+ prefix = "Wrapped ";
+ statusline_info(STATUS_FOREVER, "%sI-search (ESC to exit): %s", prefix, settings->isearchterm);
+ }
+ else {
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */
+ statusline_info(STATUS_MEDIUM, "Searching on page %d", curr_page);
+ }
+ TRACE_FIND((stderr, "curr_page: %d, pageno 0: %d, pageno1: %d",
+ curr_page, page_mapping[0].pageno, page_mapping[1].pageno));
+
+ settings->hyphen_delta = 0;
+ /* scan_two_pages will return False if user cancelled */
+ if (!scan_two_pages(settings, w_info, page_mapping, curr_page)
+ || (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL)) {
+ if (!settings->isearchterm) {
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) /* too distracting for stdout */
+ statusline_append(STATUS_SHORT,
+ "- cancelled.",
+ "- cancelled.");
+ }
+ settings->searchinfo->locked = False;
+ return;
+
+ }
+
+ TRACE_FIND((stderr, "page mapping:\n%d: %d\n%d: %d",
+ page_mapping[0].pageno, page_mapping[0].offset,
+ page_mapping[1].pageno, page_mapping[1].offset));
+
+ /* dump_buffer(w_info, 0, stderr, FMT_ISO_8859_1); */
+
+ /* If ignore_hyphens has changed (in which case adjust_hyphen_offset
+ is true), the buffer will contain settings->hyphen_delta fewer
+ or more characters than in the previous pass due to the removal
+ or addition of hyphens; adjust from_pos and to_pos accordingly:
+ */
+ if (adjust_hyphen_offset) {
+ TRACE_FIND((stderr, "adjusting offset by %d", settings->hyphen_delta));
+ if (settings->ignore_hyphens) { /* fewer characters */
+ settings->searchinfo->from_pos -= settings->hyphen_delta;
+ settings->searchinfo->to_pos -= settings->hyphen_delta;
+ }
+ else { /* more characters */
+ settings->searchinfo->from_pos += settings->hyphen_delta;
+ settings->searchinfo->to_pos += settings->hyphen_delta;
+ }
+ TRACE_FIND((stderr, "NEW from_pos: %d; to_pos: %d",
+ settings->searchinfo->from_pos, settings->searchinfo->to_pos));
+ }
+
+
+ /* match the searchstring */
+#if HAVE_REGEX_H
+ if (settings->use_regexp) {
+ if (!try_regexp_match(regex, w_info, settings)) /* regexp error */
+ return;
+
+ }
+ else {
+#endif
+ try_match(w_info, settings);
+#if HAVE_REGEX_H
+ }
+#endif
+
+ /* again, check if user cancelled */
+ if (read_events(EV_NOWAIT) & EV_GE_FIND_CANCEL) { /* user cancelled */
+ if (!settings->isearchterm)
+ statusline_append(STATUS_SHORT,
+ "- cancelled.",
+ "- cancelled.");
+ settings->searchinfo->locked = False;
+ return;
+
+ }
+
+ if (settings->searchinfo->have_match) { /* match, highlight it */
+ highlight_match(settings, w_info, page_mapping);
+ settings->searchinfo->locked = False;
+ if (settings->direction == SEARCH_DOWN && !settings->isearchterm) {
+ *from_pos_bak = settings->searchinfo->from_pos;
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos;
+ }
+ break;
+ }
+ else if ((settings->direction == SEARCH_DOWN && curr_page + 1 < total_pages)
+ || (settings->direction == SEARCH_UP && curr_page > 0)) {
+ if (settings->direction == SEARCH_DOWN)
+ curr_page++;
+ else
+ curr_page--;
+ TRACE_FIND((stderr, "continuing on page %d", curr_page));
+ erase_match_highlighting(m_info, True);
+ /* no match, and we have more pages; continue scanning */
+ continue;
+ }
+ else { /* reached end of file */
+ Widget find_popup;
+
+ if (settings->isearchterm) {
+ const char *prefix = "Failed";
+ fprintf(stderr, "reached end with wrapcnt: %d\n", settings->wrapcnt);
+ if (settings->wrapcnt > 0)
+ prefix = "Failed wrapped";
+ xdvi_bell();
+ statusline_info(STATUS_FOREVER, "%s I-search (ESC to exit, RET to restart): %s", prefix, settings->term);
+ settings->searchinfo->locked = False;
+ erase_match_highlighting(m_info, True);
+ settings->wrapcnt++;
+ return;
+ }
+
+ if (settings->wrap) {
+ if (settings->wrapcnt > 0) {
+ positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_INFO,
+ settings->x_pos, settings->y_pos,
+ NULL, "Pattern `%s' not found.", settings->term);
+ /* positioned_choice_dialog(XtNameToWidget(globals.widgets.top_level, "*find_popup"), */
+ /* MSG_INFO, */
+ /* settings->x_pos, settings->y_pos, */
+ /* NULL, */
+ /* #ifndef MOTIF */
+ /* NULL, */
+ /* #endif */
+ /* NULL, NULL, /\* pre callback *\/ */
+ /* "OK", message_search_ended, (XtPointer)settings, */
+ /* NULL, NULL, NULL, */
+ /* "Pattern `%s' not found.", settings->term); */
+ settings->searchinfo->locked = False;
+ message_search_ended((XtPointer)settings);
+ return;
+ }
+ settings->wrapcnt++;
+ erase_match_highlighting(m_info, True);
+ settings->searchinfo->locked = False;
+ search_restart((XtPointer)settings);
+ return;
+ }
+
+ if ((find_popup = XtNameToWidget(globals.widgets.top_level, "*find_popup")) == 0) {
+ XDVI_WARNING((stderr, "Couldn't find \"find_popup\" widget!"));
+ find_popup = globals.widgets.top_level;
+ }
+
+ if (!settings->isearchterm)
+ statusline_append(STATUS_MEDIUM,
+ "... searched to end of file.",
+ "... searched to end of file.");
+ erase_match_highlighting(m_info, True);
+ settings->searchinfo->locked = False;
+
+ settings->message_window =
+ positioned_choice_dialog(find_popup,
+ MSG_QUESTION,
+ settings->x_pos, settings->y_pos,
+ NULL,
+#ifndef MOTIF
+ "do-search-restart",
+#endif
+ NULL, NULL, /* no pre_callbacks */
+ "Yes", search_restart, (XtPointer)settings,
+ "Cancel", message_search_ended, (XtPointer)settings,
+ "Searched %s of file without finding the pattern.\n"
+ "Start again from the %s of the file?",
+ settings->direction == SEARCH_DOWN
+ ? "to end" : "to beginning",
+ settings->direction == SEARCH_DOWN
+ ? "beginning" : "end");
+ TRACE_GUI((stderr, "message_window: %p\n", (void *)settings->message_window));
+ /* notreached */
+ break;
+ }
+ } /* for(;;) */
+}
+
+void
+search_dvi(XtPointer arg)
+{
+ struct search_settings *settings = (struct search_settings *)arg;
+ struct search_info *searchinfo = settings->searchinfo;
+
+#if HAVE_REGEX_H
+ static regex_t regex;
+#endif /* HAVE_REGEX_H */
+
+ /* a mapping of page numbers to index positions in w_info->txt_buf,
+ for the 2 pages that we scanned */
+ static struct page_mapping page_mapping[2] = { { -1, -1 }, { -1, -1 } };
+
+ static struct word_info w_info = { NULL, 0, 0, NULL, 0, 0, NULL, NULL, 0, False, False, False };
+
+ static time_t dvi_time_bak = 0;
+ static char *searchterm_bak = NULL;
+
+ static const char *text_encoding = NULL;
+
+ static Boolean case_sensitive_bak = False;
+ static Boolean ignore_hyphens_bak = False;
+ static Boolean ignore_linebreaks_bak = False;
+ static searchDirectionT direction_bak = SEARCH_UNINITIALIZED;
+ /* from_pos_bak is needed to mark the start of the match when switching from
+ search down to search backwards, where we want to jump to the previous match,
+ so we need the start of the current match again (and down search sets
+ searchinfo->from_pos = searchinfo->to_pos) */
+ static int from_pos_bak = -1;
+ /* int curr_page; */
+
+ Boolean reinit = False;
+ Boolean recompile_regexp = False;
+ Boolean adjust_hyphen_offset = False;
+
+ /* prevent multiple invocations while still busy searching */
+ if (searchinfo->locked) {
+ TRACE_FIND((stderr, "LOCKED"));
+ return;
+ }
+ searchinfo->locked = True;
+
+ if (dvi_time_bak == 0) { /* first invocation */
+ case_sensitive_bak = settings->case_sensitive;
+ ignore_hyphens_bak = settings->ignore_hyphens;
+ ignore_linebreaks_bak = settings->ignore_linebreaks;
+ dvi_time_bak = globals.dvi_file.time;
+ }
+ if (globals.dvi_file.time > dvi_time_bak) {
+ dvi_time_bak = globals.dvi_file.time;
+ reinit = True;
+ }
+
+ m_match_page = -1;
+
+ if (raise_message_windows()) { /* any popups user still needs to deal with? */
+ TRACE_GUI((stderr, "Still open message windows to deal with, returning ..."));
+ searchinfo->locked = False;
+ return;
+ }
+
+ ASSERT(settings->term != NULL, "settings->term mustn't be NULL!");
+ if (strlen(settings->term) == 0) {
+ if (settings->isearchterm) {
+ settings->searchinfo->locked = False;
+ return;
+ }
+
+ positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ settings->x_pos, settings->y_pos,
+ NULL, "Empty search term");
+ searchinfo->locked = False;
+ return;
+ }
+
+ TRACE_FIND((stderr, "dvi_search: Searching for |%s| from page %d", settings->term, settings->from_page));
+ TRACE_FIND((stderr, " settings: down = %d, re = %d, case = %d",
+ settings->direction, settings->use_regexp, settings->case_sensitive));
+
+ if (m_changed_page) {
+ m_changed_page = False;
+ reinit = True;
+ }
+
+ /* initialize text_encoding */
+ if (text_encoding == NULL) {
+ text_encoding = get_text_encoding();
+ }
+
+ /* first call to this routine, or search term changed:
+ Re-initialize the utf-8 representation and the regexp */
+ if (settings->utf8_term == NULL
+ || searchterm_bak == NULL
+ || strcmp(settings->term, searchterm_bak) != 0) {
+
+ if (!reinit_searchterm(settings, text_encoding)) {
+ searchinfo->locked = False;
+ return;
+ }
+
+ free(searchterm_bak);
+ searchterm_bak = xstrdup(settings->term);
+ recompile_regexp = True;
+ }
+
+ if (strlen(settings->utf8_term) == 0) {
+ positioned_popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_WARN,
+ settings->x_pos, settings->y_pos,
+ NULL, "Search term is empty after UTF-8 conversion!");
+ searchinfo->locked = False;
+ return;
+ }
+
+ if (direction_bak != settings->direction && direction_bak != SEARCH_UNINITIALIZED
+ && searchinfo->from_pos != INT_MAX && searchinfo->from_pos != -1) {
+ TRACE_FIND((stderr, "changed direction! from_pos: %d", searchinfo->from_pos));
+ if (settings->direction == SEARCH_DOWN) {
+ searchinfo->from_pos = searchinfo->to_pos;
+ TRACE_FIND((stderr, "DOWN; new from_pos: %d", searchinfo->from_pos));
+ }
+ else if (settings->direction == SEARCH_UP) {
+ if (from_pos_bak != -1) {
+ searchinfo->from_pos = from_pos_bak;
+ }
+ else {
+ searchinfo->from_pos = 0;
+ }
+ TRACE_FIND((stderr, "UP; new from_pos: %d", searchinfo->from_pos));
+ }
+ }
+ direction_bak = settings->direction;
+
+ /* If one of the settings for case, hyphens ore linebreaks has
+ * changed, we need to rescan the page to undo lowercasing,
+ * hyphenation or linebreak removal in w_info, but preserve
+ * searchinfo->from_pos since user will want to find next match.
+ */
+ if (case_sensitive_bak != settings->case_sensitive
+ || ignore_hyphens_bak != settings->ignore_hyphens
+ || ignore_linebreaks_bak != settings->ignore_linebreaks) {
+
+ if (ignore_hyphens_bak != settings->ignore_hyphens)
+ adjust_hyphen_offset = True;
+ case_sensitive_bak = settings->case_sensitive;
+ ignore_hyphens_bak = settings->ignore_hyphens;
+ ignore_linebreaks_bak = settings->ignore_linebreaks;
+
+ reset_info(&w_info);
+
+ /* adjust from_pos if it's on second page (we'll rescan it as first page) */
+ if (searchinfo->from_pos >= page_mapping[0].offset)
+ searchinfo->from_pos -= page_mapping[0].offset;
+
+ TRACE_FIND((stderr, "from_pos: %d", searchinfo->from_pos));
+ page_mapping[0].offset = page_mapping[1].offset = page_mapping[0].pageno = page_mapping[1].pageno = -1;
+ /* also need to recompile regexp, and undo lowercasing of search term */
+ if (!reinit_searchterm(settings, text_encoding))
+ return;
+ recompile_regexp = True;
+ }
+
+ if (reinit) { /* file changed, or on different page: re-initialize scan info */
+ TRACE_FIND((stderr, "re-initializing scan info!"));
+ page_mapping[0].offset = page_mapping[1].offset = page_mapping[0].pageno = page_mapping[1].pageno = -1;
+
+ /* re-initialize info */
+ reset_info(&w_info);
+ if (settings->direction == SEARCH_DOWN)
+ searchinfo->from_pos = searchinfo->to_pos = 0;
+ else
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos = INT_MAX;
+ }
+
+ TRACE_FIND((stderr, "from_pos initialized with: %d", settings->searchinfo->from_pos));
+
+ if (settings->use_regexp && recompile_regexp) {
+#if HAVE_REGEX_H
+ if (!do_recompile_regexp(settings, &regex))
+ return;
+#else
+ warn_no_regex();
+#endif /* HAVE_REGEX_H */
+ }
+
+ /* do it */
+ search_over_pages(settings, page_mapping, &w_info, &from_pos_bak, adjust_hyphen_offset
+#if HAVE_REGEX_H
+ , &regex
+#endif
+ );
+}
+
+static void cb_isearch(Widget w, XtPointer closure, XEvent *event, Boolean *cont);
+
+static void
+do_isearch_cancel(struct search_settings *settings)
+{
+ static const char default_key_translations[] =
+ "\"0\":digit(0)\n"
+ "\"1\":digit(1)\n"
+ "\"2\":digit(2)\n"
+ "\"3\":digit(3)\n"
+ "\"4\":digit(4)\n"
+ "\"5\":digit(5)\n"
+ "\"6\":digit(6)\n"
+ "\"7\":digit(7)\n"
+ "\"8\":digit(8)\n"
+ "\"9\":digit(9)\n"
+ /* "\"-\":minus()\n" */
+ "<Motion>:motion()\n";
+
+ static const char default_mouse_translations[] =
+ "<BtnUp>:release()";
+
+
+ statusline_info(STATUS_SHORT, "I-search stopped.");
+
+ free(settings->isearchterm);
+ settings->isearchterm = NULL;
+ settings->searchinfo->from_pos = settings->searchinfo->to_pos = 0;
+ settings->from_page = current_page;
+ erase_match_highlighting(m_info, True);
+
+
+
+ /* restore translations */
+ XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(base_key_translations));
+ XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(default_key_translations));
+ XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(base_mouse_translations));
+ XtOverrideTranslations(globals.widgets.top_level, XtParseTranslationTable(default_mouse_translations));
+
+ XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(base_key_translations));
+ XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(default_key_translations));
+ XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(base_mouse_translations));
+ XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(default_mouse_translations));
+
+ XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(base_key_translations));
+ XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(default_key_translations));
+ XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(base_mouse_translations));
+ XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(default_mouse_translations));
+
+ if (resource.main_translations != NULL) {
+ XtOverrideTranslations(globals.widgets.draw_widget, XtParseTranslationTable(resource.main_translations));
+ XtOverrideTranslations(globals.widgets.clip_widget, XtParseTranslationTable(resource.main_translations));
+ }
+
+ XtRemoveEventHandler(globals.widgets.top_level, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)settings);
+ XtRemoveEventHandler(globals.widgets.draw_widget, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)settings);
+ XtRemoveEventHandler(globals.widgets.clip_widget, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)settings);
+}
+
+static void
+cb_isearch(Widget w, XtPointer closure, XEvent *event, Boolean *cont)
+{
+ struct search_settings *settings = (struct search_settings *)closure;
+
+ UNUSED(w);
+ UNUSED(cont);
+
+ if (settings->isearchterm == NULL)
+ settings->isearchterm = xstrdup("");
+
+ if (event->type == KeyPress) {
+ char buf[48];
+ KeySym keysym;
+ int count;
+ /* temporarily disable control mask; this gives better results with XLookupString() */
+ const unsigned int save_state = event->xkey.state;
+ /* event->xkey.state &= ~ControlMask; */
+ count = XLookupString(&(event->xkey), buf, 48, &keysym, NULL);
+ event->xkey.state = save_state;
+ if (count > 0) {
+ /* Ctrl-g and Ctrl-f continue isearch and
+ switch to the search window, respectively */
+ if (event->xkey.state & ControlMask) {
+ if (keysym == XK_g) {
+ settings->term = settings->isearchterm;
+ isearch_start(); /* restart search */
+ return;
+ }
+ else if (keysym == XK_f) {
+ static char *str = NULL;
+ if (str != NULL) {
+ free(str);
+ }
+ str = xstrdup(settings->isearchterm);
+ do_isearch_cancel(settings);
+ TRACE_FIND((stderr, "restarting search: %s", str));
+ dvi_find_string(str, False);
+ return;
+ }
+ }
+ if (keysym == XK_Escape) {
+ do_isearch_cancel(settings);
+ return;
+ }
+ if (keysym == XK_BackSpace || keysym == XK_Delete) {
+ size_t len = strlen(settings->isearchterm);
+ if (len > 0) {
+ settings->isearchterm = xrealloc(settings->isearchterm, len);
+ settings->isearchterm[len - 1] = '\0';
+ /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s", settings->posix_term); */
+ }
+ else {
+ xdvi_bell();
+ }
+ }
+ else if (keysym >= XK_Shift_L && keysym <= XK_Hyper_R) {
+ fprintf(stderr, "keysym %ld: Modifier %s\n", keysym, XKeysymToString(keysym));
+ }
+ else if (keysym == XK_Return || keysym == XK_KP_Enter || keysym == XK_Linefeed) { /* TODO */
+ settings->term = settings->isearchterm;
+ isearch_start(); /* restart search */
+ return;
+ /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s (next match)", settings->isearchterm); */
+ }
+ else if ((keysym >= XK_KP_Space && keysym <= XK_KP_9)
+ || (keysym >= XK_space && keysym <= XK_asciitilde)
+ || (keysym >= XK_exclamdown && keysym <= XK_ydiaeresis)
+ || (keysym >= XK_F1 && keysym <= XK_F35)) {
+ settings->isearchterm = xstrcat(settings->isearchterm, buf);
+ /* statusline_info(STATUS_FOREVER, "I-search (ESC to exit): %s", settings->posix_term); */
+ }
+ else { /* TODO: abort search? */
+ xdvi_bell();
+ TRACE_FIND((stderr, "keysym %ld: %s is not handled", keysym, XKeysymToString(keysym)));
+ }
+
+ if (settings->isearchterm[0] != '\0') {
+ /* const char *prefix = ""; */
+ /* fprintf(stderr, "cb_isearch called!\n"); */
+ /* if (settings->wrapcnt > 0) */
+ /* prefix = "Wrapped "; */
+ /* statusline_info(STATUS_FOREVER, "%sI-search (ESC to exit): %s", prefix, settings->isearchterm); */
+ settings->from_page = current_page;
+ settings->message_window = 0;
+ /* settings->wrapcnt = 0; */
+ settings->term = settings->isearchterm;
+ search_dvi((XtPointer)settings);
+ }
+ }
+ }
+
+}
+
+#ifdef MOTIF
+#define XTranslations XmNtranslations
+#else
+#define XTranslations XtNtranslations
+#endif
+
+/* static void */
+/* isearch_cancel(Widget w, XEvent *event, String *params, Cardinal *num_params) */
+/* { */
+/* struct search_settings *settings = NULL; */
+/* void *ptr; */
+
+/* UNUSED(w); */
+/* UNUSED(event); */
+
+/* if (*num_params < 1) { */
+/* XDVI_WARNING((stderr, "Wrong argument number (%d) in callback!", *num_params)); */
+/* return; */
+/* } */
+/* sscanf(*params, "%p", &ptr); */
+/* settings = (struct search_settings *)ptr; */
+/* do_isearch_cancel(settings); */
+/* } */
+
+
+/* static XtActionsRec isearch_actions[] = { */
+/* {"CancelIsearch", isearch_cancel }, */
+/* }; */
+
+void isearch_start(void)
+{
+ /* char *ptr = NULL; */
+ XtTranslations empty_trans;
+ static struct search_settings settings = {
+ NULL, NULL, NULL,
+ False, False, False, False,
+ False, 0,
+ NULL, /* isearchterm */
+ SEARCH_DOWN, NULL,
+ 0, 0,
+ 0, 0, 0,
+ 0, NULL
+ };
+ static struct search_info searchinfo = {
+ False, False, False,
+ 0, 0, 0, 0
+ };
+ static int wrapcnt_bak = 0;
+
+ settings.searchinfo = &searchinfo;
+
+ if (settings.isearchterm) { /* already running a search, jump to next match */
+ settings.searchinfo->from_pos = settings.searchinfo->to_pos;
+ if (settings.wrapcnt > wrapcnt_bak) { /* search wrapped */
+ wrapcnt_bak = settings.wrapcnt;
+ search_restart((XtPointer)&settings);
+ }
+ else {
+ wrapcnt_bak = settings.wrapcnt;
+ search_dvi((XtPointer)&settings);
+ }
+ return;
+ }
+
+ settings.wrapcnt = 0;
+
+ /* ptr = get_string_va("<Key>osfCancel:CancelIsearch(%p)", (void *)&settings); */
+ /* empty_trans = XtParseTranslationTable(ptr); */
+ empty_trans = XtParseTranslationTable("");
+ /* free(ptr); */
+ /* XtAddActions(isearch_actions, XtNumber(isearch_actions)); */
+
+ statusline_info(STATUS_FOREVER, "I-search (ESC to exit): ");
+ XtVaSetValues(globals.widgets.top_level, XTranslations, empty_trans, NULL);
+ XtAddEventHandler(globals.widgets.top_level, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)&settings);
+
+ XtVaSetValues(globals.widgets.draw_widget, XTranslations, empty_trans, NULL);
+ XtAddEventHandler(globals.widgets.draw_widget, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)&settings);
+
+ XtVaSetValues(globals.widgets.clip_widget, XTranslations, empty_trans, NULL);
+ XtAddEventHandler(globals.widgets.clip_widget, KeyPressMask|KeyReleaseMask, False,
+ cb_isearch, (XtPointer)&settings);
+}
+
diff --git a/Build/source/texk/xdvik/search-internal.h b/Build/source/texk/xdvik/search-internal.h
new file mode 100644
index 00000000000..725a2754f70
--- /dev/null
+++ b/Build/source/texk/xdvik/search-internal.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2003-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef DVI_SEARCH_H_
+#define DVI_SEARCH_H_
+
+#include "xdvi.h"
+
+#include "search-dialog.h"
+#include "dvisel.h"
+
+/* Widget names that are used in callbacks */
+#define Xdvi_SEARCHBOX_INPUT_NAME "searchbox_input"
+#define Xdvi_SEARCH_POPUP_NAME "find_popup"
+
+/* A sorted dynamic array that maps text buffer (i.e. word)
+ * positions to DVI file offsets.
+ */
+
+struct pos_info {
+ size_t buffer_pos; /* position in text buffer */
+ struct bbox bbox; /* bounding box of this word */
+};
+
+struct page_mapping {
+ int pageno;
+ int offset;
+};
+
+struct word_info {
+ char *txt_buf; /* contains scanned text as whitespace separated strings */
+ size_t txt_buf_size; /* size of above buffer */
+ size_t curr_buf_idx; /* current position in buffer */
+ struct bbox *bboxes; /* dynamic array of position infos */
+ size_t bboxes_size; /* size of above array */
+ size_t bboxes_idx; /* current position in buffer */
+ const struct page_mapping *page_mapping; /* list of page offsets, for bbox_pass */
+ struct search_settings *settings; /* pointer to search settings, for bbox_pass */
+ int buffer_offset; /* offset to start of buffer from text on previous pages */
+ Boolean bbox_pass; /* whether we're scanning for bounding boxes of match */
+ Boolean search_scan_pass; /* whether we're scanning for text in string search */
+ Boolean text_selection_pass; /* whether we're scanning for text selection */
+};
+
+struct save_or_print_info; /* forward declaration */
+
+extern void isearch_start(void);
+extern void search_dvi(XtPointer settings);
+extern void search_restart(XtPointer settings);
+extern Boolean search_extract_text(struct save_or_print_info *info);
+extern Boolean search_have_match(int pageno);
+extern int search_inside_bbox_match(int x, int y);
+extern void search_draw_inverted_regions(void);
+extern void search_signal_page_changed(void);
+extern void search_reset_info(void);
+extern void search_erase_highlighting(Boolean flag);
+extern void search_putback_expose(void);
+extern char *get_text_selection(int *len, int x, int y, int w, int h);
+
+#if 0
+#define TEST_DELAY(s) \
+ do { \
+ TRACE_FIND((stderr, s)); \
+ int i, j; \
+ XSync(DISP, False); \
+ for (i = 0; i < 10000; i++) \
+ for (j = 0; j < 20000; j++); \
+ } while (0)
+#else
+#define TEST_DELAY(s) /* as nothing */
+#endif
+
+#endif /* DVI_SEARCH_H_ */
+
diff --git a/Build/source/texk/xdvik/special.c b/Build/source/texk/xdvik/special.c
new file mode 100644
index 00000000000..e971822179e
--- /dev/null
+++ b/Build/source/texk/xdvik/special.c
@@ -0,0 +1,2892 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2019 Paul Vojta and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+This module is based on prior work as noted below.
+
+\*========================================================================*/
+
+/*
+ * Support drawing routines for TeXsun and TeX
+ *
+ * Copyright, (C) 1987, 1988 Tim Morgan, UC Irvine
+ * Adapted for xdvi by Jeffrey Lee, U. of Toronto
+ *
+ * At the time these routines are called, the values of hh and vv should
+ * have been updated to the upper left corner of the graph (the position
+ * the \special appears at in the dvi file). Then the coordinates in the
+ * graphics commands are in terms of a virtual page with axes oriented the
+ * same as the Imagen and the SUN normally have:
+ *
+ * 0,0
+ * +-----------> +x
+ * |
+ * |
+ * |
+ * \ /
+ * +y
+ *
+ * Angles are measured in the conventional way, from +x towards +y.
+ * Unfortunately, that reverses the meaning of "counterclockwise"
+ * from what it's normally thought of.
+ *
+ * A lot of floating point arithmetic has been converted to integer
+ * arithmetic for speed. In some places, this is kind-of kludgy, but
+ * it's worth it.
+ */
+
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+
+#include <setjmp.h>
+
+#include <ctype.h>
+
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/line.h"
+#include "kpathsea/tex-file.h"
+
+#include "special.h"
+#include "hypertex.h"
+#include "dvi.h"
+#include "message-window.h"
+#include "events.h"
+#include "dvi-init.h"
+#include "dvi-draw.h"
+#include "statusline.h"
+#include "util.h"
+#include "image-magick.h"
+#include "pagesel.h"
+#include "my-snprintf.h"
+#include "string-utils.h"
+
+#if PS
+# ifdef PS_DPS
+# include "psdps.h"
+# endif
+# ifdef PS_NEWS
+# include "psnews.h"
+# endif
+# ifdef PS_GS
+# include "psgs.h"
+# endif
+
+/*
+ Code inside BUG_888087_FIXED improve the appearance of pic specials at magstep 1, but
+ _decreases_ it at other magnifications (bug #888087; see
+ http://sourceforge.net/tracker/index.php?func=detail&aid=888087&group_id=23164&atid=377580)
+ Disabled until this is fixed.
+*/
+#define BUG_888087_FIXED 0
+
+
+/*
+ Flag whether this page contains raw PS material;
+ used to warn user about this:
+*/
+Boolean have_raw_postscript = False;
+
+#endif
+
+
+#if COLOR
+
+/*
+ * Color stack used when scanning. These records stay around, to ease
+ * the burden on xmalloc(). The first entry is a dummy entry, giving
+ * the default foreground color (as modified).
+ */
+
+struct colorframe {
+ struct colorframe *next, *prev;
+ struct rgb color;
+};
+
+static Boolean m_have_papersize_special = False;
+
+void reset_papersize_special(void)
+{
+ m_have_papersize_special = False;
+}
+
+Boolean have_papersize_special(void)
+{
+ return m_have_papersize_special;
+}
+
+static struct colorframe scanstack_head;
+static int scanstack_len;
+static struct colorframe *scanstack_current;
+
+/*
+ * Page stack when displaying. Again, the records stay around once
+ * allocated. Bottom entries in the stack (inherited from previous
+ * pages) are stored in an array instead (see comments in xdvi.h).
+ */
+
+static struct colorframe *rcs_head;
+
+static Boolean parse_color (const char *cp0, const char *cp, struct rgb *rgbp, Boolean generic_ps_flag);
+
+#endif /* COLOR */
+
+
+#ifndef S_IRUSR
+# define S_IRUSR 0400
+#endif
+#ifndef S_IWUSR
+# define S_IWUSR 0200
+#endif
+
+# if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+# endif
+# ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
+# endif
+# ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+# endif
+
+#define MAXPOINTS 300 /* Max points in a path */
+#define MAX_PEN_SIZE 7 /* Max pixels of pen width */
+#define TWOPI (3.14159265359 * 2.0)
+
+extern double floor(double);
+#define rint(x) floor((x) + 0.5)
+
+static int xx[MAXPOINTS], yy[MAXPOINTS]; /* Path in milli-inches */
+static int path_len = 0; /* # points in current path */
+static int pen_size = 1; /* Pixel width of lines drawn */
+
+static Boolean whiten = False;
+static Boolean shade = False;
+static Boolean blacken = False;
+
+Boolean psfig_begun = False;
+
+#define CMD(x, y) ((x) << 8 | (y))
+
+
+/*
+ * X drawing routines
+ */
+
+#define toint(x) ((int) ((x) + 0.5))
+#define xconv(x) (toint(tpic_conv*(x))/currwin.shrinkfactor + PXL_H)
+#define yconv(y) (toint(tpic_conv*(y))/currwin.shrinkfactor + PXL_V)
+
+/*
+ * Draw a line from (fx,fy) to (tx,ty).
+ */
+static void
+line_btw(int fx, int fy, int tx, int ty)
+{
+ int fcx = xconv(fx);
+ int tcx = xconv(tx);
+ int fcy = yconv(fy);
+ int tcy = yconv(ty);
+
+ if ((fcx < globals.win_expose.max_x || tcx < globals.win_expose.max_x) && (fcx >= globals.win_expose.min_x || tcx >= globals.win_expose.min_x) &&
+ (fcy < globals.win_expose.max_y || tcy < globals.win_expose.max_y) && (fcy >= globals.win_expose.min_y || tcy >= globals.win_expose.min_y)) {
+#if COLOR
+ if (fg_active != fg_current)
+ do_color_change();
+#endif
+ XDrawLine(DISP, currwin.win, globals.gc.rule,
+ fcx - currwin.base_x, fcy - currwin.base_y,
+ tcx - currwin.base_x, tcy - currwin.base_y);
+ }
+}
+
+/*
+ * Draw a dot at (x,y)
+ */
+static void
+dot_at(int x, int y)
+{
+ int cx = xconv(x);
+ int cy = yconv(y);
+
+ if (cx < globals.win_expose.max_x && cx >= globals.win_expose.min_x && cy < globals.win_expose.max_y && cy >= globals.win_expose.min_y){
+#if COLOR
+ if (fg_active != fg_current)
+ do_color_change();
+#endif
+ XDrawPoint(DISP, currwin.win, globals.gc.rule,
+ cx - currwin.base_x, cy - currwin.base_y);
+ }
+}
+
+/*
+ * Apply the requested attributes to the last path (box) drawn.
+ * Attributes are reset.
+ * (Not currently implemented.)
+ */
+static void
+do_attribute_path(int last_min_x, int last_max_x, int last_min_y, int last_max_y)
+{
+ UNUSED(last_min_x);
+ UNUSED(last_max_x);
+ UNUSED(last_min_y);
+ UNUSED(last_max_y);
+}
+
+/*
+ * Set the size of the virtual pen used to draw in milli-inches
+ */
+static void
+set_pen_size(char *cp)
+{
+ int ps;
+
+ if (sscanf(cp, " %d ", &ps) != 1) {
+ XDVI_WARNING((stderr, "invalid .ps command format: %s", cp));
+ return;
+ }
+ pen_size = (2 * ps * resource.pixels_per_inch / currwin.shrinkfactor + 1000) / 2000;
+ if (pen_size < 1)
+ pen_size = 1;
+ else if (pen_size > MAX_PEN_SIZE)
+ pen_size = MAX_PEN_SIZE;
+
+#if BUG_888087_FIXED
+ if (globals.gc.rule) {
+ XGCValues values;
+ values.line_width = pen_size;
+ XChangeGC(DISP, globals.gc.rule, GCLineWidth, &values);
+ }
+#endif
+}
+
+
+/*
+ * Print the line defined by previous path commands
+ */
+
+static void
+flush_path(void)
+{
+ int i;
+ int last_min_x, last_max_x, last_min_y, last_max_y;
+
+ last_min_x = 30000;
+ last_min_y = 30000;
+ last_max_x = -30000;
+ last_max_y = -30000;
+ for (i = 1; i < path_len; i++) {
+ if (xx[i] > last_max_x)
+ last_max_x = xx[i];
+ if (xx[i] < last_min_x)
+ last_min_x = xx[i];
+ if (yy[i] > last_max_y)
+ last_max_y = yy[i];
+ if (yy[i] < last_min_y)
+ last_min_y = yy[i];
+ line_btw(xx[i], yy[i], xx[i + 1], yy[i + 1]);
+ }
+ if (xx[path_len] > last_max_x)
+ last_max_x = xx[path_len];
+ if (xx[path_len] < last_min_x)
+ last_min_x = xx[path_len];
+ if (yy[path_len] > last_max_y)
+ last_max_y = yy[path_len];
+ if (yy[path_len] < last_min_y)
+ last_min_y = yy[path_len];
+ path_len = 0;
+ do_attribute_path(last_min_x, last_max_x, last_min_y, last_max_y);
+}
+
+
+/*
+ * Print a dashed line along the previously defined path, with
+ * the dashes/inch defined.
+ */
+
+static void
+flush_dashed(char *cp, Boolean dotted)
+{
+ int i;
+ int numdots;
+ int lx0, ly0, lx1, ly1;
+ int cx0, cy0, cx1, cy1;
+ float inchesperdash;
+ double d, spacesize, a, b = 0.0, dx, dy, milliperdash;
+
+ if (sscanf(cp, " %f ", &inchesperdash) != 1) {
+ XDVI_WARNING((stderr, "invalid format for dotted/dashed line: %s", cp));
+ return;
+ }
+ if (path_len <= 1 || inchesperdash <= 0.0) {
+ XDVI_WARNING((stderr, "invalid conditions for dotted/dashed line"));
+ return;
+ }
+ milliperdash = inchesperdash * 1000.0;
+ lx0 = xx[1];
+ ly0 = yy[1];
+ lx1 = xx[2];
+ ly1 = yy[2];
+ dx = lx1 - lx0;
+ dy = ly1 - ly0;
+ if (dotted) {
+ numdots = sqrt(dx * dx + dy * dy) / milliperdash + 0.5;
+ if (numdots == 0)
+ numdots = 1;
+ for (i = 0; i <= numdots; i++) {
+ a = (float)i / (float)numdots;
+ cx0 = lx0 + a * dx + 0.5;
+ cy0 = ly0 + a * dy + 0.5;
+ dot_at(cx0, cy0);
+ }
+ }
+ else {
+ d = sqrt(dx * dx + dy * dy);
+ numdots = d / (2.0 * milliperdash) + 1.0;
+ if (numdots <= 1)
+ line_btw(lx0, ly0, lx1, ly1);
+ else {
+ spacesize = (d - numdots * milliperdash) / (numdots - 1);
+ for (i = 0; i < numdots - 1; i++) {
+ a = i * (milliperdash + spacesize) / d;
+ b = a + milliperdash / d;
+ cx0 = lx0 + a * dx + 0.5;
+ cy0 = ly0 + a * dy + 0.5;
+ cx1 = lx0 + b * dx + 0.5;
+ cy1 = ly0 + b * dy + 0.5;
+ line_btw(cx0, cy0, cx1, cy1);
+ b += spacesize / d;
+ }
+ cx0 = lx0 + b * dx + 0.5;
+ cy0 = ly0 + b * dy + 0.5;
+ line_btw(cx0, cy0, lx1, ly1);
+ }
+ }
+ path_len = 0;
+}
+
+
+/*
+ * Add a point to the current path
+ */
+
+static void
+add_path(char *cp)
+{
+ int pathx, pathy;
+
+ if (++path_len >= MAXPOINTS)
+ XDVI_FATAL((stderr, "Too many points"));
+ if (sscanf(cp, " %d %d ", &pathx, &pathy) != 2)
+ XDVI_FATAL((stderr, "Malformed path command"));
+ xx[path_len] = pathx;
+ yy[path_len] = pathy;
+}
+
+
+/*
+ * Draw to a floating point position
+ */
+
+static void
+im_fdraw(double x, double y)
+{
+ if (++path_len >= MAXPOINTS)
+ XDVI_FATAL((stderr, "Too many arc points"));
+ xx[path_len] = x + 0.5;
+ yy[path_len] = y + 0.5;
+}
+
+
+/*
+ * Draw an ellipse with the indicated center and radices.
+ */
+
+static void
+draw_ellipse(int xc, int yc, int xr, int yr)
+{
+ double angle, theta;
+ int n;
+ int px0, py0, px1, py1;
+
+ angle = (xr + yr) / 2.0;
+ theta = sqrt(1.0 / angle);
+ n = TWOPI / theta + 0.5;
+ if (n < 12)
+ n = 12;
+ else if (n > 80)
+ n = 80;
+ n /= 2;
+ theta = TWOPI / n;
+
+ angle = 0.0;
+ px0 = xc + xr; /* cos(0) = 1 */
+ py0 = yc; /* sin(0) = 0 */
+ while ((angle += theta) <= TWOPI) {
+ px1 = xc + xr * cos(angle) + 0.5;
+ py1 = yc + yr * sin(angle) + 0.5;
+ line_btw(px0, py0, px1, py1);
+ px0 = px1;
+ py0 = py1;
+ }
+ line_btw(px0, py0, xc + xr, yc);
+}
+
+/*
+ * Draw an arc
+ */
+
+static void
+arc(char *cp, Boolean invis)
+{
+ int xc, yc, xrad, yrad, n;
+ float start_angle, end_angle, angle, theta, r;
+ double xradius, yradius, xcenter, ycenter;
+
+ n = sscanf(cp, " %d %d %d %d %f %f ", &xc, &yc, &xrad, &yrad,
+ &start_angle, &end_angle);
+
+ if (n != 6) {
+ XDVI_WARNING((stderr, "invalid arc specification: %s", cp));
+ return;
+ }
+
+ if (invis)
+ return;
+
+ /* We have a specialized fast way to draw closed circles/ellipses */
+ if (start_angle <= 0.0 && end_angle >= 6.282) {
+ draw_ellipse(xc, yc, xrad, yrad);
+ return;
+ }
+ xcenter = xc;
+ ycenter = yc;
+ xradius = xrad;
+ yradius = yrad;
+ r = (xradius + yradius) / 2.0;
+ theta = sqrt(1.0 / r);
+#if BUG_888087_FIXED
+ n = (pen_size * TWOPI) / (theta * currwin.shrinkfactor) + 0.5;
+#else
+ n = 0.3 * TWOPI / theta + 0.5;
+#endif
+ if (n < 12)
+ n = 12;
+ else if (n > 80)
+ n = 80;
+ n /= 2;
+ theta = TWOPI / n;
+ flush_path();
+ im_fdraw(xcenter + xradius * cos(start_angle),
+ ycenter + yradius * sin(start_angle));
+ angle = start_angle + theta;
+ if (end_angle < start_angle)
+ end_angle += TWOPI;
+ while (angle < end_angle) {
+ im_fdraw(xcenter + xradius * cos(angle),
+ ycenter + yradius * sin(angle));
+ angle += theta;
+ }
+ im_fdraw(xcenter + xradius * cos(end_angle),
+ ycenter + yradius * sin(end_angle));
+ flush_path();
+}
+
+
+/*
+ * APPROXIMATE integer distance between two points
+ */
+
+#define dist(x0, y0, x1, y1) (abs(x0 - x1) + abs(y0 - y1))
+
+
+/*
+ * Draw a spline along the previously defined path
+ */
+
+static void
+flush_spline(void)
+{
+ int xp, yp;
+ int N;
+ int lastx = -1, lasty = -1;
+ Boolean lastvalid = False;
+ int t1, t2, t3;
+ int steps;
+ int j;
+ int i, w;
+
+ N = path_len + 1;
+ xx[0] = xx[1];
+ yy[0] = yy[1];
+ xx[N] = xx[N - 1];
+ yy[N] = yy[N - 1];
+ for (i = 0; i < N - 1; i++) { /* interval */
+ steps = (dist(xx[i], yy[i], xx[i + 1], yy[i + 1]) +
+ dist(xx[i + 1], yy[i + 1], xx[i + 2], yy[i + 2])) / 80;
+ for (j = 0; j < steps; j++) { /* points within */
+ w = (j * 1000 + 500) / steps;
+ t1 = w * w / 20;
+ w -= 500;
+ t2 = (750000 - w * w) / 10;
+ w -= 500;
+ t3 = w * w / 20;
+ xp =
+ (t1 * xx[i + 2] + t2 * xx[i + 1] + t3 * xx[i] + 50000) / 100000;
+ yp =
+ (t1 * yy[i + 2] + t2 * yy[i + 1] + t3 * yy[i] + 50000) / 100000;
+ if (lastvalid)
+ line_btw(lastx, lasty, xp, yp);
+ lastx = xp;
+ lasty = yp;
+ lastvalid = True;
+ }
+ }
+ path_len = 0;
+}
+
+
+/*
+ * Shade the last box, circle, or ellipse
+ */
+
+static void
+shade_last(void)
+{
+ blacken = whiten = False;
+ shade = True;
+}
+
+
+/*
+ * Make the last box, circle, or ellipse, white inside (shade with white)
+ */
+
+static void
+whiten_last(void)
+{
+ whiten = True;
+ blacken = shade = False;
+}
+
+
+/*
+ * Make last box, etc, black inside
+ */
+
+static void
+blacken_last(void)
+{
+ blacken = True;
+ whiten = shade = False;
+}
+
+
+/*
+ * Code for PostScript<tm> specials begins here.
+ */
+
+#if PS
+
+/*
+ * Information on how to search for PS header and figure files.
+ */
+
+static void ps_startup(int, int, const char *);
+static void ps_startup2(void);
+
+/* dummy procedures */
+static void NullProc(void) { }
+static void NullProcInt(int flag) { UNUSED(flag); }
+static void NullProcStr(const char *cp) { UNUSED(cp); }
+
+
+struct psprocs psp = { /* used for lazy startup of the ps machinery */
+ /* toggle */ NullProcInt,
+ /* destroy */ NullProc,
+ /* interrupt */ NullProc,
+ /* endpage */ NullProc,
+ /* drawbegin */ ps_startup,
+ /* drawraw */ NullProcStr,
+ /* drawfile */ NULL,
+ /* drawend */ NullProcStr,
+ /* beginheader */ ps_startup2,
+ /* endheader */ NullProc,
+ /* newdoc */ NullProc
+};
+
+struct psprocs no_ps_procs = { /* used if postscript is unavailable */
+ /* toggle */ NullProcInt,
+ /* destroy */ NullProc,
+ /* interrupt */ NullProc,
+ /* endpage */ NullProc,
+ /* drawbegin */ drawbegin_none,
+ /* drawraw */ NullProcStr,
+ /* drawfile */ NULL,
+ /* drawend */ NullProcStr,
+ /* beginheader */ NullProc,
+ /* endheader */ NullProc,
+ /* newdoc */ NullProc
+};
+
+#endif /* PS */
+
+#ifdef MAGICK
+int bbox_angle;
+Boolean bbox_valid;
+unsigned int bbox_width;
+unsigned int bbox_height;
+int bbox_voffset;
+#else
+static int bbox_angle;
+static Boolean bbox_valid;
+static unsigned int bbox_width;
+static unsigned int bbox_height;
+static int bbox_voffset;
+#endif
+
+/* info on bboxes on this page */
+struct bbox_info {
+ int x;
+ int y;
+ int w;
+ int h;
+ int angle;
+};
+
+static struct bbox_info *g_bbox_info = NULL;
+static size_t g_bbox_info_size = 0;
+static size_t g_bbox_info_max_size = 0;
+
+/*
+ Append the current coordinates to g_bbox_info, unless it already
+ contains these coordinates.
+*/
+
+static void
+append_bbox_info(int x, int y, int w, int h, int angle)
+{
+ Boolean found = False;
+ size_t i;
+ const size_t SIZE_STEP = 16;
+
+ /* is this box already present? */
+ for (i = 0; i < g_bbox_info_size; i++) {
+ if (g_bbox_info[i].x == x
+ && g_bbox_info[i].y == y
+ && g_bbox_info[i].w == w
+ && g_bbox_info[i].h == h
+ && g_bbox_info[i].angle == angle) {
+ found = True;
+ break;
+ }
+ }
+
+ if (!found) {
+ g_bbox_info_size++;
+
+ while (g_bbox_info_size >= g_bbox_info_max_size) {
+ g_bbox_info_max_size += SIZE_STEP;
+ }
+
+ g_bbox_info = xrealloc(g_bbox_info, g_bbox_info_max_size * sizeof *g_bbox_info);
+ g_bbox_info[g_bbox_info_size - 1].x = x;
+ g_bbox_info[g_bbox_info_size - 1].y = y;
+ g_bbox_info[g_bbox_info_size - 1].w = w;
+ g_bbox_info[g_bbox_info_size - 1].h = h;
+ g_bbox_info[g_bbox_info_size - 1].angle = angle;
+ }
+}
+
+static void
+draw_bbox0(int xcorner, int ycorner)
+{
+ if (bbox_valid) {
+#if COLOR
+ if (fg_active != fg_current)
+ do_color_change();
+#endif
+
+ if (bbox_angle == 0) {
+ ycorner -= bbox_voffset;
+ XDrawRectangle(DISP, currwin.win, globals.gc.high, xcorner, ycorner, bbox_width, bbox_height);
+ if (resource.postscript == 0) {
+ if (htex_inside_href) {
+ htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width, ycorner + bbox_height);
+ htex_set_objecttype(HTEX_IMG);
+ }
+ }
+ }
+ else {
+ float sin_a = sin(bbox_angle * (TWOPI / 360));
+ float cos_a = cos(bbox_angle * (TWOPI / 360));
+ float a, b, c, d;
+
+ a = cos_a * bbox_width;
+ b = -sin_a * bbox_width;
+ c = -sin_a * bbox_height;
+ d = -cos_a * bbox_height;
+
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ xcorner, ycorner,
+ xcorner + (int)rint(a), ycorner + (int)rint(b));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ xcorner + (int)rint(a), ycorner + (int)rint(b),
+ xcorner + (int)rint(a + c), ycorner + (int)rint(b + d));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ xcorner + (int)rint(a + c), ycorner + (int)rint(b + d),
+ xcorner + (int)rint(c), ycorner + (int)rint(d));
+ XDrawLine(DISP, currwin.win, globals.gc.high,
+ xcorner + (int)rint(c), ycorner + (int)rint(d),
+ xcorner, ycorner);
+ }
+ bbox_valid = False;
+ }
+}
+
+/*
+ Display the items in bbox_info.
+ Invoked from draw_page() in dvi-draw.c.
+*/
+void
+display_bboxes(void)
+{
+ size_t i;
+
+ for (i = 0; i < g_bbox_info_size; i++) {
+ if (globals.debug & DBG_PS) {
+ fprintf(stderr, "drawing bbox %lu at %d %d, %d x %d, angle %d\n",
+ (unsigned long)i,
+ g_bbox_info[i].x,
+ g_bbox_info[i].y,
+ g_bbox_info[i].w,
+ g_bbox_info[i].h,
+ g_bbox_info[i].angle);
+ }
+#if 0
+ XDrawRectangle(DISP, currwin.win, globals.gc.high,
+ g_bbox_info[i].x,
+ g_bbox_info[i].y,
+ g_bbox_info[i].w,
+ g_bbox_info[i].h);
+#else
+ bbox_valid = True;
+ bbox_width = g_bbox_info[i].w;
+ bbox_height = bbox_voffset = g_bbox_info[i].h;
+ bbox_angle = g_bbox_info[i].angle;
+ draw_bbox0(g_bbox_info[i].x, g_bbox_info[i].y + bbox_height);
+#endif
+ }
+ bbox_angle = 0;
+ bbox_valid = False;
+}
+
+void
+clear_bboxes(void)
+{
+ free(g_bbox_info);
+ g_bbox_info = NULL;
+ g_bbox_info_size = 0;
+ g_bbox_info_max_size = 0;
+}
+
+void
+save_bbox(void)
+{
+ int xcorner, ycorner;
+
+ if (bbox_valid) {
+ xcorner = PXL_H - currwin.base_x;
+ ycorner = PXL_V - currwin.base_y;
+
+ ycorner -= bbox_voffset;
+ append_bbox_info(xcorner, ycorner, bbox_width, bbox_height, bbox_angle);
+
+ /* register boundaries of this box as anchor boundaries */
+ if (htex_inside_href) {
+ htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width, ycorner + bbox_height);
+ htex_set_objecttype(HTEX_IMG);
+ }
+ }
+}
+
+
+void
+draw_bbox(void)
+{
+ draw_bbox0(PXL_H - currwin.base_x, PXL_V - currwin.base_y);
+}
+
+#if PS
+
+static XIOErrorHandler oldhandler;
+
+static int XDviIOErrorHandler(Display * disp)
+{
+ ps_destroy();
+ return oldhandler(disp);
+}
+
+static void
+actual_startup(int flag)
+{
+ UNUSED(flag);
+ oldhandler = XSetIOErrorHandler(XDviIOErrorHandler);
+
+ /*
+ * Figure out what we want to use to display postscript figures
+ * and set at most one of the following to True:
+ * resource.useGS, resource.useDPS, resource.useNeWS
+ *
+ * Choose DPS then NEWS then Ghostscript if they are available
+ */
+ if (!(
+#ifdef PS_DPS
+ (resource.useDPS && initDPS())
+#if defined(PS_NEWS) || defined(PS_GS)
+ ||
+#endif
+#endif /* PS_DPS */
+#ifdef PS_NEWS
+ (resource.useNeWS && initNeWS())
+#ifdef PS_GS
+ ||
+#endif
+#endif /* PS_NEWS */
+#ifdef PS_GS
+ (resource.useGS && initGS())
+#endif
+ ))
+ psp = no_ps_procs;
+}
+
+static void
+ps_startup(int xul, int yul, const char *cp)
+{
+ if (resource.postscript == 0) {
+ draw_bbox();
+ return;
+ }
+ actual_startup(0);
+ psp.drawbegin(xul, yul, cp);
+}
+
+static void
+ps_startup2(void)
+{
+ actual_startup(0);
+ psp.beginheader();
+}
+
+
+/*
+ * dumb parsing of PostScript - search for rotation H. Zeller 1/97
+ * Returns true if we find a potentially non-supported command that
+ * we want to warn users about.
+ */
+static Boolean
+ps_parseraw(const char *PostScript_cmd)
+{
+ const char *p;
+
+ bbox_angle = 0;
+ p = strstr(PostScript_cmd, "rotate");
+ if (p != NULL) {
+ while (*p != '\0' && !isdigit((int)*p))
+ --p;
+ while (*p != '\0' && isdigit((int)*p))
+ --p;
+ if (*p != '+' && *p != '-')
+ ++p;
+ sscanf(p, "%d neg rotate", &bbox_angle);
+ return True;
+ }
+ if (strstr(PostScript_cmd, " scale ") != NULL)
+ return True;
+ return False;
+}
+
+
+void
+drawbegin_none(int xul, int yul, const char *cp)
+{
+ UNUSED(xul);
+ UNUSED(yul);
+ UNUSED(cp);
+
+ draw_bbox();
+}
+
+
+/*
+ * Mechanism to keep track of included PS files.
+ */
+
+struct avl_psinfo {
+ AVL_COMMON;
+ char *fullpath;
+ char *tempname;
+ dev_t ps_dev;
+ ino_t ps_ino;
+ time_t ps_mtime;
+ Boolean is_new; /* set if previous use failed because of !allow_shell */
+};
+
+static struct avl_psinfo *psinfo_head = NULL;
+
+
+/*
+ * ps_clear_cache() resets the cache to the empty state.
+ */
+
+static void
+clear_psinfo_node(struct avl_psinfo *psinfp)
+{
+ if (psinfp->fullpath != NULL) {
+ free(psinfp->fullpath);
+ psinfp->fullpath = NULL;
+ }
+ if (psinfp->tempname != NULL) {
+ if (unlink(psinfp->tempname) < 0)
+ perror(psinfp->tempname);
+ free(psinfp->tempname);
+ psinfp->tempname = NULL;
+ }
+}
+
+static void
+clear_psinfo_tree(struct avl_psinfo *psinfp)
+{
+ if (psinfp == NULL)
+ return;
+
+ clear_psinfo_tree((struct avl_psinfo *) psinfp->left);
+ clear_psinfo_tree((struct avl_psinfo *) psinfp->right);
+ free((char *) psinfp->key);
+ clear_psinfo_node(psinfp);
+ free(psinfp);
+}
+
+static void
+ps_clear_cache(void)
+{
+ clear_psinfo_tree(psinfo_head);
+ psinfo_head = NULL;
+}
+
+
+/*
+ * ps_clear_cache_nofree() does the same thing as ps_clear_cache(), but
+ * without ever calling free(). This is because it may be called
+ * following a segmentation fault, in which case the heap may be corrupted.
+ */
+
+static void
+clear_psinfo_node_nofree(struct avl_psinfo *psinfp)
+{
+ if (psinfp->fullpath != NULL) {
+ psinfp->fullpath = NULL;
+ }
+ if (psinfp->tempname != NULL) {
+ if (unlink(psinfp->tempname) < 0)
+ perror(psinfp->tempname);
+ psinfp->tempname = NULL;
+ }
+}
+
+static void
+clear_psinfo_tree_nofree(struct avl_psinfo *psinfp)
+{
+ if (psinfp == NULL)
+ return;
+
+ clear_psinfo_tree_nofree((struct avl_psinfo *) psinfp->left);
+ clear_psinfo_tree_nofree((struct avl_psinfo *) psinfp->right);
+ clear_psinfo_node_nofree(psinfp);
+}
+
+static void
+ps_clear_cache_nofree(void)
+{
+ clear_psinfo_tree_nofree(psinfo_head);
+ psinfo_head = NULL;
+}
+
+
+/*
+ * ps_new_tempfile() - Opens a new temporary file.
+ * Returns the fd, or -1 if an error occurred.
+ */
+
+static int
+ps_new_tempfile(struct avl_psinfo *psinfp)
+{
+ int fd;
+
+ fd = xdvi_temp_fd(&psinfp->tempname);
+ if (fd == -1) {
+ XDVI_ERROR((stderr,
+ "Cannot create temporary file for PostScript figure file: %s",
+ strerror(errno)));
+ free(psinfp->tempname);
+ psinfp->tempname = NULL;
+ }
+ return fd;
+}
+
+#ifndef UNCOMPRESS
+#define UNCOMPRESS "uncompress"
+#endif
+
+#ifndef GUNZIP
+#define GUNZIP "gunzip"
+#endif
+
+#ifndef BUNZIP2
+#define BUNZIP2 "bunzip2"
+#endif
+
+static void send_ps_file(const char *filename, kpse_file_format_type pathinfo);
+
+static void
+enable_specials_send_ps_file(XtPointer data)
+{
+ const char *filename = (const char *)data;
+ resource.allow_shell = True;
+ redraw_page(); /* to erase the bounding box */
+ statusline_info(STATUS_MEDIUM,
+ "Shell specials enabled for this session.",
+ filename);
+ send_ps_file(filename, kpse_pict_format);
+}
+
+static void
+try_open_tempname(int status, struct xchild *this)
+{
+ if (WIFEXITED(status)) { /* child exited normally */
+ if (WEXITSTATUS(status) != 0) {
+ /* default error procedure */
+ handle_child_exit(status, this);
+ this = NULL; /* prevent freeing it twice */
+ }
+ else {
+ struct avl_psinfo *psinfp = (struct avl_psinfo *) this->data;
+ FILE *f = XFOPEN(psinfp->tempname, OPEN_MODE);
+
+ fprintf(stderr, "FILE: %s\n", psinfp->tempname);
+ if (f == NULL) {
+ perror(psinfp->tempname);
+ }
+ else {
+ fprintf(stderr, "sending file: %s, %p\n", psinfp->tempname, (void *)f);
+ /* There's no point in invoking
+ psp.drawfile(psinfp->tempname, f);
+ here, since usually it will be already too late (draw_part() which
+ had called us via applicationDoSpecial() will already have terminated).
+ So instead, we just close the file and force a redraw of the entire page.
+ */
+ fclose(f);
+ globals.ev.flags |= EV_NEWPAGE;
+ }
+ }
+ }
+ else if (WIFSIGNALED(status)) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Process `%s' terminated abnormally with signal %d.", this->name, WTERMSIG(status));
+ }
+ else if (WIFSTOPPED(status)) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Process `%s' stopped by signal %d.", this->name, WSTOPSIG(status));
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Process `%s' terminated with unknown status.", this->name);
+ }
+ if (this != NULL) { /* if it wasn't freed already */
+ free(this->name);
+ free(this->io);
+ free(this);
+ }
+}
+
+static void
+send_ps_file(const char *filename, kpse_file_format_type pathinfo)
+{
+ FILE *f;
+ int fd;
+ static const char *argv[] = { NULL, "-c", NULL, NULL };
+ char *bufp = NULL;
+ size_t len;
+ struct avl_psinfo *volatile psinfp;
+ char magic1, magic2, magic3;
+ static Boolean warned_about_shellescape = False;
+ static size_t ffline_len = 0;
+ static char *ffline = NULL;
+ const size_t FFLINE_STEP = 128;
+
+ if (psp.drawfile == NULL || resource.postscript == 0) {
+ return;
+ }
+
+ len = strlen(filename);
+ psinfp = (struct avl_psinfo *) avladd(filename, len,
+ (struct avl **) &psinfo_head, sizeof(struct avl_psinfo));
+
+ if (psinfp->key == filename) { /* if new record */
+ psinfp->is_new = True;
+ psinfp->key = xmemdup(filename, len + 1);
+ psinfp->fullpath = psinfp->tempname = NULL;
+ }
+
+ if (filename[0] == '`') {
+ /* To test this code, use \special{psfile="`cat file.ps"} */
+ if (!resource.allow_shell) {
+ if (!warned_about_shellescape) {
+ choice_dialog_sized(globals.widgets.top_level,
+ MSG_INFO,
+ SIZE_MEDIUM,
+ /* helptext */
+ "To enable shell specials, use the \"-allowshell\" command "
+ "line option.\n\n"
+ "WARNING: You should NOT use shell specials like\n"
+ "`gunzip -c file.eps.gz\n"
+ "(e.g. via \\DeclareGraphicsRule{...}) "
+ "to uncompress .eps.gz files, even though some obsolete "
+ "LaTeX documentation might suggest it. Current versions "
+ "of xdvi and dvips will handle .eps.gz files just fine without this trick.\n",
+#ifndef MOTIF
+ NULL,
+#endif
+ NULL, NULL, /* no pre_callbacks */
+ /* Cancel label/callback */
+ "Cancel", NULL, (XtPointer)NULL,
+ /* Enable label/callback */
+ "Enable", enable_specials_send_ps_file, (XtPointer)filename,
+ /* msg */
+ "This page contains a shell special \"%s\", but execution of shell specials "
+ "is disabled.\n\nYou can now click "
+ "\"Enable\" to enable shell specials for this session only, "
+ "\"Cancel\" to leave the specials disabled, or \"Help\" for more help "
+ "on this topic.\n\n"
+ "Please note that shell specials are a security risk, since they "
+ "allow execution of arbitrary shell commands from the TeX file. "
+ "You should enable them only for DVI files that you created yourself.",
+ filename);
+ warned_about_shellescape = True;
+ }
+ else {
+ statusline_error(STATUS_MEDIUM,
+ "Info: Shell special \"%s\" disabled.",
+ filename);
+ }
+ draw_bbox();
+ return;
+ }
+
+ if (!psinfp->is_new) { /* if we already have it */
+ if (psinfp->tempname == NULL) { /* if previously known error */
+ draw_bbox();
+ return;
+ }
+ f = XFOPEN(psinfp->tempname, OPEN_MODE);
+ if (f == NULL) {
+ perror(psinfp->tempname);
+ /* WARN1(XmDIALOG_ERROR,
+ "Cannot open temporary PostScript file:\n%s",
+ psinfp->tempname); */
+ clear_psinfo_node(psinfp);
+ draw_bbox();
+ return;
+ }
+ psp.drawfile(psinfp->tempname, f);
+ }
+ else { /* it is new */
+ char *argv[4];
+
+ psinfp->is_new = False;
+
+ /* Create the file (it wasn't cached).
+ Fork so that we can collect the process's error messages. */
+
+ fd = ps_new_tempfile(psinfp);
+ if (fd == -1) { /* if error */
+ draw_bbox();
+ return;
+ }
+
+ /* FIXME: Insecure - this is a /tmp race;
+ shouldn't close(fd), just re-use it */
+ close(fd);
+
+ len = strlen(filename) + strlen(psinfp->tempname) + (4 - 1);
+ if (len > ffline_len) {
+ ffline_len += FFLINE_STEP;
+ ffline = xrealloc(ffline, ffline_len);
+ }
+
+ sprintf(ffline, "%s > %s", filename + 1, psinfp->tempname);
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = ffline;
+ argv[3] = NULL;
+ fork_process("/bin/sh", False, globals.dvi_file.dirname,
+ try_open_tempname, psinfp, -SIGKILL, argv);
+ }
+ }
+ else { /* not shell escape */
+ char *expanded_filename = NULL;
+ struct stat statbuf;
+
+ if (psinfp->fullpath != NULL) { /* if existing rec., no error */
+ /* Check file modification time */
+ if (stat(psinfp->fullpath, &statbuf) != 0) {
+ perror(psinfp->fullpath);
+ if (psinfp->ps_mtime != 0) {
+ clear_psinfo_node(psinfp);
+ psinfp->is_new = True;
+ }
+ }
+ else {
+ if (psinfp->ps_dev != statbuf.st_dev
+ || psinfp->ps_ino != statbuf.st_ino
+ || psinfp->ps_mtime != statbuf.st_mtime) {
+ clear_psinfo_node(psinfp);
+ psinfp->is_new = True;
+ }
+ }
+ }
+
+ if (!psinfp->is_new) {
+ bufp = psinfp->tempname;
+ if (bufp == NULL) {
+ bufp = psinfp->fullpath;
+ if (bufp == NULL) { /* if error already noted */
+ draw_bbox();
+ return;
+ }
+ }
+ f = XFOPEN(bufp, OPEN_MODE);
+ if (f == NULL) {
+ XDVI_WARNING((stderr, "Could not find graphics or temporary file \"%s\"",
+ bufp));
+ statusline_info(STATUS_MEDIUM, "Warning: Could not find graphics or temporary file \"%s\"",
+ bufp);
+ clear_psinfo_node(psinfp);
+ draw_bbox();
+ return;
+ }
+ }
+ else { /* node is new */
+ psinfp->is_new = False;
+
+ expanded_filename = find_file(filename, &statbuf, pathinfo);
+
+ if (expanded_filename == NULL &&
+ (pathinfo == kpse_enc_format || pathinfo == kpse_type1_format))
+ {
+ /* in this case, we also kpathsea-search in the `old' place for
+ backwards compatibility: kpse_tex_ps_header_format
+ (see comment for load_vector(), dvi-draw.c for details) */
+ expanded_filename = kpse_find_file(filename,
+ kpse_tex_ps_header_format, True);
+ }
+ if (expanded_filename == NULL) {
+ expanded_filename = kpse_find_file(filename,
+ kpse_program_text_format, True);
+ }
+ if (expanded_filename == NULL) { /* still no success, complain */
+ /* FIXME: this warning may be overwritten by warning about raw
+ PS specials, so additinally dump to stderr.
+ TODO: make statusline printing respect more important
+ messages. */
+ XDVI_WARNING((stderr, "Could not find graphics file \"%s\"",
+ filename));
+ statusline_info(STATUS_MEDIUM,
+ "Warning: Could not find graphics file \"%s\"",
+ filename);
+ draw_bbox();
+ return;
+ }
+ if (globals.debug & DBG_OPEN)
+ printf("%s:%d: |%s| expanded to |%s|\n", __FILE__, __LINE__,
+ filename, expanded_filename);
+
+ f = XFOPEN(expanded_filename, OPEN_MODE);
+ if (f == NULL) {
+ XDVI_WARNING((stderr, "Could not open graphics file \"%s\": %s",
+ expanded_filename, strerror(errno)));
+ statusline_info(STATUS_MEDIUM,
+ "Warning: Could not open graphics file \"%s\": %s",
+ expanded_filename, strerror(errno));
+ free(expanded_filename);
+ draw_bbox();
+ return;
+ }
+
+ bufp = psinfp->fullpath = expanded_filename;
+
+ if (fstat(fileno(f), &statbuf) == 0) { /* get mod. time */
+ psinfp->ps_dev = statbuf.st_dev;
+ psinfp->ps_ino = statbuf.st_ino;
+ psinfp->ps_mtime = statbuf.st_mtime;
+ }
+ else {
+ perror(bufp);
+ psinfp->ps_dev = 0;
+ psinfp->ps_ino = 0;
+ psinfp->ps_mtime = 0;
+ }
+
+ /* check for compressed files */
+
+ len = strlen(filename);
+ magic1 = '\037';
+ magic3 = '\0';
+ if ((len > 2 && strcmp(filename + len - 2, ".Z") == 0
+ && (argv[0] = UNCOMPRESS, magic2 = '\235', True))
+ || (len > 3 && strcmp(filename + len - 3, ".gz") == 0
+ && (argv[0] = GUNZIP, magic2 = '\213', True))
+ || (len > 4 && strcmp(filename + len - 4, ".bz2") == 0
+ && (argv[0] = BUNZIP2, magic1 = 'B', magic2 = 'Z',
+ magic3 = 'h', True))) {
+ if (getc(f) != magic1 || (char)getc(f) != magic2
+ || (magic3 != '\0' && getc(f) != magic3)) {
+ rewind(f);
+ }
+ else {
+ pid_t pid;
+ int status;
+
+ fclose(f);
+
+ fd = ps_new_tempfile(psinfp);
+ if (fd == -1) { /* if error */
+ clear_psinfo_node(psinfp);
+ return;
+ }
+ argv[2] = bufp;
+ fflush(stderr); /* avoid double flushing */
+ pid = vfork();
+ if (pid == 0) { /* if child */
+ (void)dup2(fd, 1);
+ (void)execvp(argv[0], (char **)argv);
+ XDVI_ERROR((stderr, "Execvp of %s failed: %s", argv[0],
+ strerror(errno)));
+ _exit(EXIT_FAILURE);
+ }
+ (void)close(fd);
+
+ for (;;) {
+#if HAVE_WAITPID
+ if (waitpid(pid, &status, 0) != -1)
+ break;
+#else
+# if HAVE_WAIT4
+ if (wait4(pid, &status, 0, (struct rusage *)NULL)
+ != -1)
+ break;
+# else
+ int retval;
+
+ retval = wait(&status);
+ if (retval == pid)
+ break;
+ if (retval != -1)
+ continue;
+# endif /* HAVE_WAIT4 */
+#endif /* HAVE_WAITPID */
+ if (errno == EINTR)
+ continue;
+ perror("[xdvik] waitpid");
+ return;
+ }
+ f = XFOPEN(psinfp->tempname, OPEN_MODE);
+ if (f == NULL) {
+ perror(psinfp->tempname);
+ draw_bbox();
+ return;
+ }
+ bufp = psinfp->tempname;
+ }
+ }
+ }
+ /* Success! */
+ psp.drawfile(bufp, f); /* this is supposed to close the file */
+ }
+}
+
+
+void
+ps_destroy(void)
+{
+ /* Note: old NeXT systems (at least) lack atexit/on_exit. */
+ psp.destroy();
+ ps_clear_cache();
+}
+
+
+/*
+ * Same as above, but refrains from calling free() (may be called
+ * following a seg fault).
+ */
+
+void
+ps_destroy_nofree(void)
+{
+ psp.destroy();
+ ps_clear_cache_nofree();
+}
+
+
+#endif /* PS */
+
+
+void
+init_prescan(void)
+{
+ scanned_page = scanned_page_reset = resource.prescan ? -1 : total_pages + 1;
+#if PS
+ scanned_page_ps = scanned_page_ps_bak = scanned_page;
+#if COLOR
+ scanned_page_color = scanned_page;
+#endif /* COLOR */
+#endif /* PS */
+
+ TRACE_FILES((stderr, "init_prescan: scanned_page = %d", scanned_page));
+#if PS
+ if (resource.postscript == 0)
+ scanned_page_ps = total_pages + 1;
+
+ ps_clear_cache();
+ psp.newdoc();
+#endif
+
+#if COLOR
+ if (!resource.use_color)
+ scanned_page_color = total_pages + 1;
+#endif
+
+ if (ignore_papersize_specials) {
+#if PS && COLOR
+ scanned_page = scanned_page_ps < scanned_page_color ? scanned_page_ps : scanned_page_color;
+#elif PS
+ scanned_page = scanned_page_ps;
+#elif COLOR
+ scanned_page = scanned_page_color;
+#else
+ scanned_page = total_pages + 1;
+#endif
+ }
+}
+
+
+static void
+psfig_special(char *cp)
+{
+ char *filename;
+ int raww, rawh;
+
+ if (strncmp(cp, ":[begin]", 8) == 0) {
+ cp += 8;
+ bbox_valid = False;
+ bbox_angle = 0;
+ if (sscanf(cp, "%d %d\n", &raww, &rawh) >= 2) {
+ bbox_valid = True;
+ bbox_width = pixel_conv(spell_conv(raww));
+ bbox_height = pixel_conv(spell_conv(rawh));
+ bbox_voffset = 0;
+ }
+ if (INSIDE_MANE_WIN) {
+#if PS
+ psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, cp);
+#else
+ draw_bbox();
+#endif
+ }
+ psfig_begun = True;
+ }
+ else if (strncmp(cp, " plotfile ", 10) == 0) {
+ cp += 10;
+ while (isspace((int)*cp))
+ cp++;
+ /* handle "`zcat file". Borrowed from dvipsk... */
+ if (*cp == '"') {
+ cp++;
+ for (filename = cp; *cp && (*cp != '"'); ++cp);
+ }
+ else {
+ for (filename = cp; *cp && !isspace((int)*cp); ++cp);
+ }
+ *cp = '\0';
+#if PS
+ if (INSIDE_MANE_WIN)
+ send_ps_file(filename, kpse_pict_format);
+#endif
+ }
+ else if (strncmp(cp, ":[end]", 6) == 0) {
+ cp += 6;
+#if PS
+ if (INSIDE_MANE_WIN) {
+ psp.drawend(cp);
+ }
+#endif
+ bbox_valid = False;
+ psfig_begun = False;
+ }
+ else if (*cp == ':') {
+ /* I am going to send some raw postscript stuff */
+ ++cp; /* skip the colon */
+#if PS
+ if (ps_parseraw(cp))
+ have_raw_postscript = True;
+ if (INSIDE_MANE_WIN)
+ psp.drawraw(cp);
+#endif
+ }
+ else { /* attempt to parse pstricks color specials */
+#if COLOR
+ struct rgb color;
+ if (parse_color(cp, cp, &color, True)) {
+ /* clear stack */
+ if (rcs_head == NULL) {
+ rcs_head = xmalloc(sizeof *rcs_head);
+ rcs_head->prev = rcs_head->next = NULL;
+ }
+ rcs_top = rcs_head;
+ color_bot_size = 0;
+
+ /* Change top of stack */
+ rcs_top->color = color;
+
+ set_fg_color(&color);
+ }
+#endif
+ /* also raw PostScript, but no extra colon to skip */
+#if PS
+ if (INSIDE_MANE_WIN) {
+ if (ps_parseraw(cp))
+ have_raw_postscript = True;
+
+ if (psfig_begun)
+ psp.drawraw(cp);
+ else {
+ psp.drawbegin(PXL_H - currwin.base_x,
+ PXL_V - currwin.base_y, cp);
+ psp.drawend("");
+ }
+ }
+#endif
+ }
+}
+
+
+/* Keys for epsf specials */
+
+static const char *keytab[] = { "clip",
+ "llx",
+ "lly",
+ "urx",
+ "ury",
+ "rwi",
+ "rhi",
+ "hsize",
+ "vsize",
+ "hoffset",
+ "voffset",
+ "hscale",
+ "vscale",
+ "angle"
+};
+
+#define KEY_LLX keyval[0]
+#define KEY_LLY keyval[1]
+#define KEY_URX keyval[2]
+#define KEY_URY keyval[3]
+#define KEY_RWI keyval[4]
+#define KEY_RHI keyval[5]
+
+#define NKEYS (sizeof keytab /sizeof *keytab)
+#define N_ARGLESS_KEYS 1
+
+static void
+epsf_special(char *cp)
+{
+ char *filename;
+ static char *buffer;
+ static unsigned int buflen = 0;
+ unsigned int len;
+ char *q;
+ int flags = 0;
+ double keyval[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+
+ filename = cp;
+ if (*cp == '\'' || *cp == '"') {
+ do
+ ++cp;
+ while (*cp != '\0' && *cp != *filename);
+ ++filename;
+ }
+ else
+ while (*cp != '\0' && !isspace((int)*cp))
+ ++cp;
+ if (*cp != '\0')
+ *cp++ = '\0';
+ while (isspace((int)*cp))
+ ++cp;
+ len = strlen(cp) + NKEYS + 30;
+ if (buflen < len) {
+ if (buflen != 0)
+ free(buffer);
+ buflen = len;
+ buffer = xmalloc(buflen);
+ }
+ strcpy(buffer, "@beginspecial");
+ q = buffer + strlen(buffer);
+ while (*cp != '\0') {
+ char *p1 = cp;
+ size_t keyno;
+
+ while (*p1 != '=' && !isspace((int)*p1) && *p1 != '\0')
+ ++p1;
+ for (keyno = 0;; ++keyno) {
+ if (keyno >= NKEYS) {
+ if (globals.warn_spec_now)
+ XDVI_WARNING((stderr, "Ignoring unknown keyword (%.*s) in \\special",
+ (int)(p1 - cp), cp));
+ break;
+ }
+ if (memcmp(cp, keytab[keyno], p1 - cp) == 0) {
+ if (keyno >= N_ARGLESS_KEYS) {
+ while (isspace((int)*p1))
+ ++p1;
+ if (*p1 == '=') {
+ ++p1;
+ while (isspace((int)*p1))
+ ++p1;
+ }
+ if (keyno < N_ARGLESS_KEYS + 6) {
+ keyval[keyno - N_ARGLESS_KEYS] = atof(p1);
+ flags |= (1 << (keyno - N_ARGLESS_KEYS));
+ }
+ *q++ = ' ';
+ while (!isspace((int)*p1) && *p1 != '\0')
+ *q++ = *p1++;
+ }
+ *q++ = ' ';
+ *q++ = '@';
+ strcpy(q, keytab[keyno]);
+ q += strlen(q);
+ break;
+ }
+ }
+ cp = p1;
+ while (!isspace((int)*cp) && *cp != '\0')
+ ++cp;
+ while (isspace((int)*cp))
+ ++cp;
+ }
+ strcpy(q, " @setspecial\n");
+
+ bbox_valid = False;
+ /* Validate the case where both rwi and rhi are undefined
+ * (and llx, lly, urx, ury are properly defined) */
+ if (!(flags & 0x30) && (flags & 0xf) == 0xf) {
+ KEY_RWI = (KEY_URX - KEY_LLX) * 10;
+ flags |= 0x10;
+ }
+ if ((flags & 0x30) == 0x30 || ((flags & 0x30) && (flags & 0xf) == 0xf)) {
+ bbox_valid = True;
+ bbox_width = 0.1 * ((flags & 0x10) ? KEY_RWI
+ : KEY_RHI * (KEY_URX - KEY_LLX) / (KEY_URY -
+ KEY_LLY)) *
+ dimconv / currwin.shrinkfactor + 0.5;
+ bbox_voffset = bbox_height =
+ 0.1 * ((flags & 0x20) ? KEY_RHI : KEY_RWI * (KEY_URY - KEY_LLY) /
+ (KEY_URX - KEY_LLX))
+ * dimconv / currwin.shrinkfactor + 0.5;
+ }
+
+ if (INSIDE_MANE_WIN) {
+#if PS
+ psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, buffer);
+ /* talk directly with the DPSHandler here */
+ send_ps_file(filename, kpse_pict_format);
+ psp.drawend(" @endspecial");
+#else
+ draw_bbox();
+#endif
+ }
+ bbox_valid = False;
+}
+
+
+static void
+quote_special(char *cp)
+{
+ bbox_valid = False;
+
+#if PS
+ if (currwin.win == mane.win) {
+ psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y,
+ "@beginspecial @setspecial ");
+ /* talk directly with the DPSHandler here */
+ psp.drawraw(cp + 1);
+ psp.drawend(" @endspecial");
+ }
+#endif
+
+ /* nothing else to do--there's no bbox here */
+}
+
+#if PS
+
+static void
+scan_header(char *cp)
+{
+ char *filename;
+ /* default for .pro files: */
+ kpse_file_format_type our_format;
+
+#if PS_GS
+ if (gs_postpone_prescan)
+ return;
+#endif
+ filename = cp;
+ if (*cp == '\'' || *cp == '"') {
+ do
+ ++cp;
+ while (*cp != '\0' && *cp != *filename);
+ *cp = '\0';
+ ++filename;
+ }
+
+ psp.beginheader();
+ /* check for suffixes other than `.pro' (default PS headers),
+ case-insensitive */
+ if (str_is_suffix(".pfa", filename, False)
+ || str_is_suffix(".pfb", filename, False))
+ our_format = kpse_type1_format;
+ else if (str_is_suffix(".enc", filename, False))
+ our_format = kpse_enc_format;
+ else
+ our_format = kpse_tex_ps_header_format;
+
+ send_ps_file(filename, our_format);
+}
+
+static void
+scan_bang(char *cp)
+{
+ psp.beginheader();
+ psp.drawraw(cp + 1);
+}
+
+#endif /* PS */
+
+#if COLOR
+
+/*
+ * Table of dvips color names. Produced by passing the table in
+ * dvipsk/color.lpro through the following perl script, and then
+ * through sort.
+ *
+ * #! /usr/bin/perl -w
+ *
+ * sub cvpart {
+ * return $_[0] < 1.0 ? 1.0 - $_[0] : 0.0;
+ * }
+ *
+ * $pat = "^\\/(\\w+)\\s*\\{\\s*([0-9.]+)\\s*([0-9.]+)\\s*([0-9.]+)"
+ * . "\\s*([0-9.]+)\\s*setcmykcolor\\s*\\}\\s*DC\\s*\$";
+ * while (<STDIN>) {
+ * chop;
+ * if (/^%%/) {next;}
+ * if (/$pat/o) {
+ * printf "\t\tDVIPSCOLORDESC(%2d, \"%s\", %g, %g, %g),\n",
+ * length($1), $1,
+ * cvpart($2 + $5), cvpart($3 + $5), cvpart($4 + $5);
+ * }
+ * else {
+ * print "Bad line: ", $_, "\n";
+ * }
+ * }
+ */
+
+struct dvipscolor {
+ const char *name;
+ struct rgb color;
+};
+
+static Boolean
+parse_color(const char *cp0, const char *cp,
+ struct rgb *rgbp, Boolean generic_ps_flag)
+{
+ double r, g, b;
+ double k;
+ double hue, sat, bri;
+ char dummy[8];
+
+#define CVPART(x) ((int)((x) * 65535 + 0.5))
+#define COLOR_DESC(name, r, g, b) \
+ {name, {CVPART(r), CVPART(g), CVPART(b)}}
+
+ /* hash table to speed up lookup in following list of color names */
+ static hashTableT colornames_hash;
+ /*
+ Use a prime close to sizof colornames / sizeof colornames[0].
+ You might want to update this when extending the colornames array,
+ and to check the filling factor and average chain length by uncommenting the
+ hash_print(colornames_hash, True);
+ below. I usually go for filling > 50% and avg. chain len < 2.
+
+ The 68-elem array below results in:
+ 79 buckets, 43 nonempty (54%); 68 entries, average chain 1.6.
+ */
+ static const size_t colornames_hash_size = 79;
+
+ static struct dvipscolor colornames[] = {
+ COLOR_DESC("Red", 1, 0, 0),
+ COLOR_DESC("Tan", 0.86, 0.58, 0.44),
+ COLOR_DESC("Blue", 0, 0, 1),
+ COLOR_DESC("Cyan", 0, 1, 1),
+ COLOR_DESC("Gray", 0.5, 0.5, 0.5),
+ COLOR_DESC("Plum", 0.5, 0, 1),
+ COLOR_DESC("Black", 0, 0, 0),
+ COLOR_DESC("Brown", 0.4, 0, 0),
+ COLOR_DESC("Green", 0, 1, 0),
+ COLOR_DESC("Melon", 1, 0.54, 0.5),
+ COLOR_DESC("Peach", 1, 0.5, 0.3),
+ COLOR_DESC("Sepia", 0.3, 0, 0),
+ COLOR_DESC("White", 1, 1, 1),
+ COLOR_DESC("Maroon", 0.68, 0, 0),
+ COLOR_DESC("Orange", 1, 0.39, 0.13),
+ COLOR_DESC("Orchid", 0.68, 0.36, 1),
+ COLOR_DESC("Purple", 0.55, 0.14, 1),
+ COLOR_DESC("Salmon", 1, 0.47, 0.62),
+ COLOR_DESC("Violet", 0.21, 0.12, 1),
+ COLOR_DESC("Yellow", 1, 1, 0),
+ COLOR_DESC("Apricot", 1, 0.68, 0.48),
+ COLOR_DESC("Emerald", 0, 1, 0.5),
+ COLOR_DESC("Fuchsia", 0.45, 0.01, 0.92),
+ COLOR_DESC("Magenta", 1, 0, 1),
+ COLOR_DESC("SkyBlue", 0.38, 1, 0.88),
+ COLOR_DESC("Thistle", 0.88, 0.41, 1),
+ COLOR_DESC("BrickRed", 0.72, 0, 0),
+ COLOR_DESC("Cerulean", 0.06, 0.89, 1),
+ COLOR_DESC("Lavender", 1, 0.52, 1),
+ COLOR_DESC("Mahogany", 0.65, 0, 0),
+ COLOR_DESC("Mulberry", 0.64, 0.08, 0.98),
+ COLOR_DESC("NavyBlue", 0.06, 0.46, 1),
+ COLOR_DESC("SeaGreen", 0.31, 1, 0.5),
+ COLOR_DESC("TealBlue", 0.12, 0.98, 0.64),
+ COLOR_DESC("BlueGreen", 0.15, 1, 0.67),
+ COLOR_DESC("CadetBlue", 0.38, 0.43, 0.77),
+ COLOR_DESC("Dandelion", 1, 0.71, 0.16),
+ COLOR_DESC("Goldenrod", 1, 0.9, 0.16),
+ COLOR_DESC("LimeGreen", 0.5, 1, 0),
+ COLOR_DESC("OrangeRed", 1, 0, 0.5),
+ COLOR_DESC("PineGreen", 0, 0.75, 0.16),
+ COLOR_DESC("RawSienna", 0.55, 0, 0),
+ COLOR_DESC("RedOrange", 1, 0.23, 0.13),
+ COLOR_DESC("RedViolet", 0.59, 0, 0.66),
+ COLOR_DESC("Rhodamine", 1, 0.18, 1),
+ COLOR_DESC("RoyalBlue", 0, 0.5, 1),
+ COLOR_DESC("RubineRed", 1, 0, 0.87),
+ COLOR_DESC("Turquoise", 0.15, 1, 0.8),
+ COLOR_DESC("VioletRed", 1, 0.19, 1),
+ COLOR_DESC("Aquamarine", 0.18, 1, 0.7),
+ COLOR_DESC("BlueViolet", 0.1, 0.05, 0.96),
+ COLOR_DESC("DarkOrchid", 0.6, 0.2, 0.8),
+ COLOR_DESC("OliveGreen", 0, 0.6, 0),
+ COLOR_DESC("Periwinkle", 0.43, 0.45, 1),
+ COLOR_DESC("Bittersweet", 0.76, 0.01, 0),
+ COLOR_DESC("BurntOrange", 1, 0.49, 0),
+ COLOR_DESC("ForestGreen", 0, 0.88, 0),
+ COLOR_DESC("GreenYellow", 0.85, 1, 0.31),
+ COLOR_DESC("JungleGreen", 0.01, 1, 0.48),
+ COLOR_DESC("ProcessBlue", 0.04, 1, 1),
+ COLOR_DESC("RoyalPurple", 0.25, 0.1, 1),
+ COLOR_DESC("SpringGreen", 0.74, 1, 0.24),
+ COLOR_DESC("YellowGreen", 0.56, 1, 0.26),
+ COLOR_DESC("MidnightBlue", 0, 0.44, 0.57),
+ COLOR_DESC("YellowOrange", 1, 0.58, 0),
+ COLOR_DESC("CarnationPink", 1, 0.37, 1),
+ COLOR_DESC("CornflowerBlue", 0.35, 0.87, 1),
+ COLOR_DESC("WildStrawberry", 1, 0.04, 0.61),
+ };
+#undef CVPART
+#undef COLOR_DESC
+
+ UNUSED(cp0);
+
+ while (*cp == ' ') ++cp;
+
+ if (generic_ps_flag) {
+ /*
+ check for pstricks color specials.
+ The dummy buffer is to ensure that there are no other (general PS)
+ commands following (we wouldn't know how to deal with these).
+ */
+ if (sscanf(cp, "%lf %lf %lf setrgbcolor %7s", &r, &g, &b, dummy) == 3
+ && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1) {
+ rgbp->r = r * 65535 + 0.5;
+ rgbp->g = g * 65535 + 0.5;
+ rgbp->b = b * 65535 + 0.5;
+ return True;
+ }
+ else if (sscanf(cp, "%lf %lf %lf %lf setcmykcolor %7s", &r, &g, &b, &k, dummy) == 4
+ && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1
+ && k >= 0 && k <= 1) {
+ r = 1.0 - r - k; /* cyan --> red */
+ rgbp->r = (r < 0 ? 0 : r * 65535 + 0.5);
+ g = 1.0 - g - k; /* magenta --> green */
+ rgbp->g = (g < 0 ? 0 : g * 65535 + 0.5);
+ b = 1.0 - b - k; /* yellow --> blue */
+ rgbp->b = (b < 0 ? 0 : b * 65535 + 0.5);
+ return True;
+ }
+ else if (sscanf(cp, "%lf %lf %lf sethsbcolor %7s", &hue, &sat, &bri, dummy) == 3 && hue >= 0
+ && hue <= 1 && sat >= 0 && sat <= 1 && bri >= 0 && bri <= 1) {
+ int h = (int) (6 * hue);
+ double p = bri * (1 - sat);
+ double q = bri * (1 - sat * (6 * hue - h));
+ double t = p - q + bri;
+
+ switch (h) {
+ case 0: r = bri; g = t; b = p; break; /* Red - Yel */
+ case 1: r = q; g = bri; b = p; break; /* Yel - Grn */
+ case 2: r = p; g = bri; b = t; break; /* Grn - Cyn */
+ case 3: r = p; g = q; b = bri; break; /* Cyn - Blu */
+ case 4: r = t; g = p; b = bri; break; /* Blu - Mag */
+ case 5: r = bri; g = p; b = q; break; /* Mag - Red */
+ case 6: r = bri; g = b = p; break; /* Red */
+ }
+ rgbp->r = r * 65535 + 0.5;
+ rgbp->g = g * 65535 + 0.5;
+ rgbp->b = b * 65535 + 0.5;
+ return True;
+ }
+ else if (sscanf(cp, "%lf setgray %7s", &r, dummy) == 1 && r >= 0 && r <= 1) {
+ rgbp->r = rgbp->g = rgbp->b = r * 65535 + 0.5;
+ return True;
+ }
+ else
+ return False;
+ }
+
+ /* no generic PS command; must be a dvips color special */
+
+ if (memicmp(cp, "rgb ", 4) == 0) {
+ if (sscanf(cp + 3, "%lf %lf %lf", &r, &g, &b) == 3
+ && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1) {
+ rgbp->r = r * 65535 + 0.5;
+ rgbp->g = g * 65535 + 0.5;
+ rgbp->b = b * 65535 + 0.5;
+ return True;
+ }
+ }
+ else if (memicmp(cp, "gray ", 5) == 0) {
+ if (sscanf(cp + 4, "%lf", &r) == 1 && r >= 0 && r <= 1) {
+ rgbp->r = rgbp->g = rgbp->b = r * 65535 + 0.5;
+ return True;
+ }
+ }
+ else if (memicmp(cp, "cmyk ", 5) == 0) {
+ if (sscanf(cp + 4, "%lf %lf %lf %lf", &r, &g, &b, &k) == 4
+ && r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1
+ && k >= 0 && k <= 1) {
+ r = 1.0 - r - k; /* cyan --> red */
+ rgbp->r = (r < 0 ? 0 : r * 65535 + 0.5);
+ g = 1.0 - g - k; /* magenta --> green */
+ rgbp->g = (g < 0 ? 0 : g * 65535 + 0.5);
+ b = 1.0 - b - k; /* yellow --> blue */
+ rgbp->b = (b < 0 ? 0 : b * 65535 + 0.5);
+ return True;
+ }
+ }
+ else if (memicmp(cp, "hsb ", 4) == 0) {
+ if (sscanf(cp + 3, "%lf %lf %lf", &hue, &sat, &bri) == 3 && hue >= 0
+ && hue <= 1 && sat >= 0 && sat <= 1 && bri >= 0 && bri <= 1) {
+ int h = (int) (6 * hue);
+ double p = bri * (1 - sat);
+ double q = bri * (1 - sat * (6 * hue - h));
+ double t = p - q + bri;
+
+ switch (h) {
+ case 0: r = bri; g = t; b = p; break; /* Red - Yel */
+ case 1: r = q; g = bri; b = p; break; /* Yel - Grn */
+ case 2: r = p; g = bri; b = t; break; /* Grn - Cyn */
+ case 3: r = p; g = q; b = bri; break; /* Cyn - Blu */
+ case 4: r = t; g = p; b = bri; break; /* Blu - Mag */
+ case 5: r = bri; g = p; b = q; break; /* Mag - Red */
+ case 6: r = bri; g = b = p; break; /* Red */
+ }
+ rgbp->r = r * 65535 + 0.5;
+ rgbp->g = g * 65535 + 0.5;
+ rgbp->b = b * 65535 + 0.5;
+ return True;
+ }
+ }
+ else { /* is it a dvips color name? */
+ size_t idx;
+ size_t len = 0;
+ static char *testname = NULL;
+ static size_t testname_len = 0;
+ size_t testname_step = 16;
+
+ if (colornames_hash.size == 0) { /* initialize hash table */
+ size_t i;
+ colornames_hash = hash_create(colornames_hash_size);
+ /* insert color names and array indexes */
+ for (i = 0; i < (sizeof colornames / sizeof colornames[0]); i++) {
+ put_str_int_hash(&colornames_hash, colornames[i].name, i);
+ }
+ }
+ /* uncomment the following to get statistics on hashing: */
+ /* hash_print(colornames_hash, True); */
+
+ /* need to copy to a null-terminated string for hash lookup ... */
+ while (isalpha((int)cp[len])) {
+ ++len; /* get length of color name */
+ }
+ while (len >= testname_len) {
+ testname_len += testname_step;
+ testname = xrealloc(testname, testname_len);
+ }
+ memcpy(testname, cp, len);
+ testname[len] = '\0';
+
+ if (find_str_int_hash(&colornames_hash, testname, &idx)) {
+ *rgbp = colornames[idx].color;
+ return True;
+ }
+ }
+
+ /* not found */
+ XDVI_WARNING((stderr, "Ignoring invalid color name in special `%s'", cp0 == NULL ? "<NULL>" : cp0));
+ return False;
+}
+
+void
+init_page_colors(struct rgb *foreground, struct rgb *background)
+{
+ int i;
+
+ page_colors.size = total_pages;
+ page_colors.stack = xmalloc(page_colors.size * sizeof *page_colors.stack);
+
+ for (i = 0; i <= scanned_page + 1; ++i) {
+ page_colors.stack[i].bg = *background;
+ page_colors.stack[i].colorstack = foreground;
+ page_colors.stack[i].stacksize = 1;
+ }
+ for (; i < total_pages; i++) {
+ page_colors.stack[i].colorstack = NULL;
+ }
+
+ scanstack_head.color = *foreground;
+ scanstack_len = 1; /* nothing yet */
+ scanstack_current = &scanstack_head; /* stack position */
+}
+
+
+static void
+scan_bg_color(const char *cp)
+{
+ if (!resource.use_color)
+ return;
+
+ if (page_colors.stack == NULL)
+ init_page_colors(&fg_initial, &bg_initial);
+
+ ASSERT(scanned_page < (int)page_colors.size, "page_colors.size too small");
+ (void) parse_color(cp, cp + 11, &(page_colors.stack[scanned_page + 1].bg), False);
+}
+
+void
+scan_color(const char *cp)
+{
+ const char *cp1 = cp + 6;
+
+ if (!resource.use_color)
+ return;
+
+ while (*cp1 == ' ') ++cp1;
+
+ if (page_colors.stack == NULL)
+ init_page_colors(&fg_initial, &bg_initial);
+
+ if (memicmp(cp1, "push ", 5) == 0) {
+ if (scanstack_current->next == NULL) { /* if at end */
+ scanstack_current->next = xmalloc(sizeof *scanstack_current);
+ scanstack_current->next->prev = scanstack_current;
+ scanstack_current->next->next = NULL;
+ }
+ scanstack_current = scanstack_current->next;
+ ++scanstack_len;
+ if (!parse_color(cp, cp1 + 5, &scanstack_current->color, False))
+ scanstack_current->color = scanstack_current->prev->color;
+ }
+ else if (memicmp(cp1, "pop", 3) == 0) {
+ if (scanstack_len <= 1) {
+ XDVI_WARNING((stderr, "Color pop occurred with empty color stack."));
+ }
+ else {
+ scanstack_current = scanstack_current->prev;
+ --scanstack_len;
+ }
+ }
+ else {
+ (void) parse_color(cp, cp1, &scanstack_head.color, False);
+ if (scanstack_len > 1) {
+ struct colorframe *cfp;
+
+ XDVI_WARNING((stderr, "Global color change occurred with non-empty color stack!\n"
+ "Trying to recover by setting all stack entries to that color."));
+ for (cfp = scanstack_head.next;; cfp = cfp->next) {
+ cfp->color = scanstack_head.color;
+ if (cfp == scanstack_current) break;
+ }
+ }
+ }
+}
+
+void
+scan_color_eop(void)
+{
+ int i;
+ struct rgb *prev, *p1, *rgbp;
+ struct colorframe *cf;
+
+ if (page_colors.stack == NULL)
+ return;
+
+ /* set background color for next page */
+ if (scanned_page + 1 < total_pages) {
+ ASSERT(scanned_page + 1 < (int)page_colors.size, "page_colors.size too small");
+ page_colors.stack[scanned_page + 1].bg = page_colors.stack[scanned_page].bg;
+ }
+ ASSERT(scanned_page < (int)page_colors.size, "page_colors.size too small");
+ /* save the stack contents */
+ page_colors.stack[scanned_page].stacksize = scanstack_len;
+
+ prev = &fg_initial;
+ i = 1;
+ if (scanned_page > 0) {
+ prev = page_colors.stack[scanned_page - 1].colorstack;
+ i = page_colors.stack[scanned_page - 1].stacksize;
+ }
+ if (scanstack_len <= i) {
+ /* try to reuse the previous array */
+ p1 = prev;
+ cf = &scanstack_head;
+ for (i = 0;;) {
+ if (p1->r != cf->color.r || p1->g != cf->color.g || p1->b != cf->color.b)
+ break;
+ if (++i >= scanstack_len) { /* end loop; reuse memory */
+ page_colors.stack[scanned_page].colorstack = prev;
+ return; /* done */
+ }
+ ++p1;
+ cf = cf->next;
+ }
+ }
+ page_colors.stack[scanned_page].colorstack = rgbp = xmalloc(scanstack_len * sizeof *rgbp);
+ cf = &scanstack_head;
+ for (i = 0; i < scanstack_len; ++i) {
+ *rgbp++ = cf->color;
+ cf = cf->next;
+ }
+}
+
+
+/*
+ * We don't actually do any X calls yet to change colors; that can wait
+ * until a character or rule needs to be drawn.
+ */
+
+void
+set_fg_color(const struct rgb *color)
+{
+ struct fgrec **fgpp;
+
+ if (fg_current != NULL
+ && color->r == fg_current->color.r
+ && color->g == fg_current->color.g
+ && color->b == fg_current->color.b) {
+ return;
+ }
+
+ ASSERT(bg_current != NULL, "Background color not initialized");
+ for (fgpp = &bg_current->fg_head;;) {
+ fg_current = *fgpp;
+ if (fg_current == NULL) { /* if color is not in list */
+ fg_current = *fgpp = xmalloc(sizeof *fg_current);
+ fg_current->next = NULL;
+ fg_current->color = *color;
+ fg_current->pixel_good = False;
+#if GREY
+ fg_current->palette_good = False;
+#endif
+ break;
+ }
+ if (fg_current->color.r == color->r
+ && fg_current->color.g == color->g
+ && fg_current->color.b == color->b)
+ break;
+ fgpp = &fg_current->next;
+ }
+ if (globals.debug & DBG_DVI)
+ printf("Changing fg color to %5d %5d %5d\n",
+ color->r, color->g, color->b);
+}
+
+#if 0
+static void
+show_stack(void) {
+ struct colorframe *ptr;
+ int i;
+ fprintf(stderr, "FG: %d,%d,%d\n", fg_current->color.r, fg_current->color.b, fg_current->color.g);
+ for (i = 0, ptr = rcs_top; ptr != NULL; ptr = ptr->prev, i++) {
+ fprintf(stderr, "stack %d: %d,%d,%d\n", i, ptr->color.r, ptr->color.b, ptr->color.g);
+ }
+}
+#endif
+
+void
+color_special(const char *cp)
+{
+ while (*cp == ' ') ++cp;
+
+ if (memicmp(cp, "push ", 5) == 0) {
+ if (rcs_top == NULL) {
+ if (rcs_head == NULL) {
+ rcs_head = xmalloc(sizeof *rcs_head);
+ rcs_head->prev = rcs_head->next = NULL;
+ }
+ rcs_top = rcs_head;
+ }
+ else {
+ struct colorframe *rcs_next;
+
+ rcs_next = rcs_top->next;
+ if (rcs_next == NULL) {
+ rcs_next = rcs_top->next = xmalloc(sizeof *rcs_next);
+ rcs_next->prev = rcs_top;
+ rcs_next->next = NULL;
+ }
+ rcs_top = rcs_next;
+ }
+ if (!parse_color(NULL, cp + 5, &rcs_top->color, False)) {
+ if (rcs_top->prev != NULL)
+ rcs_top->color = rcs_top->prev->color;
+ else
+ rcs_top->color = color_bottom[color_bot_size - 1];
+ }
+ set_fg_color(&rcs_top->color);
+ }
+ else if (memicmp(cp, "pop", 3) == 0) {
+ /* Pop stack */
+ if (rcs_top != NULL) {
+ if (color_bot_size > 0)
+ rcs_top = rcs_top->prev;
+ else
+ return;
+ }
+ else if (color_bot_size > 1)
+ --color_bot_size;
+ else {
+ if (scanned_page_reset >= 0) {
+ /* turn on scanning and redraw the page */
+ scanned_page = scanned_page_color = scanned_page_reset = -1;
+#if PS
+ scanned_page_ps = scanned_page;
+#endif
+ /* fprintf(stderr, "forcing redraw!!!\n"); */
+ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */
+ longjmp(globals.ev.canit, 1);
+ }
+ return;
+ }
+ /* fprintf(stderr, "bot_size: %d\n", color_bot_size); */
+ set_fg_color(rcs_top != NULL ? &rcs_top->color
+ : &color_bottom[color_bot_size - 1]);
+ }
+ else {
+ struct rgb color;
+
+ if (!parse_color(NULL, cp, &color, False))
+ return;
+
+ /* clear stack */
+ if (rcs_head == NULL) {
+ rcs_head = xmalloc(sizeof *rcs_head);
+ rcs_head->prev = rcs_head->next = NULL;
+ }
+ rcs_top = rcs_head;
+ color_bot_size = 0;
+
+ /* Change top of stack */
+ rcs_top->color = color;
+
+ set_fg_color(&color);
+ }
+}
+
+#endif /* COLOR */
+
+static unsigned int
+myatopix(const char **pp)
+{
+#define SCR_LEN 16
+ unsigned int value;
+ const char *cp = *pp;
+ char scr[16];
+ const char *p0, *p1;
+
+ p0 = cp;
+ while ((*cp >= '0' && *cp <= '9') || *cp == '.')
+ ++cp;
+ p1 = cp;
+ while (isspace((int)*cp))
+ ++cp;
+ if (*cp >= 'a' && *cp <= 'z' && cp[1] >= 'a' && cp[1] <= 'z') {
+ /* if units are present */
+ if (p1 - p0 <= SCR_LEN - 3) {
+ sprintf(scr, "%.*s%c%c", (int)(p1 - p0), p0, *cp, cp[1]);
+ value = atopix(scr);
+ }
+ else
+ value = 0;
+ cp += 2;
+ }
+ else
+ value = atopix(p0);
+
+ *pp = cp;
+ return value;
+#undef SCR_LEN
+}
+
+static void
+scan_papersize(const char *cp0)
+{
+ const char *cp = cp0;
+ unsigned int w, h;
+ double mag = 1.0;
+
+ if (ignore_papersize_specials)
+ return;
+
+ if (*cp == '*') {
+ do
+ ++cp;
+ while (isspace((int)*cp));
+ mag = magnification * .001;
+ }
+
+ w = myatopix(&cp) * mag + 0.5;
+
+ while (isspace((int)*cp))
+ ++cp;
+ if (*cp == ',')
+ do
+ ++cp;
+ while (isspace((int)*cp));
+
+ h = myatopix(&cp) * mag + 0.5;
+
+ if (w == 0 || h == 0)
+ XDVI_WARNING((stderr, "Invalid papersize special `%s'", cp0));
+ else {
+ /* we have a paper size special; disable xdvirc_geometry:
+ fprintf(stderr, "---------- scanned papersize: %dx%d\n", w, h);
+ resource.xdvirc_geometry = NULL;
+ */
+ pageinfo_set_page_width(scanned_page + 1, w);
+ pageinfo_set_window_width(scanned_page + 1, w);
+ pageinfo_set_page_height(scanned_page + 1, h);
+ pageinfo_set_window_height(scanned_page + 1, h);
+ }
+}
+
+/*
+ * The following copyright message applies to the rest of this file. --PV
+ */
+
+/*
+ * This program is Copyright (C) 1987 by the Board of Trustees of the
+ * University of Illinois, and by the author Dirk Grunwald.
+ *
+ * This program may be freely copied, as long as this copyright
+ * message remaines affixed. It may not be sold, although it may
+ * be distributed with other software which is sold. If the
+ * software is distributed, the source code must be made available.
+ *
+ * No warranty, expressed or implied, is given with this software.
+ * It is presented in the hope that it will prove useful.
+ *
+ * Hacked in ignorance and desperation by jonah@db.toronto.edu
+ */
+
+/*
+ * The code to handle the \specials generated by tpic was modified
+ * by Dirk Grunwald using the code Tim Morgan at Univ. of Calif, Irvine
+ * wrote for TeXsun.
+ */
+
+static char *
+endofcommand(char *cp)
+{
+ while (isspace((int)*cp))
+ ++cp;
+ if (*cp != '=')
+ return NULL;
+ do
+ ++cp;
+ while (isspace((int)*cp));
+ return cp;
+}
+
+#define CMD(x, y) ((x) << 8 | (y))
+
+void
+applicationDoSpecial(char *cp, size_t len)
+{
+ char *p;
+
+ if (globals.debug & DBG_DVI)
+ printf(" `%s'\n", cp);
+
+ while (isspace((int)*cp))
+ ++cp;
+
+ /* Ignore initial "xdvi:" */
+ if (memcmp(cp, "xdvi:", 5) == 0) {
+ cp += 5;
+ while (isspace((int)*cp))
+ ++cp;
+ }
+
+ /* PostScript specials */
+#ifdef MAGICK
+ if (resource.useMAGICK) {
+ if (Magick_parse_special(cp))
+ return;
+ }
+#endif
+
+ if (*cp == '"') {
+ quote_special(cp);
+ return;
+ }
+ if (memicmp(cp, "ps:", 3) == 0) {
+ cp += 3;
+ psfig_special(cp);
+ /* check for hdvips hyperlinks */
+ if (memicmp(cp, "sdict begin ", strlen("sdict begin ")) == 0) {
+ static Boolean warned_hypertex_too_old = False;
+ char *match = NULL;
+ if (warned_hypertex_too_old) /* don't continue evaluating links in this case */
+ return;
+ cp += strlen("sdict begin ");
+ if (memcmp(cp, "H.S", 3) == 0
+ || memcmp(cp, "H.R", 3) == 0
+ || memcmp(cp, "H.B", 3) == 0
+ /* following 2 conditions could be more restrictive: between `begin' and H.A/H.L,
+ there should be a single number (baselineskip in pt) */
+ || (match = strstr(cp, "H.A")) != NULL
+ || (match = strstr(cp, "H.L")) != NULL
+ || (match = strstr(cp, "/Action")) != NULL
+ || (match = strstr(cp, "/Link")) != NULL
+ || (match = strstr(cp, "/View")) != NULL) {
+ if (match != NULL)
+ htex_do_special(match, len - 3 - (match - cp) - strlen("sdict begin "));
+ else
+ htex_do_special(cp, len - strlen("sdict begin "));
+ }
+ else if (!warned_hypertex_too_old && strstr(cp, "HyperStart") != NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN, NULL,
+ "This DVI was created with a too old version of the `dvips' hyperref driver - "
+ "disabling hyperlinks.\n"
+ "To fix this, you should either upgrade to a current version of hyperref "
+ "(see http://www.tug.org/applications/hyperref/), "
+ "or use the `hypertex' package option, like this:\n\\usepackage[hypertex]{hyperref}\n"
+ "(Be aware though that this option won't work for PS->PDF conversion!)");
+ warned_hypertex_too_old = True;
+ }
+ }
+ /* When not ignoring SDict entries, the distiller and pagecolor
+ code in lshort.dvi from CTAN:info/lshort/russian/lshrtdvi.zip
+ causes a failed assertion for 'color_bot_size > 0' in dvi-draw.c;
+ there's something wrong with the parsing order/event handling here
+ (see bug #856547).
+ But we also don't want those entries to trigger erasepage_gs()
+ [deleted in r3810], so it's correct to ignore them here.
+ */
+ return;
+ }
+ if (memicmp(cp, "psfile", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) {
+ epsf_special(p);
+ return;
+ }
+ if (memicmp(cp, "html:", 5) == 0) {
+ htex_do_special(cp + 5, len - 5);
+ return;
+ }
+
+#if COLOR
+ if (memicmp(cp, "color ", 6) == 0) {
+ /* fprintf(stderr, "------------- color special\n"); */
+ if (resource.use_color)
+ color_special(cp + 6);
+ return;
+ }
+#endif
+
+ /* these should have been scanned */
+ if (*cp == '!'
+ || (memicmp(cp, "header", 6) == 0 && endofcommand(cp + 6) != NULL)) {
+#ifdef PS
+ if (resource.postscript != 0 && scanned_page_reset >= 0) {
+ /* turn on scanning and redraw the page */
+ scanned_page = scanned_page_ps = scanned_page_reset = -1;
+# if COLOR
+ scanned_page_color = scanned_page;
+# endif
+ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */
+ longjmp(globals.ev.canit, 1);
+ }
+#endif /* PS */
+ return;
+ }
+
+ if (memicmp(cp, "background ", 11) == 0) {
+#if COLOR
+ if (resource.use_color && scanned_page_reset >= 0) {
+ /* turn on scanning and redraw the page */
+ scanned_page = scanned_page_color = scanned_page_reset = -1;
+# if PS
+ scanned_page_ps = scanned_page;
+# endif
+ /* fprintf(stderr, "forcing redraw!\n"); */
+ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */
+ longjmp(globals.ev.canit, 1);
+ }
+#endif /* COLOR */
+ return;
+ }
+
+ if (memcmp(cp, "papersize", 9) == 0 && endofcommand(cp + 9) != NULL) {
+ m_have_papersize_special = True;
+ if (scanned_page_reset >= 0) {
+ /* turn on scanning and redraw the page */
+ scanned_page = scanned_page_reset = -1;
+#if PS
+ scanned_page_ps = scanned_page;
+#endif
+#if COLOR
+ scanned_page_color = scanned_page;
+#endif
+ globals.ev.flags |= EV_NEWPAGE; /* force a redraw */
+ longjmp(globals.ev.canit, 1);
+ }
+ return;
+ }
+
+ /* tpic specials */
+
+ if (*cp >= 'a' && *cp <= 'z' && cp[1] >= 'a' && cp[1] <= 'z' &&
+ (isspace((int)cp[2]) || cp[2] == '\0')) {
+ switch (CMD(*cp, cp[1])) {
+ case CMD('p', 'n'):
+ set_pen_size(cp + 2);
+ return;
+ case CMD('f', 'p'):
+ flush_path();
+ return;
+ case CMD('d', 'a'):
+ flush_dashed(cp + 2, False);
+ return;
+ case CMD('d', 't'):
+ flush_dashed(cp + 2, True);
+ return;
+ case CMD('p', 'a'):
+ add_path(cp + 2);
+ return;
+ case CMD('a', 'r'):
+ arc(cp + 2, False);
+ return;
+ case CMD('i', 'a'):
+ arc(cp + 2, True);
+ return;
+ case CMD('s', 'p'):
+ flush_spline();
+ return;
+ case CMD('s', 'h'):
+ shade_last();
+ return;
+ case CMD('w', 'h'):
+ whiten_last();
+ return;
+ case CMD('b', 'k'):
+ blacken_last();
+ return;
+ case CMD('i', 'p'): /* throw away the path -- jansteen */
+ path_len = 0;
+ return;
+ }
+ }
+
+ if (memcmp(cp, "src:", 4) == 0) {
+ have_src_specials = True;
+ }
+ else if (globals.warn_spec_now)
+ XDVI_WARNING((stderr, "Special \"%s\" not implemented.", cp));
+}
+
+#undef CMD
+
+
+Boolean
+scan_special(char *cp, int cp_len, void *data)
+{
+ char *p;
+ Boolean dummy_ret = True; /* currently unused;
+ FIXME: use return value to avoid redundant calls (instead of longjmp()) */
+ UNUSED(cp_len); /* TODO: could probably utilize this in call to htex_prescan_special() */
+ ASSERT(data != NULL, "Must pass a data pointer when using HTEX");
+
+ if (globals.debug & DBG_PS)
+ printf("Scanning special `%s'.\n", cp);
+
+ while (isspace((int)*cp))
+ ++cp;
+
+ /* Ignore initial "xdvi:" */
+ if (memcmp(cp, "xdvi:", 5) == 0) {
+ cp += 5;
+ while (isspace((int)*cp))
+ ++cp;
+ }
+
+ if (memicmp(cp, "ps:", 3) == 0) {
+ cp += 3;
+ /* check for hdvips hyperlinks */
+ if (memicmp(cp, "sdict begin ", strlen("sdict begin ")) == 0) {
+ static Boolean hypertex_too_old = False;
+ char *match = NULL;
+ cp += strlen("sdict begin ");
+
+ if (strstr(cp, "HyperStart") != NULL)
+ hypertex_too_old = True;
+ if (hypertex_too_old)
+ return False;
+
+ if (memcmp(cp, "H.S", 3) == 0
+ || memcmp(cp, "H.R", 3) == 0
+ || memcmp(cp, "H.B", 3) == 0
+ /* following 2 conditions could be more restrictive: between `begin' and H.A/H.L,
+ there should be a single number (baselineskip in pt) */
+ || (match = strstr(cp, "H.A")) != NULL
+ || (match = strstr(cp, "H.L")) != NULL
+ || (match = strstr(cp, "/Action")) != NULL
+ || (match = strstr(cp, "/Link")) != NULL
+ || (match = strstr(cp, "/View")) != NULL) {
+ if (match != NULL)
+ htex_prescan_special(match, cp_len, data);
+ else
+ htex_prescan_special(cp, cp_len, data);
+ }
+ }
+
+ }
+ else if (memicmp(cp, "html:", strlen("html:")) == 0) {
+ size_t offset = strlen("html:");
+#if 0
+ Boolean found =
+#endif
+ htex_prescan_special(cp + offset, cp_len - offset, data);
+#if 0
+ /* if searching for a specific string, return as soon as it's found - not yet implemented */
+ if (my_data != NULL && my_data->scan_type == HTEX_ANCHOR_STRING && found) {
+ return True;
+ }
+#endif
+ }
+ /* do the following only if not searching for an anchor string */
+ if (((struct htex_prescan_data *)data)->scan_type != HTEX_ANCHOR_STRING) {
+#if PS
+# if COLOR
+ if (scanned_page_ps <= scanned_page)
+# endif
+ {
+ if (*cp == '!') {
+ scan_bang(cp);
+ return dummy_ret;
+ }
+ else if (memicmp(cp, "header", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) {
+ scan_header(p);
+ return dummy_ret;
+ }
+ }
+#endif /* PS */
+
+#if COLOR
+# if PS
+ if (scanned_page_color <= scanned_page)
+# endif
+ {
+ if (memicmp(cp, "background ", 11) == 0) {
+ scan_bg_color(cp);
+ return dummy_ret;
+ }
+ else if (memicmp(cp, "color ", 6) == 0) {
+ scan_color(cp);
+ return dummy_ret;
+ }
+ }
+#endif /* COLOR */
+ if (memcmp(cp, "papersize", 9) == 0 && (p = endofcommand(cp + 9)) != NULL) {
+ m_have_papersize_special = True;
+ scan_papersize(p);
+ return dummy_ret;
+ }
+ }
+ return dummy_ret;
+}
+
+
+/* #define xspell_conv(n) spell_conv0(n, current_dimconv) */
+#define xpixel_conv(x) ((int) ((x) >> 16))
+#define G_PXL_H xpixel_conv(currinf.data.dvi_h)
+
+/* cp is not const, because of endofcommand(). */
+void
+geom_do_special(struct scan_info *info, char *cp, double current_dimconv)
+{
+ const char *p;
+ struct geom_info *g_info = (struct geom_info *)info->data;
+
+ UNUSED(current_dimconv);
+
+ while (isspace((int)*cp))
+ ++cp;
+
+ /* Ignore initial "xdvi:" */
+ if (memcmp(cp, "xdvi:", 5) == 0) {
+ cp += 5;
+ while (isspace((int)*cp))
+ ++cp;
+ }
+
+ if (memicmp(cp, "psfile", 6) == 0 && (p = endofcommand(cp + 6)) != NULL) {
+ /* compute epsf bounding box */
+ char c;
+ int flags = 0;
+ double keyval[6];
+
+ c = *p;
+ if (c == '\'' || c == '"') {
+ do
+ ++p;
+ while (*p != '\0' && *p != c);
+ }
+ else
+ while (*p != '\0' && !isspace((int)*p))
+ ++p;
+ while (isspace((int)*p))
+ ++p;
+ while (*p != '\0') {
+ const char *p1 = p;
+ size_t keyno;
+
+ while (*p1 != '=' && !isspace((int)*p1) && *p1 != '\0')
+ ++p1;
+ for (keyno = 0; keyno < NKEYS; ++keyno) {
+ if (memcmp(p, keytab[keyno], p1 - p) == 0) {
+ if (keyno >= N_ARGLESS_KEYS) {
+ while (isspace((int)*p1))
+ ++p1;
+ if (*p1 == '=') {
+ ++p1;
+ while (isspace((int)*p1))
+ ++p1;
+ }
+ if (keyno < N_ARGLESS_KEYS + 6) {
+ keyval[keyno - N_ARGLESS_KEYS] = atof(p1);
+ flags |= (1 << (keyno - N_ARGLESS_KEYS));
+ }
+ while (!isspace((int)*p1) && *p1 != '\0')
+ ++p1;
+ }
+ break;
+ }
+ }
+ p = p1;
+ while (!isspace((int)*p) && *p != '\0')
+ ++p;
+ while (isspace((int)*p))
+ ++p;
+ }
+
+ if ((flags & 0x30) == 0x30 || ((flags & 0x30) && (flags & 0xf) == 0xf)) {
+ long x = G_PXL_H;
+ long y = PXL_V;
+ long bbox_w;
+ long bbox_h;
+
+ bbox_w = 0.1 * ((flags & 0x10) ? KEY_RWI
+ : KEY_RHI * (KEY_URX - KEY_LLX) / (KEY_URY -
+ KEY_LLY)) *
+ dimconv + 0.5;
+ bbox_h =
+ 0.1 * ((flags & 0x20) ? KEY_RHI : KEY_RWI *
+ (KEY_URY - KEY_LLY) / (KEY_URX - KEY_LLX))
+ * dimconv + 0.5;
+
+ g_info->geom_box(info, x, y - bbox_h, x + bbox_w, y);
+ }
+ }
+ else if (memicmp(cp, "ps::[begin]", 11) == 0) {
+ /* compute psfig bounding box */
+ long bbox_w, bbox_h;
+
+ if (sscanf(cp + 11, "%ld %ld\n", &bbox_w, &bbox_h) >= 2) {
+ long x = G_PXL_H;
+ long y = PXL_V;
+
+ bbox_w = xpixel_conv(spell_conv(bbox_w));
+ bbox_h = xpixel_conv(spell_conv(bbox_h));
+
+ g_info->geom_box(info, x, y, x + bbox_w, y + bbox_h);
+ }
+ }
+}
diff --git a/Build/source/texk/xdvik/special.h b/Build/source/texk/xdvik/special.h
new file mode 100644
index 00000000000..e6994d3f995
--- /dev/null
+++ b/Build/source/texk/xdvik/special.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2002-2016 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef SPECIAL_H_
+#define SPECIAL_H_
+
+#include "xdvi.h"
+#include "events.h"
+
+extern Boolean scan_special(char *str, int str_len, void *data);
+
+#if PS
+
+struct psprocs {
+ void (*toggle) (int flag);
+ void (*destroy) (void);
+ void (*interrupt) (void);
+ void (*endpage) (void);
+ void (*drawbegin) (int, int, const char *);
+ void (*drawraw) (const char *);
+ void (*drawfile) (const char *, FILE *);
+ void (*drawend) (const char *);
+ void (*beginheader) (void);
+ void (*endheader) (void);
+ void (*newdoc) (void);
+};
+
+extern void ps_destroy(void);
+extern void ps_destroy_nofree(void);
+extern void drawbegin_none(int, int, const char *);
+extern void draw_bbox(void);
+extern void display_bboxes(void);
+extern void clear_bboxes(void);
+extern void save_bbox(void);
+
+#endif
+
+extern void applicationDoSpecial(char *str, size_t len);
+extern void geom_do_special(struct scan_info *, char *, double);
+extern void color_special(const char *colorspec);
+
+extern void init_prescan(void);
+
+/*
+ info on whether this DVI file contains papersize specials,
+ and a resetting method.
+*/
+extern void reset_papersize_special(void);
+extern Boolean have_papersize_special(void);
+
+#if COLOR
+extern void init_page_colors(struct rgb *foreground, struct rgb *background);
+extern void scan_color_eop(void);
+extern void scan_color(const char *color);
+struct rgb; /* forward declaration */
+extern void set_fg_color(const struct rgb *);
+#endif
+
+#endif /* SPECIAL_H_ */
diff --git a/Build/source/texk/xdvik/squeeze/Makefile.am b/Build/source/texk/xdvik/squeeze/Makefile.am
new file mode 100644
index 00000000000..8f81ba88ee3
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/Makefile.am
@@ -0,0 +1,16 @@
+## Makefile.am for the TeX Live subdirectory texk/xdvik/squeeze/
+##
+## Copyright (C) 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+##
+AM_CFLAGS = $(WARNING_CFLAGS)
+
+noinst_PROGRAMS = squeeze
+
+nodist_noinst_DATA = stamp-squeeze
+
+stamp-squeeze: squeeze$(EXEEXT)
+ $(AM_V_at)echo timestamp >$@
+
+CLEANFILES = stamp-squeeze
+
diff --git a/Build/source/texk/xdvik/squeeze/Makefile.in b/Build/source/texk/xdvik/squeeze/Makefile.in
new file mode 100644
index 00000000000..00bbca36960
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/Makefile.in
@@ -0,0 +1,724 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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 = :
+noinst_PROGRAMS = squeeze$(EXEEXT)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+squeeze_SOURCES = squeeze.c
+squeeze_OBJECTS = squeeze.$(OBJEXT)
+squeeze_LDADD = $(LDADD)
+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@
+depcomp = $(SHELL) $(top_srcdir)/../../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/squeeze.Po
+am__mv = mv -f
+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 = $(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 = squeeze.c
+DIST_SOURCES = squeeze.c
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+DATA = $(nodist_noinst_DATA)
+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
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../../build-aux/compile \
+ $(top_srcdir)/../../../build-aux/depcomp \
+ $(top_srcdir)/../../../build-aux/install-sh \
+ $(top_srcdir)/../../../build-aux/missing \
+ ../../../build-aux/ar-lib ../../../build-aux/compile \
+ ../../../build-aux/config.guess ../../../build-aux/config.sub \
+ ../../../build-aux/depcomp ../../../build-aux/install-sh \
+ ../../../build-aux/ltmain.sh ../../../build-aux/missing \
+ ../../../build-aux/texinfo.tex ../../../build-aux/ylwrap
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+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@
+AM_CFLAGS = $(WARNING_CFLAGS)
+nodist_noinst_DATA = stamp-squeeze
+CLEANFILES = stamp-squeeze
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+squeeze$(EXEEXT): $(squeeze_OBJECTS) $(squeeze_DEPENDENCIES) $(EXTRA_squeeze_DEPENDENCIES)
+ @rm -f squeeze$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(squeeze_OBJECTS) $(squeeze_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/squeeze.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.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) '$<'`
+
+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"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+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
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @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
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(DATA)
+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-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f ./$(DEPDIR)/squeeze.Po
+ -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 -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f ./$(DEPDIR)/squeeze.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \
+ check-am clean clean-cscope clean-generic clean-noinstPROGRAMS \
+ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+ dist-zstd distcheck distclean distclean-compile \
+ distclean-generic distclean-tags distcleancheck distdir \
+ distuninstallcheck 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 pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+stamp-squeeze: squeeze$(EXEEXT)
+ $(AM_V_at)echo timestamp >$@
+
+# 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/xdvik/squeeze/aclocal.m4 b/Build/source/texk/xdvik/squeeze/aclocal.m4
new file mode 100644
index 00000000000..d9f7204a3b4
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/aclocal.m4
@@ -0,0 +1,1170 @@
+# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.3], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../../../m4/kpse-common.m4])
+m4_include([../../../m4/kpse-warnings.m4])
diff --git a/Build/source/texk/xdvik/squeeze/configure b/Build/source/texk/xdvik/squeeze/configure
new file mode 100755
index 00000000000..0c302e5eb6d
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/configure
@@ -0,0 +1,5660 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for xdvik squeeze 22.84.15.
+#
+# Report bugs to <tex-k@tug.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='xdvik squeeze'
+PACKAGE_TARNAME='xdvik-squeeze'
+PACKAGE_VERSION='22.84.15'
+PACKAGE_STRING='xdvik squeeze 22.84.15'
+PACKAGE_BUGREPORT='tex-k@tug.org'
+PACKAGE_URL=''
+
+ac_unique_file="squeeze.c"
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+WARNING_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_compiler_warnings
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures xdvik squeeze 22.84.15 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/xdvik-squeeze]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of xdvik squeeze 22.84.15:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-compiler-warnings=[no|min|yes|max|all]
+ Turn on compiler warnings [default: yes if
+ maintainer-mode, min otherwise]
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <tex-k@tug.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+xdvik squeeze configure 22.84.15
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by xdvik squeeze $as_me 22.84.15, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_aux_dir=
+for ac_dir in ../../../build-aux "$srcdir"/../../../build-aux; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../build-aux \"$srcdir\"/../../../build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+
+
+am__api_version='1.16'
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+# Check whether --enable-compiler-warnings was given.
+if test "${enable_compiler_warnings+set}" = set; then :
+ enableval=$enable_compiler_warnings;
+fi
+case $enable_compiler_warnings in #(
+ no | min | yes | max | all) :
+ ;; #(
+ *) :
+ if test "x$enable_maintainer_mode" = xyes; then :
+ enable_compiler_warnings=yes
+else
+ enable_compiler_warnings=min
+fi ;;
+esac
+
+##tldbg KPSE_BASIC: Remember xdvik squeeze () as Kpse_Package (for future messages).
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='xdvik-squeeze'
+ VERSION='22.84.15'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler accepts prototypes" >&5
+$as_echo_n "checking whether the compiler accepts prototypes... " >&6; }
+if ${kb_cv_c_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+extern void foo(int i,...);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kb_cv_c_prototypes=yes
+else
+ kb_cv_c_prototypes=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kb_cv_c_prototypes" >&5
+$as_echo "$kb_cv_c_prototypes" >&6; }
+if test "x$kb_cv_c_prototypes" = xno; then
+ as_fn_error $? "Sorry, your compiler does not understand prototypes." "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5
+$as_echo_n "checking what warning flags to pass to the C compiler... " >&6; }
+if ${kpse_cv_warning_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$GCC" = xyes; then
+ kpse_cv_warning_cflags=
+if test "x$enable_compiler_warnings" != xno; then
+ kpse_cv_warning_cflags="-Wimplicit -Wreturn-type"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #(
+ *) :
+ ;;
+esac
+ case `$CC -dumpversion` in #(
+ 3.[234].* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmin; then
+ kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations"
+ if test "x$enable_compiler_warnings" != xyes; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmax; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow"
+ fi
+ fi
+ fi
+fi
+elif test "x$enable_compiler_warnings" = xno; then
+ kpse_cv_warning_cflags=
+else
+ kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5
+$as_echo "$kpse_cv_warning_cflags" >&6; }
+WARNING_CFLAGS=$kpse_cv_warning_cflags
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by xdvik squeeze $as_me 22.84.15, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <tex-k@tug.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+xdvik squeeze config.status 22.84.15
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/Build/source/texk/xdvik/squeeze/configure.ac b/Build/source/texk/xdvik/squeeze/configure.ac
new file mode 100644
index 00000000000..ba2f11fcca9
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/configure.ac
@@ -0,0 +1,21 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl Copyright (C) 2009, 2012 Peter Breitenlohner <tex-live@tug.org>
+dnl
+dnl This file is free software; the copyright holder
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+AC_INIT([xdvik squeeze], [22.84.15], [tex-k@tug.org])
+AC_PREREQ([2.63])
+AC_CONFIG_SRCDIR([squeeze.c])
+AC_CONFIG_AUX_DIR([../../../build-aux])
+AC_CONFIG_MACRO_DIR([../../../m4])
+
+KPSE_BASIC([xdvik squeeze])
+
+AC_PROG_CC
+
+AC_CONFIG_FILES([Makefile])
+
+AC_OUTPUT
diff --git a/Build/source/texk/xdvik/squeeze/squeeze.c b/Build/source/texk/xdvik/squeeze/squeeze.c
new file mode 100644
index 00000000000..58ede78a120
--- /dev/null
+++ b/Build/source/texk/xdvik/squeeze/squeeze.c
@@ -0,0 +1,195 @@
+/*========================================================================*\
+
+Copyright (c) 1994-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+This routine is adapted from the squeeze.c that comes with dvips;
+it bears the message:
+This software is Copyright 1988 by Radical Eye Software.
+Used with permission.
+
+\*========================================================================*/
+
+/*
+ * This routine squeezes a PostScript file down to its
+ * minimum. We parse and then output it.
+ * Adapted for xdvi 1/94. Writes a C program that contains the PS file
+ * as a constant string.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+
+#define LINELENGTH (72)
+#define BUFLENGTH (1000)
+#undef putchar
+#define putchar(a) (void)putc(a, out) ;
+FILE *in, *out;
+static int linepos = 0;
+static int lastspecial = 1;
+static int stringlen = 0;
+/*
+ * This next routine writes out a `special' character. In this case,
+ * we simply put it out, since any special character terminates the
+ * preceding token.
+ */
+static void
+specialout(char c)
+{
+ if (linepos + 1 > LINELENGTH) {
+ (void)fputs("\\n\\\n", out);
+ stringlen += linepos + 1;
+ linepos = 0;
+ }
+ putchar(c);
+ linepos++;
+ lastspecial = 1;
+}
+
+static void
+strout(char *s)
+{
+ if (linepos + strlen(s) > LINELENGTH) {
+ (void)fputs("\\n\\\n", out);
+ stringlen += linepos + 1;
+ linepos = 0;
+ }
+ linepos += strlen(s);
+ while (*s != 0)
+ putchar(*s++);
+ lastspecial = 1;
+}
+
+static void
+cmdout(char *s)
+{
+ int l;
+
+ l = strlen(s);
+ if (linepos + l + 1 > LINELENGTH) {
+ (void)fputs("\\n\\\n", out);
+ stringlen += linepos + 1;
+ linepos = 0;
+ lastspecial = 1;
+ }
+ if (!lastspecial) {
+ putchar(' ');
+ linepos++;
+ }
+ while (*s != 0) {
+ putchar(*s++);
+ }
+ linepos += l;
+ lastspecial = 0;
+}
+
+char buf[BUFLENGTH];
+#ifndef VMS
+int
+#endif
+main(int argc, char *argv[])
+{
+ int c;
+ char *b;
+ char seeking;
+ extern void exit();
+
+ if (argc > 3 || (in = (argc < 2 ? stdin : fopen(argv[1], "r"))) == NULL ||
+ (out = (argc < 3 ? stdout : fopen(argv[2], "w"))) == NULL) {
+ (void)fprintf(stderr, "Usage: squeeze [infile [outfile]]\n");
+ exit(EXIT_FAILURE);
+ }
+ (void)fputs("/*\n"
+ " * DO NOT EDIT THIS FILE!\n"
+ " * It was created by squeeze.c from another file (see the Makefile).\n"
+ " */\n\n"
+ "const char psheader[] = \"\\\n", out);
+ while (1) {
+ c = getc(in);
+ if (c == EOF)
+ break;
+ if (c == '%') {
+ while ((c = getc(in)) != '\n');
+ }
+ if (c <= ' ')
+ continue;
+ switch (c) {
+ case '{':
+ case '}':
+ case '[':
+ case ']':
+ specialout(c);
+ break;
+ case '<':
+ case '(':
+ if (c == '(')
+ seeking = ')';
+ else
+ seeking = '>';
+ b = buf;
+ *b++ = c;
+ do {
+ c = getc(in);
+ if (b > buf + BUFLENGTH - 2) {
+ (void)fprintf(stderr, "Overran buffer seeking %c", seeking);
+ exit(EXIT_FAILURE);
+ }
+ *b++ = c;
+ if (c == '\\')
+ *b++ = getc(in);
+ } while (c != seeking);
+ *b++ = 0;
+ strout(buf);
+ break;
+ default:
+ b = buf;
+ while ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
+ (c >= '0' && c <= '9') || (c == '/') || (c == '@') ||
+ (c == '!') || (c == '"') || (c == '&') || (c == '*')
+ || (c == ':') || (c == ',') || (c == ';') || (c == '?')
+ || (c == '^') || (c == '~') || (c == '-') || (c == '.')
+ || (c == '#') || (c == '|') || (c == '_') || (c == '=')
+ || (c == '$') || (c == '+')) {
+ *b++ = c;
+ c = getc(in);
+ }
+ if (b == buf) {
+ (void)fprintf(stderr, "Oops! Missed a case: %c.\n", c);
+ exit(EXIT_FAILURE);
+ }
+ *b++ = 0;
+ (void)ungetc(c, in);
+ cmdout(buf);
+ }
+ }
+ (void)fprintf(out,
+ "\\n\";\n\n int\tpsheaderlen\t= %d;\n",
+ stringlen + linepos + 1);
+ return 0;
+}
diff --git a/Build/source/texk/xdvik/string-utils.c b/Build/source/texk/xdvik/string-utils.c
new file mode 100644
index 00000000000..769b2ac8ccc
--- /dev/null
+++ b/Build/source/texk/xdvik/string-utils.c
@@ -0,0 +1,774 @@
+/*
+ * miscellaneous string utility functions
+ *
+ * Copyright (c) 2001-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* #define MYDEBUG 1 */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "string-utils.h"
+#include "util.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <locale.h>
+#include <ctype.h>
+
+/*------------------------------------------------------------
+ * str_is_prefix
+ *
+ * Purpose:
+ * Return True if <str1> is a prefix of <str2>, else False.
+ *
+ * If `case_sensitive' is set to False, it performs matching
+ * in a case-insensitive manner; in that case, str1 should
+ * be lowercase.
+ *------------------------------------------------------------*/
+
+Boolean
+str_is_prefix(const char *str1, const char *str2, Boolean case_sensitive)
+{
+ int i;
+
+ for (i = 0; *str1 != '\0' && *str2 != '\0'; i++) {
+ if ((case_sensitive && *str1 != *str2) ||
+ (!case_sensitive && *str1 != tolower((int)*str2)))
+ return False;
+ str1++;
+ str2++;
+ }
+ return *str1 == '\0';
+}
+
+
+
+/*------------------------------------------------------------
+ * str_is_suffix
+ *
+ * Purpose:
+ * Return True if str1 is a suffix of str2, else False.
+ * E.g. returns true if str1 = ".tex", str2 = "test.tex".
+ *
+ * If `case_sensitive' is set to False, it performs matching
+ * in a case-insensitive manner; in that case, str1 should
+ * be lowercase.
+ *------------------------------------------------------------*/
+
+Boolean
+str_is_suffix(const char *str1, const char *str2, Boolean case_sensitive)
+{
+ int len1 = strlen(str1);
+ int len2 = strlen(str2);
+
+ while (len2 > len1) {
+ str2++;
+ len2--;
+ }
+ if (case_sensitive)
+ return strcmp(str1, str2) == 0;
+ else
+ /* also compare terminating 0; second string
+ is assumed to be all-lowercase! */
+ return memicmp(str2, str1, len1 + 1) == 0;
+}
+
+/*
+ * Like strstr(), but does case-insensitive matching: Brute-force algorithm
+ * to find the first occurrence of subsrtring `needle' (which should be all-lowercase)
+ * in string `haystack', ignoring case in (i.e. lowercasing) haystack. The terminating
+ * '\0' characters are not compared.
+ * Returns a pointer to the beginning of the substring if found, NULL else.
+ *
+ * This code was derived from public domain code (Stristr.c on www.snippets.org).
+ * Currently unused.
+ */
+char *
+my_stristr(const char *haystack, const char *needle)
+{
+ const char *curr;
+
+ for (curr = haystack; *curr != '\0'; curr++) {
+ const char *ptr1, *ptr2;
+ /* search for first character */
+ for (; ((*curr != '\0') && (tolower((int)*curr) != *needle)); curr++) { ; }
+
+ if (*curr == '\0') /* not found */
+ return NULL;
+
+ /* now compare other characters */
+ ptr1 = needle;
+ ptr2 = curr;
+ while (tolower((int)*ptr2) == *ptr1) {
+ ptr2++;
+ ptr1++;
+ /* success if at end of needle */
+ if (*ptr1 == '\0')
+ return (char *)curr;
+ }
+ }
+ return NULL;
+}
+
+/*
+ expand filename to include full path name;
+ returns result in a freshly allocated string.
+*/
+char *
+expand_filename(const char *filename, expandPathTypeT type)
+{
+ char *path_name = NULL;
+
+ if (*filename == '/') /* already an absolute path */
+ return xstrdup(filename);
+
+ if (type == USE_CWD_PATH) {
+ size_t path_name_len = 512;
+ size_t len = strlen(filename) + 1;
+
+ /* append to cwd if it's not already a full path */
+ if (filename[0] != '/') {
+ for (;;) {
+ char *tmp;
+ path_name = xrealloc(path_name, path_name_len);
+ if ((tmp = getcwd(path_name, path_name_len)) == NULL && errno == ERANGE) {
+ path_name_len *= 2;
+ }
+ else {
+ path_name = tmp;
+ break;
+ }
+ }
+ len += strlen(path_name) + 1; /* 1 for '/' */
+ path_name = xrealloc(path_name, len);
+ strcat(path_name, "/");
+ strcat(path_name, filename);
+ }
+
+ TRACE_HTEX((stderr,
+ "Expanding filename |%s| with CWD gives |%s|",
+ filename, path_name == NULL ? "<NULL>" : path_name));
+ return path_name ? path_name : xstrdup(filename);
+ }
+ else {
+ ASSERT(globals.dvi_file.dirname != NULL, "globals.dvi_file.dirname should have been initialized before");
+ path_name = xstrdup(globals.dvi_file.dirname);
+ path_name = xstrcat(path_name, filename);
+ TRACE_HTEX((stderr,
+ "Expanding filename |%s| with globals.dvi_file.dirname |%s| gives |%s|",
+ filename, globals.dvi_file.dirname, path_name));
+ return path_name;
+ }
+}
+
+/* expand filename to include `.dvi' extension and full path name;
+ returns malloc()ed string (caller is responsible for free()ing).
+*/
+char *
+filename_append_dvi(const char *filename)
+{
+ char *expanded_filename = NULL;
+ const char *orig_filename = filename;
+ size_t len;
+ char *p;
+
+ /* skip over `file:' prefix if present */
+ if (str_is_prefix("file:", filename, True)) {
+ filename += strlen("file:");
+ if (str_is_prefix("//", filename, True)) { /* is there a hostname following? */
+ char *tmp = strchr(filename+2, '/'); /* skip over host name */
+ if (tmp == NULL) {
+ XDVI_WARNING((stderr, "Malformed hostname part in filename `%s'; not expanding file name",
+ orig_filename));
+ }
+ else {
+ /* deal with multiple `//' after "file://localhost";
+ while the RFC seems to suggest that file://localhost/foo/bar defines a path
+ `foo/bar', most browsers (and actually, also libwww) will treat this path as absolute:
+ `/foo/bar'. So we treat
+ file://localhost//foo/bar
+ and
+ file://localhost/foo/bar
+ as equivalent.
+ */
+ while (*(tmp+1) == '/')
+ tmp++;
+ filename = tmp;
+ }
+ }
+ }
+
+ len = strlen(filename) + 5; /* 5 in case we need to add `.dvi\0' */
+
+ expanded_filename = xmalloc(len);
+
+ strcpy(expanded_filename, filename);
+
+ /* Append ".dvi" extension if no extension is present.
+ Only look at the filename part when trying to find a `.'.
+ */
+ if ((p = strrchr(expanded_filename, '/')) == NULL) {
+ p = expanded_filename;
+ }
+ if ((p = strrchr(p, '.')) == NULL) {
+ TRACE_HTEX((stderr, "appending .dvi extension to filename |%s|", expanded_filename));
+ strcat(expanded_filename, ".dvi");
+ }
+ return expanded_filename;
+}
+
+char *
+expand_filename_append_dvi(const char *filename, expandPathTypeT type, Boolean must_exist)
+{
+ char canonical_path[MAXPATHLEN + 1];
+ char *normalized_fname = filename_append_dvi(filename);
+ char *expanded_fname = expand_filename(normalized_fname, type);
+ if (must_exist) {
+ char *canonical_name = REALPATH(expanded_fname, canonical_path);
+ free(normalized_fname);
+ free(expanded_fname);
+ return xstrdup(canonical_name);
+ }
+ else {
+ free(normalized_fname);
+ return expanded_fname;
+ }
+}
+
+char *
+format_arg(const char *fmt, const char *arg, int *match)
+{
+ char *tmp = xmalloc(strlen(fmt) + strlen(arg) + 1);
+ if (strchr(fmt, '%') != NULL) {
+ sprintf(tmp, fmt, arg);
+ *match = 1;
+ }
+ else {
+ strcpy(tmp, fmt);
+ /* NOTE: don't reset *match to 0, leave that to caller */
+ }
+ return tmp;
+}
+
+/* escape single `%' characters in arg and return newly allocated string */
+char *
+escape_format_arg(const char *arg)
+{
+ char *ret, *ptr;
+ ASSERT(arg != NULL, "");
+ ret = xmalloc(strlen(arg) * 2 + 1); /* more than enuff */
+
+ ptr = ret;
+ while (*arg != '\0') {
+ /* need to escape? */
+ if (*arg == '%') { /* && (ptr == ret
+ || (ptr > ret && *(arg - 1) != '%'))) { */
+ *ptr++ = '%';
+ }
+ *ptr++ = *arg++;
+ }
+ *ptr = '\0';
+
+ /* trim return buffer */
+ return xrealloc(ret, strlen(ret) + 1);
+}
+
+char *
+unquote_arg(const char *fmt, const char *arg, int *match, int *len)
+{
+ char *ptr;
+ char c;
+
+ c = fmt[0];
+ fmt++;
+ if ((ptr = strchr(fmt, c)) != NULL) {
+ *ptr++ = '\0';
+ while (*ptr == ' ' || *ptr == '\t') {
+ ptr++;
+ }
+ *len = ptr - fmt;
+ return format_arg(fmt, arg, match);
+ }
+ else {
+ *len = strlen(fmt);
+ XDVI_WARNING((stderr, "Ignoring lonesome quote in string %s", fmt - 1));
+ return format_arg(fmt, arg, match);
+ }
+}
+
+/* Chop `source' into chunks separated by `sep', and save these
+ * to newly allocated return list. The end of the list is indicated
+ * by a NULL element (i.e. the returned list will always contain at
+ * least 1 element). The caller is responsible for free()ing the returned
+ * list.
+ *
+ * If `do_unquote' is True, separators inside single or double quotation marks will not be
+ * treated as boundaries. The quotation marks surrounding the chunk will be removed
+ * as well in that case.
+ */
+char **
+get_separated_list(const char *source, const char *sep, Boolean do_unquote)
+{
+ /* allocate at least list of size 1, for NULL termination below */
+ char **chunks = xmalloc(sizeof *chunks);
+ const char *b_ptr, *e_ptr;
+ size_t i = 0;
+
+ b_ptr = source;
+
+ while (*b_ptr != '\0' && strchr(sep, *b_ptr) != NULL)
+ b_ptr++;
+
+ for (i = 0; *b_ptr != '\0'; i++) {
+ char *quote;
+ char quotechar = 0;
+ size_t len, chunk_len, alloc_len = 0;
+
+ if ((len = strcspn(b_ptr, sep)) == 0) /* at end */
+ break;
+
+ /* check for quoted chunk, in which case we don't want to treat
+ spaces as chunk separators */
+ if (do_unquote && (quote = strchr("'\"", *b_ptr)) != NULL) {
+ const char *curr = b_ptr + 1;
+ quotechar = *quote;
+
+ for (;;) { /* find end of quote */
+ char *maybe_end = strchr(curr, quotechar);
+ if (maybe_end != NULL) {
+ if (maybe_end - curr > 0 &&
+ *(maybe_end - 1) == '\\') { /* escaped quote */
+ curr = ++maybe_end;
+ }
+ else { /* found */
+ b_ptr++;
+ len = maybe_end - b_ptr;
+ break;
+ }
+ }
+ else { /* not found end - warn, and forget about this quote */
+ XDVI_WARNING((stderr, "Unmatched quote character in string `%s'", b_ptr));
+ break;
+ }
+ }
+ }
+
+ e_ptr = b_ptr + len;
+ chunk_len = e_ptr - b_ptr;
+ while (i + 1 >= alloc_len) {
+ alloc_len++;
+ }
+ chunks = xrealloc(chunks, alloc_len * sizeof *chunks);
+ chunks[i] = xmalloc(chunk_len + 1);
+ memcpy(chunks[i], b_ptr, chunk_len);
+ chunks[i][chunk_len] = '\0';
+
+ /* skip trailing quotechar and spaces */
+ b_ptr = e_ptr;
+ if (do_unquote && quotechar != 0 && *b_ptr == quotechar)
+ b_ptr++;
+ while (*b_ptr != '\0' && strchr(sep, *b_ptr) != NULL)
+ b_ptr++;
+ }
+ /* terminate list with NULL element */
+ chunks[i] = NULL;
+ return chunks;
+}
+
+const char *
+find_format_str(const char *input, const char *fmt)
+{
+ const char *ptr = input;
+ while ((ptr = strstr(ptr, fmt)) != NULL) {
+ if (ptr > input && *(ptr - 1) == '\\') {
+ ptr++;
+ continue;
+ }
+ else
+ return ptr;
+ }
+ return NULL;
+}
+
+/* return directory component of `path', or NULL if path is a filename only */
+char *
+get_dir_component(const char *path)
+{
+ char *ret = NULL;
+ char *p;
+
+ if ((p = strrchr(path, '/')) != NULL) {
+ /* copy, chop off filename (but not the '/') */
+ ret = xstrdup(path);
+ *(ret + (p - path) + 1) = '\0';
+ TRACE_CLIENT((stderr, "get_dir_component of |%s| is |%s|\n", path, ret));
+ }
+ return ret;
+}
+
+/*
+ If `src' is an absolute path, compare it with `target', ignoring `.tex' extension in
+ both strings. Else, compare the concatenation of `src' with `dvi_path' and `target',
+ in the same way.
+ Since efficiency is a concern here, we don't copy any strings; instead, we loop through
+ `src' and `target' from the end of both strings (which makes expanding `../' easier, and
+ will terminate earlier for non-equal files), replacing `src' with `dvi_path' when
+ dropping off the beginning of `src'.
+*/
+Boolean
+src_compare(const char *src, int src_len, const char *target, const char *dvi_path, size_t dvi_path_len)
+{
+ int i, j;
+ Boolean matched = True;
+
+ /* This macro sets the `src' pointer to `dvi_path' after having
+ dropped off the beginning of src, or returns False if dvi_path
+ is NULL (which either means that `src' was an absolute path, or
+ that the dvi_path has been used up already).
+ */
+#define CHK_USE_DIR(i) \
+ if (i == -1) { \
+ if (dvi_path == NULL) /* already done */ \
+ return False; \
+ src = dvi_path; \
+ dvi_path = NULL; \
+ i = dvi_path_len - 1; \
+ MYTRACE((stderr, "swapped, now using: |%s| of len %d", src, i)); \
+ }
+
+ /* ignore path in both filenames if one of them does not contain a path */
+ {
+ char *src_p = strrchr(src, '/');
+ char *target_p = strrchr(target, '/');
+
+ if (src_p == NULL) {
+ dvi_path = NULL;
+ if (target_p != NULL)
+ target = target_p + 1;
+ }
+
+ if (target_p == NULL) {
+ dvi_path = NULL;
+ if (src_p != NULL)
+ src = src_p + 1;
+ }
+ }
+
+ /* don't prepend dvi_path if src is absolute */
+ if (*src == '/') {
+ dvi_path = NULL;
+ }
+
+ /* skip `.tex' suffix in strings if present */
+ i = src_len;
+ MYTRACE((stderr, "len of |%s| %d", src, i));
+ if (i >= 4 && strcmp(src + (i - 4), ".tex") == 0) {
+ MYTRACE((stderr, "src |%s| has .tex suffix!", src));
+ i -= 4;
+ }
+
+ j = strlen(target);
+ MYTRACE((stderr, "len of |%s| %d", target, j));
+ if (j >= 4 && strcmp(target + (j - 4), ".tex") == 0) {
+ MYTRACE((stderr, "target |%s| has .tex suffix!", target));
+ j -= 4;
+ }
+
+ /* start with index of last char */
+ i--;
+ j--;
+
+ while (i >= 0 && j >= 0) {
+ int skip_dirs = 0;
+ /* fprintf(stderr, "check: %d[%c]\n", i, src[i]); */
+ while (src[i] == '.' && src[i + 1] == '/') { /* normalize `../' and `./' */
+ MYTRACE((stderr, "check2: %d[%c]", i, src[i]));
+
+ if (i >= 2 && src[i - 1] == '.' && src[i - 2] == '/') {
+ MYTRACE((stderr, "case /.."));
+ i -= 3;
+ skip_dirs++;
+ }
+ else if (i == 1) { /* `../' or `/./' at start of src */
+ if (src[0] == '.') { /* `../' */
+ MYTRACE((stderr, "../ at start"));
+ i -= 2;
+ skip_dirs++;
+ }
+ else if (src[0] == '/') { /* `/./' */
+ MYTRACE((stderr, "/./ at start"));
+ i -= 1;
+ }
+ else /* something else */
+ break;
+ }
+ else if (i == 0 || (i > 1 && src[i - 1] == '/')) { /* ./ at start, or /./ somewhere */
+ i -= 1;
+ }
+ else /* might be `abc./' or `abc../' (strange but legal) */
+ break;
+
+ CHK_USE_DIR(i);
+ while (i >= 0 && src[i] == '/') i--;
+ CHK_USE_DIR(i);
+
+ while (src[i] != '.' && skip_dirs-- > 0) { /* unless there are subsequent `../' */
+ /* skip directories backwards */
+ while (i >= 0 && src[i] != '/') {
+ MYTRACE((stderr, "non-slash: %d,%c", i, src[i]));
+ i--;
+ }
+ CHK_USE_DIR(i);
+ while (i >= 0 && src[i] == '/') {
+ MYTRACE((stderr, "slash: %d,%c", i, src[i]));
+ i--;
+ }
+ CHK_USE_DIR(i);
+ MYTRACE((stderr, "skipped backwards: %d,%c", i, src[i]));
+ }
+ }
+
+ /* skip multiple '/'. No need to fall off the beginning of src and use
+ CHK_USE_DIR() here, since with (multiple) '/' at the beginning, src
+ must be an absolute path. */
+ while (i > 0 && src[i] == '/' && src[i - 1] == '/') {
+ i--;
+ }
+
+ MYTRACE((stderr, "comparing: %d[%c] - %d[%c]", i, src[i], j, target[j]));
+ if (src[i] != target[j]) {
+ matched = False;
+ break;
+ }
+ if (i == 0 && j == 0) /* at start of both strings */
+ break;
+ i--;
+ j--;
+ CHK_USE_DIR(i);
+ }
+
+ if (i != 0 || j != 0) /* not at start of both strings, no match */
+ return False;
+ else
+ return matched;
+#undef CHK_USE_DIR
+}
+
+
+/*
+ Contributed by ZLB: Return a canonicalized version of path (with `../'
+ and `./' resolved and `//' reduced to '/') in a freshly malloc()ed
+ buffer, which the caller is responsible for free()ing. Cannot fail.
+*/
+char *
+canonicalize_path(const char *path)
+{
+ char *p, *q, *start;
+ char c;
+ size_t len = strlen(path);
+
+ assert(path != NULL);
+ assert(*path == '/');
+
+ start = q = p = xstrdup(path);
+
+ /* len is the length of string */
+ while (p < start + len) {
+ if ((c = p[1]) == '/') {
+ /* remove multiple '/' in pathname */
+ memmove(p + 1, p + 2, len - (p + 2 - start) + 1);
+ len--;
+ continue;
+ }
+ else if (c == '.') {
+ if ((c = p[2]) == '/') {
+ /* p = '/.' in pathname */
+ memmove(p + 1, p + 3, len - (p + 3 - start) + 1);
+ len -= 2;
+ continue;
+ }
+ else if (c == '.' && ((c = p[3]) == '/' || c == '\0')) {
+ /* p == "/.." */
+ memmove(q, p + 3, len - (p + 3 - start) + 1);
+ len -= (p - q) + 3;
+ p = q;
+ /* check if the new dirname at p is "//" or './' or '../' */
+ if ((c = p[1]) == '/')
+ continue;
+ else if (c == '.') {
+ if ((c = p[2]) == '/')
+ continue;
+ else if (c == '.' && ((c = p[3]) == '/' || c == '\0')) {
+ while (--q >= start && *q != '/');
+ if (q < start)
+ q = start;
+ continue;
+ }
+ }
+ }
+ }
+
+ /* search next '/' */
+ q = p;
+ while (++p <= start + len && *p != '/');
+ }
+
+ return start;
+}
+
+/* Escape all of the following characters in str:
+ ` \ ; ( )
+ making it safe to pass str to a shell. Return result in a newly
+ allocated string, which the caller is responsible to free() after use.
+*/
+char *
+shell_escape_string(const char *str)
+{
+ size_t len = strlen(str);
+ char *new_str = xmalloc(len * 2 + 1); /* safe amount, since each char will be doubled at most */
+
+ const char *src_ptr = str;
+ char *target_ptr = new_str;
+ while (*src_ptr != '\0') {
+ if (*src_ptr == '\\'
+ || *src_ptr == '`'
+ || *src_ptr == '('
+ || *src_ptr == ')'
+ || *src_ptr == ';') {
+#if 0
+ /* only if not yet escaped? */
+ && (src_ptr == str || (src_ptr > str && *(src_ptr - 1) != '\\'))) {
+#endif
+ *target_ptr++ = '\\';
+ }
+ *target_ptr++ = *src_ptr++;
+ }
+ *target_ptr = '\0'; /* terminate */
+ return new_str;
+}
+
+/* Get a pointer to the extension of the filename 'fname'
+ (ie. into the existing string),
+ or NULL if fname doens't have an extension.
+ */
+const char *
+get_extension(const char *fname)
+{
+ char *sep, *tmp;
+ /* does filename have a directory component?
+ If so, be careful with dots within this component.
+ */
+ if ((sep = strrchr(fname, '/')) != NULL) {
+ tmp = sep;
+ if ((sep = strrchr(tmp, '.')) != NULL) {
+ return sep;
+ }
+ else {
+ return NULL;
+ }
+ }
+ else if ((sep = strrchr(fname, '.')) != NULL) {
+ return sep;
+ }
+ else {
+ return NULL;
+ }
+}
+
+void
+replace_extension(const char *fname, const char *extension,
+ char *buf, size_t buf_len)
+{
+ char *sep;
+ if ((sep = strrchr(fname, '.')) != NULL) {
+ size_t len = strlen(extension);
+ if (len + (sep - fname) > buf_len)
+ return;
+ memcpy(buf, fname, sep - fname);
+ strcpy(buf + (sep - fname), extension);
+ }
+ return;
+}
+
+#if 0
+/*
+ * Estimate the string length needed for %p conversion. Currently unused,
+ * since we use the more general VSNPRINTF() approach.
+ */
+#define PTR_CONVERSION_LEN_GUESS sizeof(void *) * CHAR_BIT
+#endif
+
+
+/*
+ * Return a formatted string in newly allocated memory.
+ */
+char *
+get_string_va(const char *fmt, ...)
+{
+ char *buf = NULL;
+ XDVI_GET_STRING_ARGP(buf, fmt);
+ return buf;
+}
+
+/* Wrapper for atof() for strtod()-like error checking,
+ * with an XDVI_WARNING if the conversion of <str> wasn't complete.
+ */
+double
+my_atof(const char *str)
+{
+ char *ptr;
+ double f;
+
+ f = strtod(str, (char **)&ptr);
+ if (*ptr != '\0') {
+ XDVI_WARNING((stderr, "strtod: incomplete conversion of %s to %f", str, f));
+ }
+ return f;
+}
+
+/* return length of a string representation of the integer n */
+int
+length_of_int(int n)
+{
+ int ret = 1;
+
+ if (n < 0) {
+ ret++;
+ n *= -1;
+ }
+ while (n >= 10) {
+ n /= 10;
+ ret++;
+ }
+
+ return ret;
+}
+
+Boolean
+is_spaces_only(const char *ptr)
+{
+ for (; *ptr; ptr++) {
+ if (!isspace((int)*ptr))
+ return False;
+ }
+ return True;
+}
diff --git a/Build/source/texk/xdvik/string-utils.h b/Build/source/texk/xdvik/string-utils.h
new file mode 100644
index 00000000000..96213e00d59
--- /dev/null
+++ b/Build/source/texk/xdvik/string-utils.h
@@ -0,0 +1,81 @@
+#ifndef STRING_UTILS_H_
+#define STRING_UTILS_H_
+
+#include <stdarg.h>
+#include "my-vsnprintf.h"
+
+extern Boolean str_is_prefix(const char *, const char *, Boolean case_sensitive);
+extern Boolean str_is_suffix(const char *, const char *, Boolean case_sensitive);
+extern Boolean is_spaces_only(const char *);
+
+extern char *my_stristr(const char *haystack, const char *needle);
+
+typedef enum { USE_DVI_PATH, USE_CWD_PATH } expandPathTypeT;
+
+/* remove `file:[//localhost/]' prefix from filename, and append `.dvi'
+ extension if no extension is present */
+extern char *filename_append_dvi(const char *fname);
+/* prepend a path of type `type' (either CWD, or directory of dvi file)
+ to `fname' */
+extern char *expand_filename(const char *fname, expandPathTypeT type);
+
+/* do both of the above */
+extern char *expand_filename_append_dvi(const char *fname, expandPathTypeT type, Boolean must_exist);
+
+/* normalize `../' `./' `//' from path */
+extern char *canonicalize_path(const char *path);
+
+extern char *format_arg(const char *fmt, const char *arg, int *match);
+extern char *escape_format_arg(const char *arg);
+extern char *unquote_arg(const char *fmt, const char *arg, int *match, int *len);
+extern char *get_dir_component(const char *path);
+extern char **get_separated_list(const char *source, const char *sep, Boolean do_unquote);
+extern const char *find_format_str(const char *input, const char *fmt);
+extern Boolean src_compare(const char *src, int src_len, const char *target, const char *path, size_t path_len);
+extern char *shell_escape_string(const char *str);
+extern void replace_extension(const char *fname, const char *extension, char *buf, size_t name_len);
+extern const char *get_extension(const char *fname);
+extern int length_of_int(int n);
+
+extern char *get_string_va(const char *fmt, ...);
+extern double my_atof(const char *str);
+
+/*
+ * Print `fmt' to a dynamically allocated string `buf'. Uses VSNPRINTF
+ * in a way that should work with all of glibc <= 2.0.6, >= 2.1, and
+ * the implementation in my-vsnprintf.c. We cannot invoke va_start()/va_end()
+ * in a wrapper function since we may need to invoke vsnprintf() several
+ * times, and each call invalidates argp; that's why this is a macro ...
+ */
+#define XDVI_GET_STRING_ARGP(buf, fmt) \
+ do { \
+ va_list argp; \
+ int CHUNK_LEN = 128; \
+ int curr_len = CHUNK_LEN, need_len; \
+ \
+ buf = NULL; \
+ \
+ for (;;) { \
+ /* see man page for vsnprintf: for glibc 2.0, <need_len> is */ \
+ /* -1 if <buf> had been trucated to <curr_len>; for glibc 2.1, */ \
+ /* it's the total length of <fmt>; so the following works */ \
+ /* with both versions: */ \
+ buf = xrealloc(buf, curr_len); \
+ \
+ va_start(argp, fmt); \
+ need_len = VSNPRINTF(buf, curr_len, fmt, argp); \
+ va_end(argp); \
+ \
+ if (need_len > -1 && need_len < curr_len) { /* <curr_len> was large enough */ \
+ break; \
+ } \
+ if (need_len > -1) { /* now need_len + 1 is the exact space needed */ \
+ curr_len = need_len + 1; \
+ } \
+ else { /* try again with larger <len> */ \
+ curr_len += CHUNK_LEN; \
+ } \
+ } \
+ } while (0) \
+
+#endif /* STRING_UTILS_H_ */
diff --git a/Build/source/texk/xdvik/string_list.c b/Build/source/texk/xdvik/string_list.c
new file mode 100644
index 00000000000..df2bdab7596
--- /dev/null
+++ b/Build/source/texk/xdvik/string_list.c
@@ -0,0 +1,166 @@
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "util.h"
+#include "string_list.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/*
+ * Helper functions for string lists
+ */
+char *
+string_list_to_str(char **list, const char *sep)
+{
+ char *result = xstrdup("");
+ int i;
+
+ for (i = 0; list[i] != NULL; i++) {
+ result = xstrcat(result, list[i]);
+ result = xstrcat(result, sep);
+ }
+ return result;
+}
+
+
+void
+string_list_print(char **list)
+{
+ int i;
+
+ for (i = 0; list != NULL && list[i] != NULL; i++) {
+ fprintf(stderr, "List %d: |%s|\n", i, list[i]);
+ }
+}
+
+/*
+ * Reorder the list so that str (which is supposed to occur in the list somewhere)
+ * is the first element.
+ */
+char **
+string_list_reorder(char **list, char *str)
+{
+ size_t i;
+ char *tmp;
+ Boolean found = False;
+
+ for (i = 0; list[i] != NULL; i++) {
+ if (strcmp(list[i], str) == 0) {
+ found = True;
+ break;
+ }
+ }
+
+ if (!found) {
+ XDVI_ERROR((stderr, "Item `%s' not found in list!\n", str));
+ return list;
+ }
+
+ tmp = list[0];
+ list[0] = str;
+ list[i] = tmp;
+ return list;
+}
+
+/*
+ * Move the item at position idx to the start of the list,
+ * by iteratively swapping it with its predecessor.
+ */
+char **
+string_list_move_to_start(char **list, size_t idx)
+{
+ size_t i;
+
+#if 0
+ for (i = 0; list[i] != NULL; i++) {
+ fprintf(stderr, "list before: %d: |%s|\n", i, list[i]);
+ }
+#endif
+
+ for (i = idx; i > 0; i--) {
+ char *tmp = list[i];
+ list[i] = list[i - 1];
+ list[i - 1] = tmp;
+ }
+
+#if 0
+ for (i = 0; list[i] != NULL; i++) {
+ fprintf(stderr, "list after: %d: |%s|\n", i, list[i]);
+ }
+#endif
+
+ return list;
+}
+
+/*
+ * Rotate the list so that the first element is shifted to the end,
+ * and all next elements are moved down by 1; e.g.:
+ * before rotate: a b c d e f
+ * after rotate: b c d e f a
+ */
+char **
+string_list_rotate_down(char **list)
+{
+ size_t i;
+ char *tmp;
+
+ tmp = list[0];
+ if (tmp == NULL) {
+ return list;
+ }
+ for (i = 1; list[i] != NULL; i++) {
+ list[i - 1] = list[i];
+ }
+ list[i - 1] = tmp;
+
+ return list;
+}
+
+/*
+ * Rotate the list so that the last element is shifted to the beginning,
+ * and all next elements are moved up by 1; e.g.:
+ * before rotate: a b c d e f
+ * after rotate: f a b c d e
+ */
+char **
+string_list_rotate_up(char **list)
+{
+ size_t i;
+ char *tmp = NULL;
+
+ if (list[0] == NULL) {
+ return list;
+ }
+ /* go to end */
+ for (i = 0; list[i] != NULL; i++) { ; }
+ i--; /* get last index */
+
+ tmp = list[i];
+ for (; i > 0; i--) {
+ list[i] = list[i - 1];
+ }
+ list[0] = tmp;
+
+ return list;
+}
+
+char **
+string_list_prepend(char **list, const char *str)
+{
+ int i, k;
+ /* reallocate with larger capacity */
+ for (i = 0; list[i] != NULL; i++) { ; }
+ i++;
+ list = xrealloc(list, (i + 1) * sizeof *list);
+
+ /* shift old contents down */
+ for (k = i; k > 0; k--) {
+ list[k] = list[k - 1];
+ }
+ /* add new element at beginning */
+ list[0] = xstrdup(str);
+
+ return list;
+}
diff --git a/Build/source/texk/xdvik/string_list.h b/Build/source/texk/xdvik/string_list.h
new file mode 100644
index 00000000000..f89a7651984
--- /dev/null
+++ b/Build/source/texk/xdvik/string_list.h
@@ -0,0 +1,8 @@
+
+char *string_list_to_str(char **list, const char *sep);
+void string_list_print(char **list);
+char **string_list_reorder(char **list, char *str);
+char **string_list_move_to_start(char **list, size_t idx);
+char **string_list_rotate_down(char **list);
+char **string_list_rotate_up(char **list);
+char **string_list_prepend(char **list, const char *str);
diff --git a/Build/source/texk/xdvik/t1mapper b/Build/source/texk/xdvik/t1mapper
new file mode 100755
index 00000000000..7562e090131
--- /dev/null
+++ b/Build/source/texk/xdvik/t1mapper
@@ -0,0 +1,433 @@
+#!/usr/bin/perl -w
+#
+# This program maps full PS font names to abreviated TeX style names
+# and puts font files or links to font files in a file hierarchy
+# suitable for texk.
+#
+# Mapping example: Times-Roman.{gsf,pfa,pfb} becomes ptmr.{pfa,pfb}
+#
+
+use File::Path;
+
+# These are the fontname map files to read
+
+# This is for the fontname distribution in teTeX 0.4:
+# @fonts=qw(adobe apple bitstrea dtc linotype monotype skey1250 skey1555
+# softkey urw);
+
+# This is for fontname 2.2, get it from ftp.tug.org:/tex/fontname-2.2
+# The linotype map in teTeX 1.0 is terebly corrupted. Removed from the list.
+
+@fonts=qw(adobe apple bitstrea dtc monotype softkey-1250
+ softkey-1555 urw wolfram yandy);
+
+$logname="t1mapper.log";
+
+# How much to read from font files to figure out the font name
+$fontdatalen=1024*10;
+
+# use $TMPDIR if set by user
+if (defined($ENV{TMPDIR})) {
+ $tempdir=$ENV{TMPDIR};
+}
+else {
+ $tempdir="/tmp";
+}
+
+# HERE BE DRAGONS
+
+usage() if $#ARGV==0;
+
+# By default copy files
+$method=1;
+
+while ($_=shift(@ARGV)) {
+ /^-cp$/ && do { $method=1; next; };
+ /^-ln$/ && do { $method=2; next; };
+ /^-lns$/ && do { $method=3; next; };
+ /^-lnlns$/ && do { $method=4; next; };
+ /^-lncp$/ && do { $method=5; next; };
+ /^-gs$/ && do {
+ $gsmap = shift(@ARGV) or usage();
+ $gsdir = shift(@ARGV) or usage();
+ next;
+ };
+ unshift(@ARGV,$_);
+ last;
+}
+
+$texdir = shift(@ARGV) or usage();
+
+if (! -d $texdir) {
+ print "Making directory $texdir\n";
+ mkpath($texdir) or die "Could not make directory: $texdir: $!\n";
+}
+
+if (!open(LOG,">$logname")) {
+ $logname="$tempdir/$logname";
+ open(LOG,">$logname") ||
+ die "Could not open file $logname for writing: $!\n";
+}
+
+# What major mode of operation?
+
+# Establish fonts based on ghostscript map?
+if ($gsmap) {
+ process_gsfonts();
+ print "Log in $logname\n";
+ exit 0;
+}
+
+# Ok, loop examine fonts to figure out the font name and copy/link to $texdir
+
+process_fontname_maps();
+process_fonts();
+print "Log in $logname\n";
+
+exit 0;
+
+# ############################### MOVE_FONT ################################
+
+sub move_font {
+ # Move font to destination directory, according to specified $method
+ my($from)=shift;
+ my($to)=shift;
+ my($relok)=shift;
+
+ my($other); # Same font, other format
+ my($type); # Other type
+
+ die "I need absolute paths please\n"
+ if !$relok && substr($from,0,1) ne '/';
+
+ logmsg("$from -> $to\n");
+
+ # Remove the old font to replace with this
+ unlink($to) if -f $to;
+
+ # Also remove the old font in the other format:
+ $other=$to;
+ $type='.pfb' if substr($to,-4) eq '.pfa';
+ $type='.pfa' if !$type && substr($to,-4) eq '.pfb';
+ substr($other,-4)=$type;
+
+ unlink($other) if -f $other;
+
+ if ($method==1) {
+ # cp
+ system "cp $from $to 2>/dev/null" and # Shell exit value
+ warn "Copying $from to $to failed\n";
+ } elsif ($method==2) {
+ # ln
+ link($from,$to) or
+ die "Linking of $to to $from failed: $!\n";
+ } elsif ($method==3) {
+ # lns
+ symlink($from,$to) or
+ die "Symlinking $to to $from failed: $!\n";
+ } elsif ($method==4) {
+ # lnlns
+ link($from,$to) ||
+ symlink($from,$to) ||
+ die "Both linking and symlinking $to to $from failed: $!\n";
+ } elsif ($method==5) {
+ # lncp. Let cp give the error-message
+ link($from,$to) || system "cp $from $to";
+ } else {
+ die "Internal error: Unknown font copy/link method\n";
+ }
+}
+
+# ############################# PROCESS_FONTS ##############################
+
+sub process_fonts {
+ # Loop over ARGV, examine each (font?) file to see if it is a
+ # type1 font, binary or text format, and figure out it's name
+ my($type,$font);
+
+ foreach $filename (@ARGV) {
+ ($type,$font)=examine_font($filename);
+
+ next if !defined($font);
+
+ if (!exists($file{$font})) {
+ logmsg("TeX name of $font ($filename) unknown\n");
+ next;
+ }
+
+ $file=$file{$font};
+ move_font($filename,"$texdir/$file$type",0);
+ }
+}
+
+# ############################## EXAMINE_FONT ##############################
+
+sub examine_font {
+ # Examine font to determine name and type
+ #
+ # The method for finding the font name is based on an awk script
+ # written years ago by Kjetil T. Homme and me (mostly him).
+ #
+ my($filename)=shift;
+ my($type);
+
+ my($size)=-s $filename;
+
+ if ($size==0) {
+ logmsg("Zero size file skipped: $filename\n");
+ return (undef,undef);
+ }
+
+ if (!open(FONT,"< $filename")) {
+ logmsg("Unable to open $filename for reading: $!\n");
+ return (undef,undef);
+ }
+
+ sysread FONT, $fontdata, $fontdatalen, 0;
+
+ # Determine type based on magic number
+ $type='.pfa' if substr($fontdata,0,16) eq '%!PS-AdobeFont-1';
+ $type='.pfa' if !$type && substr($fontdata,0,13) eq '%!FontType1-1';
+ $type='.pfb' if !$type && substr($fontdata,6,16) eq '%!PS-AdobeFont-1';
+
+ if (!$type) {
+ # This is where we end up if the file does not match the magic
+ # numbers. The file is most probably not a type1 file.
+
+ if ((index($fontdata,'%!PS-AdobeFont-1')==-1) &&
+ (index($fontdata,'%!FontType1-1')==-1)) {
+ # If the string '%!PS-AdobeFont-1.0' or '%!FontType1-1.0'
+ # does not appear at all this is NOT a type1 font of any
+ # kind.
+ logmsg("$filename is not a type1 file\n");
+ return (undef,undef);
+ }
+
+ logmsg("Odd magic in $filename\n");
+
+ # Try to determine type based on filename extention
+ $type='.pfa' if substr($filename,-4) eq '.pfa';
+ $type='.pfb' if !$type && substr($filename,-4) eq '.pfb';
+
+ if (!$type) {
+ # No extention? Fall back to perls -T (text) test operator.
+ $type='.pfb';
+ $type='.pfa' if -T $filename;
+ }
+ }
+
+ # The font type has now been determined. I wonder what the font's
+ # name is.
+
+ # What we look for is lines like this:
+ #
+ # %!PS-AdobeFont-1.0: URWGothicL-Demi 001.005
+ #
+ # or this:
+ #
+ # /FontName /URWGothicL-Demi def
+
+ $fontname='';
+
+ if ($fontdata =~ m~/FontName /([\S]+) def~) {
+ # The /FontName line is the most reliable source
+ $fontname = $1;
+ } elsif ($fontdata =~ m/%\!PS-AdobeFont-1.0: ([\S]+)/) {
+ # The magic line is not always fully formed and can only be
+ # used as fallback --- in case the /FontName entry is not in
+ # the file. True, this would be a rather dubious font.
+ $fontname = $1;
+ } elsif ($fontdata =~ m/%\!FontType1-1.0: ([\S]+)/) {
+ # The magic line is not always fully (or correctly) formed and
+ # can only be used as fallback --- in case the /FontName entry
+ # is not in the file. True, this would be a rather dubious
+ # font (actually, a lot of type1 versions of tex fonts fall
+ # into this category).
+ $fontname = $1;
+ }
+
+ return ($type,$fontname);
+}
+
+# ######################### PROCESS_FONTNAME_MAPS ##########################
+
+sub process_fontname_maps {
+ # Read the fontname maps
+
+ while ($foundry=shift(@fonts)) {
+ $map=findfile($foundry.".map");
+ next unless $map;
+ print "Reading (fontname/$foundry) $map\n";
+ open(FILE,"<$map") || die "Could not open $map: $!\n";
+ while (<FILE>) {
+ chomp;
+ s/@.*//;
+ next if $_ eq '';
+ ($file,$font,undef)=split(/\s+/,$_,3);
+ # Remove known encoding codes:
+ $file =~ s/(8a|8r|8t)$//;
+ # 8a = StandardEncoding 8a.enc
+ # 8r = TeXBase1Encoding 8r.enc
+ # 8t = CorkEncoding cork.enc
+ # Any filenames with numbers left are 'unknown encodings'
+ if ($file =~ /\d/) {
+ # print "Unknown encoding: $file - $font\n";
+ next;
+ }
+ $file{$font}=$file;
+ }
+ close(FILE);
+ }
+}
+
+# ########################### PROCESS_GSFONTS #############################
+
+sub read_gsmap {
+ # Read gs map file to obtain Font-Name -> filename mappings, and
+ # aliases so we can use GS' Times-Roman replacement as Times-Roman
+ # ourselves. Not everyone has oodles of type1 fonts on disk.
+
+ my($gsmap)=shift;
+
+ open(FILE,"<$gsmap") or die "Could not open $gsmap: $!\n";
+
+ print "Reading (gsmap) $gsmap\n";
+
+ %gsalias=();
+ %gsfile=();
+
+ while (<FILE>) {
+ chomp;
+ s/%.*//;
+ s/\s+$//;
+ next if $_ eq '';
+
+ ($font,$file,undef)=split(/\s+/,$_,3);
+
+ $font =~ s~^/~~;
+
+ if (!exists($file{$font})) {
+ logmsg("TeX name of $font unknown\n");
+ next;
+ }
+
+ if ($file =~ m~\((.*)\)~) {
+ $file = $1;
+ $gsfile{$font}=$file;
+ } else {
+ $file =~ s~^/~~;
+ # The aliases(sp?) cannot be resolved until the whole file is
+ # read
+ $gsalias{$font}=$file;
+ }
+
+ }
+
+ close(FILE);
+}
+
+
+sub process_gsfonts {
+ # Do the Work based on a ghostscript map file.
+
+ process_fontname_maps();
+ read_gsmap($gsmap);
+
+ chdir($gsdir) or die "Could not chdir to $gsdir: $!\n";
+
+ print "Moving fonts\n";
+
+ foreach $font (keys %gsfile) {
+ $gsfile=$gsfile{$font};
+ # GSF files are not propper t1 fonts I understand, so ignore them
+ next if $gsfile =~ /\.gsf$/;
+ $file=$file{$font};
+ $type='';
+
+ if (-f $gsfile) {
+
+ # Crude font type guessing. First based on existing extention:
+ $type='pfa' if substr($gsfile,-4) eq '.pfa';
+ $type='pfb' if !$type && substr($gsfile,-4) eq '.pfb';
+
+ # If existing extention fails use perls -T (text) test
+ if (!$type) {
+ # print "Fallback typing: $gsfile\n";
+ $type='pfb';
+ $type='pfa' if -T $gsfile;
+ }
+
+ # Use for alias resolving
+ $texname{$font}="$file.$type";
+
+ if (substr($gsfile,0,1) eq '/') {
+ move_font("$gsfile","$texdir/".$texname{$font},0);
+ } else {
+ move_font("$gsdir/$gsfile","$texdir/".$texname{$font},0);
+ }
+
+ } else {
+ logmsg("$file not found\n");
+ }
+ }
+
+ chdir($texdir) or die "Could not chdir to $texdir\n";
+
+ foreach $font (keys %gsalias) {
+ $alias = $gsalias{$font};
+ $falias = $texname{$alias};
+ next unless $falias;
+
+ $type='pfa' if substr($gsfile,-4) eq '.pfa';
+ $type='pfb' if !$type && substr($gsfile,-4) eq '.pfb';
+
+ $file=$file{$font};
+
+ # Symlink the aliases
+ logmsg("$falias -> $file.$type\n");
+ $method=3;
+ move_font($falias,"$file.$type",1);
+ }
+}
+
+
+# ############################ JUNK PROCEDURES ###########################
+
+sub findfile {
+ # Find file, use kpsewhich to access texmf database and search rules
+
+ my($file)=shift;
+ $fileloc=`kpsewhich $file`;
+
+ # Check errors
+ return undef if ($? != 0);
+ chomp($fileloc);
+ return undef if $fileloc eq '';
+
+ # It worked
+ return $fileloc;
+}
+
+sub usage {
+ # Abuse the user
+ print
+"Usage: t1mapper [-cp|-ln|-lns|-lnlns|-lncp] \\
+ -gs /path/to/gs/Fontmap /path/to/gs/fonts \\
+ /path/to/target/tex/directory
+
+ t1mapper [-cp|-ln|-lns|-lnlns|-lncp] \\
+ /path/to/target/tex/directory \\
+ <font-file-list>
+
+See t1mapper(1) for more documentation
+
+";
+ exit 1;
+}
+
+sub logmsg {
+ my($string)=shift;
+
+ print STDERR "$string";
+ print LOG "$string";
+}
diff --git a/Build/source/texk/xdvik/t1mapper.1 b/Build/source/texk/xdvik/t1mapper.1
new file mode 100644
index 00000000000..624cf1c55f5
--- /dev/null
+++ b/Build/source/texk/xdvik/t1mapper.1
@@ -0,0 +1,146 @@
+.TH t1mapper "1" "15 October 2001"
+.SH NAME
+t1mapper \- A tool to help xdvi use all your t1 fonts
+.SH SYNOPSIS
+.B t1mapper
+[\fIOPTIONS\fR] \fITeX-fontdir Type1-font-file-spec\fR
+.PP
+.B t1mapper
+[\fIOPTIONS\fR] -gs \fIGS-fontmap GS-fontdir TeX-fontdir\fR
+.SH DESCRIPTION
+.B T1mapper
+is a utility script written in Perl. It assists you in making
+new Postscript<tm> Type1 fonts available for use with
+.BR xdvi .
+.PP
+\fINOTE: \fBRunning this utility is only required if your TeX installation
+doesn't already contain the neccessary .pfb files somewhere in the
+texmf/ directory hierarchy.\fR
+.PP
+The first invocation shown above makes any Type1 font you may have floating around
+on your system available to
+.BR xdvi .
+The second invocation is for hi-jacking fonts from your Ghostscript
+installation, which will supply
+.B xdvi
+with all the standard Type1 fonts it needs.
+.PP
+.B T1mapper
+relies on a installed and working
+.B texk
+system to be present. In
+particular it uses
+.B kpsewhich
+to locate the
+.B fontname
+package .map files which maps between Postscript<tm> font names and TeX
+font names.
+.B teTeX
+is one such
+.B texk
+system.
+.PP
+When invoked without the
+.B -gs
+option, t1mapper will examine each of the fonts specified. It will
+attempt to determine the Postscript name of the font by looking inside
+the font file, and if that name has a TeX equivalent it will copy,
+link or symlink your the file into the TeX font directory you named
+first on the command line. The name in the TeX font directory will be
+according to the TeX/KB-fontname scheme, so that the font names used
+in
+.B .dvi
+files matches the names found in the TeX font directories.
+.PP
+When invoked with the
+.B -gs
+option
+.B t1mapper
+will read the named GS Fontmap file to determine which GS font files
+correspond to which standard Postscript fonts (GS' version of
+Times-Roman is not called \fITimes-Roman\fR, it's actually called
+\fINimbusRomNo9L-Regu\fR), and then proceed to copy or link the files
+in the named GS font directory into the named TeX font directory.
+.PP
+The program's diagnostic output is also written to a logfile
+.IR t1map.log ,
+which is created either in the current working directory or in
+.BR /tmp .
+.SH OPTIONS
+All options except
+.B -gs
+have to do with how the font files are copied or linked into the TeX
+font directories:
+.TP
+.B -cp
+Copy the files from the \fIGS-fontdir\fR or matching the
+\fIType1-font-file-spec\fR into the \fITeX-fontdir\fR. This is the
+default and will always work.
+.TP
+.B -ln
+Hard link the files. This requires the fonts to reside on the same
+disk, but it will save space, and the files will not disappear from
+the \fITeX-fontdir\fR if they are removed from the source directory.
+.TP
+.B -lns
+Symlink the files. This saves space, but if the original files are
+removed the symlinks will be broken.
+.TP
+.B -lnlns
+Attempt hard-link first, if it fails make symlink.
+.TP
+.B -lncp
+Attempt hard-link first, if that fails, copy the font.
+.SH EXAMPLES
+If your Ghostscript is installed in
+.B /usr/local/share/ghostscript
+and your TeX
+lives in
+.B /usr/local/teTeX
+then this command will make your GS fonts available to xdvi:
+.PP
+.Vb 4
+\&t1mapper -lns -gs \e
+\& /usr/local/share/ghostscript/5.50/Fontmap \e
+\& /usr/local/share/ghostscript/fonts \e
+\& /usr/local/teTeX/share/texmf/fonts/type1/gs
+.Ve
+.PP
+The first argument here is the full path to the GS Fontmap. The
+second is the GS font directory, note the lack of wildcards here (as
+opposed to the next example). The third argument is the TeX font
+directory. If it does not exist it will be created. Texk and teTeX uses
+quite finely structured font directories, and the above reflects this.
+.PP
+If you have a Solaris machine with Display Postscript fonts then this
+command will make them available to xdvi:
+.PP
+.Vb 4
+\&t1mapper -lns \e
+\& /usr/local/teTeX/share/texmf/fonts/type1/gs \e
+\& /usr/openwin/lib/X11/fonts/Type1/*.pfa
+.Ve
+.PP
+Here the first argument is the TeX font directory and thereafter comes
+a wildcard that specifies which fonts to examine for copying/linking
+into the TeX font directory.
+.SH FILES
+.B fontname
+Postscript to TeX name mapping files from
+.B http://tug.org/fontname/,
+these are included in teTeX.
+.PP
+.B Ghostscript
+fonts from
+.B http://sourceforge.net/projects/ghostscript/
+or
+.B http://www.gnu.org/software/ghostscript/ghostscript.html
+.SH SEE ALSO
+.BR kpsewhich (1),
+.BR xdvi (1),
+.BR ln (1),
+.B README.t1fonts
+in the source distribution
+.SH AUTHOR
+Nicolai Langfeldt for the xdvik project at SourceForge (see
+.BR http://sourceforge.net/projects/xdvi/ ).
diff --git a/Build/source/texk/xdvik/tests/Makefile.am b/Build/source/texk/xdvik/tests/Makefile.am
new file mode 100644
index 00000000000..9c89699c1e3
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/Makefile.am
@@ -0,0 +1,33 @@
+## Makefile.am for the TeX Live subdirectory texk/xdvik/tests/
+##
+## Copyright (C) 2009-2012 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+##
+include ../common.am
+
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/gui $(common_includes)
+AM_CFLAGS = $(WARNING_CFLAGS)
+
+check_PROGRAMS = run_tests
+
+TESTS = $(check_PROGRAMS)
+
+run_tests_SOURCES = \
+ run_tests.c \
+ run_tests.h \
+ test_dl_list.c \
+ test_string_list.c \
+ test_string_utils.c \
+ test_util.c
+
+$(run_tests_OBJECTS): ../libxdvi.a $(common_dependencies)
+
+LDADD = ../libxdvi.a $(common_ldadd)
+
+../libxdvi.a: $(libxdvi_dependencies)
+ cd .. && $(MAKE) $(AM_MAKEFLAGS) libxdvi.a
+
+## Not used
+##
+EXTRA_DIST = test1.c
+
diff --git a/Build/source/texk/xdvik/tests/Makefile.in b/Build/source/texk/xdvik/tests/Makefile.in
new file mode 100644
index 00000000000..2ccb804850b
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/Makefile.in
@@ -0,0 +1,1079 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+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@
+check_PROGRAMS = run_tests$(EXEEXT)
+subdir = tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/xdvi-c-bitmap-type.m4 \
+ $(top_srcdir)/m4/xdvi-check-iconv.m4 \
+ $(top_srcdir)/m4/xdvi-check-langinfo.m4 \
+ $(top_srcdir)/m4/xdvi-check-xaw.m4 \
+ $(top_srcdir)/m4/xdvi-find-motif.m4 \
+ $(top_srcdir)/m4/xdvi-find-xpm.m4 \
+ $(top_srcdir)/m4/xdvi-func-memicmp.m4 \
+ $(top_srcdir)/m4/xdvi-func-poll.m4 \
+ $(top_srcdir)/m4/xdvi-func-setsid-in-fork.m4 \
+ $(top_srcdir)/m4/xdvi-func-working-vsnprintf.m4 \
+ $(top_srcdir)/m4/xdvi-func-xkbbell.m4 \
+ $(top_srcdir)/m4/xdvi-gs-lib-path.m4 \
+ $(top_srcdir)/m4/xdvi-linker-multiple-defns.m4 \
+ $(top_srcdir)/m4/xdvi-sys-old-linux.m4 \
+ $(top_srcdir)/m4/xdvi-sys-streams.m4 \
+ $(top_srcdir)/m4/xdvi-xinput-2-1.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-freetype2-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-zlib-flags.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)/ac/xdvik.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/c-auto.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_run_tests_OBJECTS = run_tests.$(OBJEXT) test_dl_list.$(OBJEXT) \
+ test_string_list.$(OBJEXT) test_string_utils.$(OBJEXT) \
+ test_util.$(OBJEXT)
+run_tests_OBJECTS = $(am_run_tests_OBJECTS)
+run_tests_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_4 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_3)
+am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_4)
+run_tests_DEPENDENCIES = ../libxdvi.a $(am__DEPENDENCIES_5)
+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__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/run_tests.Po \
+ ./$(DEPDIR)/test_dl_list.Po ./$(DEPDIR)/test_string_list.Po \
+ ./$(DEPDIR)/test_string_utils.Po ./$(DEPDIR)/test_util.Po
+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 =
+SOURCES = $(run_tests_SOURCES)
+DIST_SOURCES = $(run_tests_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
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+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__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/../../build-aux/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../../build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/../common.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp \
+ $(top_srcdir)/../../build-aux/test-driver README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+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@
+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@
+FREETYPE2_DEPEND = @FREETYPE2_DEPEND@
+FREETYPE2_INCLUDES = @FREETYPE2_INCLUDES@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+FT2_CONFIG = @FT2_CONFIG@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+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@
+PKG_CONFIG = @PKG_CONFIG@
+PS_DEF = @PS_DEF@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+XDVIK_VERSION = @XDVIK_VERSION@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+ZLIB_DEPEND = @ZLIB_DEPEND@
+ZLIB_INCLUDES = @ZLIB_INCLUDES@
+ZLIB_LIBS = @ZLIB_LIBS@
+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_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@
+exec_prefix = @exec_prefix@
+final_exec_name = @final_exec_name@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+iconv_includes = @iconv_includes@
+iconv_libpath = @iconv_libpath@
+iconv_libs = @iconv_libs@
+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@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+x_ext_lib = @x_ext_lib@
+x_linker_options = @x_linker_options@
+x_tool_libs = @x_tool_libs@
+x_xmu_lib = @x_xmu_lib@
+x_xpm_libs = @x_xpm_libs@
+x_cppflags = $(X_CFLAGS) $(iconv_includes)
+common_includes = $(PS_DEF) $(KPATHSEA_INCLUDES) $(FREETYPE2_INCLUDES) $(x_cppflags)
+x_ldflags = $(X_LIBS) $(x_linker_options) $(iconv_libpath)
+x_extra_libs = $(X_EXTRA_LIBS) $(iconv_libs)
+xdvi_x_libs = $(x_ldflags) $(x_tool_libs) $(x_xmu_lib) -lXt \
+ $(X_PRE_LIBS) $(x_ext_lib) $(x_xpm_libs) -lX11 $(x_extra_libs)
+common_ldadd = $(KPATHSEA_LIBS) $(FREETYPE2_LIBS) $(xdvi_x_libs)
+common_dependencies = $(KPATHSEA_DEPEND) $(FREETYPE2_DEPEND)
+libxdvi_dependencies = ${top_srcdir}/*.[ch] ${top_srcdir}/gui/*.[ch] ${top_builddir}/psheader.c
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/gui $(common_includes)
+AM_CFLAGS = $(WARNING_CFLAGS)
+TESTS = $(check_PROGRAMS)
+run_tests_SOURCES = \
+ run_tests.c \
+ run_tests.h \
+ test_dl_list.c \
+ test_string_list.c \
+ test_string_utils.c \
+ test_util.c
+
+LDADD = ../libxdvi.a $(common_ldadd)
+EXTRA_DIST = test1.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../common.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 tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(srcdir)/../common.am $(am__empty):
+
+$(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-checkPROGRAMS:
+ @list='$(check_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
+
+run_tests$(EXEEXT): $(run_tests_OBJECTS) $(run_tests_DEPENDENCIES) $(EXTRA_run_tests_DEPENDENCIES)
+ @rm -f run_tests$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(run_tests_OBJECTS) $(run_tests_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_tests.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dl_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_string_list.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_string_utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_util.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.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 $@ $<
+
+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
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+run_tests.log: run_tests$(EXEEXT)
+ @p='run_tests$(EXEEXT)'; \
+ b='run_tests'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(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
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ 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:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+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-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/run_tests.Po
+ -rm -f ./$(DEPDIR)/test_dl_list.Po
+ -rm -f ./$(DEPDIR)/test_string_list.Po
+ -rm -f ./$(DEPDIR)/test_string_utils.Po
+ -rm -f ./$(DEPDIR)/test_util.Po
+ -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 -f ./$(DEPDIR)/run_tests.Po
+ -rm -f ./$(DEPDIR)/test_dl_list.Po
+ -rm -f ./$(DEPDIR)/test_string_list.Po
+ -rm -f ./$(DEPDIR)/test_string_utils.Po
+ -rm -f ./$(DEPDIR)/test_util.Po
+ -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: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am clean clean-checkPROGRAMS 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-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 \
+ recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+@KPATHSEA_RULE@
+@FREETYPE2_RULE@
+
+$(run_tests_OBJECTS): ../libxdvi.a $(common_dependencies)
+
+../libxdvi.a: $(libxdvi_dependencies)
+ cd .. && $(MAKE) $(AM_MAKEFLAGS) libxdvi.a
+
+# 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/xdvik/tests/README b/Build/source/texk/xdvik/tests/README
new file mode 100644
index 00000000000..f92ceca8cf3
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/README
@@ -0,0 +1,29 @@
+1. To run the tests:
+
+$ cd texk/xdvik
+$ make test
+
+or
+
+$ make test_verbose
+
+to see more details on the tests.
+
+
+
+2. To add a new test:
+
+(a) Adding a test to an existing test file:
+ - create a new function "static Boolean <test_name>(int verbosity)"
+ - add a register_test() call to the "register_all_...()" method
+ at the bottom of the file:
+ "register_test(<test_name>, "<short test description>")
+
+(b) Adding a new test file, e.g. test_foo.c:
+ - add test_foo.o to the "objects" definition in Makefile.in
+ - add a declaration for "extern void register_all_from_test_foo()" to run_tests.h
+ - add a call to "register_all_from_test_foo()" to run_tests.c
+ - define "register_all_from_test_foo(void)" at the botton of test_foo.c and
+ add register_test() methods for all test functions in the file
+ (see the existing test files for examples).
+ - rerun "make depend" as described in the toplevel file "README_maintainers".
diff --git a/Build/source/texk/xdvik/tests/run_tests.c b/Build/source/texk/xdvik/tests/run_tests.c
new file mode 100644
index 00000000000..1087af810b3
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/run_tests.c
@@ -0,0 +1,127 @@
+#include "run_tests.h"
+#include "util.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/* helper routines */
+Boolean test_str_equality(int verbosity, const char *str1, const char *str2)
+{
+ int res = strcmp(str1, str2);
+ if (res != 0) {
+ if (verbosity) {
+ ERROR((stderr, "|%s| != |%s|\n", str1, str2));
+ }
+ return False;
+ }
+ if (verbosity) {
+ INFO((stderr, "|%s| == |%s|\n", str1, str2));
+ }
+ return True;
+}
+
+Boolean
+test_str_list_equality(int verbosity, char **str_list1, char **str_list2)
+{
+ size_t i;
+ for (i = 0; str_list1[i] != NULL || str_list2[i] != NULL; i++)
+ {
+ int res;
+
+ if (str_list1[i] == NULL || str_list2[i] == NULL) {
+ if (verbosity) {
+ ERROR((stderr, "Items %ld differ: |%s| != |%s|\n", (long) i, str_list1[i], str_list2[i]));
+ }
+ return False;
+ }
+
+ res = strcmp(str_list1[i], str_list2[i]);
+ if (res != 0) {
+ if (verbosity) {
+ ERROR((stderr, "Items %ld differ: |%s| != |%s|\n", (long) i, str_list1[i], str_list2[i]));
+ }
+ return False;
+ }
+ else if (verbosity) {
+ INFO((stderr, "Items %ld equal: |%s| == |%s|\n", (long) i, str_list1[i], str_list2[i]));
+ }
+ }
+ return True;
+}
+
+
+
+struct test_proc {
+ const char *name;
+ testProcT proc;
+};
+
+static size_t m_test_proc_size = 0;
+static struct test_proc *m_test_proc_list = NULL;
+
+void register_test(testProcT proc, const char *name)
+{
+ size_t old_idx = m_test_proc_size;
+ m_test_proc_size++;
+ m_test_proc_list = xrealloc(m_test_proc_list, m_test_proc_size * sizeof *m_test_proc_list);
+ m_test_proc_list[old_idx].name = xstrdup(name);
+ m_test_proc_list[old_idx].proc = proc;
+}
+
+
+static Boolean
+run_all_tests(int verbosity)
+{
+ size_t i;
+
+ int tests_failed = 0;
+ int tests_ok = 0;
+
+ fprintf(stdout, "\nGoing to run %ld tests ...\n", (long) m_test_proc_size);
+
+ for (i = 0; i < m_test_proc_size; i++) {
+ Boolean retval = m_test_proc_list[i].proc(verbosity);
+ if (!retval) {
+ tests_failed++;
+ m_test_proc_list[i].proc(True);
+ }
+ else {
+ tests_ok++;
+ }
+ fprintf(stdout, "%sTest %ld: %s (%s)\n",
+ retval ? "" : "*****",
+ (long) i + 1,
+ retval ? "OK" : "FAILURE",
+ m_test_proc_list[i].name);
+ }
+
+/* fprintf(stdout, "Ran %d tests: %d OK, %d failures.\n", m_test_proc_size, tests_ok, tests_failed); */
+ if (tests_failed == 0) {
+ fprintf(stdout, "Great! All tests succeeded.\n\n");
+ return True;
+ }
+ else {
+ fprintf(stdout, "Darn, %d of %ld tests failed!\n\n", tests_failed, (long) m_test_proc_size);
+ return False;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int verbosity = 0;
+ /* fprintf(stderr, "argc: %d, argv1: %s\n", argc, argv[1]); */
+ if (argc > 1 && strcmp(argv[1], "-v") == 0) {
+ verbosity = 1;
+ }
+
+ register_all_from_test_dl_list();
+ register_all_from_test_string_utils();
+ register_all_from_test_string_list();
+ register_all_from_test_util();
+
+ if (!run_all_tests(verbosity))
+ return 1;
+ else
+ return 0;
+}
diff --git a/Build/source/texk/xdvik/tests/run_tests.h b/Build/source/texk/xdvik/tests/run_tests.h
new file mode 100644
index 00000000000..8aa1dfd109f
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/run_tests.h
@@ -0,0 +1,34 @@
+#include "xdvi-config.h"
+
+#include <sys/types.h> /* ZLB: must be before sys/socket.h for IRIX 5.3 */
+#include <sys/socket.h>
+#include <sys/file.h> /* this defines FASYNC */
+#include <sys/ioctl.h> /* this defines SIOCSPGRP and FIOASYNC */
+#include <sys/wait.h> /* this defines WIFEXITED and WEXITSTATUS */
+
+#include "xdvi.h"
+#include "hypertex.h"
+#include "dvi-init.h"
+#include "special.h"
+#include "string-utils.h"
+
+#include "kpathsea/tex-file.h"
+
+#include "events.h"
+#include "util.h"
+
+#define ERROR(X) do { fprintf(stderr, "%s:%d: Error: ", __FILE__, __LINE__); fprintf X; } while(0)
+#define INFO(X) do { fprintf(stderr, "%s:%d: Info: ", __FILE__, __LINE__); fprintf X; } while(0)
+
+typedef Boolean (*testProcT)(int verbosity);
+
+extern void register_test(testProcT testproc, const char *name);
+
+/* test helpers */
+extern Boolean test_str_equality(int verbosity, const char *str1, const char *str2);
+extern Boolean test_str_list_equality(int verbosity, char **str_list1, char **str_list2);
+
+extern void register_all_from_test_dl_list(void);
+extern void register_all_from_test_string_utils(void);
+extern void register_all_from_test_string_list(void);
+extern void register_all_from_test_util(void);
diff --git a/Build/source/texk/xdvik/tests/test1.c b/Build/source/texk/xdvik/tests/test1.c
new file mode 100644
index 00000000000..cb917e17740
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/test1.c
@@ -0,0 +1,14 @@
+#include "run_tests.h"
+
+static Boolean mytest1(void) {
+ return 1 == 1;
+}
+
+static Boolean mytest2(void) {
+ return 0 == 0;
+}
+
+void register_all_from_test1(void) {
+ register_test(mytest1, "Trivial equality");
+ register_test(mytest2, "ld_list");
+}
diff --git a/Build/source/texk/xdvik/tests/test_dl_list.c b/Build/source/texk/xdvik/tests/test_dl_list.c
new file mode 100644
index 00000000000..2ebc7409493
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/test_dl_list.c
@@ -0,0 +1,96 @@
+#include "run_tests.h"
+#include "dl_list.h"
+
+static struct elem {
+ int i;
+ const char *name;
+} elems[] = {
+ { 1, "Hello" },
+ { 2, " " },
+ { 3, "World" },
+};
+
+static struct elem test_elems[] = {
+ { 1, "Hello" },
+ { 3, "Another" },
+ { 1, "Hello" },
+ { 2, " " },
+ { 3, "World" },
+};
+
+static void printer_func(const void *e_in) {
+ const struct elem *e = (const struct elem *)e_in;
+ INFO((stderr, "ELEM: %d, `%s'\n", e->i, e->name));
+}
+
+static Boolean test_equality(int verbose,
+ struct dl_list *list,
+ const struct elem *elems,
+ size_t list_len,
+ size_t elem_cnt)
+{
+ size_t i;
+ struct dl_list *ptr = NULL;
+
+ if (list_len != elem_cnt) {
+ if (verbose) {
+ ERROR((stderr, "List len %ld != %ld\n", (long) list_len, (long) elem_cnt));
+ }
+ return False;
+ }
+
+ for (i = 0, ptr = list; i < list_len; i++, ptr = ptr->next) {
+ const struct elem *curr = (const struct elem *)ptr->item;
+
+ if (verbose) {
+ INFO((stderr, "Checking: `%s' - `%s'\n", elems[i].name, curr->name));
+ }
+ if (strcmp(test_elems[i].name, curr->name) != 0) {
+ return False;
+ }
+ if (elems[i].i != curr->i) {
+ return False;
+ }
+ }
+ return True;
+}
+
+static Boolean dl_list_test1(int verbosity) {
+ struct dl_list *testlist = NULL;
+ size_t list_len;
+ static struct elem e1 = { 3, "Another" };
+ static struct elem e2 = { 1, "Hello" };
+
+ testlist = dl_list_insert(testlist, &elems[0]);
+ testlist = dl_list_insert(testlist, &elems[1]);
+ testlist = dl_list_insert(testlist, &elems[2]);
+ testlist = dl_list_head(testlist);
+
+ if (verbosity) {
+ testlist = dl_list_head(testlist);
+ dl_list_apply(testlist, printer_func);
+ }
+
+ list_len = dl_list_len(testlist);
+
+ test_equality(verbosity, testlist, elems, list_len, 3);
+
+ /* test pushing */
+ testlist = dl_list_push_front(testlist, &e1);
+ testlist = dl_list_push_front(testlist, &e2);
+ testlist = dl_list_head(testlist);
+ list_len = dl_list_len(testlist);
+
+ test_equality(verbosity, testlist, test_elems, list_len, 5);
+
+ /* test truncating */
+ testlist = dl_list_truncate(testlist);
+ testlist = dl_list_truncate(testlist);
+
+
+ return True;
+}
+
+void register_all_from_test_dl_list(void) {
+ register_test(dl_list_test1, "dl_list construction");
+}
diff --git a/Build/source/texk/xdvik/tests/test_string_list.c b/Build/source/texk/xdvik/tests/test_string_list.c
new file mode 100644
index 00000000000..1f23158949a
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/test_string_list.c
@@ -0,0 +1,75 @@
+#include "run_tests.h"
+#include "string_list.h"
+
+static Boolean
+string_list_test1(int verbosity)
+{
+ static char *test_str = "This\nis\na\ntest\n";
+ static char *test_str_rotated = "is\na\ntest\nThis\n";
+ static char *test_list[] = {
+ "This",
+ "is",
+ "a",
+ "test",
+ NULL
+ };
+
+ char *res_str;
+ char **test_list_orig, **test_list_rotated;
+
+ res_str = string_list_to_str(test_list, "\n");
+ if (!test_str_equality(verbosity, res_str, test_str)) {
+ return False;
+ }
+
+ test_list_rotated = string_list_rotate_down(test_list);
+ if (!test_str_equality(verbosity,
+ string_list_to_str(test_list_rotated, "\n"),
+ test_str_rotated)) {
+ return False;
+ }
+
+ test_list_orig = string_list_rotate_up(test_list_rotated);
+ if (!test_str_list_equality(verbosity,
+ test_list_orig,
+ test_list)) {
+ return False;
+ }
+ return True;
+}
+
+static Boolean
+string_list_test2(int verbosity)
+{
+ static char *test_str = "";
+ static char *test_list[] = { NULL };
+ char **res_list;
+ char *res_str = string_list_to_str(test_list, "#");
+
+ if (!test_str_equality(verbosity, res_str, test_str)) {
+ return False;
+ }
+
+ /* string_list_print(test_list); */
+
+ res_list = string_list_rotate_down(test_list);
+
+ /* string_list_print(res_list); */
+
+ if (!test_str_equality(verbosity,
+ test_str,
+ string_list_to_str(res_list, "\n")))
+ {
+ return False;
+ }
+ return True;
+}
+
+/* todo: append, prepend, reorder */
+
+void
+register_all_from_test_string_list(void)
+{
+ register_test(string_list_test1, "string lists");
+ register_test(string_list_test2, "empty string lists");
+}
diff --git a/Build/source/texk/xdvik/tests/test_string_utils.c b/Build/source/texk/xdvik/tests/test_string_utils.c
new file mode 100644
index 00000000000..90bdb8188f2
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/test_string_utils.c
@@ -0,0 +1,443 @@
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include <stdarg.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "run_tests.h"
+
+#include "string-utils.h"
+
+#define DEBUG 0
+
+static Boolean test_get_separated_list(int verbose)
+{
+ char *test_list1[] = {
+ "This is the first line",
+ "This is the second",
+ "This, is the third",
+ "The last one",
+ NULL
+ };
+ char *test_list2[] = {
+ "This",
+ "is",
+ "another",
+ "first",
+ "line",
+ NULL
+ };
+ const char *teststring1 = "This is the first line,This is the second,\"This, is the third\",The last one";
+ const char *teststring2 = "This\nis another\tfirst line";
+
+ char **res_list1 = get_separated_list(teststring1, ",", True);
+ char **res_list2 = get_separated_list(teststring2, " \t\n", True);
+ /* TODO: deallocate? */
+ return test_str_list_equality(verbose, test_list1, res_list1) && test_str_list_equality(verbose, test_list2, res_list2);
+}
+
+static Boolean test_str_is_prefix(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *str2;
+ Boolean case_sensitive;
+ Boolean result;
+ } tests[] = {
+ { "foo", "foobar", True, True },
+ { "foo", "Foobar", True, False },
+ { "foo", "Foobar", False, True },
+ { "foo", "FOObar", False, True },
+ { "foo", "foo", True, True },
+ { "f", "foo", True, True },
+ { "b", "foo", True, False },
+ { "foo", "b", True, False },
+ { "", "foo", True, True },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "str_is_prefix(%s,%s,%d) -> %d == %d?\n",
+ tests[i].str1,
+ tests[i].str2,
+ tests[i].case_sensitive,
+ str_is_prefix(tests[i].str1, tests[i].str2, tests[i].case_sensitive),
+ tests[i].result));
+ }
+ if (str_is_prefix(tests[i].str1, tests[i].str2, tests[i].case_sensitive) != tests[i].result) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+static Boolean test_str_is_suffix(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *str2;
+ Boolean case_sensitive;
+ Boolean result;
+ } tests[] = {
+ { "bar", "foobar", True, True },
+ { "bar", "FooBar", True, False },
+ { "bar", "fooBAR", False, True },
+ { "bar", "fooBaR", False, True },
+ { "bar", "bar", True, True },
+ { "r", "bar", True, True },
+ { "x", "bar", True, False },
+ { "bar", "r", True, False },
+ { "", "bar", True, True },
+ { "", "", True, True },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "str_is_suffix(%s,%s,%d) -> %d == %d?\n",
+ tests[i].str1,
+ tests[i].str2,
+ tests[i].case_sensitive,
+ str_is_suffix(tests[i].str1, tests[i].str2, tests[i].case_sensitive),
+ tests[i].result));
+ }
+ if (str_is_suffix(tests[i].str1, tests[i].str2, tests[i].case_sensitive) != tests[i].result) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+static Boolean test_is_spaces_only(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ Boolean result;
+ } tests[] = {
+ { "bar", False },
+ { " \t\n ", True },
+ { " a ", False },
+ { "", True },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "is_spaces_only(%s) -> %d == %d?\n",
+ tests[i].str1,
+ is_spaces_only(tests[i].str1),
+ tests[i].result));
+ }
+ if (is_spaces_only(tests[i].str1) != tests[i].result) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+static Boolean test_my_stristr(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *str2;
+ char *result;
+ } tests[] = {
+ { "paloozah", "ooz", "oozah" },
+ { "paloozah", "pa", "paloozah" },
+ { "paloozah", "par", NULL },
+ { "paloozah", "x", NULL },
+ { "PALOOZAH", "ooz", "OOZAH" },
+ { "PALOOZAH", "ah", "AH" },
+ { "PALOOZAH", "h", "H" },
+ { "h", "h", "h" },
+ { "H", "h", "H" },
+ { "", "h", NULL },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ char *res_str = my_stristr(tests[i].str1, tests[i].str2);
+ /* We want to verify that my_stristr(STR1, STR2) is either NULL or
+ * a substring of STR1, but, e.g., `"oozah" == "paloozah" + 3' may
+ * or may not be true (depending on compiler optimizations). */
+ char *test_str = tests[i].result ?
+ tests[i].str1 + strlen(tests[i].str1) - strlen(tests[i].result) :
+ NULL;
+ if (verbose) {
+ INFO((stderr, "my_stristr(%s, %s) -> %s == %s?\n",
+ tests[i].str1,
+ tests[i].str2,
+ res_str,
+ test_str));
+ }
+ if (res_str != test_str) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+static Boolean test_format_arg(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *arg;
+ char *result;
+ } tests[] = {
+ { "netscape(%s, same-window)", "file.html", "netscape(file.html, same-window)" },
+ { "netscape(same-window)", "file.html", "netscape(same-window)" },
+ { "%s", "a", "a" },
+ { "", "", "" },
+ };
+
+ size_t i;
+ int tmpcnt = 0;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "format_arg(%s) -> %s == %s, %d\n",
+ tests[i].str1,
+ format_arg(tests[i].str1, tests[i].arg, &tmpcnt),
+ tests[i].result,
+ tmpcnt));
+ }
+ if (!test_str_equality(verbose,
+ format_arg(tests[i].str1, tests[i].arg, &tmpcnt),
+ tests[i].result)) {
+ result = False;
+ }
+ }
+ /* tempcnt shouldn't be reset to 0 by format_arg() */
+ if (tmpcnt != 1) {
+ ERROR((stderr, "tmpcnt should be 1\n"));
+ result = False;
+ }
+ return result;
+}
+
+static Boolean test_escape_format_arg(int verbose)
+{
+ static struct stringtest {
+ char *str;
+ char *result;
+ } tests[] = {
+ { "netscape(%s, same-window)", "netscape(%%s, same-window)" },
+ { "%%s", "%%%%s" },
+ { "%d%s", "%%d%%s" },
+ { "a", "a" },
+ { "", "" },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "escape_format_arg(%s) -> %s == %s\n",
+ tests[i].str,
+ escape_format_arg(tests[i].str),
+ tests[i].result));
+ }
+ if (!test_str_equality(verbose,
+ escape_format_arg(tests[i].str),
+ tests[i].result)) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+static Boolean test_filename_append_dvi(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *str2;
+ } tests[] = {
+ { "file:///tmp/foo.bar", "/tmp/foo.bar" },
+ { "file:///tmp/foo", "/tmp/foo.dvi" },
+ /* the following two mimick firefox behaviour with double/single slashes */
+ { "file://tmp/foo", "/foo.dvi" },
+ { "file:/tmp/foo", "/tmp/foo.dvi" },
+ { "file://localhost/tmp/foo", "/tmp/foo.dvi" },
+ { "~/tmp/foo", "~/tmp/foo.dvi" },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ char *tmp = filename_append_dvi(tests[i].str1);
+ if (verbose) {
+ INFO((stderr, "filename_append_dvi(%s) -> %s == %s?\n",
+ tests[i].str1,
+ tmp,
+ tests[i].str2));
+ }
+ if (!test_str_equality(verbose, tmp, tests[i].str2)) {
+ result = False;
+ }
+ free(tmp);
+ }
+ return result;
+}
+
+static Boolean test_canonicalize_path(int verbose)
+{
+ static struct stringtest {
+ char *str1;
+ char *str2;
+ } tests[] = {
+ { "/foo/a/bz.to/bar.dvi", "/foo/a/bz.to/bar.dvi" },
+ { "/foo/../bar.dvi", "/bar.dvi" },
+ { "/foo/../bar.dvi", "/bar.dvi" },
+ { "/foo/./roo/./bar.dvi", "/foo/roo/bar.dvi" },
+ { "/foo/./roo/../bar.dvi", "/foo/bar.dvi" },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "canonicalize_path(%s) -> %s == %s?\n",
+ tests[i].str1,
+ canonicalize_path(tests[i].str1),
+ tests[i].str2));
+ }
+ if (!test_str_equality(verbose, canonicalize_path(tests[i].str1), tests[i].str2)) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+
+
+static Boolean test_expand_filename(int verbose)
+{
+ char cwd[10240];
+ char *currpath, *testpath1, *testpath2;
+
+ currpath = xstrdup(getcwd(cwd, 10240));
+ testpath1 = expand_filename(__FILE__, USE_CWD_PATH);
+ globals.dvi_file.dirname = xstrdup(cwd);
+ globals.dvi_file.dirname = xstrcat(globals.dvi_file.dirname, "/");
+ testpath2 = expand_filename(__FILE__, USE_DVI_PATH);
+
+ if (__FILE__[0] == '/') {
+ free(currpath);
+ currpath = xstrdup(__FILE__);
+ } else {
+ currpath = xstrcat(currpath, "/");
+ currpath = xstrcat(currpath, __FILE__);
+ }
+
+ return test_str_equality(verbose, testpath1, currpath) \
+ && test_str_equality(verbose, testpath2, currpath);
+}
+
+
+static Boolean test_get_extension(int verbose)
+{
+ const char *test_strings[][2] = {
+ { "/dev/fd/3", NULL },
+ { "/home/user/file.dvi", ".dvi" },
+ { "/home/user/file.ps", ".ps" },
+ { "/home/user.bar/file.dvi", ".dvi" },
+ { "/home/user.bar/file", NULL },
+ { "/home/user/file", NULL },
+ { NULL, NULL }
+ };
+
+ size_t i;
+
+ for (i = 0; test_strings[i][0] != NULL; i++) {
+ const char *tmp = get_extension(test_strings[i][0]);
+ if (tmp == NULL && test_strings[i][1] == NULL) {
+ if (verbose)
+ INFO((stderr, "Checking extension of |%s| OK: <NULL> == <NULL>\n", test_strings[i][0]));
+ }
+ else if (tmp == NULL && test_strings[i][1] != NULL) {
+ if (verbose)
+ ERROR((stderr, "extension of |%s| gave <NULL> - should be |%s|\n",
+ test_strings[i][0], test_strings[i][1]));
+ return False;
+ }
+ else if (tmp != NULL && test_strings[i][1] == NULL) {
+ if (verbose)
+ ERROR((stderr, "extension of |%s| gave |%s| - should be <NULL>\n",
+ test_strings[i][0], tmp));
+ return False;
+ }
+ else {
+ if (strcmp(tmp, test_strings[i][1]) != 0) {
+ if (verbose)
+ ERROR((stderr, "ERROR: extension of |%s| gave |%s| - should be |%s|\n",
+ test_strings[i][0], tmp, test_strings[i][1]));
+ return False;
+ }
+ else {
+ if (verbose)
+ INFO((stderr, "Checking extension of |%s| OK: |%s| == |%s|\n",
+ test_strings[i][0], tmp, test_strings[i][1]));
+ }
+ }
+ }
+
+ return True;
+}
+
+static Boolean test_length_of_int(int verbose)
+{
+ static struct stringtest {
+ int d;
+ int len;
+ } tests[] = {
+ { 0, 1 },
+ { 1, 1 },
+ { 11, 2 },
+ { 111, 3 },
+ { 100, 3 },
+ { 100000, 6 },
+ { 999999, 6 },
+ { 1000000, 7 },
+ { 101, 3 },
+ { 001, 1 },
+ };
+
+ size_t i;
+ Boolean result = True;
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ if (verbose) {
+ INFO((stderr, "length_of_int(%d) -> %d == %d?\n",
+ tests[i].d,
+ length_of_int(tests[i].d),
+ tests[i].len));
+ }
+ if (length_of_int(tests[i].d) != tests[i].len) {
+ result = False;
+ }
+ }
+ return result;
+}
+
+void register_all_from_test_string_utils(void)
+{
+ register_test(test_str_is_prefix, "str_is_prefix()");
+ register_test(test_str_is_suffix, "str_is_suffix()");
+ register_test(test_is_spaces_only, "is_spaces_only()");
+ register_test(test_my_stristr, "my_stristr()");
+ register_test(test_filename_append_dvi, "filename_append_dvi()");
+ /* TODO: expand_filename_append_dvi */
+ register_test(test_canonicalize_path, "canonicalize_path()");
+ register_test(test_format_arg, "format_arg()");
+ register_test(test_escape_format_arg, "escape_format_arg()");
+ register_test(test_expand_filename, "expand_filename()");
+ register_test(test_get_separated_list, "get_separated_list");
+ register_test(test_length_of_int, "length_of_int()");
+ register_test(test_get_extension, "Filename extensions");
+}
diff --git a/Build/source/texk/xdvik/tests/test_util.c b/Build/source/texk/xdvik/tests/test_util.c
new file mode 100644
index 00000000000..239927190c8
--- /dev/null
+++ b/Build/source/texk/xdvik/tests/test_util.c
@@ -0,0 +1,45 @@
+#include "run_tests.h"
+#include "util.h"
+#include "string-utils.h"
+
+static Boolean
+test_src_format_arguments(int verbose)
+{
+ static struct stringtest {
+ char *str;
+ char *res[16]; /* big enuff */
+ } tests[] = {
+ { "emacsclient --no-wait +%l %f",
+ { "emacsclient", "--no-wait", "+10", "/this/is/a/filename.tex", NULL }
+ },
+ { "vim +%l:%c %f",
+ { "vim", "+10:0", "/this/is/a/filename.tex", NULL }
+ },
+ { "bazoo %f:%l:%c",
+ { "bazoo", "/this/is/a/filename.tex:10:0", NULL }
+ }
+ };
+
+ const char *filename = "/this/is/a/filename.tex";
+ int lineno = 10;
+ int colno = 0;
+ size_t i;
+ Boolean res = True;
+
+ for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
+ char **argv = get_separated_list(tests[i].str, " \t", True);
+ argv = src_format_arguments(argv, filename, lineno, colno);
+ if (!test_str_list_equality(verbose, argv, tests[i].res)) {
+ res = False;
+ }
+ }
+
+ return res;
+}
+
+
+void
+register_all_from_test_util(void)
+{
+ register_test(test_src_format_arguments, "src_format_arguments");
+}
diff --git a/Build/source/texk/xdvik/texmf-alt/README b/Build/source/texk/xdvik/texmf-alt/README
new file mode 100644
index 00000000000..069c4e988c9
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/README
@@ -0,0 +1,31 @@
+
+README for the texmf-alt (`alternative') directory:
+
+This directory contains xdvi.cfg and *.map files for users of
+older versions of teTeX (< 1.0) or non-teTeX distributions.
+
+Users of teTeX >= 1.0 or TeXLive >= 6b should use the files
+in ../texmf/ instead.
+
+Installation:
+
+The `make install' target doesn't install these files, so you'll
+need to install them manually. Copy all files into the directory
+ TEXMFMAIN/xdvi
+where TEXMF is your main texmf tree. Use e.g.:
+
+ kpsewhich --expand-path='$TEXMFMAIN'
+
+to locate this directory. Make sure the XDVIINPUTS variable
+(set either in the xdvi shell wrapper or in your shell)
+contains this directory, e.g. by setting:
+
+ export XDVIINPUTS='.;$TEXMF/{xdvi,dvips//}'
+
+Some map files might also be located in the directory
+TEXMFMAIN/dvips/config; setting XDVIINPUTS like above should
+find these as well.
+
+Please consult the file README.t1fonts if you experience problems
+with your Type1 font setup.
+
diff --git a/Build/source/texk/xdvik/texmf-alt/charter2.map b/Build/source/texk/xdvik/texmf-alt/charter2.map
new file mode 100644
index 00000000000..40cf1e6707f
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/charter2.map
@@ -0,0 +1,5 @@
+% Thomas Esser, 1998, public domain.
+% Updated for xdvi by Nicolai Langfeldt 1998, public domain.
+
+bchbo8r CharterBT-Bold ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <bchb
+bchro8r CharterBT-Roman ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <bchr
diff --git a/Build/source/texk/xdvik/texmf-alt/lucida.map b/Build/source/texk/xdvik/texmf-alt/lucida.map
new file mode 100644
index 00000000000..18040dd069a
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/lucida.map
@@ -0,0 +1,110 @@
+% lucida.map
+% Mappings of lucida fonts for xdvi.
+%
+% I have not looked at this file in disgust - janl 21/2/1999
+%
+% If t1mapper has been used on the lucida fonts then most of these are
+% quite redundant.
+
+hlcbot8r LucidaTypewriterBoldOblique "TeXBase1Encoding ReEncodeFont" <8r.enc <lbtbo.pfb
+hlcbt8r LucidaTypewriterBold "TeXBase1Encoding ReEncodeFont" <8r.enc <lbtb.pfb
+
+hlcda LucidaNewMath-Arrows-Demi <lbmad.pfb
+hlcdim LucidaNewMath-DemiItalic <lbmdi.pfb
+hlcdima LucidaNewMath-AltDemiItalic <lbmdo.pfb
+hlcdm LucidaNewMath-Demibold <lbmd.pfb
+hlcdy LucidaNewMath-Symbol-Demi <lbmsd.pfb
+hlcra LucidaNewMath-Arrows <lbma.pfb
+hlcrf8r LucidaBlackletter "TeXBase1Encoding ReEncodeFont" <8r.enc <lbl.pfb
+hlcrie8r LucidaCalligraphy-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lbc.pfb
+
+hlcbot8rn LucidaTypewriterBoldOblique ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbtbo.pfb
+hlcbt8rn LucidaTypewriterBold ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbtb.pfb
+
+hlcrim LucidaNewMath-Italic <lbmi.pfb
+hlcrima LucidaNewMath-AltItalic <lbmo.pfb
+hlcrin8r LucidaCasual-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lbki.pfb
+hlcriw8r LucidaHandwriting-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lbh.pfb
+hlcrm LucidaNewMath-Roman <lbmr.pfb
+hlcrn8r LucidaCasual "TeXBase1Encoding ReEncodeFont" <8r.enc <lbkr.pfb
+hlcrof8r LucidaBlackletter ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbl.pfb
+hlcron8r LucidaCasual ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbkr.pfb
+hlcrot8r LucidaTypewriterOblique "TeXBase1Encoding ReEncodeFont" <8r.enc <lbto.pfb
+hlcrot8rn LucidaTypewriterOblique ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbto.pfb
+hlcrt8r LucidaTypewriter "TeXBase1Encoding ReEncodeFont" <8r.enc <lbtr.pfb
+hlcrt8rn LucidaTypewriter ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbtr.pfb
+hlcrv LucidaNewMath-Extension <lbme.pfb
+hlcry LucidaNewMath-Symbol <lbms.pfb
+hlhb8r LucidaBright-Demi "TeXBase1Encoding ReEncodeFont" <8r.enc <lbd.pfb
+hlhbc8r LucidaBrightSmallcaps-Demi "TeXBase1Encoding ReEncodeFont" <8r.enc <lbdsc.pfb
+hlhbi8r LucidaBright-DemiItalic "TeXBase1Encoding ReEncodeFont" <8r.enc <lbdi.pfb
+hlhbo8r LucidaBright-Demi ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lbd.pfb
+hlhr8r LucidaBright "TeXBase1Encoding ReEncodeFont" <8r.enc <lbr.pfb
+hlhrc8r LucidaBrightSmallcaps "TeXBase1Encoding ReEncodeFont" <8r.enc <lbrsc.pfb
+hlhri8r LucidaBright-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lbi.pfb
+hlhro8r LucidaBright-Oblique "TeXBase1Encoding ReEncodeFont" <8r.enc <lbsl.pfb
+hlsb8r LucidaSans-Demi "TeXBase1Encoding ReEncodeFont" <8r.enc <lsd.pfb
+hlsbi8r LucidaSans-DemiItalic "TeXBase1Encoding ReEncodeFont" <8r.enc <lsdi.pfb
+hlsbot8r LucidaSans-TypewriterBoldOblique "TeXBase1Encoding ReEncodeFont" <8r.enc <lstbo.pfb
+hlsbot8rn LucidaSans-TypewriterBoldOblique ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lstbo.pfb
+hlsbt8r LucidaSans-TypewriterBold "TeXBase1Encoding ReEncodeFont" <8r.enc <lstb.pfb
+hlsbt8rn LucidaSans-TypewriterBold ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lstb.pfb
+hlsr8r LucidaSans "TeXBase1Encoding ReEncodeFont" <8r.enc <lsr.pfb
+hlsri8r LucidaSans-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lsi.pfb
+hlsro8r LucidaSans ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lsr.pfb
+hlsrot8r LucidaSans-TypewriterOblique "TeXBase1Encoding ReEncodeFont" <8r.enc <lsto.pfb
+hlsrot8rn LucidaSans-TypewriterOblique ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lsto.pfb
+hlsrt8r LucidaSans-Typewriter "TeXBase1Encoding ReEncodeFont" <8r.enc <lstr.pfb
+hlsrt8rn LucidaSans-Typewriter ".850 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <lstr.pfb
+hlsu8r LucidaSans-Bold "TeXBase1Encoding ReEncodeFont" <8r.enc <lsb.pfb
+hlsui8r LucidaSans-BoldItalic "TeXBase1Encoding ReEncodeFont" <8r.enc <lsbi.pfb
+hlsuo8r LucidaSans-Bold ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lsb.pfb
+hlxb8r LucidaFax-Demi "TeXBase1Encoding ReEncodeFont" <8r.enc <lfd.pfb
+hlxbi8r LucidaFax-DemiItalic "TeXBase1Encoding ReEncodeFont" <8r.enc <lfdi.pfb
+hlxbo8r LucidaFax-Demi ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lfd.pfb
+hlxr8r LucidaFax "TeXBase1Encoding ReEncodeFont" <8r.enc <lfr.pfb
+hlxri8r LucidaFax-Italic "TeXBase1Encoding ReEncodeFont" <8r.enc <lfi.pfb
+hlxro8r LucidaFax ".167 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <lfr.pfb
+
+lbkr LucidaCasual "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbkr.pfb
+lbl LucidaBlackletter "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbl.pfb
+lbma LucidaNewMath-Arrows <lbma.pfb
+lbmad LucidaNewMath-Arrows-Demi <lbmad.pfb
+lbmd LucidaNewMath-Demibold <lbmd.pfb
+lbmdi LucidaNewMath-DemiItalic <lbmdi.pfb
+lbmdo LucidaNewMath-AltDemiItalic <lbmdo.pfb
+lbme LucidaNewMath-Extension <lbme.pfb
+lbmi LucidaNewMath-Italic <lbmi.pfb
+lbmo LucidaNewMath-AltItalic <lbmo.pfb
+lbmr LucidaNewMath-Roman <lbmr.pfb
+lbms LucidaNewMath-Symbol <lbms.pfb
+lbmsd LucidaNewMath-Symbol-Demi <lbmsd.pfb
+lbr LucidaBright "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbr.pfb
+lbrsc LucidaBrightSmallcaps "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbrsc.pfb
+lbsl LucidaBright-Oblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbsl.pfb
+lbtb LucidaTypewriterBold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbtb.pfb
+lbtbo LucidaTypewriterBoldOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbtbo.pfb
+lbto LucidaTypewriterOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbto.pfb
+lbtr LucidaTypewriter "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbtr.pfb
+lfd LucidaFax-Demi "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lfd.pfb
+lfdi LucidaFax-DemiItalic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lfdi.pfb
+lfi LucidaFax-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lfi.pfb
+lfr LucidaFax "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lfr.pfb
+lsb LucidaSans-Bold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsb.pfb
+lsbi LucidaSans-BoldItalic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsbi.pfb
+lsd LucidaSans-Demi "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsd.pfb
+lsdi LucidaSans-DemiItalic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsdi.pfb
+lsi LucidaSans-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsi.pfb
+lsr LucidaSans "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsr.pfb
+lstb LucidaSans-TypewriterBold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lstb.pfb
+lstbo LucidaSans-TypewriterBoldOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lstbo.pfb
+lsto LucidaSans-TypewriterOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lsto.pfb
+lstr LucidaSans-Typewriter "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lstr.pfb
+
+lbc LucidaCalligraphy-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbc.pfb
+lbd LucidaBright-Demi "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbd.pfb
+lbdi LucidaBright-DemiItalic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbdi.pfb
+lbdsc LucidaBrightSmallcaps-Demi "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbdsc.pfb
+lbh LucidaHandwriting-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbh.pfb
+lbi LucidaBright-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbi.pfb
+lbki LucidaCasual-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <lbki.pfb
diff --git a/Build/source/texk/xdvik/texmf-alt/marvosym.map b/Build/source/texk/xdvik/texmf-alt/marvosym.map
new file mode 100644
index 00000000000..d63aaca8407
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/marvosym.map
@@ -0,0 +1,2 @@
+fmvr8x Martin_Vogels_Symbole <marvosym.pfb
+fmvri8x Martin_Vogels_Symbole " .167 SlantFont" <marvosym.pfb
diff --git a/Build/source/texk/xdvik/texmf-alt/xdvifont.map b/Build/source/texk/xdvik/texmf-alt/xdvifont.map
new file mode 100644
index 00000000000..6c58606aa55
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/xdvifont.map
@@ -0,0 +1,56 @@
+% xdvifont.map.
+%
+% Derived from psfonts.map in teTeX 0.9 in this way:
+%
+% - Remove mappings which are also available in files we can use unmodified
+% - Remove all trivial mappings
+% - Lucida is a mess - put in separate file: lucida.map
+% - Add input file names for the standard fonts left
+%
+% NOTE: xdvi does not care about the font-file extention, but dvips does.
+%
+% Nicolai Langfeldt 21/2/1999.
+
+ppi020 MathematicalPi-Two <mh2.pfb
+ppi025 MathematicalPi-Six <mh6.pfb
+
+% So, non KB names for standard fonts:
+
+cob Courier-Bold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <pcrb
+cobo Courier-BoldOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <pcrbo
+com Courier "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <pcrr
+coo Courier-Oblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <pcrro
+
+pcrr8rn Courier ".85 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <pcrr
+
+hv Helvetica "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <phvr
+hvb Helvetica-Bold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <phvb
+hvbo Helvetica-BoldOblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <phvbo
+hvo Helvetica-Oblique "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <phvro
+
+% This _should've_ been HelveticaNarrow, if you own Helvetica narrow
+% you want to comment these out:
+
+phvb8rn Helvetica-Bold ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <phvb
+phvbo8rn Helvetica-BoldOblique ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <phvbo
+phvr8rn Helvetica ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <phvr
+phvro8rn Helvetica-Oblique ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <phvro
+
+pplr8rn Palatino-Roman ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <pplr
+pplrr8re Palatino-Roman "1.2 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <pplr
+pplru8r Palatino-Italic "-.1763 SlantFont TeXBase1Encoding ReEncodeFont" <8r.enc <pplri
+
+psyro Symbol ".167 SlantFont" <psyr
+
+ptmr8rn Times-Roman ".82 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <ptmr
+ptmrr8re Times-Roman "1.2 ExtendFont TeXBase1Encoding ReEncodeFont" <8r.enc <ptmr
+
+tib Times-Bold "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmb
+tibi Times-BoldItalic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmbi
+tibo Times-Bold ".167 SlantFont TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmb
+tii Times-Italic "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmri
+tio Times-Roman ".167 SlantFont TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmr
+tir Times-Roman "TeXnANSIEncoding ReEncodeFont" <texnansi.enc <ptmr
+
+zd ZapfDingbats <pzdr
+
diff --git a/Build/source/texk/xdvik/texmf-alt/xypic.map b/Build/source/texk/xdvik/texmf-alt/xypic.map
new file mode 100644
index 00000000000..bd47b3ccaa1
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf-alt/xypic.map
@@ -0,0 +1,18 @@
+% Thomas Esser, 1998, public domain.
+xyatip10 XYATIP10 <xyatip10.pfb
+xybsql10 XYBSQL10 <xybsql10.pfb
+xybtip10 XYBTIP10 <xybtip10.pfb
+xycirc10 XYCIRC10 <xycirc10.pfb
+xycmat10 XYCMAT10 <xycmat10.pfb
+xycmat11 XYCMAT10 "1.1 ExtendFont" <xycmat10.pfb
+xycmat12 XYCMAT10 "1.2 ExtendFont" <xycmat10.pfb
+xycmbt10 XYCMBT10 <xycmbt10.pfb
+xycmbt11 XYCMBT10 "1.1 ExtendFont" <xycmbt10.pfb
+xycmbt12 XYCMBT10 "1.2 ExtendFont" <xycmbt10.pfb
+xydash10 XYDASH10 <xydash10.pfb
+xyeuat10 XYEUAT10 <xyeuat10.pfb
+xyeuat11 XYEUAT10 "1.1 ExtendFont" <xyeuat10.pfb
+xyeuat12 XYEUAT10 "1.2 ExtendFont" <xyeuat10.pfb
+xyeubt10 XYEUBT10 <xyeubt10.pfb
+xyeubt11 XYEUBT10 "1.1 ExtendFont" <xyeubt10.pfb
+xyeubt12 XYEUBT10 "1.2 ExtendFont" <xyeubt10.pfb
diff --git a/Build/source/texk/xdvik/texmf/XDvi b/Build/source/texk/xdvik/texmf/XDvi
new file mode 100644
index 00000000000..99e0533a3b9
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf/XDvi
@@ -0,0 +1,370 @@
+!!! Global application defaults for XDvik
+!!! Install this file into $TEXMF/xdvi/XDvi
+!!! (use kpsewhich --expand-path '$TEXMF' to determine the location of
+!!! $TEXMF on you system).
+!!!
+!!! Lines commented out (starting with `!') are examples of
+!!! how to customize Xdvi for your personal needs.
+!!! To use these settings, copy them into your $HOME/.Xdefaults file
+!!! (remove the comments), prefix each line with `xdvi', and activate
+!!! them with:
+!!! $ xrdb -merge $HOME/.Xdefaults
+
+!!!------------------------------------------------------------------------------
+!!!------------------------ useful global settings ------------------------------
+!!!------------------------------------------------------------------------------
+
+!!! Use `logical' (TeX) pages instead of physical pages for the `g' keystroke:
+*useTeXPages: True
+
+!!! A fairly high resolution, which usually gives better results for anti-aliasing
+!!! and greater flexibility for shrink values. Generating MF fonts shouldn't be an
+!!! issue when using T1lib.
+!*mfMode: ljfour
+*paper: a4
+
+!!! This should be the best choice for modern displays with large color depth.
+*thorough: true
+
+!!! Add some useful translations for the mouse wheel (bug #1422928)
+*wheelTranslations:\
+Shift<Btn4Down>:left(.08)\n\
+Shift<Btn5Down>:right(.08)\n\
+Ctrl<Btn4Down>:set-shrink-factor(+)\n\
+Ctrl<Btn5Down>:set-shrink-factor(-)\n\
+<Btn4Down>:wheel(-.7)\n\
+<Btn5Down>:wheel(.7)
+
+!!!------------------------------------------------------------------------------
+!!!------------------------------ Motif toolbar ---------------------------------
+!!!------------------------------------------------------------------------------
+
+!!! filename of the XPM file used for the toolbar pixmaps:
+*toolbarPixmapFile: toolbar.xpm
+
+!!! Use toolbar buttons that are non-raised by default and only appear raised
+!!! when the mouse is over a button, as in e.g. Netscape 4.x:
+*toolbarButtonsRaised: False
+
+!!! don't draw a border around armed buttons:
+*button*highlightThickness: 0
+
+!!! no extra margin above/below buttons
+*toolBar.marginHeight:0
+
+!!! some spacing around button icons and button edges
+*toolBar*button*marginHeight: 2
+*toolBar*button*marginWidth: 2
+
+
+!!! don't draw the small grey rectangle inside the armed button:
+*button*fillOnArm: false
+
+!!! Or, for a more traditional Motif look, use something like:
+!*toolbarButtonsRaised: True
+!*button*fillOnArm: True
+!*button*shadowThickness: 1
+!*toolBar.marginHeight: 0
+!*toolBarFrame.marginWidth: 0
+!*button*highlightThickness: 2
+
+!!!------------------------------------------------------------------------------
+!!!-------------------------------- Motif widgets -------------------------------
+!!!------------------------------------------------------------------------------
+!!! small shadows like in netscape 4.x
+*menuBar.shadowThickness: 1
+*button*shadowThickness: 2
+*toolBar.shadowThickness: 1
+*toolBarFrame.shadowThickness: 1
+*helppanel.shadowThickness: 1
+*toolBarFrame.marginWidth: 2
+*statusline*shadowThickness: 1
+
+!!! prevent the Motif file selector widget from resizing itself, and start with a reasonable default:
+*resizePolicy: XmRESIZE_NONE
+*textColumns: 50
+
+!!! make all text/entry fields white, for better contrasts:
+*XmDialogShell*XmTextField.background: white
+*XmDialogShell*XmText.background: white
+*XmDialogShell*XmList.background: white
+
+!!! adjust position of header in help window
+*help_window*right_form.topOffset: 10
+
+!!!------------------------------------------------------------------------------
+!!!----------------------------- Preferences window -----------------------------
+!!!------------------------------------------------------------------------------
+
+*XmComboBox*List*background: white
+*XmComboBox*Text*background: white
+*XmComboBox*Text*borderWidth: 2
+*XmComboBox*Text*borderColor: black
+
+!!!------------------------------------------------------------------------------
+!!!--------------------------------- Help window --------------------------------
+!!!------------------------------------------------------------------------------
+!!! (See also the fontList entries for TOPIC_LABEL and TOPIC_HEADING)
+!!!
+!!! Set this to something that fits to your font size:
+*help_text.rows: 23
+*help_text.columns: 56
+
+!!! fg/bg for help topics label
+*help_label*shadowThickness: 2
+!!! ... if you want a more colorful label:
+!*help_label*foreground: blue4
+!*help_label*background: grey90
+
+
+!!! help topics label for Xaw
+*help_label.font: -*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*
+
+!!!------------------------------------------------------------------------------
+!!!-------------------------------- Motif tooltips ------------------------------
+!!!------------------------------------------------------------------------------
+!!! background color and font:
+*tipShell.background: cornsilk
+*tipShell.fontSet: -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*
+
+!!! time the mouse needs to stay on a button until tooltips pop up,
+!!! in milliseconds; set to a negative value to disable:
+*tipShell.waitPeriod: 800
+
+
+!!!------------------------------------------------------------------------------
+!!!------------------------------ Fonts and colors ------------------------------
+!!!------------------------------------------------------------------------------
+*font: -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*
+!!! Use a smaller font for the statusline in the Xaw version:
+*statusline.font: -*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*
+
+!!! Motif fonts. Meaning of the tags is:
+!!! NORMAL: Ordinary text, labels etc.
+!!! UNMARKED: Unmarked entries in page list
+!!! MARKED: Marked entries in page list, emphasized entries in other lists
+!!! TOPIC_LABEL: Label for topics list in help window
+!!! TOPIC_HEADING: Heading for help text in help window
+!!!
+*fontList: \
+-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*=NORMAL,\
+-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*=UNMARKED,\
+-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*=MARKED,\
+-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*=TOPIC_LABEL,\
+-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*=TOPIC_HEADING
+
+
+!!! Color used for page border, image bounding boxes and the ruler in `Ruler mode'.
+*highlight: red
+
+!!! Color used for the magnifier and its rulers:
+*rulecolor: blue
+
+!!!------------------------------------------------------------------------------
+!!!---------------------------------- hyperlinks -------------------------------
+!!!------------------------------------------------------------------------------
+
+!!! Colors for unvisited and visited hyperlinks (can be any valid X color spec,
+!!! also in hex format):
+*linkColor: Blue2
+*visitedLinkColor: Purple4
+
+!!! Link style:
+!!! 0: no highlighting at all
+!!! 1: underline with linkColor
+!!! 2: no underlining, text with linkColor
+!!! 3: underlining and text with linkColor
+*linkStyle: 3
+
+!!!------------------------------------------------------------------------------
+!!!------------------------------ helper applications ---------------------------
+!!!------------------------------------------------------------------------------
+
+!!! the editor used for `forward search'; can also be set via $EDITOR, $VISUAL
+!!! or $XEDITOR. Setting the X resource will override the environment variables.
+!!! The format strings `%l' and `%f' are optional.
+!!! You could use this for older emacsen that come with emacsclient:
+!*editor: emacsclient --no-wait +%l %f
+!!! and this for current emacs or xemacs that come with gnuclient (which is much better):
+!*editor: gnuclient -q +%l %f
+
+!!!------------------------------------------------------------------------------
+!!!------------------------------ Xaw buttons and helptexts ---------------------
+!!!------------------------------------------------------------------------------
+
+!!! The following sections are of a more esoteric nature, giving
+!!! examples for customizing the Xaw buttons and the help texts.
+!!! Maybe these are useful for i18n.
+
+!!!------------------------------
+!!! This is the default Xaw button configuration:
+!!!------------------------------
+! *buttonTranslations: \
+! File_Open ...:select-dvi-file()\n\
+! File_Reload:reread-dvi-file()\n\
+! File_Back Hyperref:htex-back()\n\
+! File_Quit:quit()\n\
+! Page_First page:goto-page(1)\n\
+! Page_Page-10:back-page(10)\n\
+! Page_Page-5:back-page(10)\n\
+! Page_Prev:back-page(1)\n\
+! Page_Next:forward-page(1)\n\
+! Page_Page+5:forward-page(5)\n\
+! Page_Page+10:forward-page(10)\n\
+! Page_Last page:goto-page()\n\
+! Zoom_Full size:set-shrink-factor(1)\n\
+! Zoom_$%%:shrink-to-dpi(150)\n\
+! Zoom_$%%:shrink-to-dpi(100)\n\
+! Zoom_$%%:shrink-to-dpi(50)\n\
+! Zoom_Fit in window:set-shrink-factor()\n\
+! Options_View PS:set-ps(toggle)\n\
+! Options_Keep position:set-keep-flag()\n\
+! Help_About ...:popup-help(helpGeneral)\n\
+! Help_Page Motion ...:popup-help(helpPagemotion)\n\
+! Help_Other Commands ...:popup-help(helpOthercommands)\n\
+! Help_HyperTeX commands ...:popup-help(helpHypertex)\n\
+! Help_Source specials ...:popup-help(helpSourcespecials)\n
+
+!!!------------------------------
+!!! help texts
+!!!------------------------------
+
+!!!------------------------------
+!!! about/general
+!!!------------------------------
+! *.helpGeneral: \
+! \n\
+! This is xdvik, CVS version.\n\
+! \n\
+! The xdvik project homepage is located at\n\
+! http://sourceforge.net/projects/xdvi,\n\
+! where you can find updates, report bugs and submit feature requests.\n\
+! \n\
+! Getting help and exiting xdvi\n\
+! \n\
+! h or ? or `Help' button\n\
+! Displays this help text.\n\
+! \n\
+! q or Control-C or Control-D or Cancel or Stop or Control-Z (VAX VMS)\n\
+! Quits the program.\n
+!
+
+!!!------------------------------
+!!! other commands
+!!!------------------------------
+! *helpOthercommands: \
+! \n\
+! Other Commands\n\
+! \n\
+! \n\
+! Control-F\n\
+! Find another DVI file.\n\
+! \n\
+! Control-L or Clear\n\
+! Redisplays the current page.\n\
+! \n\
+! Control-P\n\
+! Prints bitmap unit, bit order, and byte order.\n\
+! \n\
+! ^ or Home\n\
+! Move to the ``home'' position of the page. This is\n\
+! normally the upper left-hand corner of the page,\n\
+! depending on the margins as described in the -margins\n\
+! option, above.\n\
+! \n\
+! c Moves the page so that the point currently beneath the\n\
+! cursor is moved to the middle of the window. It also\n\
+! (gasp!) warps the cursor to the same place.\n\
+! \n\
+! G This key toggles the use of greyscale anti-aliasing for\n\
+! displaying shrunken bitmaps. In addition, the key\n\
+! sequences `0G' and `1G' clear and set this flag,\n\
+! respectively. See also the -nogrey option.\n\
+! \n\
+! k Normally when xdvi switches pages, it moves to the home\n\
+! position as well. The `k' keystroke toggles a `keep-\n\
+! position' flag which, when set, will keep the same\n\
+! position when moving between pages. Also `0k' and `1k'\n\
+! clear and set this flag, respectively. See also the\n\
+! -keep option.\n\
+! \n\
+! M Sets the margins so that the point currently under the\n\
+! cursor is the upper left-hand corner of the text in the\n\
+! page. Note that this command itself does not move the\n\
+! image at all. For details on how the margins are used,\n\
+! see the -margins option.\n\
+! \n\
+! P ``This is page number n.'' This can be used to make\n\
+! the `g' keystroke refer to actual page numbers instead\n\
+! of absolute page numbers.\n\
+! \n\
+! R Forces the dvi file to be reread. This allows you to\n\
+! preview many versions of the same file while running\n\
+! xdvi only once.\n\
+! \n\
+! s Changes the shrink factor to the given number. If no\n\
+! number is given, the smallest factor that makes the\n\
+! entire page fit in the window will be used. (Margins\n\
+! are ignored in this computation.)\n\
+! \n\
+! S Sets the density factor to be used when shrinking\n\
+! bitmaps. This should be a number between 0 and 100;\n\
+! higher numbers produce lighter characters.\n\
+! \n\
+! t Toggles to the next unit in a sorted list of TeX dimension\n\
+! units for the popup magnifier ruler.\n\
+! \n\
+! V Toggles Ghostscript anti-aliasing. Also `0V' and `1V' clear\n\
+! and enables this mode, respectively. See also the the\n\
+! -gsalpha option.\n\
+! \n\
+! x Toggles expert mode (in which the buttons do not appear).\n\
+! `1x' toggles display of the statusline at the bottom of\n\
+! the window.\n
+
+!!!------------------------------
+!!! page motion
+!!!------------------------------
+! *helpPagemotion: \
+! \n\
+! Moving around in the document\n\
+! \n\
+! \n\
+! \n\
+! n or f or Space or Return or LineFeed or PgDn\n\
+! Moves to the next page (or to the nth next page if a\n\
+! number is given).\n\
+! \n\
+! p or b or Control-H or BackSpace or DELete or PgUp\n\
+! Moves to the previous page (or back n pages).\n\
+! \n\
+! u or Up-arrow\n\
+! Moves up two thirds of a window-full.\n\
+! \n\
+! d or Down-arrow\n\
+! Moves down two thirds of a window-full.\n\
+! \n\
+! l or Left-arrow\n\
+! Moves left two thirds of a window-full.\n\
+! \n\
+! r or Right-arrow\n\
+! Moves right two thirds of a window-full.\n\
+! \n\
+! g or j or End\n\
+! Moves to the page with the given number. Initially,\n\
+! the first page is assumed to be page number 1, but this\n\
+! can be changed with the `P' keystroke, below. If no\n\
+! page number is given, then it goes to the last page.\n\
+! \n\
+! < Move to first page in document.\n\
+! > Move to last page in document.\n
+
+!!!------------------------------
+!!! end of helptexts
+!!!------------------------------
+
+
+!!!------------------------------------------------------------------------------
+!!!-------------- used for internal checking - DO NOT CHANGE THIS! --------------
+!!!------------------------------------------------------------------------------
+*appDefaultsFileVersion: 20030303
diff --git a/Build/source/texk/xdvik/texmf/config.xdvi b/Build/source/texk/xdvik/texmf/config.xdvi
new file mode 100644
index 00000000000..5504fb48c2f
--- /dev/null
+++ b/Build/source/texk/xdvik/texmf/config.xdvi
@@ -0,0 +1,40 @@
+% original config.xdvi -- Configuration file for Type 1 rendering in xdvi.
+% (If you change or delete `original' in the first line of this file,
+% new xdvik installations won't overwrite the file.)
+%
+% This file is part of xdvik (notwithstanding its location).
+%
+% Lines starting with `%' are comments.
+%
+% This file indicates which map files are to be used when running xdvi.
+% (It is not used by dvips, unless you type "dvips -Pxdvi ...", which is not
+% likely. Doing so, however, would allow you to use the same map files
+% in dvips as are used in xdvi.)
+%
+% The format is the same as for dvips configuration files, except that only
+% the `p' and `p+' directives are used. A line
+%
+% p file.map
+%
+% clears the existing list of map files and sets the list to the given file.
+% A line
+%
+% p+ file2.map
+%
+% adds the given map file to the end of the list. If you use "p file.map"
+% anywhere other than as the first (non-comment, non-blank) line of the file,
+% then you are probably making a mistake.
+%
+% If a font entry is found in several files, the earlier entry will be used
+% (as is done in dvips). Therefore, to override font entries in the standard
+% file psfonts.map, you should use entries such as:
+%
+% p myfile.map
+% p+ anotherfile.map
+% p+ psfonts.map
+%
+% However, normally it isn't necessary to add any other map file here
+% because psfonts.map is (normally) a generated file (by the updmap
+% script). Instead, map files should be added to the updmap.cfg file.
+%
+% p psfonts.map
diff --git a/Build/source/texk/xdvik/translations.h b/Build/source/texk/xdvik/translations.h
new file mode 100644
index 00000000000..8d26b91029b
--- /dev/null
+++ b/Build/source/texk/xdvik/translations.h
@@ -0,0 +1,360 @@
+/* key translations */
+#include "xdvi.h"
+#include "version.h"
+
+static const char base_key_translations[] =
+/* note: more specific key bindings must always come first
+ (i.e. `alt ctrl' before `ctrl' before unmodified)
+ `:' at start of description means that case matters
+*/
+ "<Key>0: digit(0)\n"
+ "<Key>1: digit(1)\n"
+ "<Key>2: digit(2)\n"
+ "<Key>3: digit(3)\n"
+ "<Key>4: digit(4)\n"
+ "<Key>5: digit(5)\n"
+ "<Key>6: digit(6)\n"
+ "<Key>7: digit(7)\n"
+ "<Key>8: digit(8)\n"
+ "<Key>9: digit(9)\n"
+ "Ctrl<Key>]: pagehistory-delete-forward()\n"
+ "Ctrl<Key>[: pagehistory-delete-backward()\n"
+/* it seems the following is needed for compatibility with german, french,
+ italian, spanish and other keyboards that have [, ] on right Alt key? */
+ "Ctrl Mod2<Key>]: pagehistory-delete-forward()\n"
+ "Ctrl Mod2<Key>[: pagehistory-delete-backward()\n"
+ "Mod2<Key>]: pagehistory-forward()\n"
+ "Mod2<Key>[: pagehistory-back()\n"
+ "<Key>]: pagehistory-forward()\n"
+ "<Key>[: pagehistory-back()\n"
+ "Alt Ctrl<Key>+: change-density(10)\n" /* case insensitive, otherwise too hard to type */
+ ":Alt Ctrl<Key>-: change-density(-10)\n"
+ "Ctrl<Key>+: set-shrink-factor(+)\n" /* case insensitive, otherwise too hard to type */
+ ":Ctrl<Key>-: set-shrink-factor(-)\n"
+ ":<Key>-: minus()\n"
+ ":<Key>?: help()\n"
+/* ":<Key>/: incremental-find()\n" */
+ ":<Key>>: goto-page()\n"
+ ":<Key><: goto-page(1)\n"
+ ":<Key>^: home()\n"
+ "<Key>space: unpause-or-next()\n"
+ ":<Key>B: htex-back()\n"
+ ":<Key>b: back-page()\n"
+/* removed, redundant and gets in the way
+ ":Ctrl<Key>c: quit()\n" */
+#if COLOR
+ ":<Key>C: set-color()\n"
+#endif
+ ":<Key>c: center()\n"
+/* removed, redundant and gets in the way
+ ":Ctrl<Key>d: quit()\n" */
+ ":<Key>D: toggle-grid-mode()\n"
+ ":<Key>d: down()\n"
+ "Ctrl<Key>f: find()\n"
+ ":<Key>F: htex-forward()\n"
+ ":~Alt<Key>f: forward-page()\n"
+ "Ctrl<Key>g: find-next()\n"
+#ifdef GREY
+ ":<Key>G: set-greyscaling()\n"
+#endif
+ ":<Key>g: goto-page()\n"
+ "Ctrl<Key>h: back-page()\n"
+ ":~Alt<Key>h: help()\n"
+ ":<Key>i: htex-anchorinfo()\n"
+ "Ctrl<Key>j: forward-page()\n"
+ ":<Key>k: set-keep-flag()\n"
+ "Ctrl<Key>l: fullscreen()\n"
+ ":<Key>l: left()\n"
+ "Ctrl<Key>m: switch-mode()\n"
+ ":<Key>M: set-margins()\n"
+ ":~Alt<Key>m: toggle-mark()\n"
+ "~Alt Ctrl<Key>n: toggle-mark()forward-page()\n"
+ ":~Alt<Key>n: forward-page()\n"
+ "Ctrl<Key>o: select-dvi-file()\n"
+ ":~Alt<Key>o: ruler-snap-origin()\n"
+ /* this used to be show-display-attributes() - use the output of `-debug PK' instead */
+ "Ctrl<Key>p: print()\n"
+ ":<Key>P: declare-page-number()\n"
+ ":<Key>p: back-page()\n"
+ ":<Key>q: quit()\n"
+ "Ctrl<Key>r: forward-page(0)\n" /* redraw page */
+ ":<Key>R: reread-dvi-file()\n"
+ ":<Key>r: right()\n"
+ "Ctrl<Key>s: save()\n"
+ ":<Key>S: set-density()\n"
+ ":<Key>s: set-shrink-factor()\n"
+ ":<Key>T: use-tex-pages(toggle)\n"
+ ":<Key>t: switch-magnifier-units()\n"
+ "Ctrl<Key>u: back-page()toggle-mark()\n"
+ ":<Key>u: up()\n"
+ "Ctrl<Key>v: show-source-specials()\n"
+#ifdef PS_GS
+ ":<Key>V: set-gs-alpha()\n"
+#endif /* PS_GS */
+#ifdef PS
+ ":<Key>v: set-ps()\n"
+#endif
+ "Ctrl<Key>x: source-what-special()\n"
+ ":<Key>x: set-expert-mode()\n"
+#ifdef VMS
+ "~Alt Ctrl<Key>z: quit()\n"
+#endif
+ "<Key>Return: forward-page()\n"
+ "<Key>Delete: up-or-previous()\n"
+ "<Key>BackSpace: back-page()\n"
+#ifdef MOTIF
+ "<Key>osfDelete: up-or-previous()\n"
+ "<Key>osfBackSpace: back-page()\n"
+ "Ctrl<Key>osfBeginLine: goto-page(1)\n"
+ "Ctrl<Key>osfEndLine: goto-page()\n"
+ "<Key>osfBeginLine: home-or-top()\n"
+ "<Key>osfEndLine: end-or-bottom()\n"
+ "<Key>osfLeft: left(0.015)\n"
+ "<Key>osfUp: up(0.015)\n"
+ "<Key>osfRight: right(0.015)\n"
+ "<Key>osfDown: down(0.015)\n"
+ "<Key>osfPageUp: back-page()\n"
+ "<Key>osfPageDown: forward-page()\n"
+ "<Key>osfCancel: discard-number()\n"
+#else
+ "Ctrl<Key>Home: goto-page(1)\n"
+ "Ctrl<Key>End: goto-page()\n"
+ "<Key>Home: home-or-top()\n"
+ "<Key>End: end-or-bottom()\n"
+ "<Key>Left: left(0.015)\n"
+ "<Key>Up: up(0.015)\n"
+ "<Key>Right: right(0.015)\n"
+ "<Key>Down: down(0.015)\n"
+ "<Key>Prior: back-page()\n"
+ "<Key>Next: forward-page()\n"
+ "<Key>Escape: discard-number()\n"
+#endif
+#ifdef XK_KP_Left
+ "~@Num_Lock<Key>KP_Home:home()\n"
+ "~@Num_Lock<Key>KP_Left:left(0.015)\n"
+ "~@Num_Lock<Key>KP_Begin:center()\n"
+ "~@Num_Lock<Key>KP_Up:up(0.015)\n"
+ "~@Num_Lock<Key>KP_Right:right(0.015)\n"
+ "~@Num_Lock<Key>KP_Down:down(0.015)\n"
+ "~@Num_Lock<Key>KP_Prior:back-page()\n"
+ "~@Num_Lock<Key>KP_Next:forward-page()\n"
+ "<Key>KP_Enter:forward-page()\n"
+ "<Key>KP_Delete:up-or-previous()\n"
+ "<Key>KP_1:digit(1)\n"
+ "<Key>KP_2:digit(2)\n"
+ "<Key>KP_3:digit(3)\n"
+ "<Key>KP_4:digit(4)\n"
+ "<Key>KP_5:digit(5)\n"
+ "<Key>KP_6:digit(6)\n"
+ "<Key>KP_7:digit(7)\n"
+ "<Key>KP_8:digit(8)\n"
+ "<Key>KP_9:digit(9)\n"
+ "<Key>KP_0:digit(0)\n"
+#endif
+ "";
+
+
+static const char base_mouse_translations[] =
+ "Shift<Btn1Down>: mouse-modes(\"drag(+)\")\n"
+ "Shift<Btn2Down>: mouse-modes(\"drag(|)\")\n"
+ "Shift<Btn3Down>: mouse-modes(\"drag(-)\")\n"
+ "Ctrl<Btn1Down>: mouse-modes(\"source-special()\", \"source-special()\", \"source-special()\")\n"
+ "<Btn1Down>: mouse-modes(\"do-href()magnifier(*2)\", \"text-selection()\", \"ruler()\")\n"
+ "<Btn2Down>: mouse-modes(\"do-href-newwindow()magnifier(*2)\", \"text-selection()\", \"ruler()\")\n"
+ "<Btn3Down>: mouse-modes(\"magnifier(*3)\")\n"
+ "<Btn4Down>: mouse-modes(\"wheel(-0.2)\")\n"
+ "<Btn5Down>: mouse-modes(\"wheel(0.2)\")\n"
+ "<Btn6Down>: mouse-modes(\"hwheel(-0.2)\")\n"
+ "<Btn7Down>: mouse-modes(\"hwheel(0.2)\")\n"
+ "";
+
+
+/* #if defined(NEW_MENU_CREATION) || defined(MOTIF) */
+
+/*
+ BNF-like Syntax of the entries:
+
+ entry ::= entry-line `\n' ( entry )*
+ entry-line ::= menu-spec `:' button-type `:' mnemonic `:' action
+ menu-spec ::= menu-name ( `>' menu-name )*
+ menu-name ::= menu-title `|' accelerator
+
+ menu-title ::= String
+ mnemonic ::= <empty> | String
+ action ::= <empty> | String
+ accelerator ::= `A'|`B'|`C'|...|`a'|`b'|`c'|...
+ button-type ::= `PUSH' | `RADIO' | `CHECK' | `SEP'
+
+ Notes:
+ - In entry-line, every occurrence of `:' that's not a separator has to be
+ escaped like this: `\:'; similar for `>' in menu-spec and `|' in menu-title.
+ - Every `>' in menu-spec creates a submenu for the corresponding menu.
+ - mnemonic is the key binding for the action, displayed as mnemonic string in
+ the Motif menus (not yet in the Xaw version, since Xaw doesn't provide for
+ such mnemonics).
+ - accelerator is the Motif menu accelerator key.
+ */
+static const char default_menu_config[] =
+ "File|F > Open ...|O :PUSH :Ctrl-o :select-dvi-file()\n"
+ "File|F > Open Recent|R :PUSH : :recent-files()\n"
+ "File|F > Reload|l :PUSH :R :reread-dvi-file()\n"
+ "File|F :SEP ::\n"
+ "File|F > Find ...|F :PUSH :Ctrl-f :find()\n"
+ "File|F > Find Next ...|N :PUSH :Ctrl-g :find-next()\n"
+ "File|F :SEP ::\n"
+ "File|F > Print ...|P :PUSH :Ctrl-p :print()\n"
+ "File|F > Save As ...|S :PUSH :Ctrl-s :save()\n"
+ "File|F :SEP ::\n"
+ "File|F > Quit|Q :PUSH :q :quit()\n"
+/* ========== */
+ "Navigate|N > Page-10| :PUSH :10 p :back-page(10)\n"
+ "Navigate|N > Page-5| :PUSH :5 p :back-page(5)\n"
+ "Navigate|N > Prev|P :PUSH :p :back-page(1)\n"
+ "Navigate|N > Next|N :PUSH :n :forward-page(1)\n"
+ "Navigate|N > Page+5| :PUSH :5 n :forward-page(5)\n"
+ "Navigate|N > Page+10| :PUSH :10 n :forward-page(10)\n"
+ "Navigate|N :SEP ::\n"
+ "Navigate|N > First Page|F :PUSH :1 g :goto-page(1)\n"
+ "Navigate|N > Last Page|L :PUSH :g :goto-page()\n"
+ "Navigate|N :SEP ::\n"
+ "Navigate|N > Page History Back| :PUSH :[ :pagehistory-back()\n"
+ "Navigate|N > Page History Forward| :PUSH :] :pagehistory-forward()\n"
+/* "Navigate|N :SEP ::\n" */
+/* "Navigate|N > Clear Page History| :PUSH : :pagehistory-clear()\n" */
+ "Navigate|N :SEP ::\n"
+ "Navigate|N > Back Hyperlink|B :PUSH :B :htex-back()\n"
+ "Navigate|N > Forward Hyperlink|F :PUSH :F :htex-forward()\n"
+/* ========== */
+#ifdef MOTIF /* Motif zoom buttons are more verbose to emphasise the accelerator */
+ "Zoom|Z > Shrink by 1|1 :RADIO :1 s :set-shrink-factor(1)\n"
+ "Zoom|Z > Shrink by 2|2 :RADIO :2 s :set-shrink-factor(2)\n"
+ "Zoom|Z > Shrink by 3|3 :RADIO :3 s :set-shrink-factor(3)\n"
+ "Zoom|Z > Shrink by 4|4 :RADIO :4 s :set-shrink-factor(4)\n"
+ "Zoom|Z > Shrink by 5|5 :RADIO :5 s :set-shrink-factor(5)\n"
+ "Zoom|Z > Shrink by 6|6 :RADIO :6 s :set-shrink-factor(6)\n"
+ "Zoom|Z > Shrink by 7|7 :RADIO :7 s :set-shrink-factor(7)\n"
+ "Zoom|Z > Shrink by 8|8 :RADIO :8 s :set-shrink-factor(8)\n"
+ "Zoom|Z > Shrink by 9|9 :RADIO :9 s :set-shrink-factor(9)\n"
+#else
+ "Zoom|Z > 1|1 :RADIO :1 s :set-shrink-factor(1)\n"
+ "Zoom|Z > 2|2 :RADIO :2 s :set-shrink-factor(2)\n"
+ "Zoom|Z > 3|3 :RADIO :3 s :set-shrink-factor(3)\n"
+ "Zoom|Z > 4|4 :RADIO :4 s :set-shrink-factor(4)\n"
+ "Zoom|Z > 5|5 :RADIO :5 s :set-shrink-factor(5)\n"
+ "Zoom|Z > 6|6 :RADIO :6 s :set-shrink-factor(6)\n"
+ "Zoom|Z > 7|7 :RADIO :7 s :set-shrink-factor(7)\n"
+ "Zoom|Z > 8|8 :RADIO :8 s :set-shrink-factor(8)\n"
+ "Zoom|Z > 9|9 :RADIO :9 s :set-shrink-factor(9)\n"
+#endif
+ "Zoom|Z :SEP ::\n"
+ "Zoom|Z > Fit in Window|F :PUSH :s :set-shrink-factor(a)\n"
+ "Zoom|Z :SEP ::\n"
+ "Zoom|Z > Zoom In|I :PUSH :Ctrl-+ :set-shrink-factor(+)\n"
+ "Zoom|Z > Zoom Out|O :PUSH :Ctrl-- :set-shrink-factor(-)\n"
+/* ========== */
+ "Mark|M > Mark All Pages|M :PUSH :-1 m :toggle-mark(-1)\n"
+ "Mark|M > Unmark All Pages|U :PUSH :0 m :toggle-mark(0)\n"
+ "Mark|M :SEP ::\n"
+ "Mark|M > Toggle Odd Pages|O :PUSH :1 m :toggle-mark(1)\n"
+ "Mark|M > Toggle Even Pages|E :PUSH :2 m :toggle-mark(2)\n"
+ "Mark|M > Toggle Current Page|C :PUSH :m :toggle-mark()\n"
+#ifndef MOTIF /* special `Modes' menu for Xaw */
+ "Modes|M > Magnifier|M :RADIO :Ctrl-m :switch-mode(0)\n"
+ "Modes|M > Text Selection|T :RADIO :Ctrl-m :switch-mode(1)\n"
+ "Modes|M > Ruler|R :RADIO :Ctrl-m :switch-mode(2)\n"
+#endif
+/* ========== */
+ "Options|O > Keep Position|K :CHECK :k :set-keep-flag(toggle)\n"
+ "Options|O > Use TeX Page Numbers|T :CHECK :T :use-tex-pages(toggle)\n"
+ "Options|O :SEP ::\n"
+/* ---------- */
+#ifdef MOTIF /* nested menus are used in Motif only */
+#if 0
+/* TODO: implement setting paper size at runtime */
+ "Options|O > Paper|a > US letter|U :RADIO : :set-papersize(us)\n"
+ "Options|O > Paper|a > Legal|L :RADIO : :set-papersize(legal)\n"
+ "Options|O > Paper|a > Foolscap|F :RADIO : :set-papersize(foolscap)\n"
+ "Options|O > Paper|a > A1|1 :RADIO : :set-papersize(a1)\n"
+ "Options|O > Paper|a > A2|2 :RADIO : :set-papersize(a2)\n"
+ "Options|O > Paper|a > A3|3 :RADIO : :set-papersize(a3)\n"
+ "Options|O > Paper|a > A4|4 :RADIO : :set-papersize(a4)\n"
+ "Options|O > Paper|a > A5|5 :RADIO : :set-papersize(a5)\n"
+ "Options|O > Paper|a > A6|5 :RADIO : :set-papersize(a6)\n"
+ "Options|O > Paper|a > A7|7 :RADIO : :set-papersize(a7)\n"
+ /* Note: the b* and c* DIN sizes are too rarely used to be exposed here;
+ people can still customize the Menu if they really need them. */
+ "Options|O > Paper|a :SEP ::\n"
+ "Options|O > Paper|a > Landscape|L :CHECK : :set-paper-landscape(toggle)\n"
+#endif /* 0 */
+/* ---------- */
+# if PS
+ "Options|O > Postscript|o > Show PS|S :RADIO :1 v :set-ps(1)\n"
+ "Options|O > Postscript|o > Show PS and Bounding Boxes|B :RADIO :2 v :set-ps(2)\n"
+ "Options|O > Postscript|o > Show Bounding Boxes Only|O :RADIO :0 v :set-ps(0)\n"
+# ifdef GS_PS
+ "Options|O > Postscript|o :SEP ::\n"
+ "Options|O > Postscript|o > Use PS Anti-Aliasing|A :CHECK :V :set-gs-alpha(toggle)\n"
+# endif
+# endif
+/* ---------- */
+ "Options|O > Mouse Mode|M > Magnifier|M :RADIO :0 Ctrl-m :switch-mode(0)\n"
+ "Options|O > Mouse Mode|M > Text Selection|T :RADIO :1 Ctrl-m :switch-mode(1)\n"
+ "Options|O > Mouse Mode|M > Ruler|R :RADIO :2 Ctrl-m :switch-mode(2)\n"
+ "Options|O :SEP ::\n"
+ "Options|O > Preferences ...|P :PUSH : :prefs-dialog()\n"
+#else
+ "Options|O > Show PS|S :RADIO :1 v :set-ps(1)\n"
+ "Options|O > Show PS and Bounding Boxes|B :RADIO :2 v :set-ps(2)\n"
+ "Options|O > Show Bounding Boxes Only|O :RADIO :0 v :set-ps(0)\n"
+ "Options|O :SEP ::\n"
+ "Options|O > Use PS Anti-Aliasing|A :CHECK :V :set-gs-alpha(toggle)\n"
+ "Options|O :SEP ::\n"
+ "Options|O > Fonts Darker|D :PUSH :Alt-Ctrl-+:change-density(5)\n"
+ "Options|O > Fonts Lighter|L :PUSH :Alt-Ctrl--:change-density(-5)\n"
+#endif /* MOTIF */
+/* ========== */
+ "Help|H > Introduction ...|I :PUSH : :help(Introduction)\n"
+ "Help|H > Page Motion ...|P :PUSH : :help(Page Motion)\n"
+ "Help|H > Other Commands ...|O :PUSH : :help(Other Commands)\n"
+ "Help|H > Hyperlinks ...|H :PUSH : :help(Hyperlinks)\n"
+ "Help|H > Mouse Buttons ...|M :PUSH : :help(Mouse Buttons)\n"
+ "Help|H > Mouse Modes ...|d :PUSH : :help(Mouse Modes)\n"
+ "Help|H > String Search ...|e :PUSH : :help(String Search)\n"
+ "Help|H > Printing and Saving ...|S :PUSH : :help(Printing and Saving)\n"
+ "Help|H > Source Specials ...|r :PUSH : :help(Source Specials)\n"
+ "Help|H :SEP ::\n"
+ "Help|H > New Features in this Version|F:PUSH::load-url(http\\://xdvi.sourceforge.net/releases.html#" XDVI_VERSION ")\n"
+ "Help|H > Submit a Bug Report|B :PUSH ::load-url(http\\://sourceforge.net/tracker/?func=add&group_id=23164&atid=377580)\n"
+ "";
+
+
+static const char default_toolbar_translations[] =
+/* index statusline-text tooltip action */
+ "SPACER(5)\n"
+ "0: Open a new file (Key\\: Ctrl-o): Open file: select-dvi-file()\n"
+ "SPACER(10)\n"
+ "1: Reload this file (Key\\: R): Reload file: reread-dvi-file()\n"
+ "SPACER(10)\n"
+ "2: Go to the first page of this file (Key\\: 1g): First page: goto-page(1)\n"
+ "3: Go to the previous page of this file (Key\\: p): Previous page: back-page(1)\n"
+ "4: Go to the next page of this file (Key\\: n): Next page: forward-page(1)\n"
+ "5: Go to the last page of this file (Key\\: g): Last page: goto-page(e)\n"
+ "SPACER(10)\n"
+ "8: Back to previous page in history (Key\\: [): Page History back: pagehistory-back()\n"
+ "9: Forward to next page in history (Key\\: ]): Page History forward: pagehistory-forward()\n"
+ "SPACER(10)\n"
+ "6: Zoom in (Key\\: Ctrl-+): Zoom in: set-shrink-factor(+)\n"
+ "7: Zoom out (Key\\: Ctrl--): Zoom out: set-shrink-factor(-)\n"
+ "SPACER(10)\n"
+ "11:Print this DVI file:Print:print()\n"
+ "SPACER(10)\n"
+ "16:Find in DVI file (Key\\: Ctrl-f): Find in file: find()\n"
+ "SPACER(10)\n"
+ "12:Toggle marks of odd pages (Key\\: 1m): Toggle odd pages: toggle-mark(1)\n"
+ "13:Toggle marks of even pages (Key\\: 2m): Toggle even pages: toggle-mark(2)\n"
+ "14:Toggle mark of current page (Key\\: 2m): Toggle current page: toggle-mark()\n"
+ "15:Unmark all pages (Key\\: 0m): Unmark all pages: toggle-mark(0)\n"
+ "SPACER(10)\n"
+ "19:Display fonts darker (Key\\: Alt-Ctrl-+): Fonts darker: change-density(5)\n"
+ "20:Display fonts lighter (Key\\: Alt-Ctrl--): Fonts lighter: change-density(-5)\n"
+ "";
diff --git a/Build/source/texk/xdvik/util.c b/Build/source/texk/xdvik/util.c
new file mode 100644
index 00000000000..958a99c4788
--- /dev/null
+++ b/Build/source/texk/xdvik/util.c
@@ -0,0 +1,2006 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2015 Paul Vojta and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+#include "xdvi-config.h"
+
+#include <sys/types.h> /* ZLB: must be before sys/socket.h for IRIX 5.3 */
+#include <sys/socket.h>
+#include <sys/file.h> /* this defines FASYNC */
+#include <sys/ioctl.h> /* this defines SIOCSPGRP and FIOASYNC */
+#include <sys/wait.h> /* this defines WIFEXITED and WEXITSTATUS */
+
+#include "xdvi.h"
+#include "hypertex.h"
+#include "dvi-init.h"
+#include "special.h"
+#include "string-utils.h"
+
+#include "kpathsea/tex-file.h"
+
+#include "events.h"
+#include "util.h"
+#include "x_util.h"
+#include "message-window.h"
+#include "search-internal.h"
+#include "encodings.h"
+#include "filehist.h"
+#include "xm_prefs.h" /* for preferences_changed() */
+
+#include <errno.h>
+
+#ifndef HAVE_MEMICMP
+#include <ctype.h>
+#endif
+
+#ifdef VMS
+#include <rmsdef.h>
+#endif /* VMS */
+
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+extern void *malloc();
+extern void *realloc();
+#endif
+
+
+#ifdef DOPRNT /* define this if vfprintf gives you trouble */
+#define vfprintf(stream, message, args) _doprnt(message, args, stream)
+#endif
+
+#ifdef VMS
+#include <rmsdef.h>
+#endif /* VMS */
+
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+extern void *malloc();
+extern void *realloc();
+#endif
+
+#if HAVE_XKB_BELL_EXT
+# include <X11/XKBlib.h>
+# define XBell(dpy, percent) XkbBell(dpy, mane.win, percent, (Atom) None)
+#endif
+
+/* if POSIX O_NONBLOCK is not available, use O_NDELAY */
+#if !defined O_NONBLOCK && defined O_NDELAY
+# define O_NONBLOCK O_NDELAY
+#endif
+
+/* Linux prefers O_ASYNC over FASYNC; SGI IRIX does the opposite. */
+#if !defined(FASYNC) && defined(O_ASYNC)
+# define FASYNC O_ASYNC
+#endif
+
+#if !defined(FLAKY_SIGPOLL) && !HAVE_STREAMS && !defined(FASYNC)
+# if !defined(SIOCSPGRP) || !defined(FIOASYNC)
+# define FLAKY_SIGPOLL 1
+# endif
+#endif
+
+#if !FLAKY_SIGPOLL && HAVE_STREAMS
+# include <stropts.h>
+
+# ifndef S_RDNORM
+# define S_RDNORM S_INPUT
+# endif
+
+# ifndef S_RDBAND
+# define S_RDBAND 0
+# endif
+
+# ifndef S_HANGUP
+# define S_HANGUP 0
+# endif
+
+# ifndef S_WRNORM
+# define S_WRNORM S_OUTPUT
+# endif
+
+#endif /* not FLAKY_SIGPOLL && HAVE_STREAMS */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <pwd.h>
+#include <errno.h>
+
+#ifndef MAXSYMLINKS /* Workaround for Linux libc 4.x/5.x */
+#define MAXSYMLINKS 5
+#endif
+
+#if HAVE_ICONV_H
+#include <iconv.h>
+#endif
+
+#include <locale.h>
+
+#if USE_LANGINFO
+#include <langinfo.h>
+#endif
+
+#define BUF_SIZE 1024
+
+void
+xdvi_assert(const char *version,
+ const char *filename,
+ int lineno,
+ Boolean condition,
+ const char *fmt, ...)
+{
+ if (!(condition)) {
+ va_list argp;
+ fprintf(stderr,
+ "\n************************************************************\n"
+ "XDvi %s: Failed assertion:\n%s:%d: ",
+ version, filename, lineno);
+ va_start(argp, fmt);
+ (void)vfprintf(stderr, fmt, argp);
+ va_end(argp);
+#ifdef NDEBUG
+ fprintf(stderr,
+ "\nAborting now. Please report this as a bug to:\n"
+ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n"
+ "If a core dump has been produced, please invoke:\n"
+ "gdb %s core\nThen type \"bt\", "
+ "and include the resulting output in your bug report.\n"
+ "************************************************************\n",
+ globals.program_name);
+ do_abort();
+#else
+ fprintf(stderr,
+ "\nPlease report this as a bug to:\n"
+ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n"
+ "************************************************************\n");
+#endif
+ }
+}
+
+
+void
+xdvi_bell(void)
+{
+ if (!resource.hush_bell) {
+ XBell(DISP, 0);
+ }
+}
+
+
+
+/* NOTE: keep this table in sync with the #defines in xdvi-debug.h! */
+struct debug_string_options debug_options[] = {
+ { DBG_BITMAP, "bitmap", ", " },
+ { DBG_DVI, "dvi", ", " },
+ { DBG_PK, "pk", ", " },
+ { DBG_BATCH, "batch", ", " },
+ { DBG_EVENT, "events", ", " },
+ { DBG_PS, "ps", ",\n"},
+ { DBG_STAT, "stat", ", " },
+ { DBG_HASH, "hash", ", " },
+ { DBG_OPEN, "open", ", " },
+ { DBG_PATHS, "paths", ", " },
+ { DBG_EXPAND, "expand", ", " },
+ { DBG_SEARCH, "search", ", " },
+ { DBG_KPATHSEA, "kpathsea", ",\n"},
+ { DBG_HTEX, "htex", ", " },
+ { DBG_SRC_SPECIALS,"src", ", " },
+ { DBG_CLIENT, "client", ", " },
+ { DBG_FT, "ft", ", " },
+ { DBG_FT_VERBOSE, "ft_verbose", ",\n"},
+ { DBG_GUI, "gui", ", " },
+ { DBG_FIND, "find", ", " },
+ { DBG_FILES, "files", ", " },
+ { DBG_ALL, "all", "\n" },
+ /* end marker */
+ { 0, NULL, NULL }
+};
+
+/*
+ * General utility routines.
+ */
+
+/*
+ * 2-step fopen using close_a_file() if first opening attempt fails with
+ * `too many open files'.
+ */
+FILE *
+try_fopen(const char *fname, const char *mode)
+{
+ FILE *fp = fopen(fname, mode);
+ if (fp == NULL && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ fp = fopen(fname, mode);
+ }
+ return fp;
+}
+
+/*
+ * Like try_fopen(), for fdopen().
+ */
+FILE *
+try_fdopen(int fd, const char *mode)
+{
+ FILE *fp = fdopen(fd, mode);
+ if (fp == NULL && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ fp = fdopen(fd, mode);
+ }
+ return fp;
+}
+
+
+/*
+ * Like try_fopen(), for open().
+ */
+int
+try_open(const char *fname, int flags)
+{
+ int fd = open(fname, flags);
+ if (fd < 0 && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ fd = open(fname, flags);
+ }
+ return fd;
+}
+
+/*
+ * Like try_fopen(), for open() with 3 arguments.
+ */
+int
+try_open_mode(const char *fname, int flags, mode_t mode)
+{
+ int fd = open(fname, flags, mode);
+ if (fd < 0 && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ fd = open(fname, flags, mode);
+ }
+ return fd;
+}
+
+
+/*
+ * invoked on SIGSEGV: try to stop gs before aborting, to prevent gs
+ * running on with 100% CPU consumption - this can be annoying during
+ * testing. We'd also like to clean up the "xdvi windows" property in
+ * the root window, but it might be already too late to talk to the
+ * X server here (the code can also be triggered by X errors).
+ */
+void
+do_abort(void)
+{
+#if PS
+ ps_destroy();
+#endif
+ /* if (globals.widgets.top_level) */
+ /* exit_clean_windows(); */
+ abort();
+}
+
+/*
+ Expand leading ~ or ~user in path to the actual homedirectory of the user.
+ Returns either NULL if unsuccessful, or result in freshly allocated string.
+ Bugs: ~user doesn't work with NIS/yellow pages.
+*/
+char *
+expand_homedir(const char *path)
+{
+ char *resolved = NULL;
+ const char *orig_path = path;
+ UNUSED(orig_path); /* if HAVE_GETPWNAM or HAVE_GETPWUID && HAVE_GETUID */
+
+ if (path == NULL)
+ return NULL;
+
+ /* if path doesn't start with ~, just return a copy of path */
+ if (*path != '~')
+ return xstrdup(path);
+
+ /* expand ~/ or ~user */
+ path++;
+ if (*path == '/') { /* expand `~/' to `$HOME/' */
+ char *homedir = getenv("HOME");
+ if (homedir != NULL) {
+ resolved = xstrdup(homedir);
+ resolved = xstrcat(resolved, path);
+ }
+ else {
+#if defined(HAVE_GETPWUID) && defined(HAVE_GETUID)
+ /* homedir not set */
+ struct passwd *entry = getpwuid(getuid());
+ if (entry != NULL) {
+ homedir = entry->pw_dir;
+ if (homedir != NULL) {
+ resolved = xstrdup(homedir);
+ resolved = xstrcat(resolved, path);
+ }
+ else {
+ XDVI_ERROR((stderr, "getpwnam returned NULL for entry->pw_dir: %s", strerror(errno)));
+ return NULL;
+ }
+ }
+ else {
+ XDVI_ERROR((stderr, "getpwnam failed: %s", strerror(errno)));
+ return NULL;
+ }
+#else
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "$HOME not set, and getpwuid() or getuid() not supported - could not expand \"%s\".",
+ orig_path);
+ return NULL;
+#endif
+ }
+ TRACE_GUI((stderr, "resolved: |%s|", resolved));
+ return resolved;
+ }
+ else { /* ~user -> try getpwnam() to get homedir */
+#ifdef HAVE_GETPWNAM
+ struct passwd *entry;
+ char *separator = strchr(path, '/');
+ char *homedir;
+
+ TRACE_GUI((stderr, "separator is: |%s|, len of username: %d",
+ separator, (int)(separator - path)));
+ if (separator == NULL)
+ return NULL;
+
+ resolved = xmalloc(separator - path + 1);
+ memcpy(resolved, path, separator - path);
+ resolved[separator - path] = '\0';
+
+ TRACE_GUI((stderr, "username is: |%s|", resolved));
+ entry = getpwnam(resolved);
+ if (entry == NULL) {
+ XDVI_ERROR((stderr, "getpwnam failed: %s", strerror(errno)));
+ return NULL;
+ }
+ TRACE_GUI((stderr, "homedir of user is: |%s|", entry->pw_dir));
+ homedir = entry->pw_dir;
+
+ free(resolved);
+ resolved = xstrdup(homedir);
+ resolved = xstrcat(resolved, path + (separator - path));
+ TRACE_GUI((stderr, "resolved: |%s|", resolved));
+ return resolved;
+#else
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Expanding \"%s\" failed: This platform doesn't support getpwnam().",
+ orig_path);
+ return NULL;
+#endif
+ }
+
+}
+
+/*
+ realpath implementation if no implementation available.
+ Try to canonicalize path, removing `~', `.' and `..' and expanding symlinks.
+
+ Adopted from wu-ftpd's fb_realpath (in realpath.c), but without the
+ seteuid(0) stuff (which we don't need, since we never change into
+ directories or read files the user has no permissions for), and
+ without the ugly goto(). Special care has been taken to avoid buffer
+ overflows (e.g. this version is not affected by
+ http://isec.pl/vulnerabilities/isec-0011-wu-ftpd.txt).
+
+ `resolved' should be a buffer of size MAXPATHLEN. */
+
+char *
+my_realpath(const char *path, char *resolved)
+{
+ struct stat sb;
+ int n;
+ /* char *p, *q, *tmp; */
+ char *base;
+ char tmpbuf[MAXPATHLEN];
+ int symlinks = 0;
+#ifdef HAVE_FCHDIR
+ int fd;
+#else
+ char cwd[MAXPATHLEN];
+#endif
+
+ /* Save cwd for going back later */
+#ifdef HAVE_FCHDIR
+ if ((fd = try_open(".", O_RDONLY)) < 0)
+ return NULL;
+#else /* HAVE_FCHDIR */
+ if (
+# ifdef HAVE_GETCWD
+ getcwd(cwd, MAXPATHLEN)
+# else
+ getwd(cwd)
+# endif
+ == NULL)
+ return NULL;
+#endif /* HAVE_FCHDIR */
+
+ if (strlen(path) + 1 > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ return NULL;
+ }
+
+ strcpy(resolved, path);
+
+ for (;;) { /* loop for resolving symlinks in base name */
+ /* get base name and dir name components */
+ char *p = strrchr(resolved, '/');
+ if (p != NULL) {
+ base = p + 1;
+ if (p == resolved) {
+ /* resolved is in root dir; this must be treated as a special case,
+ since we can't chop off at `/'; instead, just use the `/':
+ */
+ p = "/";
+ }
+ else {
+ /* not in root dir; chop off path name at slash */
+ while (p > resolved && *p == '/') /* for multiple trailing slashes */
+ p--;
+ *(p + 1) = '\0';
+ p = resolved;
+ }
+
+ /* change into that dir */
+ if (chdir(p) != 0)
+ break;
+ }
+ else /* no directory component */
+ base = resolved;
+
+ /* resolve symlinks or directory names (not used in our case) in basename */
+ if (*base != '\0') {
+ if (
+#ifdef HAVE_LSTAT
+ lstat(base, &sb)
+#else
+ stat(base, &sb)
+#endif
+ == 0) {
+#ifdef HAVE_LSTAT
+ if (S_ISLNK(sb.st_mode)) { /* if it's a symlink, iterate for what it links to */
+ if (++symlinks > MAXSYMLINKS) {
+ errno = ELOOP;
+ break;
+ }
+
+ if ((n = readlink(base, resolved, MAXPATHLEN)) < 0)
+ break;
+
+ resolved[n] = '\0';
+ continue;
+ }
+#endif /* HAVE_LSTAT */
+ if (S_ISDIR(sb.st_mode)) { /* if it's a directory, go there */
+ if (chdir(base) != 0)
+ break;
+
+ base = "";
+ }
+ }
+ }
+
+ /* Now get full pathname of current directory and concatenate it with saved copy of base name */
+ strcpy(tmpbuf, base); /* cannot overrun, since strlen(base) <= strlen(path) < MAXPATHLEN */
+ if (
+#ifdef HAVE_GETCWD
+ getcwd(resolved, MAXPATHLEN)
+#else
+ getwd(resolved)
+#endif
+ == NULL)
+ break;
+
+ /* need to append a slash if resolved is not the root dir */
+ if (!(resolved[0] == '/' && resolved[1] == '\0')) {
+ if (strlen(resolved) + 2 > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ break;
+ }
+ strcat(resolved, "/");
+ }
+
+ if (*tmpbuf) {
+ if (strlen(resolved) + strlen(tmpbuf) + 1 > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ break;
+ }
+ strcat(resolved, tmpbuf);
+ }
+
+ /* go back to where we came from */
+#ifdef HAVE_FCHDIR
+ (void)fchdir(fd);
+ close(fd);
+#else
+ (void)chdir(cwd);
+#endif
+ return resolved;
+ }
+
+ /* arrive here in case of error: go back to where we came from, and return NULL */
+#ifdef HAVE_FCHDIR
+ (void)fchdir(fd);
+ close(fd);
+#else
+ (void)chdir(cwd);
+#endif
+ return NULL;
+}
+
+
+#ifndef KPATHSEA
+
+/*
+ * Either (re)allocate storage or fail with explanation.
+ */
+
+void *
+xmalloc(unsigned size)
+{
+ void *mem = malloc(size);
+
+ if (mem == NULL)
+ XDVI_FATAL((stderr, "Out of memory (allocating %u bytes).", size));
+ return mem;
+}
+
+void *
+xrealloc(void *where, unsigned size)
+{
+ void *mem = realloc(where, size);
+
+ if (mem == NULL)
+ XDVI_FATAL((stderr, "Out of memory (reallocating %u bytes).", size));
+ return mem;
+}
+
+
+/*
+ * Allocate a new string.
+ */
+
+char *
+xstrdup(const char *str)
+{
+ size_t len;
+ char *new;
+
+ ASSERT(fprintf(stderr, "Test assertion!\n") && 1 == 0);
+ ASSERT(str != NULL, "");
+ len = strlen(str) + 1;
+ new = xmalloc(len);
+ memcpy(new, str, len);
+ return new;
+}
+
+#endif /* not KPATHSEA */
+
+
+/*
+ * Allocate a new string. The second argument is the length.
+ */
+
+char *
+xmemdup(const char *str, size_t len)
+{
+ char *new;
+
+ new = xmalloc(len);
+ memcpy(new, str, len);
+ return new;
+}
+
+/* like xstrdup(), but with XtMalloc() */
+char *
+xt_strdup(const char *ptr)
+{
+ char *ret = XtMalloc(strlen(ptr) + 1);
+ return strcpy(ret, ptr);
+}
+
+
+/*
+ * Append str2 to str1, reallocating str1 as neccessary.
+ * Note that this modifies str1, so if you want a clean
+ * new copy, use xstrdup() first, then xstrcat().
+ * str1 should be either NULL, or a valid char * that has
+ * previously been malloc()ed.
+ */
+
+char *
+xstrcat(char *str1, const char *str2)
+{
+ size_t len1 = (str1 == NULL) ? 0 : strlen(str1);
+ size_t len2 = strlen(str2) + 1;
+
+ str1 = xrealloc(str1, len1 + len2);
+ memcpy(str1 + len1, str2, len2);
+ return str1;
+}
+
+
+/*
+ * Allocate bitmap for given font and character
+ */
+
+void
+alloc_bitmap(struct bitmap *bitmap)
+{
+ unsigned int size;
+
+ /* fprintf(stderr, "allocating bitmap of size %u x %u\n", bitmap->w, bitmap->h); */
+ /* width must be multiple of <arch-defined> bits for raster_op */
+ bitmap->bytes_wide = ROUNDUP((int)bitmap->w, BMBITS) * BMBYTES;
+ size = bitmap->bytes_wide * bitmap->h;
+ bitmap->bits = xmalloc(size != 0 ? size : 1);
+}
+
+
+#ifndef HAVE_MEMICMP
+/*
+ * Case-insensitive version of memcmp(). This code assumes that the second
+ * argument (i.e. what is being compared with) is lower case.
+ */
+
+int
+memicmp(const char *s1, const char *s2, size_t n)
+{
+ while (n > 0) {
+ int i = tolower((int)*s1) - *s2;
+ if (i != 0)
+ return i;
+ ++s1;
+ ++s2;
+ --n;
+ }
+ return 0;
+}
+#endif /* HAVE_MEMICMP */
+
+/*
+ * Try to close the pixel file for the least recently used font.
+ * Invoked when we've run out of file descriptors.
+ */
+void
+close_a_file(void)
+{
+ struct font *fontp;
+ unsigned short oldest = USHRT_MAX;
+ struct font *f = NULL;
+
+ if (globals.debug & DBG_OPEN)
+ puts("Calling close_a_file().");
+
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next) {
+ if (fontp->file != NULL && fontp->timestamp <= oldest) {
+ f = fontp;
+ oldest = fontp->timestamp;
+ }
+ }
+ /* fprintf(stderr, "oldest = %u\n", oldest); */
+ if (f == NULL)
+ XDVI_FATAL((stderr, "Can't find an open pixel file to close"));
+ fclose(f->file);
+ f->file = NULL;
+}
+
+/*
+ * Open a file in the given mode. We use XFOPEN since xfopen is already
+ * usurpated by kpathsea's xfopen.c, which just exits rather ungracefully
+ * if it detects a NULL return value; most certainly NOT what we want here.
+ */
+FILE *
+XFOPEN(const char *path, const char *mode)
+{
+ FILE *fp = NULL;
+#ifdef TESTING_OPEN_FILES
+ fprintf(stderr, "trying to open |%s|\n", path);
+#endif
+ if ((fp = try_fopen(path, mode)) == NULL && (errno == EMFILE || errno == ENFILE)) {
+ XDVI_FATAL((stderr, "too many open files"));
+ }
+ return fp;
+}
+
+/*
+ * Create a pipe, closing a file if necessary.
+ * We use socketpair() instead of pipe() because several operating
+ * systems don't support SIGPOLL/SIGIO on pipes:
+ * SGI IRIX 6.5 F_SETOWN not implemented
+ * Linux 2.4.2 Not supported
+ */
+
+int
+xpipe(int *fd)
+{
+ int retval;
+
+ for (;;) {
+ retval = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
+ if (retval == 0) { /* success */
+ break;
+ }
+ if ((errno != EMFILE && errno != ENFILE)) {
+ /* failed, but not because of too many files */
+ break;
+ }
+ close_a_file();
+ }
+ return retval;
+}
+
+
+
+/*
+ *
+ * Read size bytes from the FILE fp, constructing them into a
+ * signed/unsigned integer.
+ *
+ */
+
+unsigned long
+get_bytes(FILE *fp, int size)
+{
+ long x = 0;
+
+ while (size--)
+ x = (x << 8) | get_byte(fp);
+ return x;
+}
+
+long
+get_lbytes(FILE *fp, int size)
+{
+ long x;
+
+#if __STDC__
+ x = (signed char)getc(fp);
+#else
+ x = (unsigned char)getc(fp);
+ if (x & 0x80)
+ x -= 0x100;
+#endif
+ while (--size)
+ x = (x << 8) | get_byte(fp);
+ return x;
+}
+
+
+
+/*
+ * Create a temporary file and return its fd. Also put its filename
+ * in str. Create str if it's NULL.
+ */
+
+#ifndef P_tmpdir
+#define P_tmpdir "/tmp"
+#endif
+
+static const char tmp_suffix[] = "/xdvi-XXXXXX";
+
+int
+xdvi_temp_fd(char **str)
+{
+ int fd;
+ char *p;
+ size_t len;
+ static const char *template = NULL;
+#if !HAVE_MKSTEMP
+ static unsigned long seed;
+ static char letters[] =
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._";
+ char *p1;
+#endif
+
+ if (*str != NULL) {
+ p = *str;
+
+ /* O_EXCL is there for security (if root runs xdvi) */
+ if (!((fd = try_open_mode(p, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1
+ && errno == EEXIST))
+ return fd;
+#if HAVE_MKSTEMP
+ memcpy(p + strlen(p) - 6, "XXXXXX", 6);
+#endif
+ }
+ else {
+ if (template == NULL) {
+ const char *ourdir;
+
+ ourdir = getenv("TMPDIR");
+ if (ourdir == NULL || access(ourdir, W_OK) < 0) {
+ ourdir = P_tmpdir;
+ if (access(ourdir, W_OK) < 0)
+ ourdir = ".";
+ }
+ len = strlen(ourdir);
+ if (len > 0 && ourdir[len - 1] == '/')
+ --len;
+ template = p = xmalloc(len + sizeof tmp_suffix);
+ memcpy(p, ourdir, len);
+ memcpy(p + len, tmp_suffix, sizeof tmp_suffix);
+#if !HAVE_MKSTEMP
+ seed = 123456789 * time(NULL) + 987654321 * getpid();
+#endif
+ }
+ *str = p = xstrdup(template);
+ }
+
+#if HAVE_MKSTEMP
+ fd = mkstemp(p);
+ if (fd == -1 && (errno == EMFILE || errno == ENFILE)) {
+ close_a_file();
+ memcpy(p + strlen(p) - 6, "XXXXXX", 6);
+ fd = mkstemp(p);
+ }
+#else
+ p1 = p + strlen(p) - 6;
+ for (;;) {
+ unsigned long s = ++seed;
+ char *p2;
+
+ for (p2 = p1 + 5; p2 >= p1; --p2) {
+ *p2 = letters[s & 63];
+ s >>= 6;
+ }
+ if (!((fd = try_open_mode(p, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1
+ && errno == EEXIST))
+ break;
+ }
+#endif
+ return fd;
+}
+
+
+/* print a GUI error message for childs that exited with an errorcode */
+void
+handle_child_exit(int status, struct xchild *this)
+{
+ char *err_msg = NULL;
+
+ /* if child exited with error and xio struct is available for child,
+ print error text */
+ if (this->io != NULL
+ && (WIFEXITED(status) != 0)
+ && (WEXITSTATUS(status) != 0)
+ && (err_msg = (this->io->read_proc)(this->io->fd, NULL)) != NULL) {
+
+ if (this->name == NULL) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ err_msg[0] == '\0' ? "An unknown error occurred" : err_msg);
+ }
+ else {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ "Xdvi tries to collect all messages from STDERR. "
+ "When no useful error message is available "
+ "(e.g. because the program has written to STDOUT instead), "
+ "try to run the command again from the command line "
+ "to find out what the problem was.",
+ "Command \"%s\" exited with error code %d\n%s\n",
+ this->name, WEXITSTATUS(status), err_msg);
+ }
+ free(err_msg);
+ }
+ free(this->name);
+ free(this->io);
+ free(this);
+}
+
+static void
+dummy_write_proc(int fd, void *data)
+{
+ UNUSED(fd);
+ UNUSED(data);
+
+ fprintf(stderr, "============== dummy_write_proc called for fd %d\n", fd);
+}
+
+/*
+ * read what child printed to fd (should be set up to be stderr).
+ * Allocates and returns error text; caller is responsible for free()ing it
+ * afterwards.
+ */
+char *
+read_child_error(int fd, void *data)
+{
+ int bytes = 0, buf_old_size = 0, buf_new_size = 0;
+ char tmp_buf[BUF_SIZE];
+ char *err_buf = xstrdup("");
+ char *ret;
+ UNUSED(data);
+
+ /* collect stderr messages into err_buf */
+ while ((bytes = read(fd, tmp_buf, BUF_SIZE - 1)) > 0) {
+ buf_old_size = buf_new_size;
+ buf_new_size += bytes;
+ err_buf = xrealloc(err_buf, buf_new_size + 1);
+ memcpy(err_buf + buf_old_size, tmp_buf, buf_new_size - buf_old_size);
+ err_buf[buf_new_size] = '\0';
+ }
+
+ close(fd);
+ ret = escape_format_arg(err_buf); /* this allocates ret */
+ free(err_buf);
+ return ret;
+}
+
+/*
+ * Fork a child process. If exit_proc is NULL, the process' error messages
+ * will be collected and a window popped up for GUI display. If exit_proc
+ * is non-NULL, it should be a function that does something reasonable
+ * with the error messages itself. It should also free the xchild struct.
+ *
+ * If dirname != NULL, the child will chdir into dirname before running the
+ * command.
+ *
+ * If killsig == 0, the process will not be killed when xdvi terminates.
+ * If killsig > 0, the process will be sent this signal when xdvi terminates.
+ * If killsig < 0, the process will be given its own group, and the whole group
+ * will be sent -killsig when xdvi terminates. This is useful when invoking
+ * /bin/sh. Generally killsig (if nonzero) should be SIGKILL or -SIGKILL.
+ */
+Boolean
+fork_process(const char *proc_name, Boolean redirect_stdout,
+ const char *dirname,
+ childProcT exit_proc, void *data,
+ int killsig,
+ char *const argv[])
+{
+ int i, pid;
+ struct xchild *my_child = xmalloc(sizeof *my_child);
+ struct xio *my_io = xmalloc(sizeof *my_io);
+ int err_pipe[2];
+ char *volatile buf = xstrdup("");
+
+ for (i = 0; argv[i] != NULL; i++) {
+ TRACE_GUI((stderr, "argv: |%s|", argv[i]));
+ buf = xstrcat(buf, argv[i]);
+ buf = xstrcat(buf, " ");
+ }
+
+ if (i > 0)
+ buf[strlen(buf) - 1] = '\0'; /* chop off trailing space */
+
+ TRACE_GUI((stderr, "forking: |%s|", buf));
+
+ /* flush output buffers to avoid double buffering (i.e. data
+ waiting in the output buffer being written twice, by the parent
+ and the child) */
+ fflush(stdout);
+ fflush(stderr);
+
+ if (pipe(err_pipe) < 0) {
+ XDVI_FATAL((stderr, "pipe error"));
+ }
+
+ switch (pid = vfork()) {
+ case -1: /* forking error */
+ perror("vfork");
+ close(err_pipe[0]);
+ close(err_pipe[1]);
+ return False;
+ case 0: /* child */
+ if (dirname != NULL)
+ (void)chdir(dirname);
+ if (globals.debug & DBG_FILES) {
+ char path[MAXPATHLEN];
+ (void)getcwd(path, MAXPATHLEN);
+ fprintf(stderr, "Directory of running `%s': `%s'\n",
+ proc_name, path);
+ }
+ /* FIXME: There's a bug which prevents this from working
+ with xdvi as child: Whenever xdvi tries to print to stderr,
+ this will hang the child forever. Closing all other file
+ descriptors, as in the #if TRY_FIX regions, seems to fix
+ this, but it also loses all output ...
+ */
+#if TRY_FIX
+ close(0);
+ close(1);
+#endif /* TRY_FIX */
+ close(err_pipe[0]); /* no reading from stderr */
+
+ /* (Maybe) set session ID, so that kill will also affect subprocesses */
+ if (killsig < 0) {
+ if (setsid() == -1) {
+ perror("setsid");
+ _exit(EXIT_FAILURE);
+ return False; /* make compiler happy */
+ }
+ }
+
+ /* redirect writing to stderr */
+ if (dup2(err_pipe[1], STDERR_FILENO) != STDERR_FILENO) {
+ perror("dup2 for stderr");
+ _exit(EXIT_FAILURE);
+ return False; /* make compiler happy */
+ }
+ if (redirect_stdout) {
+ /* also redirect writing to stdout */
+ if (dup2(err_pipe[1], STDOUT_FILENO) != STDOUT_FILENO) {
+ perror("dup2 for stdout");
+ _exit(EXIT_FAILURE);
+ return False; /* make compiler happy */
+ }
+ }
+
+#if TRY_FIX
+ /* close all remaining descriptors */
+ i = 2;
+ while (i < 256 /* TODO: better handling of OPEN_MAX; see Stevens p. 43 */) {
+ close(i++);
+ }
+#endif /* TRY_FIX */
+ execvp(proc_name, argv);
+
+ /* arrive here only if execvp failed */
+ fprintf(stderr, "%s: Execution of %s failed.\n", globals.program_name, proc_name);
+ fflush(stderr);
+ close(err_pipe[1]);
+ _exit(EXIT_FAILURE);
+ return False; /* make compiler happy */
+ default: /* parent */
+ close(err_pipe[1]); /* no writing to stderr */
+
+ my_io->next = NULL;
+ my_io->fd = err_pipe[0];
+ my_io->xio_events = XIO_IN;
+#if HAVE_POLL
+ my_io->pfd = NULL;
+#endif
+ my_io->read_proc = read_child_error;
+ my_io->write_proc = dummy_write_proc;
+ my_io->data = data;
+
+ my_child->next = NULL;
+ my_child->pid = pid;
+ my_child->name = buf;
+ my_child->data = data;
+ my_child->killsig = killsig;
+ if (exit_proc == NULL) { /* use default exit procedure */
+ my_child->proc = handle_child_exit;
+ }
+ else {
+ my_child->proc = exit_proc;
+ }
+ my_child->io = my_io;
+
+ set_chld(my_child);
+
+ return True;
+ }
+}
+
+
+
+/*
+ * Prepare the file descriptor to generate SIGPOLL/SIGIO events.
+ * If called with a True argument, set it up for non-blocking I/O.
+ */
+
+void
+prep_fd(int fd, wide_bool noblock)
+{
+ /* Set file descriptor for non-blocking I/O */
+ if (noblock)
+ (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
+
+#if !FLAKY_SIGPOLL
+# if HAVE_STREAMS
+ if (isastream(fd) > 0) {
+ if (ioctl(fd, I_SETSIG,
+ S_RDNORM | S_RDBAND | S_HANGUP | S_WRNORM) == -1)
+ perror("xdvi: ioctl I_SETSIG");
+ }
+ else
+# endif
+ {
+# ifdef FASYNC
+ if (fcntl(fd, F_SETOWN, getpid()) == -1)
+ perror("xdvi: fcntl F_SETOWN");
+ if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | FASYNC) == -1)
+ perror("xdvi: fcntl F_SETFL");
+# elif defined SIOCSPGRP && defined FIOASYNC
+ /* For HP-UX B.10.10 and maybe others. See "man 7 socket". */
+ int arg;
+
+ arg = getpid();
+ if (ioctl(fd, SIOCSPGRP, &arg) == -1)
+ perror("xdvi: ioctl SIOCSPGRP");
+ arg = 1;
+ if (ioctl(fd, FIOASYNC, &arg) == -1)
+ perror("xdvi: ioctl FIOASYNC");
+# endif
+ }
+#endif /* not FLAKY_SIGPOLL */
+}
+
+
+/* APS Pointer locator: */
+/* Return screen positions */
+Boolean
+pointerlocate(int *xpos, int *ypos)
+{
+ Window root, child;
+ int root_x, root_y;
+ unsigned int keys_buttons;
+
+ if (!XtIsRealized(globals.widgets.top_level))
+ return False;
+
+ return XQueryPointer(DISP, mane.win, &root, &child,
+ &root_x, &root_y, xpos, ypos, &keys_buttons);
+}
+
+unsigned long
+parse_debugging_string(const char *arg)
+{
+ int retval = 0;
+ const char *curr, *last;
+ size_t i;
+
+ curr = last = arg;
+
+ while (*curr != '\0') {
+ Boolean matched = False;
+
+ while (isspace((int)*curr))
+ curr++;
+ for (i = 0; debug_options[i].description != NULL; i++) {
+ size_t curr_opt_len = strlen(debug_options[i].description);
+ /* Should we match on length of passed argument, to allow for abbreviations? */
+ if (memicmp(curr,
+ debug_options[i].description,
+ curr_opt_len) == 0
+ && (curr[curr_opt_len] == '\0'
+ || curr[curr_opt_len] == ','
+ || isspace((int)curr[curr_opt_len]))) {
+ matched = True;
+ retval |= debug_options[i].bitmap;
+ fprintf(stderr, "Debugging option: \"%s\" = \"%s\", debug: %d\n",
+ curr, debug_options[i].description, retval);
+ }
+ }
+ if (!matched) {
+ char *tempstr = xstrdup(curr);
+ char *test;
+ if ((test = strchr(curr, ',')) != NULL) {
+ *test = '\0';
+ }
+ XDVI_WARNING((stderr, "Ignoring unknown debugging option \"%s\". Valid options are:\n", tempstr));
+ for (i = 0; debug_options[i].description != NULL; i++) {
+ fprintf(stderr, "`%s'%s",
+ debug_options[i].description,
+ debug_options[i].help_formatting);
+ }
+ fprintf(stderr, "\n");
+ free(tempstr);
+ }
+ curr = strchr(curr, ',');
+ if (curr != NULL)
+ curr++;
+ }
+
+ return retval;
+}
+
+unsigned long
+parse_debugging_option(const char *ptr)
+{
+ if (ptr == NULL)
+ return 0L;
+ else if (isdigit((int)*ptr)) {
+ if (resource.debug_arg == NULL)
+ return DBG_ALL; /* per default debug everything */
+ else
+ return strtol(resource.debug_arg, (char **)NULL, 10);
+ } else if (*ptr == '-')
+ return DBG_ALL;
+ else return parse_debugging_string(ptr);
+}
+
+/* determine average width of a font */
+int
+get_avg_font_width(XFontStruct *font)
+{
+ int width;
+
+ assert(font != NULL);
+ width = font->max_bounds.width + font->min_bounds.width / 2;
+ if (width == 0) {
+ /* if min_bounds.width = -max_bounds.width, we probably
+ have a scalable TT font; try to determine its actual
+ width by measuring the letter `x':
+ */
+ width = XTextWidth(font, "x", 1);
+ }
+ if (width == 0) { /* last resort */
+ width = font->max_bounds.width / 2;
+ }
+ return width;
+
+}
+
+/*
+ Splits LINE from BEGIN to END (not neccessarily null-terminated)
+ into items separated by SEP, removes leading or trailing whitespace,
+ and saves the items as newly allocated char*s into the return array.
+ Returns the number of items that have been saved as RET_ITEMS.
+ Empty entries are returned as such, i.e. both `abc:' and `abc: '
+ return RET_ITEMS = 2 and "" as second entry.
+*/
+char **
+split_line(const char *line, char sep, size_t begin, size_t end, size_t *ret_items)
+{
+ const char *c_ptr = line + begin;
+ const char *e_ptr = line + end;
+ const char *test_end;
+
+ size_t result_cnt = 0;
+ size_t alloc_len = 0;
+ size_t len;
+ const size_t ALLOC_STEP = 8;
+ char **result_arr = NULL;
+
+ /* create new result item, resizing result_arr as needed
+ * (an empty string will coun1 as 1 item: "") */
+ while (result_cnt + 1 >= alloc_len) {
+ alloc_len += ALLOC_STEP;
+ result_arr = xrealloc(result_arr, alloc_len * sizeof *result_arr);
+ }
+
+ while (c_ptr <= e_ptr) {
+ /* skip leading whitespace */
+ while (c_ptr < e_ptr && isspace((int)*c_ptr)) {
+ c_ptr++;
+ }
+
+ /* find end of current elem, which is either the separator or out of range */
+ test_end = strchr(c_ptr, sep);
+ /* skip escaped separators */
+ while (test_end != NULL && test_end <= e_ptr) {
+ if (test_end > c_ptr && *(test_end - 1) == '\\') {
+ test_end = strchr(test_end + 1, sep);
+ }
+ else
+ break;
+ }
+ /* if nothing found, use e_ptr */
+ if (test_end == NULL || test_end > e_ptr) {
+ test_end = e_ptr;
+ }
+
+ len = test_end - c_ptr;
+
+ /* skip trailing whitespace */
+ while (len > 0 && isspace((int)c_ptr[len - 1])) {
+ len--;
+ }
+
+ result_arr[result_cnt] = xmalloc(len + 1);
+ /* copy into result item, skipping the escape '\\' characters */
+ {
+ size_t i = 0, j = 0;
+ while (i < len) {
+ if (c_ptr[i] == '\\' && c_ptr[i + 1] == sep) /* i + 1 is safe since (i < len) */
+ i++;
+ result_arr[result_cnt][j++] = c_ptr[i++];
+ }
+ result_arr[result_cnt][j] = '\0';
+ }
+ result_cnt++;
+
+ /* skip to next item */
+ c_ptr = test_end + 1;
+ }
+ result_arr[result_cnt] = NULL; /* null-terminate return array, just to be safe */
+ *ret_items = result_cnt;
+ return result_arr;
+}
+
+
+/*------------------------------------------------------------
+ * find_file
+ *
+ * Arguments:
+ * filename - absolute or relative file name
+ * statbuf - buffer to stat filename
+ * pathinfo - kpse_file_format_type, only used if a kpathsearch for the
+ * file is performed.
+ * See kpathsea/tex-file.h for a list of possible values.
+ *
+ * Returns:
+ * expanded filename
+ *
+ * Purpose:
+ * Find a file name corresponding to <filename>, possibly
+ * expanding it to a full path name; checks if the file
+ * exists by stat()ing it; returns NULL if nothing has
+ * been found, else the expanded filename in fresh memory.
+ *
+
+ *------------------------------------------------------------*/
+
+char *
+find_file(const char *filename, struct stat *statbuf, kpse_file_format_type pathinfo)
+{
+ char *tmp;
+ char *pathname;
+
+ TRACE_SRC((stderr, "checking filename \"%s\"", filename));
+
+ /*
+ * case 1:
+ * try absolute filename
+ */
+ if (filename[0] == '/') {
+ if (stat(filename, statbuf) == 0) {
+ TRACE_SRC((stderr, "Found absolute filename \"%s\"", filename));
+ return xstrdup(filename);
+ }
+ else {
+ TRACE_SRC((stderr, "Can't stat absolute filename \"%s\"\n", filename));
+ return NULL;
+ }
+ }
+
+ /*
+ * case 2:
+ * prepend filename with dir component from the `main' xdvi file (globals.dvi_file.dirname).
+ * This works for both
+ * /absolute/path/ + filename
+ * and
+ * /absolute/path/ + relative/path/filename
+ */
+ ASSERT(globals.dvi_file.dirname != NULL, "globals.dvi_file.dirname should have been initialized");
+
+ pathname = xstrdup(globals.dvi_file.dirname);
+ pathname = xstrcat(pathname, filename);
+
+ TRACE_SRC((stderr, "Trying globals.dvi_file.dirname: \"%s\"", pathname));
+ if (stat(pathname, statbuf) == 0) {
+ return pathname;
+ }
+
+ /*
+ * case 3:
+ * try current directory; if it's a match, expand to full (but uncanonicalized) path name.
+ */
+ if (stat(filename, statbuf) == 0) {
+ TRACE_SRC((stderr, "Found file \"%s\" in current dir", filename));
+ free(pathname);
+ return expand_filename(filename, USE_CWD_PATH);
+ }
+
+ /*
+ * case 4a:
+ * try a kpathsea search for filename, from globals.dvi_file.dirname
+ */
+ {
+#ifdef HAVE_FCHDIR
+ int fd;
+#else
+ char cwd[MAXPATHLEN];
+#endif
+
+ /* Save cwd for going back later */
+ if (
+#ifdef HAVE_FCHDIR
+ (fd = try_open(".", O_RDONLY)) >= 0
+#else /* HAVE_FCHDIR */
+# ifdef HAVE_GETCWD
+ getcwd(cwd, MAXPATHLEN)
+# else
+ getwd(cwd)
+# endif
+ != NULL
+#endif /* HAVE_FCHDIR */
+ ) {
+ if (chdir(globals.dvi_file.dirname) == 0) {
+
+ TRACE_SRC((stderr,
+ "trying kpathsearch for filename \"%s\" from %s",
+ filename, globals.dvi_file.dirname));
+ tmp = kpse_find_file(filename, pathinfo, True);
+
+ if (tmp != NULL && stat(tmp, statbuf) == 0) {
+ free(pathname);
+ /* go back to where we came from */
+#ifdef HAVE_FCHDIR
+ (void)fchdir(fd);
+ close(fd);
+#else
+ (void)chdir(cwd);
+#endif
+ if (tmp[0] == '/') { /* is it an absolute path? */
+ pathname = xstrdup(tmp);
+ }
+ else {
+ pathname = xstrdup(globals.dvi_file.dirname);
+ pathname = xstrcat(pathname, tmp);
+ }
+ TRACE_SRC((stderr, "Found file: `%s'", pathname));
+ free(tmp);
+ return pathname;
+ }
+ }
+ else {
+ /*
+ * case 4b:
+ * couldn't change to globals.dvi_file.dirname - try a kpathsea search from CWD
+ */
+ TRACE_SRC((stderr,
+ "trying kpathsearch for filename \"%s\" from CWD",
+ filename));
+ tmp = kpse_find_file(filename, pathinfo, True);
+
+ if (tmp != NULL && stat(tmp, statbuf) == 0) {
+ TRACE_SRC((stderr, "Found file: `%s'", tmp));
+ free(pathname);
+ return tmp;
+ }
+ }
+ }
+ }
+ /*
+ * case 5:
+ * try a kpathsea search for pathname
+ */
+ TRACE_SRC((stderr,
+ "trying kpathsearch for pathname \"%s\"",
+ pathname));
+ tmp = kpse_find_file(pathname, pathinfo, True);
+
+ if (tmp != NULL && stat(tmp, statbuf) == 0) {
+ TRACE_SRC((stderr, "Found file: `%s'", tmp));
+ free(pathname);
+ return tmp;
+ }
+
+ /* not found */
+ free(pathname);
+ free(tmp);
+ errno = 0;
+ return NULL;
+}
+
+/*
+ Hashtable functions
+
+ The purpose of these is to wrap kpathsea's rather strange hash
+ functions that can be used to store 2 type of values: char *, and
+ long, where the latter is interpreted as char *. (See kpathsea/dir.c
+ for an example of where this is used).
+
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ BUG ALERT: Note however that a long value may never be removed from
+ the hash table with hash_delete(), since it would do a strcmp() on
+ the long interpreted as a pointer!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ We can't use a different approach (like using a void *) since
+ the debugging ouput of kpathsea relies on printing the value
+ either as char * or long (depending on the value of the global flag
+ `kpse_debug_hash_lookup_int').
+*/
+/*
+ If key is in hashtable, return True and the integer value in val;
+ else return False (and leave val untouched).
+*/
+Boolean
+find_str_int_hash(hashTableT *hashtable, const char *key, size_t *val)
+{
+ const_string *ret;
+#ifdef KPSE_DEBUG
+ if (KPSE_DEBUG_P (KPSE_DEBUG_HASH))
+ kpse_debug_hash_lookup_int = True;
+#endif
+ ret = hash_lookup(*hashtable, key);
+#ifdef KPSE_DEBUG
+ if (KPSE_DEBUG_P (KPSE_DEBUG_HASH))
+ kpse_debug_hash_lookup_int = False;
+#endif
+
+ if (ret != NULL) {
+ long l = (long)*ret;
+ *val = (size_t)l;
+ return True;
+ }
+ return False;
+}
+
+/*
+ Insert key-value pair into hashtable. Note that the key is
+ *not* copied (i.e. it is expected that is had been allocated
+ somewhere else, and persists throughout the program).
+*/
+void
+put_str_int_hash(hashTableT *hashtable, const char *key, size_t val)
+{
+ long ptr = (long)val;
+ hash_insert(hashtable, key, (const string)ptr);
+}
+
+
+/*
+ * General AVL tree mechanism. Search for a node, and return it if found.
+ * Otherwise insert a node.
+ * This uses the AVL algorithm from Knuth Vol. 3.
+ */
+
+struct avl *
+avladd(const char *key, size_t key_len, struct avl **headp, size_t size)
+{
+ struct avl *ap;
+ struct avl **app;
+ struct avl *sp; /* place where rebalancing may be necessary */
+ struct avl **spp; /* points to sp */
+ int i;
+
+ /* Search */
+ spp = app = headp;
+ for (;;) {
+ ap = *app;
+ if (ap == NULL) /* bottom of tree */
+ break;
+ if (ap->bal != 0)
+ spp = app;
+ i = key_len - ap->key_len;
+ if (i == 0)
+ i = memcmp(key, ap->key, key_len);
+ if (i == 0) /* found record already */
+ return ap;
+ if (i < 0) /* move left */
+ app = &ap->left;
+ else
+ app = &ap->right;
+ }
+
+ /* Insert */
+ ap = xmalloc(size);
+ ap->key = key;
+ ap->key_len = key_len;
+ ap->bal = 0;
+ ap->left = ap->right = NULL;
+ *app = ap;
+
+ /* Adjust balance factors */
+ sp = *spp;
+ if (sp == ap)
+ return ap;
+ i = key_len - sp->key_len;
+ if (i == 0)
+ i = memcmp(key, sp->key, key_len);
+ sp = (i < 0 ? sp->left : sp->right);
+ while (sp != ap) {
+ i = key_len - sp->key_len;
+ if (i == 0)
+ i = memcmp(key, sp->key, key_len);
+ if (i < 0) {
+ sp->bal = -1;
+ sp = sp->left;
+ }
+ else {
+ sp->bal = 1;
+ sp = sp->right;
+ }
+ }
+
+ /* Balancing act */
+ sp = *spp;
+ i = key_len - sp->key_len;
+ if (i == 0)
+ i = memcmp(key, sp->key, key_len);
+ if (i < 0) {
+ if (sp->bal >= 0)
+ --sp->bal;
+ else { /* need to rebalance */
+ struct avl *left;
+
+ left = sp->left;
+ if (left->bal < 0) { /* single rotation */
+ sp->left = left->right;
+ left->right = sp;
+ sp->bal = left->bal = 0;
+ *spp = left;
+ }
+ else { /* double rotation */
+ struct avl *newtop;
+
+ newtop = left->right;
+ sp->left = newtop->right;
+ newtop->right = sp;
+ left->right = newtop->left;
+ newtop->left = left;
+ sp->bal = left->bal = 0;
+ if (newtop->bal < 0) ++sp->bal;
+ else if (newtop->bal > 0) --left->bal;
+ newtop->bal = 0;
+ *spp = newtop;
+ }
+ }
+ }
+ else {
+ if (sp->bal <= 0)
+ ++sp->bal;
+ else { /* need to rebalance */
+ struct avl *right;
+
+ right = sp->right;
+ if (right->bal > 0) { /* single rotation */
+ sp->right = right->left;
+ right->left = sp;
+ sp->bal = right->bal = 0;
+ *spp = right;
+ }
+ else { /* double rotation */
+ struct avl *newtop;
+
+ newtop = right->left;
+ sp->right = newtop->left;
+ newtop->left = sp;
+ right->left = newtop->right;
+ newtop->right = right;
+ sp->bal = right->bal = 0;
+ if (newtop->bal > 0) --sp->bal;
+ else if (newtop->bal < 0) ++right->bal;
+ newtop->bal = 0;
+ *spp = newtop;
+ }
+ }
+ }
+
+ return ap;
+}
+
+
+/* set globals.dvi_name, globals.dvi_file.dirname and globals.dvi_file.dirlen */
+void
+set_dvi_name_expand(const char *new_filename)
+{
+ ASSERT(new_filename != NULL, "");
+ free(globals.dvi_name);
+ globals.dvi_name = expand_filename_append_dvi(new_filename, USE_CWD_PATH, True);
+
+ free(globals.dvi_file.dirname);
+ globals.dvi_file.dirname = get_dir_component(globals.dvi_name);
+
+ ASSERT(globals.dvi_file.dirname != NULL, "dvi_name should be a path with dir component");
+ globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname);
+}
+
+/* set globals.dvi_name, globals.dvi_file.dirname and globals.dvi_file.dirlen
+ In contrast to previous function, input filename is not copied.
+*/
+void
+set_dvi_name(char *new_filename)
+{
+ ASSERT(new_filename != NULL, "");
+ free(globals.dvi_name);
+ globals.dvi_name = new_filename;
+
+ free(globals.dvi_file.dirname);
+ globals.dvi_file.dirname = get_dir_component(globals.dvi_name);
+
+ ASSERT(globals.dvi_file.dirname != NULL, "dvi_name should be a path with dir component");
+ globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname);
+}
+
+/*
+ * Copy the file pointer `in' to the file pointer `out'. Return True
+ * if successful, False else (in which case caller should examine
+ * errno to find the error).
+ * The caller is responsible for closing the files.
+ */
+Boolean
+copy_fp(FILE *in, FILE *out)
+{
+#define TMP_BUF_SIZE 4 * 1024
+ char buf[TMP_BUF_SIZE];
+
+ while (feof(in) == 0) {
+ size_t bytes_in, bytes_out;
+
+ bytes_in = fread(buf, 1, TMP_BUF_SIZE, in);
+ if (bytes_in < TMP_BUF_SIZE && !feof(in))
+ return False;
+ bytes_out = fwrite(buf, 1, bytes_in, out);
+ /* fprintf(stderr, "read %d, wrote %d bytes\n", bytes_in, bytes_out); */
+ if (bytes_out < bytes_in)
+ return False;
+ }
+ return True;
+
+#undef TMP_BUF_SIZE
+}
+
+
+/*
+ * Copy a file from `from_path' to `to'. Return True if successful, False else
+ * (in which case caller should examine errno to find the error).
+ */
+Boolean
+copy_file(const char *from_path, const char *to_path) {
+ FILE *from_fp;
+ FILE *to_fp;
+
+ Boolean retval;
+
+ if ((from_fp = try_fopen(from_path, "rb")) == NULL) {
+ XDVI_ERROR((stderr, "opening %s for reading failed: %s", from_path, strerror(errno)));
+ return False;
+ }
+
+ if ((to_fp = try_fopen(to_path, "wb")) == NULL) {
+ XDVI_ERROR((stderr, "opening %s for writing failed: %s", to_path, strerror(errno)));
+ return False;
+ }
+
+ retval = copy_fp(from_fp, to_fp);
+
+ fclose(from_fp);
+ fclose(to_fp);
+
+ return retval;
+}
+
+const char *
+get_text_encoding(void)
+{
+ const char *text_encoding = NULL;
+
+ /* if resource.text_encoding isn't set, use nl_langinfo() if langinfo is available */
+ if (resource.text_encoding == NULL) {
+#if USE_LANGINFO
+ if (globals.orig_locale == NULL) {
+ XDVI_ERROR((stderr, "Call to setlocale() returned NULL; assuming ISO-8859-1 charset."));
+ text_encoding = "ISO-8859-1";
+ }
+ else {
+ if (strcmp(globals.orig_locale, "C") == 0 || strcmp(globals.orig_locale, "POSIX") == 0) {
+ /* nl_langinfo returns rather strange values for these ... */
+ text_encoding = "ISO-8859-1";
+ TRACE_FIND((stderr, "Assuming |%s| for locale |%s|",
+ text_encoding, globals.orig_locale));
+ }
+ else {
+ text_encoding = nl_langinfo(CODESET);
+ TRACE_FIND((stderr, "nl_langinfo returned: |%s| for locale |%s|",
+ text_encoding, globals.orig_locale));
+ }
+ }
+#else
+ XDVI_WARNING((stderr,
+ "nl_langinfo() not available on this platform, "
+ "and XDvi.textEncoding resource not set; using default "
+ "encoding ISO-8859-1."));
+ text_encoding = "ISO-8859-1";
+#endif
+ }
+ else {
+ text_encoding = resource.text_encoding;
+ }
+ return text_encoding;
+}
+
+char *
+iconv_convert_string(const char *from_enc, const char *to_enc, const char *str)
+{
+ static Boolean have_warned = False;
+#if HAVE_ICONV_H
+ size_t input_len = strlen(str);
+ size_t conv_len = input_len * 4 + 1; /* worst case ... */
+ int conv_len_save = conv_len;
+ char *conv_buf = xmalloc(conv_len);
+ const char *in_ptr = str;
+ const char *out_ptr = conv_buf;
+
+ iconv_t conv_desc = iconv_open(to_enc, from_enc);
+
+ if (conv_desc == (iconv_t)(-1)) {
+ if (!have_warned) {
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ NULL,
+ "iconv_open() error: Encoding \"%s\" is not supported by this version of iconv.\n"
+ "Please check the output of \"iconv -l\" and set the X resource\n"
+ "\"XDvi.textEncoding\" to an appropriate value.", from_enc);
+ have_warned = True;
+ }
+ free(conv_buf);
+ return NULL;
+ }
+
+ TRACE_FIND((stderr, "iconv_convert_string: from `%s', to `%s'", from_enc, to_enc));
+ if (iconv(conv_desc, (iconv_char_pptrT)&in_ptr, &input_len, (char **)&out_ptr, &conv_len) == (size_t)(-1)) {
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ NULL,
+ "iconv_convert_string(): Could not convert %s to %s: %s.",
+ from_enc, to_enc, strerror(errno));
+ iconv_close(conv_desc);
+ free(conv_buf);
+ return NULL;
+ }
+
+ iconv_close(conv_desc);
+ conv_len = conv_len_save - conv_len;
+ conv_buf[conv_len] = '\0';
+
+ TRACE_FIND((stderr, "after iconv conversion: |%s| %lu bytes\n",
+ conv_buf, (unsigned long)conv_len));
+
+
+ return conv_buf;
+
+#else /* HAVE_ICONV_H */
+
+ UNUSED(from_enc);
+ UNUSED(to_enc);
+ UNUSED(str);
+
+ /* no iconv available */
+ if (!have_warned) {
+ popup_message(XtNameToWidget(globals.widgets.top_level, "*find_popup"),
+ MSG_ERR,
+ "You can either set the \"LANG\" environment variable or the X resource "
+ "\"XDvi.textEncoding\" to make xdvi use a different language/encoding setting.\n"
+ "Without iconv, only the encodings ISO-8859-1 and UTF-8 are supported. "
+ "For real iconv support, you will need to install the iconv library "
+ "and recompile xdvik.",
+ "Cannot convert from %s to UTF-8 without iconv support compiled in.");
+ have_warned = True;
+ }
+ return NULL;
+
+#endif /* HAVE_ICONV_H */
+}
+
+
+/* Replace (pseudo-)format arguments in NULL-terminated argv list as follows:
+ * %f -> filename, %l -> linenumber, %c -> column number.
+ * If %f or %l are not specified, they are appended as %f and +%l.
+ * If colno == 0, no %c argument is provided.
+ */
+char **
+src_format_arguments(char **argv, const char *filename, int lineno, int colno)
+{
+ size_t i;
+ Boolean found_filename = False;
+ Boolean found_lineno = False;
+
+ for (i = 0; argv[i] != NULL; i++) {
+ char *ptr, *curr = argv[i];
+ while ((ptr = strchr(curr, '%')) != NULL) {
+ char *p1;
+ if ((p1 = strchr("flc", ptr[1])) != NULL) { /* we have a formatting char */
+ char digit_arg[LENGTH_OF_INT];
+ const char *new_elem = NULL;
+ /* remember offsets and lengths */
+ size_t l_init = ptr - argv[i];
+ size_t l_rest = strlen(ptr + 2) + 1;
+ size_t l_mid;
+
+ if (*p1 == 'f') {
+ found_filename = True;
+ new_elem = filename;
+ }
+ else if (*p1 == 'l') {
+ found_lineno = True;
+ sprintf(digit_arg, "%d", lineno);
+ new_elem = digit_arg;
+ }
+ else if (*p1 == 'c') {
+ sprintf(digit_arg, "%d", colno);
+ new_elem = digit_arg;
+ }
+
+ l_mid = strlen(new_elem);
+
+ argv[i] = xrealloc(argv[i], strlen(argv[i]) + l_mid + 1);
+ curr = argv[i] + l_init; /* need to reinitialize it because of realloc */
+ memmove(curr + l_mid, curr + 2, l_rest);
+ memcpy(curr, new_elem, l_mid);
+ curr += l_mid;
+ }
+ else if (ptr[1] == '%') { /* escaped %, skip both */
+ curr = ptr + 2;
+ }
+ else {
+ curr = ptr + 1;
+ }
+ }
+ }
+
+ /* append line number and file name arguments if they were not specified */
+ if (!found_lineno) {
+ i++;
+ argv = xrealloc(argv, (i + 1) * sizeof *argv);
+ argv[i - 1] = xmalloc(LENGTH_OF_INT + 2);
+ sprintf(argv[i - 1], "+%d", lineno);
+ argv[i] = NULL;
+ }
+
+ if (!found_filename) {
+ i++;
+ argv = xrealloc(argv, (i + 1) * sizeof *argv);
+ argv[i - 1] = xstrdup(filename);
+ argv[i] = NULL;
+ }
+
+ return argv;
+}
+
+char *
+xstrndup(const char *str, size_t len)
+{
+ char *new_str = xmalloc(len + 1);
+ memcpy(new_str, str, len);
+ new_str[len] = '\0';
+ return new_str;
+}
+
+#if 0
+/*
+ * Search integer array <arr> of length <arr_len> for for <item>.
+ * Return the index of the item, or the index of the next smaller item
+ * if there's no exact match. (That we want the latter is the
+ * reason why we can't use bsearch()).
+ */
+int
+binary_search(int *arr, int arr_len, int item)
+{
+ int lower = -1;
+ int upper = arr_len;
+ int mid;
+
+ ASSERT(arr_len >= 1, "binary_search expects arrays of length >= 1");
+
+ do {
+ mid = (lower + upper) / 2;
+ if (item > arr[mid])
+ lower = mid;
+ else if (item < arr[mid])
+ upper = mid;
+ else /* exact match */
+ return mid;
+ } while (upper - lower > 1);
+
+ /* no exact match, return next lower item */
+ if (mid > 0 && arr[mid] > item)
+ return mid - 1;
+ else
+ return mid;
+}
+#endif /* 0 */
diff --git a/Build/source/texk/xdvik/util.h b/Build/source/texk/xdvik/util.h
new file mode 100644
index 00000000000..09a14fde460
--- /dev/null
+++ b/Build/source/texk/xdvik/util.h
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2002-2015 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef UTIL_H_
+#define UTIL_H_
+
+#include <stdio.h>
+#include "version.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/hash.h"
+#include "kpathsea/tex-file.h"
+
+#if HAVE_POLL
+# include <poll.h>
+# define XIO_IN POLLIN
+# define XIO_OUT POLLOUT
+#else
+# if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+# else
+# if HAVE_SELECT_H
+# include <select.h>
+# endif
+# endif
+# define XIO_IN 1
+# define XIO_OUT 2
+#endif
+
+#include "events.h" /* for child proc stuff */
+
+FILE *try_fopen(const char *fname, const char *mode);
+FILE *try_fdopen(int fd, const char *mode);
+int try_open(const char *fname, int flags);
+int try_open_mode(const char *fname, int flags, mode_t mode);
+
+extern int xdvi_temp_fd(char **tempfilename);
+extern void xdvi_assert(const char *version,
+ const char *filename,
+ int lineno,
+ Boolean condition,
+ const char *fmt,
+ ...);
+
+typedef void (*child_exited_proc)(int status, struct xchild *this);
+
+extern void handle_child_exit(int status, struct xchild *this);
+extern char *read_child_error(int fd, void *data);
+extern Boolean fork_process(const char *file, Boolean redirect_stdout,
+ const char *dirname,
+ childProcT exit_proc, void *data,
+ int killsig,
+ char *const argv[]);
+extern void prep_fd(int fd, wide_bool noblock);
+
+struct bitmap; /* forward declaration */
+extern void alloc_bitmap(struct bitmap *);
+
+extern char *my_realpath(const char *path, char *real);
+#ifdef HAVE_REALPATH
+#include <limits.h>
+# define REALPATH realpath
+#else
+# define REALPATH my_realpath
+#endif
+
+char *expand_homedir(const char *path);
+void set_dvi_name_expand(const char *new_filename);
+void set_dvi_name(char *new_filename);
+FILE *XFOPEN(const char *path, const char *mode);
+
+
+#ifndef HAVE_MEMICMP
+extern int memicmp(const char *, const char *, size_t);
+#endif
+
+/* NOTE: all of the following are already defined by kpathsea. */
+/* extern void *xmalloc(unsigned); */
+/* extern void *xrealloc(void *, unsigned); */
+/* extern char *xstrdup(const char *); */
+/* extern void xputenv(const char *, const char *); */
+
+extern char *xmemdup(const char *, size_t);
+
+/* like xstrdup, but only copy len characters and zero-terminate at next index (allocates len+1 characters) */
+extern char *xstrndup(const char *str, size_t len);
+
+extern char *xt_strdup(const char *); /* like xstrdup, but with XtMalloc() */
+
+extern char *xstrcat(char *str1, const char *str2);
+extern int xpipe(int *);
+extern void close_a_file(void);
+extern unsigned long get_bytes(FILE *, int);
+extern long get_lbytes(FILE *, int);
+
+extern void do_abort(void);
+
+/* various levels of warning/error messages */
+extern void xdvi_info(const char *fmt, ...);
+extern void xdvi_warning(const char *fmt, ...);
+extern void xdvi_error(const char *fmt, ...);
+extern void xdvi_fatal(const char *fmt, ...);
+extern void xdvi_abort(const char *fmt, ...);
+
+extern Boolean pointerlocate(int *, int *);
+extern unsigned long parse_debugging_string(const char *arg);
+extern unsigned long parse_debugging_option(const char *ptr);
+
+extern int get_avg_font_width(XFontStruct *font);
+extern char **split_line(const char *line, char sep, size_t begin, size_t end, size_t *ret_items);
+extern char *find_file(const char *filename, struct stat *statbuf, kpse_file_format_type pathinfo);
+extern char **src_format_arguments(char **argv, const char *filename, int lineno, int colno);
+
+/*
+ hashtable wrapper functions, mostly used by dvi-draw.c to
+ map filenames to integers. This uses the hashtable implementation
+ from kpathsea, which is reasonably fast.
+*/
+
+/*
+ We use this dummy wrapper stuct, which we cast to void *, to get integer
+ values into/from the hashtable (natively, kpahtsea only supports string
+ values).
+*/
+struct str_int_hash_item {
+ int value;
+};
+
+
+typedef hash_table_type hashTableT; /* from kpathsea */
+extern Boolean find_str_int_hash(hashTableT *hashtable, const char *key, size_t *val);
+extern void put_str_int_hash(hashTableT *hashtable, const char *key, size_t val);
+
+
+/*
+ * AVL tree structures.
+ */
+
+#define AVL_COMMON \
+ const char *key; /* key */ \
+ int key_len; /* length of key */ \
+ int bal; /* AVL balancing information */ \
+ struct avl *left; \
+ struct avl *right
+
+struct avl { /* generic data structure */
+ AVL_COMMON;
+};
+
+extern struct avl *avladd(const char *, size_t, struct avl **, size_t);
+
+
+extern Boolean copy_file(const char *from, const char *to);
+extern Boolean copy_fp(FILE *in, FILE *out);
+
+extern const char *get_text_encoding(void);
+extern char *iconv_convert_string(const char *from_enc, const char *to_enc, const char *str);
+
+extern void xdvi_bell(void);
+
+/* Various error reporting macros.
+ The reasons why these are macros are:
+ - possibility to use __FILE__, __LINE__
+ - (more importantly:) gcc can't do type checking on generic vararg
+ macros, but does so for the printf() functions.
+*/
+
+/*
+ * Print an informative message to stdout,
+ * unless the resource `hush_stdout' is set.
+ */
+#define XDVI_INFO(X) do { \
+ fprintf(stdout, "%s: Info: ", globals.program_name); \
+ fflush(stdout); /* in case following goes to stderr accidentally ... */ \
+ fprintf X; \
+ fprintf(stdout, "\n"); \
+ fflush(stdout); /* to make sure it doesn't get intermingled with stderr */ \
+} while(0)
+
+
+/*
+ * Print a warning message to stderr.
+ * This can't be shut off by `hush_stdout'.
+ */
+#define XDVI_WARNING(X) do { \
+ fprintf(stderr, "%s: Warning: ", globals.program_name); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+} while(0)
+
+/*
+ * Print an un-typed message to stderr, without starting a newline.
+ * This can't be shut off by `hush_stdout'.
+ */
+#define XDVI_MSG(X) do { \
+ fprintf(stderr, "%s: ", globals.program_name); \
+ fprintf X; \
+} while(0)
+
+
+/*
+ * Print an error message to stderr.
+ * This can't be shut off by `hush_stdout'.
+ */
+#define XDVI_ERROR(X) do { \
+ fprintf(stderr, "%s: Error: ", globals.program_name); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+} while(0)
+
+/*
+ * Print an error message and quit. Use this only with extreme care,
+ * if recovery is really impossible!
+ */
+#define XDVI_FATAL(X) do { \
+ fprintf(stderr, "%s: Fatal error: ", globals.program_name); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ xdvi_exit(EXIT_FAILURE); \
+} while(0)
+
+/*
+ * Print an error message and abort. Use this instead of assertions
+ * if you want to give a more informative message.
+ */
+#define XDVI_ABORT(X) do { \
+ fprintf(stderr, "%s %s: %s:%d: Shouldn't happen: ", \
+ globals.program_name, \
+ XDVI_VERSION_INFO, \
+ __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ do_abort(); \
+} while(0)
+
+#endif /* UTIL_H_ */
diff --git a/Build/source/texk/xdvik/version.h b/Build/source/texk/xdvik/version.h
new file mode 100644
index 00000000000..aff3bf3cab3
--- /dev/null
+++ b/Build/source/texk/xdvik/version.h
@@ -0,0 +1,19 @@
+/* Version info that is displayed at -h, -v and in GUI elements */
+#ifndef VERSION_H_
+#define VERSION_H_
+
+#define XDVI_VERSION "22.87.04"
+
+#ifdef MOTIF
+#define XDVI_GUI "(Motif toolkit)"
+#else
+#define XDVI_GUI "(Xaw toolkit)"
+#endif
+
+#define XDVIK_PROGNAME "xdvik"
+#define XDVI_PROGNAME "xdvi"
+
+#define XDVI_VERSION_INFO XDVI_VERSION" "XDVI_GUI
+#define XDVI_TERSE_VERSION_INFO XDVI_VERSION
+
+#endif /* VERSION_H_ */
diff --git a/Build/source/texk/xdvik/vf.c b/Build/source/texk/xdvik/vf.c
new file mode 100644
index 00000000000..b5ab6ac005b
--- /dev/null
+++ b/Build/source/texk/xdvik/vf.c
@@ -0,0 +1,187 @@
+/*========================================================================*\
+
+Copyright (c) 1992-2004 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+\*========================================================================*/
+
+/*
+ * VF font reading routines.
+ * Public routine is read_index---because virtual characters are presumed
+ * to be short, we read the whole virtual font in at once, instead of
+ * faulting in characters as needed.
+ */
+
+#include "xdvi-config.h"
+#include "dvi.h"
+#include "xdvi.h"
+#include "util.h"
+#include "dvi-init.h"
+#include "dvi-draw.h"
+
+#define LONG_CHAR 242
+
+/*
+ * These are parameters which determine whether macros are combined for
+ * storage allocation purposes. Small macros ( <= VF_PARM_1 bytes) are
+ * combined into chunks of size VF_PARM_2.
+ */
+
+#ifndef VF_PARM_1
+#define VF_PARM_1 20
+#endif
+#ifndef VF_PARM_2
+#define VF_PARM_2 256
+#endif
+
+/*
+ * The main routine
+ */
+
+unsigned long
+read_VF_index(struct font *fontp, wide_bool hushcs)
+{
+ FILE *VF_file = fontp->file;
+ ubyte cmnd;
+ ubyte *avail, *availend; /* available space for macros */
+ long checksum;
+ struct macro *newmacro;
+ unsigned long maxcc = 0;
+ Boolean dummy_success = False;
+
+ fontp->read_char = NULL;
+ fontp->flags |= FONT_VIRTUAL;
+ fontp->set_char_p = set_vf_char;
+ if (globals.debug & DBG_PK)
+ printf("Reading VF file %s\n", fontp->filename);
+ /*
+ * Read preamble.
+ */
+ fseek(VF_file, (long)get_byte(VF_file), SEEK_CUR); /* skip comment */
+ checksum = get_bytes(VF_file, 4);
+ if (checksum != fontp->checksum && checksum != 0 && fontp->checksum != 0
+ && !hushcs)
+ XDVI_WARNING((stderr, "Checksum mismatch (dvi = %lu, vf = %lu) in font file %s",
+ fontp->checksum, checksum, fontp->filename));
+ (void)get_bytes(VF_file, 4); /* skip design size */
+ /*
+ * Read the fonts.
+ */
+ fontp->vf_table = xmalloc(VFTABLELEN * sizeof(struct font *));
+ memset((char *)fontp->vf_table, 0, VFTABLELEN * sizeof(struct font *));
+ fontp->vf_chain = NULL;
+ fontp->first_font = NULL;
+ while ((cmnd = get_byte(VF_file)) >= FNTDEF1 && cmnd <= FNTDEF4) {
+ struct font *newfontp = define_font(True,
+#if DELAYED_MKTEXPK
+ True,
+#endif
+ VF_file, cmnd, fontp,
+ fontp->vf_table, VFTABLELEN,
+ &fontp->vf_chain,
+ &dummy_success);
+ if (fontp->first_font == NULL)
+ fontp->first_font = newfontp;
+ }
+ /*
+ * Prepare macro array.
+ */
+ if (resource.omega) {
+ fontp->maxchar = 65535;
+ fontp->macro = xmalloc(65536 * sizeof(struct macro));
+ memset((char *)fontp->macro, 0, 65536 * sizeof(struct macro));
+ }
+ else {
+ fontp->macro = xmalloc(256 * sizeof(struct macro));
+ memset((char *)fontp->macro, 0, 256 * sizeof(struct macro));
+ }
+ /*
+ * Read macros.
+ */
+ avail = availend = NULL;
+ for (; cmnd <= LONG_CHAR; cmnd = get_byte(VF_file)) {
+ struct macro *m;
+ int len;
+ unsigned long cc;
+ long width;
+
+ if (cmnd == LONG_CHAR) { /* long form packet */
+ len = get_bytes(VF_file, 4);
+ cc = get_bytes(VF_file, 4);
+ width = get_bytes(VF_file, 4);
+ if ((resource.omega && cc >= 65536)
+ || (!resource.omega && cc >= 256)) {
+ XDVI_WARNING((stderr, "Virtual character %lu in font %s ignored.",
+ cc, fontp->fontname));
+ fseek(VF_file, (long)len, SEEK_CUR);
+ continue;
+ }
+ }
+ else { /* short form packet */
+ len = cmnd;
+ cc = get_byte(VF_file);
+ width = get_bytes(VF_file, 3);
+ }
+ if (resource.omega) {
+ maxcc = (cc > maxcc) ? cc : maxcc;
+ }
+ m = &fontp->macro[cc];
+ m->dvi_adv = width * fontp->dimconv;
+ if (len > 0) {
+ if (len <= availend - avail) {
+ m->pos = avail;
+ avail += len;
+ }
+ else {
+ m->free_me = True;
+ if (len <= VF_PARM_1) {
+ m->pos = avail = xmalloc(VF_PARM_2);
+ availend = avail + VF_PARM_2;
+ avail += len;
+ }
+ else
+ m->pos = xmalloc((unsigned)len);
+ }
+ (void)fread((char *)m->pos, 1, len, VF_file);
+ m->end = m->pos + len;
+ }
+ if (globals.debug & DBG_PK)
+ printf("Read VF macro for character %lu; dy = %ld, length = %d\n",
+ cc, m->dvi_adv, len);
+ }
+ if (cmnd != POST)
+ XDVI_FATAL((stderr, "Wrong command byte found in VF macro list: %d", cmnd));
+
+ fclose(VF_file);
+ fontp->file = NULL;
+ if (resource.omega) {
+ size_t i;
+ newmacro = xmalloc((maxcc + 1) * sizeof(struct macro));
+ for (i = 0; i <= maxcc; i++) {
+ newmacro[i] = fontp->macro[i];
+ }
+ free(fontp->macro);
+ fontp->macro = newmacro;
+ fontp->maxchar = maxcc;
+ return maxcc;
+ }
+ else
+ return 0; /* dummy */
+}
diff --git a/Build/source/texk/xdvik/x_util.c b/Build/source/texk/xdvik/x_util.c
new file mode 100644
index 00000000000..df1c48d92e6
--- /dev/null
+++ b/Build/source/texk/xdvik/x_util.c
@@ -0,0 +1,1231 @@
+#include "xdvi-config.h"
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/StringDefs.h>
+
+
+#if !MOTIF
+# include <X11/Xaw/Form.h>
+#endif
+
+#include "x_util.h"
+#include "string-utils.h"
+#include "util.h"
+#include "statusline.h"
+#include "message-window.h"
+#include "events.h" /* for set_bar_value() */
+
+#define DEBUG_SCROLL_IF_NEEDED 0
+
+Boolean do_autoscroll = False;
+
+
+/* Center window wa over window wb */
+void
+center_window(Widget wa, Widget wb)
+{
+ Position x, y;
+ Dimension w1, h1, w2, h2;
+
+ if (!XtIsRealized(wa) || !XtIsRealized(wb))
+ return;
+
+ XtVaGetValues(wa,
+ XtNwidth, &w1,
+ XtNheight, &h1,
+ NULL);
+ XtVaGetValues(wb,
+ XtNwidth, &w2,
+ XtNheight, &h2,
+ XtNx, &x,
+ XtNy, &y,
+ NULL);
+ XtVaSetValues(wa, XtNx, x + (w2 - w1) / 2,
+ XtNy, y + (h2 - h1) / 2,
+ NULL);
+}
+
+/* Position window w at coordinates x, y */
+void
+position_window(Widget w, Position x, Position y)
+{
+ if (!XtIsRealized(w))
+ return;
+
+ TRACE_GUI((stderr, "positioning %ld at %d, %d", (unsigned long)w, x, y));
+ XtVaSetValues(w, XtNx, x, XtNy, y, NULL);
+}
+
+/*
+ Used for the hyperref and forward search markers: scroll the page
+ to make the marker visible.
+*/
+void
+scroll_page_if_needed(int x_min, int x_max, int y_min, int y_max)
+{
+ Position drawing_x, drawing_y, drawing_h, clip_x, clip_y, clip_h, clip_w;
+ int test_scroll, need_v_scroll = 0, need_h_scroll = 0;
+
+ if (!do_autoscroll)
+ return;
+
+ XtVaGetValues(globals.widgets.clip_widget,
+ XtNx, &clip_x, XtNy, &clip_y,
+ XtNheight, &clip_h, XtNwidth, &clip_w,
+ NULL);
+ XtVaGetValues(globals.widgets.draw_widget,
+ XtNx, &drawing_x, XtNy, &drawing_y,
+ XtNheight, &drawing_h,
+ NULL);
+
+#if DEBUG_SCROLL_IF_NEEDED
+ fprintf(stderr, "y: %d, drawing_y: %d, clip_h: %d\n", y, drawing_y, clip_h);
+#endif
+ /* check if we need to scroll vertically; first, down for y_min */
+ test_scroll = y_min + drawing_y - clip_h;
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0)
+ test_scroll += get_statusline_height();
+
+ TRACE_SRC((stderr, "test_scroll vertically: %d", test_scroll));
+#if DEBUG_SCROLL_IF_NEEDED
+ fprintf(stderr, "%d + %d > %d?\n", drawing_y, y_min, clip_h);
+#endif
+ if (test_scroll > 0) { /* need to scroll down? */
+ need_v_scroll = test_scroll;
+ TRACE_SRC((stderr, "need_v_scroll down: %d", need_v_scroll));
+ }
+ else if (abs(drawing_y) + 2 > y_max) { /* need to scroll up? */
+ need_v_scroll = -((abs(drawing_y) - y_max) + 1);
+ TRACE_SRC((stderr, "need_v_scroll up: %d (%d > %d; %d)", need_v_scroll, abs(drawing_y), y_max, clip_y));
+ }
+
+ /* check if we need to scroll horizontally; x_min < 0 blocks this
+ (e.g. for hyperref, where we don't want it) */
+ if (x_min >= 0) {
+ test_scroll = x_min + drawing_x - clip_w + 1;
+ TRACE_SRC((stderr, "test_scroll horizontally: %d", test_scroll));
+
+ if (test_scroll > 0) {
+ /* need to scroll to right (i.e. make stuff on right-hand side visible)? */
+ need_h_scroll = test_scroll;
+ TRACE_SRC((stderr, "need_h_scroll right: %d", need_h_scroll));
+ }
+ else if (abs(drawing_x) > x_max) {
+ /* need to scroll to left (i.e. make stuff on left-hand side visible)? */
+ need_h_scroll = -(abs(drawing_x) - x_max);
+ TRACE_SRC((stderr, "need_h_scroll left: %d", need_h_scroll));
+ }
+ }
+
+ /* FIXME: should we not scroll if keep_flag is active? */
+ if (need_v_scroll != 0 && globals.widgets.y_bar != NULL) {
+#ifdef MOTIF
+ /* need to add new value to current one */
+ XtVaGetValues(globals.widgets.y_bar, XmNvalue, &test_scroll, NULL);
+ (void)set_bar_value(globals.widgets.y_bar, test_scroll + need_v_scroll, (int)(globals.page.h - mane.height));
+#else
+ XtCallCallbacks(globals.widgets.y_bar, XtNscrollProc, cast_int_to_XtPointer(need_v_scroll));
+#endif
+ }
+
+ if (need_h_scroll != 0 && globals.widgets.x_bar != NULL) {
+#ifdef MOTIF
+ /* need to add new value to current one */
+ XtVaGetValues(globals.widgets.x_bar, XmNvalue, &test_scroll, NULL);
+ (void)set_bar_value(globals.widgets.x_bar, test_scroll + need_h_scroll, (int)(globals.page.w - mane.width));
+#else
+ XtCallCallbacks(globals.widgets.x_bar, XtNscrollProc, cast_int_to_XtPointer(need_h_scroll));
+#endif
+ }
+
+ do_autoscroll = False;
+}
+
+void adjust_width(Widget a, Widget b)
+{
+ Dimension w1, w2;
+
+ XtVaGetValues(a, XtNwidth, &w1, NULL);
+ XtVaGetValues(b, XtNwidth, &w2, NULL);
+
+ if (w1 < w2)
+ XtVaSetValues(a, XtNwidth, w2, NULL);
+ else if (w2 > w1)
+ XtVaSetValues(b, XtNwidth, w1, NULL);
+}
+
+/* change a GC and return it, or create one if it doesn't exist yet */
+GC
+set_or_make_gc(GC gc, int function, Pixel fg, Pixel bg)
+{
+ XGCValues values;
+ values.function = function;
+ values.foreground = fg;
+ values.background = bg;
+
+ /* Since print is in round dots we make drawings as "smooth" as possible. */
+ values.cap_style = CapRound;
+ values.join_style = JoinRound;
+
+ if (gc != NULL)
+ XChangeGC(DISP, gc, GCFunction | GCForeground | GCBackground
+ | GCCapStyle | GCJoinStyle, &values);
+ else
+ gc = XCreateGC(DISP, XtWindow(globals.widgets.top_level), GCFunction | GCForeground | GCBackground
+ | GCCapStyle | GCJoinStyle, &values);
+
+ return gc;
+}
+
+/*
+ * Atom handling.
+ */
+
+static char *atom_names[] = {
+ "XDVI_WINDOWS",
+ "DVI_NAME",
+ "SRC_GOTO",
+ "RELOAD",
+ "NEWDOC",
+ "NEWPAGE",
+ "RAISE",
+ "FIND_STRING",
+ "REREAD_PREFS"
+};
+static Atom atoms[XtNumber(atom_names)];
+
+/*
+ * On 64-bit platforms, XGetWindowProperty and related functions convert
+ * properties with format=32 to arrays of longs. This function keeps that
+ * convention.
+ * The return value is the total number of bytes in the buffer.
+ */
+
+#if defined(WORD64) || defined(LONG64)
+# define LONG_CONV_64(bytes, format) ((bytes) << ((format) >> 5))
+#else
+# define LONG_CONV_64(bytes, format) (bytes)
+#endif
+
+size_t
+property_get_data(Window w, Atom a, char **ret_buf,
+ int (*x_get_property)(Display *, Window, Atom, long,
+ long, Bool, Atom,
+ Atom *, int *, unsigned long *,
+ unsigned long *, unsigned char **))
+{
+ /* all of these are in 8-bit units */
+ unsigned long byte_offset = 0;
+ Atom type_ret;
+ int format_ret;
+ unsigned long nitems_ret;
+ unsigned long bytes_after_ret = 0;
+ unsigned char *prop_ret = NULL;
+
+ /*
+ * buffer for collecting returned data; this is static to
+ * avoid expensive malloc()s at every call (which is often!)
+ */
+ static unsigned char *buffer = NULL;
+ static size_t buffer_len = 0;
+
+ while (x_get_property(DISP, w,
+ a, byte_offset / 4, (bytes_after_ret + 3) / 4, False,
+ a, &type_ret, &format_ret, &nitems_ret,
+ &bytes_after_ret, &prop_ret)
+ == Success) {
+
+ if (type_ret != a || format_ret == 0)
+ break;
+
+ nitems_ret *= (format_ret / 8); /* convert to bytes */
+
+ if (LONG_CONV_64(byte_offset + nitems_ret, format_ret) >= buffer_len) {
+ buffer_len += 256
+ * ((LONG_CONV_64(byte_offset + nitems_ret, format_ret)
+ - buffer_len) / 256 + 1);
+ buffer = (buffer == NULL ? xmalloc(buffer_len)
+ : xrealloc(buffer, buffer_len));
+ }
+
+ /* the +1 captures the extra '\0' that Xlib puts after the end. */
+ memcpy(buffer + LONG_CONV_64(byte_offset, format_ret), prop_ret,
+ LONG_CONV_64(nitems_ret, format_ret) + 1);
+ byte_offset += nitems_ret;
+
+ XFree(prop_ret);
+ prop_ret = NULL;
+
+ if (bytes_after_ret == 0) /* got all data */
+ break;
+ }
+
+ if (prop_ret != NULL)
+ XFree(prop_ret);
+
+ *ret_buf = (char *)buffer;
+ return LONG_CONV_64(byte_offset, format_ret);
+}
+
+static size_t
+property_get_window_list(long **window_list)
+{
+ size_t len = property_get_data(DefaultRootWindow(DISP),
+ atom_xdvi_windows(), (char **) window_list,
+ XGetWindowProperty);
+ if (len == 0) {
+ TRACE_CLIENT((stderr, "No \"xdvi windows\" property found"));
+ return 0;
+ }
+
+ if (len % sizeof(long) != 0) {
+ TRACE_CLIENT((stderr,
+ "\"XDVI_WINDOWS\" property had incorrect size; deleting it."));
+ XDeleteProperty(DISP, DefaultRootWindow(DISP), atom_xdvi_windows());
+ return 0;
+ }
+
+ return len / sizeof (long);
+}
+
+/**
+ ** set_dvi_property sets the appropriate property for the main
+ ** window (used in source special handoff).
+ **/
+
+void
+set_dvi_property(void)
+{
+ XChangeProperty(DISP, XtWindow(globals.widgets.top_level), atom_dvi_file(), atom_dvi_file(),
+ 8, PropModeReplace, (unsigned char *)dvi_property, dvi_property_length);
+}
+
+
+/*
+ * Delete all occurrences of window w from the window list property.
+ * Then, if `prepend' is true, prepend the window ID to the existing list.
+ */
+void
+update_window_property(Window w, Boolean prepend)
+{
+ long *wlist;
+ size_t wlist_len;
+ long *wlist_end;
+ long *wp;
+#if 0
+ int i;
+#endif /* 0 */
+
+ /* this allocates wlist */
+ if ((wlist_len = property_get_window_list(&wlist)) == 0)
+ return;
+
+ /* Loop over list of windows. */
+ wlist_end = wlist + wlist_len;
+
+#if 0
+ for (i = 0, wp = wlist; wp < wlist_end; ++wp, ++i) {
+ fprintf(stderr, "WIN %d: %08lx; len: %d\n", i, *wp, wlist_len);
+ }
+#endif /* 0 */
+
+ for (wp = wlist; wp < wlist_end; ++wp) {
+ if (*wp == w) { /* match, remove our ID */
+ --wlist_len;
+ --wlist_end;
+ memmove(wp, wp + 1, (wlist_end - wp) * sizeof (long));
+ --wp; /* new item is now at wp; don't skip it in next iteration */
+ }
+ }
+
+ if (prepend) { /* add our ID again to front */
+ /* Note: no need to realloc wlist, since the original length
+ was sufficient for all elements.
+ */
+ memmove(wlist + 1, wlist, wlist_len * sizeof (long));
+ ++wlist_len;
+ *wlist = w;
+ }
+
+ if (wlist_len == 0)
+ XDeleteProperty(DISP, DefaultRootWindow(DISP),
+ atom_xdvi_windows());
+ else
+ XChangeProperty(DISP, DefaultRootWindow(DISP),
+ atom_xdvi_windows(), atom_xdvi_windows(), 32,
+ PropModeReplace, (unsigned char *)wlist, wlist_len);
+
+ XFlush(DISP);
+}
+
+void
+property_initialize(void)
+{
+ size_t i;
+
+#if XlibSpecificationRelease >= 6
+ if (!XInternAtoms(DISP, atom_names, XtNumber(atom_names), False, atoms))
+ XDVI_FATAL((stderr, "XtInternAtoms failed."));
+#else
+ for (i = 0; i < XtNumber(atom_names); i++) {
+ if ((atoms[i] = XInternAtom(DISP, atom_names[i], False)) == None)
+ XDVI_FATAL((stderr, "XtInternAtoms failed."));
+ }
+#endif
+
+ if (globals.debug & DBG_CLIENT) {
+ for (i = 0; i < XtNumber(atom_names); i++)
+ TRACE_CLIENT((stderr, "Atom(%s) = %lu", atom_names[i], atoms[i]));
+ }
+}
+
+
+Atom atom_xdvi_windows(void)
+{
+ return atoms[0];
+}
+
+Atom atom_dvi_file(void)
+{
+ return atoms[1];
+}
+
+Atom atom_src_goto(void)
+{
+ return atoms[2];
+}
+
+Atom atom_reload(void)
+{
+ return atoms[3];
+}
+
+Atom atom_newdoc(void)
+{
+ return atoms[4];
+}
+
+Atom atom_newpage(void)
+{
+ return atoms[5];
+}
+
+Atom atom_raise(void)
+{
+ return atoms[6];
+}
+
+Atom atom_find_string(void)
+{
+ return atoms[7];
+}
+
+Atom atom_reread_prefs(void)
+{
+ return atoms[8];
+}
+
+/*
+ * Syntesize a mouse-1 down event for the Widget w passed as second argument.
+ * This can be, e.g. a dialog button, or some other window.
+ */
+void
+synthesize_event(XEvent *ev, Widget w)
+{
+ memset(ev, 0, sizeof(XButtonPressedEvent));
+ ev->type = ButtonPress;
+ ev->xbutton.serial = 1;
+ ev->xbutton.send_event = True;
+ ev->xbutton.button = 1;
+ ev->xbutton.display = XtDisplayOfObject(w);
+ ev->xbutton.window = XtWindowOfObject(w);
+}
+
+#ifdef MOTIF
+int xm_get_height(Widget w)
+{
+ int ret_h = 0;
+ static Dimension h0, h1, h2;
+ static Arg args[] = {
+ {XmNheight, (XtArgVal) &h0},
+ {XmNmarginHeight, (XtArgVal) &h1},
+ {XmNshadowThickness, (XtArgVal) &h2},
+ };
+ ASSERT(w != NULL, "widget in xm_get_width mustn't be NULL!");
+
+ XtGetValues(w, args, XtNumber(args));
+ ret_h = h0 + 2 * h1 + 2 * h2;
+ TRACE_GUI((stderr, "xm_get_height: %d", ret_h));
+ return ret_h;
+}
+
+int xm_get_width(Widget w)
+{
+ int ret_w = 0;
+ static Arg args = { XtNwidth, (XtArgVal)0 };
+ ASSERT(w != NULL, "widget in xm_get_width mustn't be NULL!");
+
+ args.value = (XtArgVal)&ret_w;
+ XtGetValues(w, &args, 1);
+ TRACE_GUI((stderr, "xm_get_width: %d", ret_w));
+ return ret_w;
+}
+
+/*
+ * Get pixel from color `colorname'. We try to keep this as
+ * high-level as possible, with simple black as fallback.
+ */
+void
+str_to_pixel(Widget w, const char *colorname, Pixel *ret)
+{
+ XrmValue from, to;
+
+ from.addr = (char *)colorname;
+ from.size = strlen(from.addr) + 1;
+ to.addr = (XtPointer)ret;
+ to.size = sizeof(Pixel);
+ if (!XtConvertAndStore(w, XtRString, &from, XtRPixel, &to)) {
+ fprintf(stderr, "String to pixel conversion failed for %s!\n", colorname);
+ from.addr = (char *)"black";
+ from.size = strlen(from.addr) + 1;
+ to.addr = (XtPointer)ret;
+ to.size = sizeof(Pixel);
+ XtConvertAndStore(w, XtRString, &from, XtRPixel, &to);
+ }
+}
+
+/*
+ * Convert pixel value `pix' to color name passed as str,
+ * of length len, or `black' if conversion failed.
+ * -- FIXME: This is broken!!!
+ */
+void
+pixel_to_str(Widget w, Pixel pix, char *str, size_t len)
+{
+ XrmValue from, to;
+
+ from.addr = (XtPointer)&pix;
+ from.size = sizeof(Pixel);
+ to.addr = str;
+ to.size = len;
+
+ if (!XtConvertAndStore(w, XtRString, &from, XtRPixel, &to)) {
+ fprintf(stderr, "Pixel to String conversion failed for %ld!\n", pix);
+ sprintf(str, "white");
+ }
+}
+
+/* Free color, and initialize it anew with pixel value `pix' */
+void
+pixel_to_color(Pixel pix, XColor *color, Display *display, Colormap colormap)
+{
+ XColor test;
+ test.pixel = pix;
+ XQueryColor(display, colormap, &test);
+
+ color->red = test.red;
+ color->green = test.green;
+ color->blue = test.blue;
+
+ if (!XAllocColor(display, colormap, color)) {
+ fprintf(stderr, "Fatal: Couldn't XAllocColor!");
+ exit(1);
+ }
+}
+#endif /* MOTIF */
+
+/* helper routine for get_matching_parent() */
+static Widget
+matches_parent(Widget w, const char *name)
+{
+ for (; w != NULL; w = XtParent(w)) {
+ char *ptr;
+ ptr = XtName(w);
+ TRACE_GUI((stderr, "parent: %s", ptr == NULL ? "<NULL>" : ptr));
+ if (ptr != NULL && strcmp(ptr, name) == 0) { /* found */
+ TRACE_GUI((stderr, "match!"));
+ break;
+ }
+ }
+ TRACE_GUI((stderr, "returning: %p (0x%lx)", (void *)w, w ? XtWindow(w) : 0));
+ return w;
+}
+
+/* Traverse widget hieararchy upwards until a widget matches
+ a name in the (NULL-terminated) list fmt, or Widget d (`default')
+ if none is found.
+*/
+Widget
+get_matching_parent(Widget w, Widget d, const char *fmt, ...)
+{
+ Widget parent = d;
+ const char *str = fmt;
+
+ va_list argp;
+ va_start(argp, fmt);
+
+ TRACE_GUI((stderr, "get_matching_parent of %p (0x%lx)", (void *)w, XtWindow(w)));
+ while (str != NULL) {
+ Widget p;
+ if ((p = matches_parent(w, str)) != NULL) {
+ parent = p;
+ break;
+ }
+ str = va_arg(argp, char *);
+ }
+
+ va_end(argp);
+
+ return parent;
+}
+
+void
+adjust_width_to_max(Widget w, ...)
+{
+ Dimension max = 0;
+ Widget w1 = w;
+
+ va_list argp;
+ va_start(argp, w);
+
+ /* get maximum width */
+ while (w1 != NULL) {
+ Dimension curr;
+ XtVaGetValues(w1, XtNwidth, &curr, NULL);
+ if (curr > max)
+ max = curr;
+ w1 = va_arg(argp, Widget);
+ }
+ va_end(argp);
+
+ /* set maximum width */
+ va_start(argp, w);
+ w1 = w;
+ while (w1 != NULL) {
+ XtVaSetValues(w1, XtNwidth, max, NULL);
+ w1 = va_arg(argp, Widget);
+ }
+ va_end(argp);
+}
+
+/* Return True if p is a parent of widget w, stopping (and returning FALSE)
+ if s is reached (which should be the toplevel window of the hierarchy).
+*/
+Boolean
+widget_is_parent(Widget w, Widget p, Widget s)
+{
+ Widget curr = XtParent(w);
+ while (curr != NULL && curr != s) {
+ fprintf(stderr, "Comparing: %p - %p\n", (void *)curr, (void *)p);
+ if (curr == p)
+ return True;
+ curr = XtParent(curr);
+ }
+ return False;
+}
+
+/*
+ Adjust height in a NULL-terminated list of widgets. For Motif,
+ this works better than the following adjust_vertically().
+*/
+void
+adjust_heights(Widget w, ...)
+{
+ va_list ap;
+ Widget curr;
+ Dimension h, max;
+
+ ASSERT(w != NULL, "Must have at least one element in va_list for adjust_heights!");
+
+#if MOTIF
+#define HEIGHT XmNheight
+#else
+#define HEIGHT XtNheight
+#endif
+
+ /* initialize maximum */
+ XtVaGetValues(w, HEIGHT, &max, NULL);
+
+ /* get maximum height */
+ va_start(ap, w);
+ while ((curr = va_arg(ap, Widget)) != NULL) {
+ XtVaGetValues(curr, HEIGHT, &h, NULL);
+ if (h > max)
+ max = h;
+ }
+ va_end(ap);
+
+ /* set maximum height for all widgets */
+ XtVaSetValues(w, HEIGHT, max, NULL);
+
+ va_start(ap, w);
+ while ((curr = va_arg(ap, Widget)) != NULL)
+ XtVaSetValues(curr, HEIGHT, max, NULL);
+ va_end(ap);
+
+#undef HEIGHT
+
+}
+
+/*
+ Adjust height in a NULL-terminated list of widgets. For Motif,
+ this works better than the following adjust_vertically().
+*/
+void
+adjust_heights_min(Widget w, ...)
+{
+ va_list ap;
+ Widget curr;
+ Dimension h, min;
+
+ ASSERT(w != NULL, "Must have at least one element in va_list for adjust_heights!");
+
+#if MOTIF
+#define HEIGHT XmNheight
+#else
+#define HEIGHT XtNheight
+#endif
+
+ /* initialize minimum */
+ XtVaGetValues(w, HEIGHT, &min, NULL);
+
+ /* get minimum height */
+ va_start(ap, w);
+ while ((curr = va_arg(ap, Widget)) != NULL) {
+ XtVaGetValues(curr, HEIGHT, &h, NULL);
+ if (h < min)
+ min = h;
+ }
+ va_end(ap);
+
+ /* set maximum height for all widgets */
+ XtVaSetValues(w, HEIGHT, min, NULL);
+
+ va_start(ap, w);
+ while ((curr = va_arg(ap, Widget)) != NULL)
+ XtVaSetValues(curr, HEIGHT, min, NULL);
+ va_end(ap);
+
+#undef HEIGHT
+
+}
+
+/* adjust two widgets vertically */
+void
+adjust_vertically(Widget w1, Widget w2, int default_dist)
+{
+ Dimension h1, h2;
+#if MOTIF
+ XtVaGetValues(w1, XmNheight, &h1, NULL);
+ XtVaGetValues(w2, XmNheight, &h2, NULL);
+ XtVaSetValues(w1, XmNtopOffset, default_dist + (h2 - h1) / 2, NULL);
+ /* XtVaSetValues(w2, XmNtopOffset, default_dist + (h2 - h1) / 2, NULL); */
+#else
+ XtVaGetValues(w1, XtNheight, &h1, NULL);
+ XtVaGetValues(w2, XtNheight, &h2, NULL);
+ XtVaSetValues(w1, XtNvertDistance, default_dist + (h2 - h1) / 2, NULL);
+ XtVaSetValues(w2, XtNvertDistance, default_dist + (h2 - h1) / 2, NULL);
+#endif /* MOTIF */
+}
+
+
+/*
+ * This is a hack to block further processing of some events on widgets:
+ * Add as an event handler for all mouse/key events for a specific widget.
+ */
+void
+block_event_callback(Widget w, XtPointer client_data,
+ XEvent *ev, Boolean *cont)
+{
+ UNUSED(w);
+ UNUSED(client_data);
+ UNUSED(ev);
+
+ /* Don't propagate this event further down... */
+ *cont = False;
+
+ return;
+}
+
+
+/* Get a widget with `name' somewhere in the widget hierarchy below `parent'
+ (matching is done against `*name') and return it in `ret'.
+ If `report_error' is True, a warning message is popped up if the widget isn't found.
+*/
+Boolean
+get_widget_by_name(Widget *ret, Widget parent, const char *name, Boolean report_error)
+{
+ char buf[1024];
+ Widget test;
+
+ /* if (parent == 0 || !XtIsManaged(parent)) { */
+ /* fprintf(stderr, "Widget %p not managed!\n", parent); */
+ /* return False; */
+ /* } */
+
+ if (strlen(name) > 1023) {
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ REPORT_XDVI_BUG_TEMPLATE,
+ "Widget name `%s' too long, couldn't get parent", name);
+ return False;
+ }
+
+ buf[0] = '*'; /* add wildcard to also match paths */
+ strcpy(buf + 1, name);
+
+ if ((test = XtNameToWidget(parent, buf)) != NULL) {
+ *ret = test;
+ return True;
+ }
+ else {
+ if (report_error)
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ REPORT_XDVI_BUG_TEMPLATE,
+ "XtNameToWidget failed for `%s', parent `%s'", name, XtName(parent));
+ return False;
+ }
+}
+
+void
+unexpected_widget_in_callback(Widget w, const char *callback)
+{
+ ASSERT(w != NULL, "Widget mustn't be NULL!");
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ REPORT_XDVI_BUG_TEMPLATE,
+ "Unexpected widget `%s' in callback `%s'",
+ XtName(w), callback);
+}
+
+static XrmDatabase m_user_db = NULL;
+
+/*
+ * Merge the resource `name' with a value specified by `fmt' into
+ * the database `db' (if db == NULL, use m_user_db).
+ */
+void
+store_preference(XrmDatabase *db, const char *name, const char *fmt, ...)
+{
+ size_t offset = strlen("xdvi.");
+ size_t name_len = strlen(name);
+ char *name_buf = xmalloc(name_len + offset + 1);
+ char *buf = NULL;
+ XrmDatabase tmp_db = NULL;
+
+ if (db == NULL)
+ db = &m_user_db;
+
+ XDVI_GET_STRING_ARGP(buf, fmt);
+
+ memcpy(name_buf, "xdvi.", offset);
+ strcpy(name_buf + offset, name);
+
+ TRACE_GUI((stderr, "storing resource: `%s: %s'", name_buf, buf));
+ XrmPutStringResource(&tmp_db, name_buf, buf);
+ XrmMergeDatabases(tmp_db, db);
+
+ free(buf);
+ free(name_buf);
+}
+
+void
+merge_into_user_db(XrmDatabase db)
+{
+ XrmMergeDatabases(db, &m_user_db);
+}
+
+const char *const xdvirc_filename = ".xdvirc";
+const char *const xdvirc_signature_line = "!!! ~/.xdvirc, used by xdvi(1) to save user preferences.\n";
+const char *const xdvirc_header = ""
+"!!!\n"
+"!!! Do not edit this file, it will be overwritten by xdvi.\n"
+"!!! This file contains resources that have been set via the\n"
+"!!! menus/dialogs. The contents of this file will override\n"
+"!!! the entries in your ~/.Xdefaults file (but not the command\n"
+"!!! line arguments passed to xdvi). Remove this file\n"
+"!!! if you want to get rid of all these customizations,\n"
+"!!! or start xdvi with the `-q' option to ignore this file.\n"
+"!!!\n";
+
+static char *
+get_xdvirc_path(const char *basename)
+{
+ const char *homedir;
+ size_t len;
+ char *str;
+
+ if (basename == NULL)
+ return NULL;
+
+ homedir = getenv("HOME");
+ len = strlen(homedir) + strlen(basename) + 2; /* 1 more for '/' */
+ str = xmalloc(len);
+
+ sprintf(str, "%s/%s", homedir, basename);
+ return str;
+}
+
+static void
+save_geometry(void)
+{
+ int x_off, y_off;
+ Dimension w, h;
+ Window dummy;
+ /* char *geom_str; */
+
+ (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level),
+ RootWindowOfScreen(SCRN),
+ 0, 0,
+ &x_off, &y_off,
+ &dummy);
+ XtVaGetValues(globals.widgets.top_level,
+ XtNwidth, &w,
+ XtNheight, &h,
+#ifdef MOTIF
+ /* XmNgeometry, &geom_str, */
+#endif
+ NULL);
+ TRACE_GUI((stderr, "geometry: %dx%d+%d+%d", w, h, x_off, y_off));
+
+ store_preference(NULL, "windowSize", "%dx%d", w, h);
+}
+
+/* Save user preferences to ~/.xdvirc. If `backup_only' is True,
+ it only writes to ~/.xdvirc.tmp and does not remove this temporary
+ file (this is used for synchronization between several xdvi instances).
+*/
+Boolean
+save_user_preferences(Boolean full_save)
+{
+ char testbuf[1024];
+ char *xdvirc_name;
+ char *tmpname;
+ FILE *from_fp, *to_fp;
+ int fd;
+
+ if (resource.no_init_file
+ || m_user_db == NULL) /* nothing to do */
+ return True;
+
+ if (resource.remember_windowsize)
+ save_geometry();
+
+ xdvirc_name = get_xdvirc_path(xdvirc_filename);
+
+ if ((to_fp = fopen(xdvirc_name, "r")) != NULL) {
+ TRACE_GUI((stderr, "~/.xdvirc exists, checking file contents ..."));
+ if (fgets(testbuf, 1024, to_fp) != NULL &&
+ memcmp(testbuf, xdvirc_signature_line, strlen(xdvirc_signature_line)) != 0) {
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ "Xdvi uses the file ~/.xdvirc to save the preferences set via "
+ "the menu bar or the preferences dialog (in the Motif version only). "
+ "To avoid overwriting files created by the user, the first line of the "
+ "file is compared with a special signature line. If that signature line "
+ "is not found, the preferences won't be written. Your file doesn't seem "
+ "to contain that signature line. You should move the file to a safe location, "
+ "and then try to quit xdvi again.",
+ /* message */
+ "The file `%s' was apparently not written by xdvi(k). "
+ "Please move or delete this file first, then try to exit xdvi again. ",
+ xdvirc_name);
+ return False;
+ }
+ fclose(to_fp);
+ }
+
+ /* don't use xdvi_temp_fd here, since XrmPutFileDatabase()
+ closes the FILE*, creating a temp race */
+ tmpname = xstrdup(xdvirc_name);
+ tmpname = xstrcat(tmpname, ".tmp");
+
+ /* since XrmPutFileDatabase doesn't give a useful error message if it fails,
+ check that creating the file works beforehand. The file is created with 0600 permissions. */
+ if ((fd = try_open_mode(tmpname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
+ XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for writing failed: %s", tmpname, strerror(errno)));
+ return True;
+ }
+ close(fd);
+
+ XrmPutFileDatabase(m_user_db, tmpname);
+
+ if (full_save) {
+ if ((from_fp = try_fopen(tmpname, "r")) == NULL) {
+ XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for reading failed: %s", tmpname, strerror(errno)));
+ return True;
+ }
+
+ /* again, create the file with 600 permissions */
+ if ((fd = try_open_mode(xdvirc_name, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) < 0) {
+ XDVI_ERROR((stderr, "Could not save preferences!\nOpening %s for writing failed: %s", xdvirc_name, strerror(errno)));
+ return True;
+ }
+
+ if ((to_fp = fdopen(fd, "w")) == NULL) {
+ XDVI_ERROR((stderr, "Could not save preferences!\nfdopen for %s for writing failed: %s", xdvirc_name, strerror(errno)));
+ return True;
+ }
+
+ if (fputs(xdvirc_signature_line, to_fp) == EOF
+ || fputs(xdvirc_header, to_fp) == EOF
+ || !copy_fp(from_fp, to_fp)) {
+ XDVI_ERROR((stderr, "Could not save preferences!\nError writing to %s: %s", xdvirc_name, strerror(errno)));
+ }
+
+ fclose(from_fp);
+ fclose(to_fp);
+ }
+
+ free(xdvirc_name);
+
+ if (full_save)
+ unlink(tmpname);
+ free(tmpname);
+
+ return True;
+}
+
+/*
+ * Read the user preferences from xdvirc_filename and merge them into the
+ * current resource database *and* into m_user_db so that all of them are
+ * saved again when xdvi exits.
+ */
+void
+read_user_preferences(Widget toplevel, const char *filename)
+{
+ char *fullpath;
+ XrmDatabase db;
+#if XtSpecificationRelease == 4
+ XrmDatabase file_db;
+#endif
+
+ fullpath = get_xdvirc_path(filename);
+ TRACE_GUI((stderr, "Reading resources from `%s'", fullpath));
+ db = XtDatabase(XtDisplay(toplevel));
+
+#if XtSpecificationRelease == 4
+ file_db = XrmGetFileDatabase(fullpath);
+ XrmMergeDatabases(file_db, &db);
+ XrmMergeDatabases(file_db, &m_user_db);
+#else /* Xt >= X11R5 */
+ XrmCombineFileDatabase(fullpath, &db, True);
+ XrmCombineFileDatabase(fullpath, &m_user_db, True);
+#endif
+ free(fullpath);
+}
+
+
+/*
+ * Routines for running as source-special client.
+ */
+
+static unsigned long xdvi_next_request = 0;
+static int xerrno;
+static int (*XdviOldErrorHandler)(Display *, XErrorEvent *);
+
+static int
+XdviErrorHandler(Display *d, XErrorEvent *event)
+{
+ if (event->serial != xdvi_next_request || event->error_code != BadWindow)
+ return XdviOldErrorHandler(d, event);
+
+ xerrno = 1;
+ return 0;
+}
+
+static int
+XdviGetWindowProperty(Display *display,
+ Window w,
+ Atom property,
+ long long_offset,
+ long long_length,
+ Bool delete,
+ Atom req_type,
+ Atom *actual_type_return,
+ int *actual_format_return,
+ unsigned long *nitems_return,
+ unsigned long *bytes_after_return,
+ unsigned char **prop_return)
+{
+ int retval;
+
+ xdvi_next_request = NextRequest(display);
+ xerrno = 0;
+
+ retval = XGetWindowProperty(display, w, property, long_offset,
+ long_length, delete, req_type,
+ actual_type_return, actual_format_return,
+ nitems_return, bytes_after_return, prop_return);
+
+ return (xerrno != 0 ? BadWindow : retval);
+}
+
+/* helper function to set a string property of type `prop' for window `win' */
+void
+set_string_property(const char *str, Atom prop, Window win)
+{
+ XChangeProperty(DISP, win, prop, prop, 8, PropModeReplace,
+ (const unsigned char *)str, strlen(str));
+ XFlush(DISP); /* necessary to get the property set */
+}
+
+/*
+ * Check for another running copy of xdvi.
+ * If same_file is true, return the window ID of an instance that has
+ * currently loaded the same file, or 0 if none exists.
+ * If same_file is false, return the first valid xdvi window ID.
+ */
+
+Window
+get_xdvi_window_id(Boolean same_file, property_cbT callback)
+{
+ long *window_list;
+ size_t window_list_len;
+ long *window_list_end;
+ long *wp;
+ long *p;
+ Boolean need_rewrite = False;
+ Window ret_window = 0;
+
+ /*
+ * Get window list.
+ * Copy it over (we'll be calling property_get_data() again).
+ */
+ if ((window_list_len = property_get_window_list(&p)) == 0)
+ return 0;
+
+ window_list = xmalloc(window_list_len * sizeof (long));
+ memcpy(window_list, p, window_list_len * sizeof (long));
+
+ XdviOldErrorHandler = XSetErrorHandler(XdviErrorHandler);
+
+ /* Loop over list of windows. */
+
+ window_list_end = window_list + window_list_len;
+ TRACE_CLIENT((stderr, "My property: `%s'", dvi_property));
+
+ for (wp = window_list; wp < window_list_end; ++wp) {
+ char *buf_ret;
+ size_t len;
+
+ TRACE_CLIENT((stderr, "Checking window %08lx", *wp));
+
+ len = property_get_data((Window) *wp, atom_dvi_file(), &buf_ret,
+ XdviGetWindowProperty);
+
+ if (len == 0) {
+ /* not getting back info for a window usually indicates
+ that the application the window had belonged to had
+ been killed with signal 9
+ */
+ TRACE_CLIENT((stderr,
+ "Window %08lx: doesn't exist any more, deleting", *wp));
+ --window_list_len;
+ --window_list_end;
+ memmove(wp, wp + 1, (window_list_end - wp) * sizeof (long));
+ --wp; /* new item is now at wp; don't skip it in next iteration */
+ need_rewrite = True;
+ continue;
+ }
+ else { /* window still alive */
+ if (globals.debug & DBG_CLIENT) {
+ TRACE_CLIENT((stderr,
+ "Window %08lx: property: `%s'", *wp, buf_ret));
+ }
+
+ /* invoke callback if given */
+ if (callback != NULL) {
+ callback((Window) *wp);
+ }
+
+ if (!same_file && ret_window == 0) {
+ ret_window = *wp;
+ if (callback == 0) /* can return early */
+ break;
+ }
+ else if (strcmp(buf_ret, dvi_property) == 0 && ret_window == 0) { /* match */
+ ret_window = *wp;
+ if (callback == 0) /* can return early */
+ break;
+ }
+ }
+ }
+
+ XSetErrorHandler(XdviOldErrorHandler);
+
+ if (need_rewrite)
+ XChangeProperty(DISP, DefaultRootWindow(DISP),
+ atom_xdvi_windows(), atom_xdvi_windows(), 32,
+ PropModeReplace, (unsigned char *)window_list,
+ window_list_len);
+
+ return ret_window;
+}
+
+Boolean
+clip_region(int *x, int *y, int *w, int *h)
+{
+#if 0
+ fprintf(stderr, "globals.win_expose.min_x: %d, globals.win_expose.max_x: %d, "
+ "globals.win_expose.min_y: %d, globals.win_expose.max_y: %d\n",
+ globals.win_expose.min_x, globals.win_expose.max_x,
+ globals.win_expose.min_y, globals.win_expose.max_y);
+#endif
+ /* check for <= so that we also return false if *w or *h == 0 */
+ if (*x + *w <= globals.win_expose.min_x
+ || *x >= globals.win_expose.max_x
+ || *y + *h <= globals.win_expose.min_y
+ || *y >= globals.win_expose.max_y
+ /* extra protection agains *w or *h == 0; don't know if this can actually happen ... */
+ || globals.win_expose.max_y == globals.win_expose.min_y
+ || globals.win_expose.max_x == globals.win_expose.min_x) {
+ return False;
+ }
+ if (*x < globals.win_expose.min_x) {
+ *w -= globals.win_expose.min_x - *x;
+ *x = globals.win_expose.min_x;
+ }
+ if (*x + *w > globals.win_expose.max_x) {
+ *w = globals.win_expose.max_x - *x;
+ }
+ if (*y < globals.win_expose.min_y) {
+ *h -= globals.win_expose.min_y - *y;
+ *y = globals.win_expose.min_y;
+ }
+ if (*y + *h > globals.win_expose.max_y) {
+ *h = globals.win_expose.max_y - *y;
+ }
+ return True;
+}
+
+Boolean
+clip_region_to_rect(XRectangle *rect)
+{
+ int x = rect->x;
+ int y = rect->y;
+ int w = rect->width;
+ int h = rect->height;
+ Boolean ret = clip_region(&x, &y, &w, &h);
+ if (ret) {
+ rect->x = x;
+ rect->y = y;
+ rect->width = w;
+ rect->height = h;
+ }
+ return ret;
+}
+
+Boolean window_is_mapped(Window w, Display *dpy)
+{
+ XWindowAttributes xwa;
+ return XGetWindowAttributes(dpy, w, &xwa) && xwa.map_state == IsViewable;
+}
+
+XtPointer cast_int_to_XtPointer(int i)
+{
+ return (XtPointer)(ptrdiff_t)i;
+}
diff --git a/Build/source/texk/xdvik/x_util.h b/Build/source/texk/xdvik/x_util.h
new file mode 100644
index 00000000000..4ce190295b4
--- /dev/null
+++ b/Build/source/texk/xdvik/x_util.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2002-2004 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef X_UTIL_H_
+#define X_UTIL_H_
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include "xdvi.h"
+
+/* nasty globals */
+/*
+ Whether program should autoscroll to make href target marker or
+ forward search marker visible.
+ This is disabled by ordinary user scrolling (otherwise xdvi would
+ jump back to the old place, undoing the user scroll), so we need
+ global access to it.
+ */
+extern Boolean do_autoscroll;
+
+
+extern void center_window(Widget w1, Widget w2);
+extern void position_window(Widget w, Position x, Position y);
+extern void scroll_page_if_needed(int x_min, int x_max, int y_min, int y_max);
+extern void adjust_width(Widget a, Widget b);
+extern GC set_or_make_gc(GC gc, int function, Pixel fg, Pixel bg);
+
+extern size_t property_get_data(Window, Atom, char **,
+ int (*x_get_property) (Display *, Window, Atom, long,
+ long, Bool, Atom, Atom *, int *, unsigned long *,
+ unsigned long *, unsigned char **));
+
+extern void set_dvi_property(void);
+extern void update_window_property(Window w, Boolean prepend);
+extern void update_dvi_property(void);
+extern void property_initialize(void);
+
+/*
+ * atom_xdvi_windows() is attached to the root window of the default
+ * screen of the display; it contains a list of (hopefully active)
+ * xdvi windows.
+ */
+Atom atom_xdvi_windows(void);
+
+/*
+ * atom_dvi_file() is attached to the main xdvi window; it tells the
+ * world what dvi file is being viewed. It is set by that copy of
+ * xdvi and read by this routine. The first 8 bytes are the inode
+ * number, and the rest is the file name. We use 8 instead of
+ * sizeof(ino_t) because the latter may vary from machine to machine,
+ * and the format needs to be machine independent.
+ */
+Atom atom_dvi_file(void);
+
+/* Atoms attached to the main xdvi window */
+
+/* instruct the current instance to do a forward search
+ * on the source string encoded in the property */
+Atom atom_src_goto(void);
+
+/* instruct the current instance to do a string search
+ * on the string encoded in the property */
+Atom atom_find_string(void);
+
+/* instruct the current instance to reload the current file */
+Atom atom_reload(void);
+
+/* instruct the current instance to load the new file contained in the property */
+Atom atom_newdoc(void);
+
+/* instruct the current instance to go to the page encoded in the property */
+Atom atom_newpage(void);
+
+/* instruct the current instance to raise its window */
+Atom atom_raise(void);
+
+/* instruct the current instance to reread preferences from ~/.xdvirc.tmp */
+Atom atom_reread_prefs(void);
+
+extern void synthesize_event(XEvent *ev, Widget button);
+
+#ifdef MOTIF
+extern int xm_get_height(Widget w);
+extern int xm_get_width(Widget w);
+extern void str_to_pixel(Widget w, const char *colorname, Pixel *ret);
+extern void pixel_to_str(Widget w, Pixel pix, char *str, size_t len);
+extern void pixel_to_color(Pixel pix, XColor *color, Display *display, Colormap colormap);
+#endif
+
+extern void adjust_width_to_max(Widget w, ...);
+extern Widget get_matching_parent(Widget w, Widget p, const char *fmt, ...);
+extern Boolean widget_is_parent(Widget w, Widget p, Widget s);
+
+extern void adjust_vertically(Widget w1, Widget w2, int default_dist);
+extern void adjust_heights(Widget w1, ...);
+extern void adjust_heights_min(Widget w1, ...);
+/* extern void adjust_widths(Widget w1, ...); */
+
+void block_event_callback(Widget w, XtPointer client_data,
+ XEvent *ev, Boolean *cont);
+
+extern void unexpected_widget_in_callback(Widget w, const char *callback);
+extern Boolean get_widget_by_name(Widget *ret, Widget parent, const char *name, Boolean report_error);
+
+extern void merge_into_user_db(XrmDatabase db);
+extern void store_user_preference(const char *name, const char *fmt, ...);
+extern void store_preference(XrmDatabase *db, const char *name, const char *fmt, ...);
+extern Boolean save_user_preferences(Boolean full_save);
+extern void read_user_preferences(Widget toplevel, const char *filename);
+
+/* property related routines */
+typedef void (*property_cbT)(Window w);
+extern Window get_xdvi_window_id(Boolean same_file, property_cbT callback);
+extern void set_string_property(const char *str, Atom prop, Window win);
+
+extern Boolean clip_region(int *x, int *y, int *w, int *h);
+extern Boolean clip_region_to_rect(XRectangle *rect);
+
+extern Boolean window_is_mapped(Window w, Display *dpy);
+
+extern XtPointer cast_int_to_XtPointer(int x);
+
+#endif
diff --git a/Build/source/texk/xdvik/xdvi-config.h b/Build/source/texk/xdvik/xdvi-config.h
new file mode 100644
index 00000000000..0fb60e3c035
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi-config.h
@@ -0,0 +1,37 @@
+/* xdvi-config.h: master configuration file, included first by all
+ compilable source files (not headers). */
+
+#ifndef CONFIG_H_
+#define CONFIG_H_
+
+/* Some xdvi options we want by default. */
+#define USE_PK
+#define USE_GF
+#define MAKEPK
+
+/* all others are defined in this file */
+#include "c-auto.h"
+
+#ifndef HAVE_VPRINTF
+#ifdef HAVE_DOPRNT
+#define vfprintf(stream, message, args) _doprnt(message, args, stream)
+/* If we have neither, should fall back to fprintf with fixed args. */
+#endif
+#endif
+
+/* XPM is used for the toolbar buttons and in xicon.c */
+#if USE_XPM
+# if defined(HAVE_X11_XPM_H) || defined(HAVE_XM_XPMP_H) || defined(HAVE_XPM_H)
+# define HAVE_XPM 1
+# else
+# define HAVE_XPM 0
+# endif
+#endif
+
+/* enable X server info output */
+#define XSERVER_INFO 1
+
+/* change this to 1 when #470325 is fixed */
+#define FIXED_FLUSHING_PAGING 0
+
+#endif /* not CONFIG_H_ */
diff --git a/Build/source/texk/xdvik/xdvi-debug.h b/Build/source/texk/xdvik/xdvi-debug.h
new file mode 100644
index 00000000000..4924f567c51
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi-debug.h
@@ -0,0 +1,217 @@
+#ifndef XDVI_DEBUG_H_
+#define XDVI_DEBUG_H_
+
+/*
+ * Copyright (c) 2002-2013 the xdvik development team
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/* debugging flags and macros */
+
+#include "xdvi.h"
+#include "version.h"
+
+#if HAVE_STRINGIZE
+#ifdef NDEBUG
+/* for production code, a failed ASSERT(x) just prints out a warning;
+ else it aborts and dumps core.
+*/
+#define ASSERT(x, y) do { \
+ if(!(x)) { \
+ fprintf(stderr, \
+ "************************************************************\n" \
+ "XDvi %s: Failed assertion:\n%s:%d: \"%s\": %s\n" \
+ "Please report this as a bug to:\n" \
+ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" \
+ "************************************************************\n", \
+ XDVI_VERSION_INFO, __FILE__, __LINE__, #x, y); \
+ } } while (0)
+#else /* NDEBUG */
+#define ASSERT(x, y) do { \
+ if(!(x)) { \
+ fprintf(stderr, \
+ "\n************************************************************\n" \
+ "XDvi %s: Failed assertion:\n%s:%d: \"%s\": %s\n" \
+ "Aborting now. Please report this as a bug to:\n" \
+ "http://sourceforge.net/tracker/?group_id=23164&atid=377580\n" \
+ "If a core dump has been produced, please invoke:\n" \
+ "gdb %s core\nThen type \"bt\", " \
+ "and include the resulting output in your bug report.\n" \
+ "************************************************************\n", \
+ XDVI_VERSION_INFO, __FILE__, __LINE__, #x, y, globals.program_name); \
+ do_abort(); \
+ } } while (0)
+#endif /* NDEBUG */
+#else /* HAVE_STRINGIZE */
+#define ASSERT(x, y) /* as nothing */
+#endif
+
+/* for temporary debugging statements */
+/* #define MYDEBUG 1 */
+#ifdef MYDEBUG
+# define MYTRACE(X) do { \
+ fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+} while(0)
+#else
+# define MYTRACE(X)
+#endif
+
+/* NOTE: keep these in sync with the debug_string_options array in util.c! */
+#define DBG_BITMAP 1
+#define DBG_DVI 2
+#define DBG_PK 4
+#define DBG_BATCH 8
+#define DBG_EVENT 16
+#define DBG_PS 32
+/* start of kpathsea debugging options */
+#define DBG_STAT 64
+#define DBG_HASH 128
+#define DBG_OPEN 256
+#define DBG_PATHS 512
+#define DBG_EXPAND 1024
+#define DBG_SEARCH 2048
+#define DBG_KPATHSEA 4032 /* handy abbrev */
+/* end of kpathsea debugging options */
+#define DBG_HTEX 4096
+#define DBG_SRC_SPECIALS 8192
+#define DBG_CLIENT 16384
+#define DBG_FT 32768
+#define DBG_FT_VERBOSE 65536 /* not currently used */
+#define DBG_GUI 131072
+#define DBG_FIND 262144
+#define DBG_FILES 524288
+#define DBG_ALL (~DBG_BATCH)
+
+/* a mapping of numerical options to descriptive strings, defined in util.c */
+struct debug_string_options {
+ int bitmap;
+ const char *description;
+ const char *help_formatting;
+};
+
+/*
+ */
+
+#if 0
+/* we don't want this defined for NDEBUG, since the tracing macros
+ are pretty useful also for users reporting bugs etc.; so we
+ enable them always.
+*/
+#define TRACE_HTEX(X)
+#define TRACE_SRC(X)
+#define TRACE_CLIENT(X)
+#define TRACE_FT(X)
+#define TRACE_FT_VERBOSE(X)
+#define TRACE_GUI(X)
+#define TRACE_EVENTS(X)
+#define TRACE_FIND(X)
+#define TRACE_FILES(X)
+
+#else /* 0 */
+
+/*
+ * Note that the argument to these macros is always ((stderr, "...")).
+ * We could also have
+ * TRACE_SRC(("..."));
+ * and invoke a function, but then gcc (3.1) won't be able to check
+ * inconsistencies between conversion specifiers and arguments any
+ * more, and that's a real killer IMHO.
+ */
+
+#define TRACE_HTEX(X) \
+ do { \
+ if (globals.debug & DBG_HTEX) { \
+ fprintf(stderr, "%s:%d: HTEX: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_SRC(X) \
+ do { \
+ if (globals.debug & DBG_SRC_SPECIALS) { \
+ fprintf(stderr, "%s:%d: SRC: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_CLIENT(X) \
+ do { \
+ if (globals.debug & DBG_CLIENT) { \
+ fprintf(stderr, "%s:%d: CLIENT: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_FT(X) \
+ do { \
+ if (globals.debug & DBG_FT) { \
+ fprintf(stderr, "%s:%d: FT: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_FT_VERBOSE(X) \
+ do { \
+ if (globals.debug & DBG_FT_VERBOSE) { \
+ fprintf(stderr, "%s:%d: FT_VERBOSE: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_GUI(X) \
+ do { \
+ if (globals.debug & DBG_GUI) { \
+ fprintf(stderr, "%s:%d: GUI: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_EVENTS(X) \
+ do { \
+ if (globals.debug & DBG_EVENT) { \
+ fprintf(stderr, "%s:%d: EVENT: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+#define TRACE_FIND(X) \
+ do { \
+ if (globals.debug & DBG_FIND) { \
+ fprintf(stderr, "%s:%d: FIND: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+
+#define TRACE_FILES(X) \
+ do { \
+ if (globals.debug & DBG_FILES) { \
+ fprintf(stderr, "%s:%d: FILES: ", __FILE__, __LINE__); \
+ fprintf X; \
+ fprintf(stderr, "\n"); \
+ } \
+ } while(0)
+
+#endif /* 0 */
+
+#endif /* XDVI_DEBUG_H_ */
diff --git a/Build/source/texk/xdvik/xdvi-search.el b/Build/source/texk/xdvik/xdvi-search.el
new file mode 100644
index 00000000000..8f611149aed
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi-search.el
@@ -0,0 +1,397 @@
+;;; xdvi-search.el --- (X)Emacs frontend for forward search with xdvi(k)
+;;; Requires xdvi(k) >= 22.38.
+;;;
+;;; See http://xdvi.sourceforge.net/inverse-search.html and the section
+;;; `FORWARD SEARCH' in the xdvi man page for more information on forward search.
+;;;
+;;; This file is available from: http://xdvi.sourceforge.net/xdvi-search.el
+;;;
+;;; Copyright (C) 2004 - 2006 Stefan Ulrich
+;;; Copyright (C) 2006, Chris Stucchio (minor modifications)
+;;; $Revision: 1.37 $, tested with Emacs 20.4 to 21.2 and Xemacs 21.1 to 21.5
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation; either version 2
+;;; of the License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+;;;
+;;;
+;;; Commentary:
+;;
+;; Usage:
+;;
+;; - Add this file to some place where Emacs can find it
+;; (e.g. put it into a directory ~/emacs/, which you add to your
+;; load path by putting the following line into your .emacs file:
+;;
+;; (add-to-list 'load-path (expand-file-name "~/emacs/"))
+;;
+;; Then, add the following line to your .emacs file:
+;;
+;; (require 'xdvi-search)
+;;
+;; After compiling your .tex file with source specials activated, you should
+;; be able to use
+;; M-x xdvi-jump-to-line
+;; to make xdvi jump to the current location of the cursor.
+;;
+;; You could also bind this command to a key, e.g. by adding
+;; a binding to tex-mode-hook:
+;;
+;; (add-hook 'tex-mode-hook (lambda ()
+;; (local-set-key "\C-c\C-j" 'xdvi-jump-to-line)))
+;;
+;;
+;; (without AucTeX; use LaTeX-mode-hook instead of tex-mode-hook with AucTeX.
+;; Note that with AucTeX, C-c C-j is already bound to LaTeX-insert-item, so
+;; you might want to use a different key combination instead.)
+;;
+;; - Note that with xdvik < 22.74.2, you may need to use one of the
+;; functions xdvi-jump-to-line-fullpath() or xdvi-jump-to-line-relpath()
+;; instead of xdvi-jump-to-line(), depending on the type of paths contained
+;; in your \include{} commands. See the docstring of xdvi-jump-to-line()
+;; for more information.
+;;
+;; Please send bug reports, improvements etc. to
+;; <stefanulrich@users.sourceforge.net>.
+;;
+
+
+;;; Code:
+
+;;;
+;;; Customizable stuff
+;;;
+
+(defgroup xdvi-search nil
+ "Support for inverse search with (La)TeX and DVI previewers."
+ :group 'languages)
+
+(defcustom explicit-shell-file-name nil
+ "*If non-nil, file name to use for explicitly requested inferior shell."
+ :type '(choice (const :tag "nil" nil) file)
+ :group 'xdvi-search)
+
+(defcustom xdvi-shell-buffer-name nil
+ "*If non-nil, file name to use for explicitly requested inferior shell."
+ :type '(choice (const :tag "nil" nil) file)
+ :group 'xdvi-search)
+
+
+(defcustom xdvi-bin "xdvi"
+ "*Name of the xdvi executable."
+ :type '(choice (const "xdvi") file)
+ :group 'xdvi-search)
+
+(defcustom xdvi-logfile "~/.xdvi-log"
+ "*Write xdvi output to this file, or throw away output if set to nil."
+ :type '(choice (const :tag "nil" nil) file)
+ :group 'xdvi-search)
+
+
+;;;
+;;; global variables/constants
+;;;
+(defvar xdvi-version-number 0
+ "*Version of xdvi(k) you're using.
+Only set this to override the built-in version recognition if that fails.
+The version number is computed as: major * 1000000 + minor * 1000 + patchlevel,
+where alphabetic characters are ignored; e.g. 22040000 equals version 22.40c;
+ 22077002 equals version 22.77.2.")
+
+(defvar xdvi-is-xdvik nil
+ "Whether we're really using xdvik instead of xdvi.")
+
+;;;
+;;; exported functions
+;;;
+;;;###autoload
+(defun xdvi-jump-to-line-fullpath ()
+ "See `xdvi-jump-to-line' for documentation."
+ (interactive)
+ (xdvi-jump-to-line 3))
+
+;;;###autoload
+(defun xdvi-jump-to-line-relpath ()
+ "See `xdvi-jump-to-line' for documentation."
+ (interactive)
+ (xdvi-jump-to-line 2))
+
+;;;###autoload
+(defun xdvi-jump-to-line (flag)
+ "Call xdvi to perform a `forward search' for current file and line number.
+The optional argument FLAG controls the path searching behaviour; see also
+'xdvi-jump-to-line-fullpath' and 'xdvi-jump-to-line-relpath'.
+
+Xdvi needs three pieces of information for forward search:
+
+- the current line number
+- the name of the current input file
+- the name of the master .tex file.
+
+The `master' .tex file (following AucTeX's terminology) is the same
+as `\jobname' and determines the name of the DVI file. It is either
+obtained by using AucTeX's function `TeX-master-file' or, in case
+AucTeX isn't available, by calling `xdvi-master-file-name', a function
+which tries to mimick AucTeX's behaviour to obtain this filename.
+
+For the current input file name, we need to rely on the DVI viewer to
+make a smart matching of path suffixes with the file names that
+actually occur in the specials, since specials inserted by TeX's
+`-src' option may contain absolute or relative paths, depending on
+whether TeX is called with a relative or absolute filename. (Similarly
+for srcltx.sty, which can't expand paths.)
+
+Note to users of older versions of xdvik (< 22.74.2), or non-k xdvi:
+
+There are various ways of specifying an input file path for LaTeX's
+\\input{} commands (which will end up in the source specials):
+
+ (1) Filename only: \\input{chapter1}
+ (2) Relative path name: \\input{chapters/chapter1}
+ (3) Full path name: \\input{/home/user/tex/diss/chapters/chapter1}
+
+Versions of xdvik < 22.74.2 and plain xdvi will not match pathname suffixes.
+With these versions, `xdvi-jump-to-line' will only work with variant (1);
+for (2) or (3) you will need to use one of `xdvi-jump-to-line-relpath' (for 2)
+or `xdvi-jump-to-line-fullpath' (for 3) instead."
+ (interactive "P")
+ (save-excursion
+ (save-restriction
+ (widen)
+ (beginning-of-line 1)
+ (if (not flag)
+ (setq flag 1))
+ (let* (;;; Current line in file.
+ ;;; `count-lines' yields different results at beginning and in the
+ ;;; middle of a line, so we normalize by going to BOL first and
+ ;;; then adding 1
+ (curr-line (+ 1 (count-lines (point-min) (point))))
+ ;;; name of master .tex file, to be used as DVI basename:
+ (abspath (file-name-directory buffer-file-name))
+ (master-file (if (fboundp 'TeX-master-file)
+ (TeX-master-file t)
+ (xdvi-get-masterfile (xdvi-master-file-name))))
+ (xdvi-version-info (xdvi-get-version-number xdvi-version-number))
+ ;;; DVI file name:
+ (dvi-file (concat (file-name-sans-extension master-file) ".dvi"))
+ ;;; Current source filename
+ (filename (get-source-filename (buffer-file-name) flag)))
+ (if (not (xdvi-has-inverse-search (car xdvi-version-info)))
+ (error "Your xdvi version is too old; see http://xdvi.sourceforge.net/inverse-search.html for more information"))
+ (if (not (file-exists-p dvi-file))
+ (message "File %s does not exist; maybe you need to run latex first?" dvi-file)
+ (save-window-excursion
+ (if (xdvi-has-nofork (car xdvi-version-info) (car (cdr xdvi-version-info)))
+ (progn
+ (setq proc
+ (start-process "xdvi" "*xdvi output*"
+ xdvi-bin
+ "-nofork"
+ "-sourceposition"
+ (concat (int-to-string curr-line) " " filename)
+ dvi-file))
+ (set-process-sentinel proc 'xdvi-process-sentinel))
+ ;;;
+ ;;; More complicated if we don't have nofork: start a
+ ;;; subshell, since otherwise there's no way of viewing
+ ;;; the stderr/stdout output of the xdvi child process
+ ;;; without having either xdvi freezing, Emacs freezing,
+ ;;; or Emacs killing the xdvi child process (which is
+ ;;; forked when running with -sourceposition).
+ ;;;
+ ;;; Obtain the type of I/O-redirection needed for current shell:
+ (let* ((default-shell
+ (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name)
+ (getenv "ESHELL")
+ (getenv "SHELL")
+ "/bin/sh"))
+ (shell-redirection
+ (cond ((string-match "/bin/t?csh" default-shell)
+ (list ">&" ""))
+ ;; bash/ksh/sh
+ ((list ">" "2>&1")))))
+ (cond ((string-match "XEmacs" emacs-version)
+ (xdvi-shell))
+ ((< emacs-major-version 21)
+ (xdvi-shell))
+ ((shell (or xdvi-shell-buffer-name "*xdvi-shell*"))))
+ (comint-send-input)
+ (insert (concat "cd " abspath ";") )
+ (insert xdvi-bin
+ " -sourceposition '" (int-to-string curr-line) " " filename "' "
+ dvi-file
+ " "
+ ;;; we could probably do without the logfile, but it's an easy
+ ;;; way for toggling between /dev/null and logging.
+ (if xdvi-logfile
+ (let ((xdvi-logfile-fullname (expand-file-name xdvi-logfile)))
+ ;;; to avoid problems with `noclobber'
+ (if (file-exists-p xdvi-logfile-fullname)
+ (delete-file xdvi-logfile-fullname))
+ (car shell-redirection)
+ " "
+ xdvi-logfile-fullname
+ " "
+ (car (cdr shell-redirection))
+ )
+ )
+ " &")
+ (if xdvi-logfile
+ (message "Writing xdvi output to \"%s\"." xdvi-logfile))
+ (comint-send-input)))))))))
+
+;;;
+;;; internal functions
+;;;
+(defun shell-with-name (name)
+ "This function opens a shell in a buffer with name given by the argument, and switches to that buffer. If the buffer already exists, we simply switch to it."
+ (let ((buffer-of-name (get-buffer name))
+ (tempname (generate-new-buffer-name "*tempshell*") ) )
+ (cond ((bufferp buffer-of-name) ;If the buffer exists, switch to it (assume it is a shell)
+ (switch-to-buffer name))
+ ( (bufferp (get-buffer "*shell*"))
+ (progn
+ (shell)
+ (rename-buffer tempname)
+ (shell)
+ (rename-buffer name)
+ (switch-to-buffer tempname)
+ (rename-buffer "*shell*")
+ (switch-to-buffer name)))
+ ( t
+ (progn
+ (shell)
+ (rename-buffer name)
+ )
+ )
+ )
+ )
+ )
+
+(defun xdvi-shell ()
+ "Behaves just like function shell, but creates the shell in buffer named *xdvi-shell* (unless of course the user chooses to modify the xdvi-shell-buffer-name variable.)"
+ (shell-with-name (or xdvi-shell-buffer-name "*xdvi-shell*") )
+ )
+
+(defun xdvi-has-inverse-search (version)
+ "Return True if inverse search is available for this VERSION of xdvi(k)."
+ (>= version 22038000))
+
+(defun xdvi-has-nofork (version is-xdvik)
+ "Return True if the '-nofork' option is available for this VERSION of xdvi(k).
+This option was implemented in version 22.74.1 of xdvik, and 22.61 of plain xdvi.
+Argument IS-XDVIK controls whether we're running xdvik or plain xdvi."
+ (if is-xdvik
+ (>= version 22074001)
+ (>= version 22061000)))
+
+(defun get-source-filename (fname flag)
+ "Helper function to extract the file name from the file name FNAME.
+FLAG controls whether to use the full path or a relative path."
+ (if (> flag 1)
+ (if (> flag 2)
+ ;;; full path name, for use with TeX patch and when using the
+ ;;; full path in \input or \include with srcltx.sty:
+ (expand-file-name fname)
+ ;;; relative path name: if current path and path of master file match partly,
+ ;;; use the rest of this path; else use buffer name. This can treat both the
+ ;;; cases when a relative path is used in \input{}, or when just the filename
+ ;;; is used and the file is located in the current directory (suggested by
+ ;;; frisk@isy.liu.se).
+ (if (string-match (concat "^" (regexp-quote (file-name-directory master-file)))
+ fname)
+ (substring fname (match-end 0))
+ fname))
+ ;;; buffer file name without path:
+ (file-name-nondirectory fname)))
+
+(defun xdvi-get-version-number (default)
+ "Return a tuple of (version-number xdvi-is-xdvik), or (DEFAULT nil) if DEFAULT != 0."
+ (if (not (= default 0))
+ (list default nil)
+ (save-window-excursion
+ (switch-to-buffer "*xdvi-version*")
+ (erase-buffer)
+ (call-process xdvi-bin nil "*xdvi-version*" nil "-version")
+ (goto-char (point-min))
+ (if (not (re-search-forward "xdvi\\((?k)?\\)? version \\([0-9]+\\)\\.\\([0-9]+\\)\\(\\.\\([0-9]+\\)\\)?" nil t))
+ (error "Unable to get xdvi version number - please check value of `xdvi-bin', or set it manually via `xdvi-version-number'")
+ (let* ((major (string-to-int (buffer-substring (match-beginning 2) (match-end 2))))
+ (minor (string-to-int (buffer-substring (match-beginning 3) (match-end 3))))
+ (patchlevel (if (match-beginning 5)
+ (string-to-int (buffer-substring (match-beginning 5) (match-end 5)))
+ 0))
+ (xdvi-is-xdvik (if (match-beginning 1) t nil))
+ (version (+ (* 1000 minor) (* 1000000 major) patchlevel)))
+ (kill-buffer "*xdvi-version*")
+;;; (message "Xdvi%s version: major %d, minor %d, version %d" (if xdvi-is-xdvik "k" "") major minor version)
+ (list version xdvi-is-xdvik)
+ )))))
+
+(defun xdvi-process-sentinel (process signal)
+ "Return a readable error message for subprocess PROCESS which has terminated with SIGNAL."
+ (let ((retmsg (substring signal 0 -1)))
+ (if (string-match "abnormally" retmsg)
+ (progn
+ (message "XDvi: %s" retmsg)
+ (pop-to-buffer (process-buffer process)))
+ (message "XDvi: %s" retmsg))))
+
+(defun xdvi-get-masterfile (file)
+ "Small helper function for AucTeX compatibility.
+Converts the special value t that TeX-master might be set to (Argument FILE)
+into a real file name."
+ (if (eq file t)
+ (buffer-file-name)
+ file))
+
+
+(defun xdvi-master-file-name ()
+ "Emulate AucTeX's TeX-master-file function.
+Partly copied from tex.el's TeX-master-file and TeX-add-local-master."
+ (if (boundp 'TeX-master)
+ TeX-master
+ (let ((master-file (read-file-name "Master file (default this file): ")))
+ (if (y-or-n-p "Save info as local variable? ")
+ (progn
+ (goto-char (point-max))
+ (if (re-search-backward "^\\([^\n]+\\)Local Variables:" nil t)
+ (let* ((prefix (if (match-beginning 1)
+ (buffer-substring (match-beginning 1) (match-end 1))
+ ""))
+ (start (point)))
+ (re-search-forward (regexp-quote (concat prefix "End:")) nil t)
+ (if (re-search-backward (regexp-quote (concat prefix "TeX-master")) start t)
+ ;;; if TeX-master line exists already, replace it
+ (progn
+ (beginning-of-line 1)
+ (kill-line 1))
+ (beginning-of-line 1))
+ (insert prefix "TeX-master: " (prin1-to-string master-file) "\n"))
+ (insert "\n%%% Local Variables: "
+;;; mode is of little use without AucTeX ...
+;;; "\n%%% mode: " (substring (symbol-name major-mode) 0 -5)
+ "\n%%% TeX-master: " (prin1-to-string master-file)
+ "\n%%% End: \n"))
+ (save-buffer)
+ (message "(local variables written.)"))
+ (message "(nothing written.)"))
+ (set (make-local-variable 'TeX-master) master-file))))
+
+
+(provide 'xdvi-search)
+
+;;; page break to avoid "Local variables entry is missing the prefix" error for previous stuff
+
+
+;;; xdvi-search.el ends here
diff --git a/Build/source/texk/xdvik/xdvi-sh.in b/Build/source/texk/xdvik/xdvi-sh.in
new file mode 100644
index 00000000000..f9a2d8299fa
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi-sh.in
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# This is the xdvi wrapper script for teTeX, version 0.2.
+# Copyright Thomas Esser, 1998. Permission to distribute under the terms
+# of the GNU general public license version 2 or later.
+
+# This script sets some environment variables to make sure that xdvi's
+# resource file in $XDVIINPUTS/xdvi is read by xdvi.bin.
+
+test -f /bin/sh5 && test -z "$RUNNING_SH5" \
+ && test x"`(uname -s) 2>&1`" = xULTRIX \
+ && { RUNNING_SH5=true; export RUNNING_SH5; exec /bin/sh5 $0 ${1+"$@"}; }
+RUNNING_SH5=
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && test x"`(uname -s) 2>&1`" = xAIX \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+RUNNING_BSH=
+
+# -help and -version only used to work if they were the only options,
+# so the "-name xdvi" parameter wasn't used in that case. With current
+# xdvik, it should work in any case, but we keep this logic for compatibility
+# with older xdvik and plain xdvi versions.
+have_basename=`basename foo/bar 2>&1 | grep -i 'not found'`
+if [ "$have_basename"xxx = "xxx" ]; then
+ BASE_NAME=`basename $0`
+else
+ BASE_NAME=`echo $0 | sed 's!.*/!!'`
+fi
+
+case "$#:$1" in
+ 1:-help|1:-version)
+ NAMEOPT=;;
+ *)
+ NAMEOPT="-name $BASE_NAME";;
+esac
+
+xdviappfile=`kpsewhich -progname=xdvi --format='other text files' XDvi`
+if test -n "$xdviappfile"; then
+ xdviappdir=`dirname "$xdviappfile"`
+ xdviapppath="${xdviappdir}/%l_%t/%N:${xdviappdir}/%N"
+
+ # For R3, we have to set XAPPLRESDIR.
+ ### SU: removed, xdvik won't work with R3 anyway, and XAPPLRESDIR is
+ ### for user customizations in current X
+ ### XAPPLRESDIR="$xdviappdir"; export XAPPLRESDIR
+
+ # For R4 or later, we have to set XFILESEARCHPATH, since XAPPLRESDIR might
+ # be ignored (if XUSERFILESEARCHPATH is set)
+ XFILESEARCHPATH="$xdviapppath:${XFILESEARCHPATH-%D}"; export XFILESEARCHPATH
+fi
+
+exec @final_exec_name@ $NAMEOPT ${1+"$@"}
diff --git a/Build/source/texk/xdvik/xdvi.1.in b/Build/source/texk/xdvik/xdvi.1.in
new file mode 100644
index 00000000000..d7da80723c8
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi.1.in
@@ -0,0 +1,4370 @@
+.\" Copyright 1990-2019 Paul Vojta and others
+.\"
+.\" This is Paul's license, included here only for reference, it does not apply
+.\" to all parts of the k version.
+.\" ----
+.\" Permission is hereby granted, free of charge, to any person obtaining a copy
+.\" of this software and associated documentation files (the "Software"), to
+.\" deal in the Software without restriction, including without limitation the
+.\" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+.\" sell copies of the Software, and to permit persons to whom the Software is
+.\" furnished to do so, subject to the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included in
+.\" all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+.\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+.\" PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM,
+.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+.\" DEALINGS IN THE SOFTWARE.
+.\" ----
+.\" This is the xdvik license:
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" following is UGLY ... use La\*(Te\& instead:
+.\" .if t .ds La L\\h'-0.1667m'\\v'-0.20v'A\\v'0.20v'\\h'-0.1667m'T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
+.\" .if n .ds La LaTeX
+.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
+.if n .ds Te TeX
+.\" # small and boldface (not all -man's provide it)
+.de SB
+\&\fB\s-1\&\\$1 \\$2\s0\fR
+..
+.TH XDVI 1 "@XDVI_DATE@" "Xdvik @XDVI_VERSION@"
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH NAME
+xdvi \- DVI Previewer for the X Window System
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SYNOPSIS
+.B xdvi
+.nh
+[\fB+\fP[\fIpage\fP]]
+[\fB\--help\fP]
+#ifps
+[\fB\-allowshell\fP]
+#endif
+[\fB\-altfont\fP \fIfont\fP]
+[\fB\-anchorposition\fP \fIanchor\fP]
+[\fB\-bg\fP \fIcolor\fP]
+[\fB\-browser\fP \fIWWWbrowser\fP]
+[\fB\-copy\fP]
+[\fB\-cr\fP \fIcolor\fP]
+[\fB\-debug\fP \fIbitmask\fP|\fIstring[,string ...]\fP]
+[\fB\-display\fP \fIhost:display\fP]
+[\fB\-dvipspath\fP \fIpath\fP]
+[\fB\-editor\fP \fIcommand\fP]
+[\fB\-expert\fP]
+[\fB\-expertmode\fP \fIflag\fP]
+[\fB\-fg\fP \fIcolor\fP]
+[\fB\-findstring\fP \fIstring\fP]
+[\fB\-font\fP \fIfont\fP]
+[\fB\-fullscreen \fP]
+#ifgrey
+[\fB\-gamma\fP \fIg\fP]
+#endif
+[\fB\-geometry\fP \fIgeometry\fP]
+#ifghost
+[\fB\-gsalpha\fP]
+#endif
+#ifghost
+[\fB\-gspalette\fP \fIpalette\fP]
+#endif
+[\fB\-h\fP]
+[\fB\-help\fP]
+[\fB\-hl\fP \fIcolor\fP]
+[\fB\-hush\fP]
+[\fB\-hushbell\fP]
+[\fB\-hushchars\fP]
+[\fB\-hushchecksums\fP]
+[\fB\-hushstdout\fP]
+[\fB\-icongeometry\fP \fIgeometry\fP]
+[\fB\-iconic\fP]
+#ifgrey
+[\fB\-install\fP]
+#endif
+#ifghost
+[\fB\-interpreter\fP \fIpath\fP]
+#endif
+[\fB\-keep\fP]
+[\fB\-l\fP]
+[\fB\-license\fP]
+[\fB\-linkcolor\fP \fIcolor\fP]
+[\fB\-linkstyle\fP \fI0|1|2|3\fP]
+[\fB\-margins\fP \fIdimen\fP]
+#ifkpathsea
+[\fB\-mfmode\fP \fImode-def\fP[\fB:\fP\fIdpi\fP]]
+#endif
+#ifnokpathsea
+[\fB\-mfmode\fP \fImode-def\fP]
+#endif
+[\fB\-mgs\fP[\fIn\fP] \fIsize\fP]
+[\fB\-mousemode\fP \fI0|1|2\fP]
+#ifcolor
+[\fB\-nocolor\fP]
+#endif
+#ifdps
+[\fB\-nodps\fP]
+#endif
+[\fB\-nofork\fP]
+#ifghost
+[\fB\-noghostscript\fP]
+#endif
+#ifgrey
+[\fB\-nogrey\fP]
+#endif
+#ifghost
+[\fB\-nogssafer\fP]
+#endif
+#ifgrey
+[\fB\-noinstall\fP]
+#endif
+#ifmakepk
+[\fB\-nomakepk\fP]
+#endif
+[\fB\-nomatchinverted\fP]
+#ifnews
+[\fB\-nonews\fP]
+#endif
+[\fB\-noomega\fP]
+[\fB\-noscan\fP]
+[\fB\-notempfile\fP]
+#ift1
+[\fB\-notype1fonts\fP]
+#endif
+#ifxi21
+[\fB\-noxi2scrolling\fP]
+#endif
+[\fB\-offsets\fP \fIdimen\fP]
+[\fB\-p\fP \fIpixels\fP]
+[\fB\-paper\fP \fIpapertype\fP]
+[\fB\-pause\fP]
+[\fB\-pausespecial\fP \fIspecial-string\fP]
+#ifps
+[\fB\-postscript\fP \fIflag\fP]
+#endif
+[\fB\-rulecolor\fP \fIcolor\fP]
+[\fB\-rv\fP]
+[\fB\-S\fP \fIdensity\fP]
+[\fB\-s\fP \fIshrink\fP]
+[\fB\-safer\fP]
+[\fB\-sidemargin\fP \fIdimen\fP]
+[\fB\-sourceposition\fP \fIline\fP[\fB:\fP\fIcol\fP][\ ]\fIfilename\fP]
+[\fB\-statusline\fP]
+[\fB\-text-encoding\fP \fIencoding\fP]
+[\fB\-thorough\fP]
+[\fB\-topmargin\fP \fIdimen\fP]
+[\fB\-unique\fP]
+[\fB\-version\fP]
+[\fB\-visitedlinkcolor\fP \fIcolor\fP]
+[\fB\-warnspecials\fP]
+[\fB\-watchfile\fP \fIsecs\fP]
+[\fB\-wheelunit\fP \fIpixels\fP]
+[\fB\-xoffset\fP \fIdimen\fP]
+[\fB\-yoffset\fP \fIdimen\fP]
+[\fIdvi_file\fP]
+.hy
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH DESCRIPTION
+.B Xdvi
+is a program for previewing
+.I dvi
+files, as produced e.g. by the
+.BR tex (1)
+program, under the X window system.
+.PP
+.B Xdvi
+can show the file shrunken by various
+integer factors, and it has a ``magnifying glass'' for viewing
+parts of the page enlarged (see the section MAGNIFIER below). This version
+of
+.B xdvi
+is also referred to as
+.B xdvik
+since it uses the kpathsea library to locate and generate font files.
+In addition to that, it supports the following features:
+.RS 2
+.TP 2
+-
+hyperlinks in DVI files (section HYPERLINKS),
+.TP
+-
+#ift1
+direct rendering of PostScript<tm> Type 1 fonts (section TYPE 1 FONTS),
+.TP
+-
+#endif
+source specials in the DVI file (section SOURCE SPECIALS),
+.TP
+-
+string search in DVI files (section STRING SEARCH),
+.TP
+-
+saving or printing (parts of) the DVI file (sections PRINT DIALOG and SAVE DIALOG).
+.RE
+.PP
+.B Xdvi
+can be compiled with the Motif toolkit or the Xaw (Athena) toolkit
+(and variants of it), and the Motif version has a slightly different GUI;
+these differences are noted below.
+.PP
+Before displaying a page of a DVI file,
+.B xdvi
+will check to see if the file has changed since the last time it was
+displayed. If this is the case, it will reload the file. This
+feature allows you to preview many versions of the same file while
+running
+.B xdvi
+only once. Since it cannot read partial DVI files,
+.B xdvik
+versions starting from 22.74.3 will create a temporary copy of the
+DVI file being viewed, to ensure that the file can be viewed without
+interruptions. (The
+.B \-notempfile
+can be used to turn off this feature).
+#ifps
+.PP
+.B Xdvi
+can show PostScript<tm> specials by any of three methods.
+It will try first to use Display PostScript<tm>, then NeWS, then it
+will try to use Ghostscript to render the images. All of these options
+depend on additional software to work properly; moreover, some of them
+may not be compiled into this copy of
+.BR xdvi .
+.PP
+For performance reasons,
+.B xdvi
+does not render PostScript specials in the magnifying glass.
+#endif
+.PP
+If no file name has been specified on the command line,
+xdvi will try to open the most recently opened file; if the file
+history (accessible via the
+.B File > Open Recent
+menu) is empty, or if none of the files in the history are valid DVI files,
+it will pop up a file selector for choosing a file name.
+(In previous versions, which didn't have a file history, the file selector
+was always used; you can set the X resource
+.B noFileArgUseHistory
+to
+.I false
+to get back the old behaviour.)
+.PP
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH OPTIONS
+In addition to specifying the
+.I dvi
+file (with or without the
+.B .dvi
+extension),
+.B xdvi
+supports the following command line options. If the option begins with a
+.RB ` + '
+instead of a
+.RB ` \- ',
+the option is restored to its default value. By default, these options can
+be set via the resource names given in parentheses in the description of
+each option.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI + page
+Specifies the first page to show. If
+.B +
+is given without a number, the last page is assumed; the first page is
+the default.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifps
+.TP
+.B \-allowshell
+.RB ( .allowShell )
+This option enables the shell escape in PostScript specials.
+(For security reasons, shell escapes are disabled by default.)
+This option should be rarely used; in particular it should not be used just
+to uncompress files: that function is done automatically if the file name
+ends in
+.BR .Z ,
+.BR .gz ,
+or
+.BR .bz2 .
+Shell escapes are always turned off if the
+.B \-safer
+option is used.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-altfont " font"
+.RB ( .altFont )
+Declares a default font to use when the font in the
+.I dvi
+file cannot be found. This is useful, for example, with PostScript <tm> fonts.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-anchorposition " anchor"
+Jump to
+.I anchor
+after opening the DVI file. This is only useful when invoking
+.B xdvi
+from other applications.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-background " color"
+.RB ( .background )
+Determines the color of the background. Same as
+.BR -bg .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-bg " color"
+.RB ( .background )
+Determines the color of the background.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-browser " browser"
+.RB ( .wwwBrowser )
+Defines the web browser used for handling external URLs. The value of this
+option or resource has the same syntax as the
+.B BROWSER
+environment variable; see the explanation of that variable in the
+section `ENVIRONMENT' below for a detailed description.
+If neither the option nor the X resource
+.I wwwBrowser
+is specified, the environment variables
+.B BROWSER
+and
+.B WWWBROWSER
+(in that order) are used to determine the browser command. If these are
+not set either, the following default value is used:
+\fBxdg-open %s:htmlview %s:firefox -remote -remote "openURL(%s,new-window)":mozilla -remote "openURL(%s,new-window)":netscape -raise -remote "openURL(%s,new-window)":xterm -e w3m %s:xterm -e lynx %s:xterm -e wget %s\fP
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.B \-copy
+.RB ( .copy )
+Always use the
+.I copy
+operation when writing characters to the display.
+This option may be necessary for correct operation on a color display, but
+overstrike characters will be incorrect.
+If greyscale anti-aliasing is in use, the
+.B \-copy
+operation will disable the use of colorplanes and make overstrikes come
+out incorrectly.
+#endif
+See also
+.BR \-thorough .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-cr " color"
+.RB ( .cursorColor )
+Determines the color of the mouse cursor. The default is the same as
+the foreground color.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-debug " bitmask|string[,string ...]"
+.RB ( .debugLevel )
+If nonzero, prints additional information on standard output. The
+argument can be either a bitmask specified as a decimal number, or
+comma-separated list of strings.
+.br
+For the bitmask representation, multiple values can
+be specified by adding the numbers that represent the individual bits;
+e.g. to debug all file searching and opening commands, use 4032
+(= 2048 + 1024 + 512 + 256 + 128 + 64). Use -1 to turn on debugging
+of everything (this will produce huge output).
+.br
+For the string representation, use the strings listed in the following
+table, with a comma to separate the values; e.g. to debug
+all file searching and opening commands, use
+.BR search,expand,paths,hash,stat,open .
+(The option `kpathsea' is provided as a shorthand for these.)
+Note that such a list may need to be quoted to prevent the shell
+from interpreting commas or spaces in the list.
+.br
+The individual numbers and strings have the following meanings:
+.nf
+.sp 1n
+.ta 1L +8L +12L
+ 1 bitmap Bitmap creation
+ 2 dvi DVI translation
+ 4 pk PK fonts
+ 8 batch Batch mode: Exit after
+ reading the DVI file
+ 16 event Event handling
+ 32 ps PostScript interpreter calls
+ 64 stat Kpathsea stat(2) calls
+ 128 hash Kpathsea hash table lookups
+ 256 open Kpathsea file opening
+ 512 paths Kpathsea path definitions
+ 1024 expand Kpathsea path expansion
+ 2048 search Kpathsea searching
+ 4032 kpathsea All Kpathsea options
+ 4096 htex Hypertex specials
+ 8192 src Source specials
+ 16384 client Client/server mode (see -unique
+ and -sourceposition options)
+ 32768 ft FreeType library messages (Type 1 fonts)
+ 65536 ft_verbose Verbose FreeType library messages (currently unused)
+ 131072 gui GUI elements
+.sp 1n
+.fi
+Some of the Kpathsea debugging options are actually provided by Kpathsea;
+see the Debugging section in the Kpathsea manual for more information on
+these.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-density " density"
+.RB ( .densityPercent )
+Determines the density used when shrinking bitmaps for fonts.
+A higher value produces a lighter font. The default value is 40.
+#ifgrey
+If greyscaling is in use, this argument does not apply; use
+.B \-gamma
+instead.
+#endif
+See also the
+.RB ` S '
+keystroke.
+Same as
+.BR \-S .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-display " host" : display
+Specifies the host and screen to be used for displaying the
+.I dvi
+file. By default this is obtained from the environment variable
+.SB DISPLAY.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-dvipspath " path"
+.RB ( .dvipsPath )
+Use
+.I path
+as the
+.B dvips
+program to use when printing. The default for this is
+.BR dvips .
+The program or script should read the DVI file from standard input,
+and write the PostScript file to standard output.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-editor " editor"
+.RB ( .editor )
+Specifies the editor that will be invoked when the
+.I source-special()
+action is triggered to start a reverse search (by default via Ctrl-Mouse 1).
+The argument to this option is a format string in which occurrences of
+.RB `` %f ''
+are replaced by the file name, occurrences of
+.RB `` %l ''
+are replaced by the line number within the file, and optional
+occurrences of
+.RB `` %c ''
+are replaced by the column number within the line.
+.sp
+If neither the option nor the X resource
+.I .editor
+is specified, the following environment variables are checked
+to determine the editor command:
+.BR XEDITOR ,
+.BR VISUAL ,
+and
+.B EDITOR
+(in this sequence). If the string is found as the value
+of the
+.SB VISUAL
+or
+.SB EDITOR
+environment variables, then
+.RI `` "xterm -e "''
+is prepended to the string; if the editor is specified by other means, then
+it must be in the form of a shell command to pop up an X window with an
+editor in it. If none of these variables is set, a warning message is displayed
+and the command
+.RI `` "xterm -e vi +%l %f"''
+is used.
+.sp
+If no
+.RB `` %f ''
+or
+.RB `` %l ''
+occurs in the string, the missing format strings are appended automatically.
+(This is for compatibility with other programs when using one of the environment
+variables).
+.sp
+A new instance of the editor is started each time this command is used;
+therefore it is preferable to use an editor that can be invoked in
+`client' mode to load new files into the same instance. Example
+settings are:
+.RS 7
+.TP 7
+.SB emacsclient --no-wait
+(older Emacsen)
+.TP
+.SB gnuclient -q
+(XEmacs and newer Emacsen)
+.TP
+.SB gvim --servername xdvi --remote
+(VIM v6.0+; the `--servername xdvi' option will cause gvim to run a
+dedicated instance for the files opened by xdvi.)
+.TP
+.SB nc
+(nedit)
+.PP
+.sp
+Note that those strings need to be enclosed
+into quotes when using them on the command-line
+to protect them from the shell; when using them
+as argument for the
+.I .editor
+resource in an X resource file, no quotes should be used.
+.sp
+.B NOTE ON SECURITY:
+The argument of this option isn't executed as a shell command,
+but via
+.I exec()
+to prevent evil tricks with the contents of source specials.
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-expert
+This option is only supported for backwards compatibility;
+it is equivalent to
+.BR "\-expertmode 0" ,
+which should be preferred.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-expertmode " flag"
+.RB ( .expertMode )
+With an argument of
+.IR 0 ,
+this option switches off the display of the buttons, scrollbars,
+the toolbar (Motif only),
+the statusline and the page list. These GUI elements
+can also be (de)activated separately, by combining the
+appropriate values in the
+.I flag
+argument. This acts similar to the
+.B \-debug
+option: The integer
+.I flag
+is treated as a bitmap where each bit represents one
+element. If the bit has the value
+.IR 1 ,
+the element is switched on, if it has the value
+.IR 0 ,
+the element is switched off. The meaning of the bits
+is as follows:
+.nf
+.sp 1n
+.ta 1L +8L +12L
+ 1 statusline
+ 2 scrollbars
+ 4 Motif: pagelist, Xaw: buttons and pagelist
+ 8 toolbar (Motif only)
+ 16 menubar (Motif only)
+.sp 1n
+.fi
+For example, to turn on only the statusline and the scrollbars,
+use 3 (= 1 + 2).
+See also the
+.RB ` x '
+keystroke, where the bits are addressed by their positions, from 1 to
+3 (Xaw) or 5 (Motif), respectively.
+.PP
+If the statusline is not active, all messages
+that would normally be printed to the statusline will be printed to
+.IR stdout ,
+unless the
+.B \-hushstdout
+option is used.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-fg " color"
+.RB ( .foreground )
+Determines the color of the text (foreground).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-findstring\fP \fIstring\fP
+This option triggers a search for
+.I string
+in the DVI file mentioned on the command-line, similar to forward search
+(see the description of the
+.B sourceposition
+option):
+If there is already another
+instance of
+.B xdvi
+running on the displaying that DVI file, it will cause that instance
+to perform the search instead. The search starts at the top of the current
+page of the DVI file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-font " font"
+.RB ( *font )
+Sets the font used in menus, buttons etc., as described in the
+.I X(7x)
+man page. The font for child windows can be set separately,
+e.g.:
+.RS 7
+.nf
+.ft 3
+.sp 1n
+xdvi*statusline*font: \e
+ -*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*
+.sp 1n
+.ft
+.fi
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-foreground " color"
+Same as
+.BR -fg .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-fullscreen
+When this option is used, xdvi will (try to) run in fullscreen mode, with
+no window decorations.
+This option is not guaranteed to work with all windowmanagers/desktops;
+if you're experiencing problems with it, please use the
+.B \-geometry
+option instead, and a suitable window manager setting to remove
+the window decorations.
+When using this option for presentations, you might want
+to get rid of all the control widgets as well, using the
+.B -expertmode
+option. This option can also be toggled at runtime using the
+.B fullscreen
+action (by default bound to Ctrl-l).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.BI \-gamma " gamma"
+.RB ( .gamma )
+Controls the interpolation of colors in the greyscale anti-aliasing color
+palette. Default value is 1.0. For 0 <
+.I gamma
+< 1, the fonts will be lighter (more like the background), and for
+.I gamma
+> 1, the fonts will be darker (more like the foreground). Negative
+values behave the same way, but use a slightly different algorithm.
+For color and grayscale displays; for monochrome, see
+.BR \-density .
+See also the
+.RB ` S '
+keystroke.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-geometry " geometry"
+.RB ( .geometry )
+Specifies the initial geometry of the main window,
+as described in the
+.I X(7x)
+man page. The geometry of child windows can be set
+separately, e.g.:
+.br
+.I xdvi*helpwindow.geometry: 600x800
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-gsalpha
+.RB ( .gsAlpha )
+Causes
+.B Ghostscript
+to be called with the
+.B x11alpha
+driver instead of the
+.B x11
+driver. The
+.B x11alpha
+driver enables anti-aliasing in PostScript specials, for a nicer appearance.
+It is available on newer versions of
+.BR Ghostscript .
+This option can also be toggled with the
+.RB ` V '
+keystroke.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifghost
+.TP
+.BI \-gspalette " palette"
+.RB ( .palette )
+Specifies the palette to be used when using Ghostscript for rendering
+PostScript specials. Possible values are
+.BR Color ,
+.BR Greyscale ,
+and
+.BR Monochrome .
+The default is
+.BR Color .
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR \-h , " \-help" , " \--help"
+Prints a short help text with an overview of the command-line options
+to standard output.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-hl " color"
+.RB ( .highlight )
+Determines the color of the page border, of the ruler in `ruler mode',
+and of the highlighting markers in forward search and string search.
+The default is the foreground color.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-hush
+.RB ( .Hush )
+Causes
+.B xdvi
+to suppress all suppressible warnings.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-hushbell
+.RB ( .hushBell )
+Don't sound the X bell when an error occurs.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-hushchars
+.RB ( .hushLostChars )
+Causes
+.B xdvi
+to suppress warnings about references to characters which are not defined
+in the font.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-hushchecksums
+.RB ( .hushChecksums )
+Causes
+.B xdvi
+to suppress warnings about checksum mismatches between the
+.I dvi
+file and the font file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-hushstdout
+.RB ( .hushStdout )
+Suppresses printing of status messages to
+.IR stdout .
+Note that errors or warnings will still be printed to
+.I stderr
+even if this option is used.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-icongeometry " geometry"
+.RB ( .iconGeometry )
+Specifies the initial position for the icon.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-iconic
+.RB ( .iconic )
+Causes the
+.B xdvi
+window to start in the iconic state. The default is to start with the
+window open.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.B \-install
+.RB ( .install )
+If
+.B xdvi
+is running under a
+.B PseudoColor
+visual, then (by default) it will check for
+.B TrueColor
+visuals with more bits per pixel, and switch to such a visual if one exists.
+If no such visual exists, it will use the current visual and colormap. If
+.B \-install
+is selected, however, it will still use a
+.B TrueColor
+visual with a greater depth, if one is available; otherwise, it will
+install its own colormap on the current visual. If the current visual is not
+.BR PseudoColor ,
+then
+.B xdvi
+will not switch the visual or colormap, regardless of its options.
+The default value of the
+.B install
+resource is the special value,
+.BR maybe .
+There is no
+.B +install
+option. See also
+.BR \-noinstall ,
+and the GREYSCALING AND COLORMAPS section.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifghost
+.TP
+.BI \-interpreter " filename"
+.RB ( .interpreter )
+Use
+.I filename
+as the Ghostscript interpreter. By default it uses
+.BR @GS_PATH@ .
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-keep
+.RB ( .keepPosition )
+Sets a flag to indicate that
+.B xdvi
+should not move to the home position when moving to a new page. See also the
+.RB ` k '
+keystroke. This flag is honored by all page switching actions and by
+.B up-or-previous() /
+.BR down-or-next() ,
+although the latter only honor the horizontal position, not the vertical one.
+This allows for a "continuous" scrolling back an forth through a document with
+a display window narrower than a page width.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-l
+.RB ( .listFonts )
+List the names of all fonts used.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-license
+Prints licensing information.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-linkcolor
+.RB ( .linkColor )
+Color used for unvisited hyperlinks (`Blue2' by default). Hyperlinks
+are unvisited before you click on them, or after the DVI file has been reloaded.
+The value should be either a valid X color name (such as
+.IR DarkGoldenrod4 )
+or a hexadecimal color string (such as
+.IR #8b6508 ).
+See also
+.B \-visitedlinkcolor
+and
+.BR \-linkstyle .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-linkstyle
+.RB ( .LinkStyle )
+Determines the style in which hyperlinks are displayed. Possible
+values and their meanings are:
+.nf
+.sp 1n
+.ta 1L +8L
+ 0 No highlighting of links
+ 1 Underline links with \fIlink color\fR
+ 2 No underlining, color text with \fIlink color\fR
+ 3 Underline and display text colored with
+ \fIlink color\fR
+.sp 1n
+.fi
+The values for \fIlink color\fR are specified by the options/resources
+.B \-linkcolor
+and
+.B \-visitedlinkcolor
+(which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-margins " dimen"
+.RB ( .Margin )
+Specifies the size of both the top margin and side margin.
+This determines the ``home'' position of the page within the window as
+follows. If the entire page fits in the window, then the margin settings
+are ignored. If, even after removing the margins from the left, right,
+top, and bottom, the page still cannot fit in the window, then the page
+is put in the window such that the top and left margins are hidden, and
+presumably the upper left-hand corner of the text on the page will be
+in the upper left-hand corner of the window.
+Otherwise, the text is centered in the window.
+The dimension should be a decimal number optionally followed by
+any of the two-letter abbreviations for units accepted by \*(Te\&
+.RB ( pt ,
+.BR pc ,
+.BR in ,
+.BR bp ,
+.BR cm ,
+.BR mm ,
+.BR dd ,
+.BR cc ,
+or
+.BR sp ).
+By default, the unit will be
+.BR @DEFAULT_UNIT@.
+See also
+.BR \-sidemargin ", " \-topmargin ,
+and the keystroke
+.RB ` M .'
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifkpathsea
+.TP
+.BI \-mfmode " mode-def"
+#endif
+#ifnokpathsea
+.BI \-mfmode " mode-def\fR[\fP\fB:\fPdpi\fR]\fP"
+#endif
+.RB ( .mfMode )
+Specifies a
+.I mode-def
+string, which can be used in searching for fonts (see ENVIRONMENT, below).
+Generally, when changing the
+.IR mode-def ,
+it is also necessary to change the font size to the appropriate value
+for that mode. This is done by adding a colon and the value in dots per inch;
+for example,
+.BR "\-mfmode ljfour:600" .
+This method overrides any value given by the
+.B pixelsPerInch
+resource or the
+.B \-p
+command-line argument.
+#ifmakepk
+The metafont mode is also passed to
+.B metafont
+during automatic creation of fonts.
+#endif
+By default, it is
+.BR "@MFMODE@" .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-mgs " size"
+Same as
+.BR \-mgs1 .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-mgs[ n ] " size"
+.RB ( .magnifierSize\fR[\fIn\fR] )
+Specifies the size of the window to be used for the ``magnifying glass''
+for Button
+.IR n .
+The size may be given as an integer (indicating that the magnifying glass
+is to be square), or it may be given in the form
+.IR width x height .
+See the MOUSE ACTIONS section. Defaults are 200x150, 400x250, 700x500,
+1000x800, and 1200x1200.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-mousemode " " [ 0 | 1 | 2 ]
+.RB ( .mouseMode )
+Specifies the default mode of xdvi at startup: Magnifier (0), Text Selection Mode (1)
+or Ruler Mode (2). See the section
+.BR MODES ,
+below, for more information.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifcolor
+.TP
+.B \-nocolor
+.RB ( .color )
+Turns off the use of color specials. This option can be toggled with the
+.RB ` C '
+keystroke.
+(Note:
+.B \-nocolor
+corresponds to
+.BR color:off ;
+.B +nocolor
+to
+.BR color:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifdps
+.TP
+.B \-nodps
+.RB ( .dps )
+Inhibits the use of Display PostScript<tm> for displaying PostScript<tm>
+specials. Other forms of PostScript emulation, if installed, will be used
+instead.
+(Note:
+.B \-nodps
+corresponds to
+.BR dps:off ;
+.B +nodps
+to
+.BR dps:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-nofork
+.RB ( .fork )
+With the
+.B \-sourceposition
+and
+.B \-unique
+options, the default behavior is for
+.B xdvi
+to put itself into the background (like a daemon) if there
+is no appropriate instance of
+.B xdvi
+already running.
+This argument makes it run in the foreground instead. This is useful
+for debugging, or if your client application cannot deal well with
+a program self-backgrounding itself in this way -- e.g. the IPC functions
+in
+.B emacs
+are known to have problems with this.
+If no
+.B \-sourceposition
+or
+.B \-unique
+argument is given, then this option has no effect.
+(Note:
+.B \-nofork
+corresponds to
+.BR fork:off ;
+.B +nofork
+to
+.BR fork:on .)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifghost
+.TP
+.B \-noghostscript
+.RB ( .ghostscript )
+Inhibits the use of Ghostscript for displaying PostScript<tm> specials.
+(Note:
+.B \-noghostscript
+corresponds to
+.BR ghostscript:off ;
+.B +noghostscript
+to
+.BR ghostscript:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.B \-nogrey
+.RB ( .grey )
+Turns off the use of greyscale anti-aliasing when printing shrunken bitmaps.
+(Note:
+.B \-nogrey
+corresponds to
+.BR grey:off ;
+.B +nogrey
+to
+.BR grey:on .)
+See also the
+.RB ` G '
+keystroke.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifghost
+.TP
+.B \-nogssafer
+.RB ( .gsSafer )
+Normally, if Ghostscript is used to render PostScript specials, the Ghostscript
+interpreter is run with the option
+.BR \-dSAFER .
+The
+.B \-nogssafer
+option runs Ghostscript without
+.BR \-dSAFER .
+The
+.B \-dSAFER
+option in Ghostscript disables PostScript operators such as
+.BR deletefile ,
+to prevent possibly malicious PostScript programs from having any effect.
+If the
+.B \-safer
+option is specified, then this option has no effect; in that case Ghostscript
+is always run with
+.BR \-dSAFER .
+(Note:
+.B \-nogssafer
+corresponds to
+.BR gsSafer:off ;
+.B +nogssafer
+to
+.BR gsSafer:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.B \-noinstall
+.RB ( .install )
+Inhibit the default behavior of switching to a
+.B TrueColor
+visual if one is available with more bits per pixel than the current visual.
+(Note:
+\-noinstall
+corresponds
+.BR install:off ;
+there is no
+.B +noinstall
+option.)
+See also
+.BR \-install ,
+and the GREYSCALING AND COLORMAPS section.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifmakepk
+.TP
+.B \-nomakepk
+.RB ( .makePk )
+Turns off automatic generation of font files that cannot be found by other
+means.
+(Note:
+.B \-nomakepk
+corresponds to
+.BR makePk:off ;
+.B +nomakepk
+to
+.BR makePK:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-nomatchinverted
+.RB ( .matchInverted )
+Don't highlight string search matches in inverted color; instead, draw a rectangle in
+.I highlight
+color (see the
+.B \-hl
+option) around the match. This option is activated automatically if
+the display isn't running in TrueColor.
+(Note:
+.B \-nomatchinverted
+corresponds to
+.BR matchInverted:off ;
+.B +nomatchinverted
+to
+.BR matchInverted:on .)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifnews
+.TP
+.B \-nonews
+.RB ( .news )
+Inhibits the use of NeWS<tm> for displaying PostScript<tm> specials.
+Ghostscript, if enabled by the installation, will be used instead.
+(Note:
+.B \-nonews
+corresponds to
+.BR news:off ;
+.B +nonews
+to
+.BR news:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-noomega
+.RB ( .omega )
+This will disable the use of Omega extensions when interpreting DVI files.
+By default, the additional opcodes
+.I 129
+and
+.I 134
+are recognized by xdvi as Omega extensions and interpreted as requests
+to set 2-byte characters. The only drawback is that the virtual font
+array will require 65536 positions instead of the default 256 positions,
+i.e. the memory requirements of xdvi will be slightly larger. If you find
+this unacceptable or encounter another problem with the Omega extensions,
+you can switch this extension off by using
+.B \-noomega
+(but please do send a bug report if you find such problems - see the bug
+address in the
+.B AUTHORS
+section below).
+.br
+(Note:
+.B \-noomega
+corresponds to
+.BR "omega: off" ;
+.B +noomega
+to
+.BR "omega: on" .)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-noscan
+.RB ( .prescan )
+By default,
+.B xdvi
+does a preliminary scan of the
+.I dvi
+file to process any
+.B papersize
+specials; this is especially important at startup since the paper size may be
+needed to determine the window size.
+#ifps
+If PostScript<tm> is in use, then prescanning is also necessary in order to
+properly process header files.
+#endif
+#ifcolor
+In addition, prescanning is needed to correctly determine the background color
+of a page.
+#endif
+This option turns off such prescanning.
+(Prescanning will be automatically be turned back on if
+.B xdvi
+detects any of the specials mentioned above.)
+(Note:
+.B \-noscan
+corresponds to
+.BR prescan:off ;
+.B +noscan
+to
+.BR prescan:on .)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-notempfile
+.RB ( .tempFile )
+As mentioned in the section
+.B DESCRIPTION
+above, xdvi will create a temporary copy of the DVI file so that it
+can be accessed without interruptions even while the file is being
+rewritten by
+.BR TeX .
+Since this introduces the overhead of copying the file every time
+it has changed, the
+.B \-notempfile
+allows you to turn off this behaviour. In this case, exposing parts of the
+window while the DVI file is being written by \*(Te\& will erase the current
+window contents until the DVI file can be completely reread.
+.br
+(Note:
+.B \-notempfile
+corresponds to
+.BR tempFile:off ;
+.B +notempfile
+to
+.BR tempFile:on .)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ift1
+.TP
+.B \-notype1fonts
+.RB ( .type1 )
+This will disable the use of the FreeType library to display PostScript<tm>
+Type 1 fonts.
+Use this option as a workaround when you encounter problems with the
+display of Type 1 fonts (but please don't forget to send a bug report in
+this case, to the URL mentioned in the section AUTHORS below).
+.br
+(Note:
+.B \-notype1fonts
+corresponds to
+.BR type1:off ;
+.B +notype1fonts
+to
+.BR type1:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifxi21
+.TP
+.B \-noxi2scrolling
+.RB ( .xi2Scrolling )
+This will disable the use of high-resolution scrolling using the XInput 2.1
+features of the X Server. When enabled, horizontal and vertical scrolling is
+done in smaller increments than would correspond to a single click of a
+mouse wheel. This is only available for hardware that supports the feature,
+generally touchpads. It is not available for traditional wheel mice.
+If suitable hardware is not present or if the X server does not support
+XInput 2.1 or higher, then the high-resolution scrolling feature
+is turned off and has no effect.
+.br
+(Note:
+.B \-noxi2scrolling
+corresponds to
+.BR xi2Scrolling:off ;
+.BR +noxi2scrolling ,
+to
+.BR xi2Scrolling:on .)
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-offsets " dimen"
+.RB ( .Offset )
+Specifies the size of both the horizontal and vertical offsets of the
+output on the page. By decree of the Stanford \*(Te\& Project,
+the default \*(Te\& page origin is always 1 inch over and down from
+the top-left page corner, even when non-American paper sizes are used.
+Therefore, the default offsets are 1.0 inch.
+The argument
+.I dimen
+should be a decimal number optionally followed by any of the two-letter
+abbreviations for units accepted by \*(Te\&
+.RB ( pt ,
+.BR pc ,
+.BR in ,
+.BR bp ,
+.BR cm ,
+.BR mm ,
+.BR dd ,
+.BR cc ,
+or
+.BR sp ).
+By default, the unit will be
+.BR @DEFAULT_UNIT@.
+See also
+.B \-xoffset
+and
+.BR \-yoffset .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-p " pixels"
+.RB ( .pixelsPerInch )
+Defines the size of the fonts to use, in pixels per inch. The
+default value is @BDPI@. This option is provided only for backwards
+compatibility; the preferred way is to set both the resolution
+and the Metafont mode via the
+.B \-mfmode
+option (which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-paper " papertype"
+.RB ( .paper )
+Specifies the size of the printed page. Note that in most cases it's
+best to specify the paper size in the TeX input file via the line
+.sp
+.B \eusepackage[dvips]{geometry}
+.sp
+which will be recognized by both dvips and xdvi; in that case the
+use of a `-paper' option should be unnecessary.
+.br
+The paper size may be specified in the form
+\fIwidth\fBx\fIheight\fR optionally followed by a unit, where
+.I width
+and
+.I height
+are decimal numbers giving the width and height of the paper, respectively,
+and the unit is any of the two-letter abbreviations for units accepted
+by \*(Te\&
+.RB ( pt ,
+.BR pc ,
+.BR in ,
+.BR bp ,
+.BR cm ,
+.BR mm ,
+.BR dd ,
+.BR cc ,
+or
+.BR sp ).
+By default, the unit is
+.BR @DEFAULT_UNIT@\fR.
+.br
+There are also synonyms which may be used:
+.B us
+(8.5x11in),
+.B legal
+(8.5x14in),
+.B foolscap
+(13.5x17in),
+as well as the ISO sizes
+.BR a1 - a7 ,
+.BR b1 - b7 ,
+.BR c1 - c7 .
+Each of these also has a landscape or `rotated' variant:
+.B usr
+(11x8.5in),
+.BR a1r - a7r ,
+etc. For compatibility with
+.BR dvips ,
+the formats
+.B letter
+(8.5x11in),
+.B ledger
+(17x11in)
+and
+.B tabloid
+(11x17in)
+are also supported (these don't have rotated variants).
+.br
+Any of the above sizes may be preceded by a plus sign
+.RB (` + ');
+this causes the paper size given here to override any paper size given in the
+.I dvi
+file. The default paper size is @DEFAULT_PAGE_SIZE@.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-pause
+.RB ( .pause )
+This option provides a simple implementation of incremental
+(stepwise) display, which can be used for presentations.
+When this option is used,
+.B xdvi
+will pause the display of the current page whenever it encounters a
+special
+.I special-string
+.RI ( xdvi:pause
+by default; the string can be customized via
+.IR \-pausespecial ,
+see below), and the cursor will change its shape. The action
+.B unpause-or-next()
+(by default bound to the
+.B Space
+key) will display the next portion of the page up to the following
+.IR special-string ,
+or until the end of the page is reached.
+When the option is not used, specials containing
+.I special-string
+will be ignored.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-pausespecial " special-string"
+.RB ( .pauseSpecial )
+Sets the special string that causes xdvi to pause when the
+.I -pause
+option is active. The default value of
+.I special-string
+is
+.IR xdvi:pause .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifps
+.TP
+.BI \-postscript " flag"
+.RB ( .postscript )
+If
+.I flag = 0,
+rendering of PostScript<tm> specials is disabled; instead, bounding
+boxes will be displayed (if available). A value of
+.I 1
+(the default) switches PostScript<tm> specials on. With a value of
+.IR 2 ,
+the PostScript<tm> specials are displayed along with their
+bounding boxes; this allows you to visually check the correctness
+of the bounding boxes. The values can also be toggled at runtime
+with the
+.RB ` v '
+keystroke and the corresponding numerical prefix arguments 0, 1 and 2.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-ps2pdfpath " path"
+.RB ( .ps2pdfPath )
+Use
+.I path
+as a conversion program from PostScript to PDF. The program or script
+should accept two command-line arguments: The PostScript file as first
+argument, and the PDF output file as second argument.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-rulecolor " color"
+.RB ( .ruleColor )
+Determines the color of the rules used for the magnifier
+(default: foreground color).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-q
+.RB ( .noInitFile )
+Ignore the
+.I $HOME/.xdvirc
+startup file (i.e. don't read it at startup, and don't write it
+at exit). This forces the defaults defined in
+.I $HOME/.Xdefaults
+to be used. See
+.B FILES
+for more information on
+.IR $HOME/.xdvirc .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-rv
+.RB ( .reverseVideo )
+Causes the page to be displayed with white characters on a black background,
+instead of vice versa.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-S " density"
+.RB ( .densityPercent )
+Same as
+.B \-density
+(which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-s " shrink"
+.RB ( .shrinkFactor )
+Defines the initial shrink factor. The default value is @SHRINK@. If
+.I shrink
+is given as 0, then the initial shrink factor is computed so that the
+page fits within the window (as if the `s' keystroke were given without
+a number).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-safer
+.RB ( .safer )
+This option turns on all available security options; it is designed for use when
+.B xdvi
+is called by a browser that obtains a
+.I dvi
+or \*(Te\& file from another site.
+#ifps
+This option selects
+#endif
+#ifghost
+.B +nogssafer
+and
+#endif
+#ifps
+.BR +allowshell .
+#endif
+#ifnops
+Otherwise, it has no effect, since
+.B xdvi
+has been compiled without support for PostScript specials.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-sidemargin " dimen"
+.RB ( .sideMargin )
+Specifies the side margin (see
+.BR \-margins ).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-sourceposition " line" [: col "][ ]" filename
+This option makes
+.B xdvi
+search in the
+.I dvi
+file for the place corresponding to the indicated line (and, optionally,
+column) in the .tex source file, and highlight the place found by drawing a
+rectangle in the
+.I highlight
+color (see the
+.B \-hl
+option) around the corresponding text. In addition, when run with this
+argument (and the
+.B \-nofork
+option is not given, which see),
+.B xdvi
+will always return immediately: if it finds another instance of
+.B xdvi
+already showing
+.I dvi_file,
+then it will cause that instance to raise its window and move to the given
+place in the
+.I dvi
+file; otherwise it will start up its own instance in the background.
+If several instances of xdvi are displaying the respective
+.I dvi
+file, the instance which was last raised to the foreground will be used.
+.sp
+The space before
+.I filename
+is only needed if the filename starts
+with a digit. When the space is used, the argument
+needs to be enclosed in quotes to prevent the shell from
+misinterpreting the space as argument separator.
+.sp
+This option requires that
+.I dvi_file
+be prepared with source special information. See the section on SOURCE SPECIALS
+for details on how to do this.
+.sp
+Here is a more detailed description of how the filename in the
+.I \-sourceposition
+argument is matched with the filename in the source specials:
+.RS 7
+.TP 3
+1.
+If neither of the filenames contains a path name component, the filenames
+are compared ignoring the
+.RI ` .tex '
+extensions in both filenames.
+.TP
+2.
+Otherwise, if one of the filenames does contain a path component (e.g.:
+.IR ./test.tex ,
+.IR ../test.tex ,
+.I /my/homedir/tex/test.tex
+or any combination of these), both filenames are expanded to a full path,
+with any occurrences of
+.I ../
+and
+.I ./
+expanded, and multiple slashes removed.
+.br
+The pathname in the
+.I \-sourceposition
+is expanded relative to the current working directory of the
+.I xdvi \-sourceposition
+invocation, and the pathnames in the source specials are expanded
+relative to the path of the current DVI file being viewed.
+.br
+The path names are then compared ignoring the
+.RI ` .tex '
+extensions in both path names.
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-statusline\fP
+.RB ( .statusline )
+This option is obsolete; use
+\fB\-expertmode \fP \fIflag\fP
+instead (which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-text-encoding " encoding"
+.RB ( .textEncoding )
+Use
+.I encoding
+as the text encoding of the string in the "Find" window. Usually, this
+should not be needed since the encoding is determined from the locale settings.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-thorough
+.RB ( .thorough )
+.B Xdvi
+will usually try to ensure that overstrike characters (e.g.\&
+.BR \enotin )
+are printed correctly. On monochrome displays, this is always possible
+with one logical operation, either
+.I and
+or
+.IR or .
+On color displays, however, this may take two operations, one to set the
+appropriate bits and one to clear other bits. If this is the case, then
+by default
+.B xdvi
+will instead use the
+.I copy
+operation, which does not handle overstriking correctly. The
+.B \-thorough
+option chooses the slower but more correct choice. See also
+.BR \-copy .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-topmargin " dimen"
+.RB ( .topMargin )
+Specifies the top and bottom margins (see
+.BR \-margins ).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-unique
+.RB ( .unique )
+This option will make another instance of xdvi running on the same display
+act as a `server'. For example, the invocation
+.sp
+.B xdvi -unique +5 file.dvi
+.sp
+will cause this other instance to load
+.I file.dvi
+on page 5 in place of the file that it is currently displaying. If there is
+already another instance of xdvi already displaying the file
+.IR file.dvi ,
+then it will just jump to page 5.
+If the other instance of xdvi is displaying a different file, it will load
+.I file.dvi
+instead. Otherwise, if no other instance of
+xdvi is currently running on the display, this option instead
+starts a new instance of xdvi in the background (unless the
+.I \-nofork
+option is specified, which see) displaying page 5 of
+.IR file.dvi .
+.br
+The filename and the
+.B +n
+option for the page number are the only options available for
+controlling a remote instance of xdvi like this; all other options are
+currently ignored.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-useTeXpages
+Use logical \*(Te\& pages (the values of the
+.I \ecount0
+register) instead of physical pages for the pagelist labels and
+when jumping to a page in a document with the `g' keystroke (or the
+.B goto-page()
+action).
+This option can be toggled via the
+.RB ` T '
+keystroke.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-version
+Print information on the version of
+.BR xdvi .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-visitedlinkcolor
+.RB ( .visitedLinkColor )
+Color used for visited hyperlinks (`Purple4' by default). Hyperlinks become
+visited once you click on them. As for
+.BR linkColor ,
+the value should be either a valid X color name or a hexadecimal color string.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B \-warnspecials
+.RB ( .warnSpecials )
+Causes
+.B xdvi
+to print warnings about
+.B \especial
+strings that it cannot process to stderr. These warnings are suppressed by default.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-watchfile " n"
+.RB ( .watchFile )
+If this option is set to a value larger than 0, xdvi will check
+the DVI file for changes every
+.I n
+seconds. If the DVI file has been completely written by TeX, it will
+be reloaded automatically. Fractional values (e.g. `2.5') are
+possible. The default for this option is 0, i.e. no watching.
+.br
+Since xdvi cannot handle partial DVI files, it tries not to reload
+the file while it is being rewritten. However, use of the magnifier
+or switching of pages requires reading (a part of) the DVI file, and
+if the
+.B tempfile
+option is switched off, this will erase the current contents of the window
+until the DVI file can be read entirely.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-wheelunit " pixels"
+.RB ( .wheelUnit )
+Sets the number of pixels that a motion of a wheel mouse will move the
+image up, down, left, or right. (See the
+.B wheel
+and
+.B hwheel
+actions, below, for more information on this.)
+If set to zero, the wheel mouse functionality is (essentially) disabled.
+The default value is 80.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-xoffset " dimen"
+.RB ( .xOffset )
+Specifies the size of the horizontal offset of the output on the page. See
+.BR \-offsets .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BI \-yoffset " dimen"
+.RB ( .yOffset )
+Specifies the size of the vertical offset of the output on the page. See
+.BR -offsets .
+.PP
+
+
+
+.SH KEYSTROKES
+.B Xdvi
+recognizes the following keystrokes when typed in its window.
+Each may optionally be preceded by a (positive or negative) number, a
+`prefix argument', whose interpretation will depend on the particular keystroke.
+This prefix argument can be discarded by pressing the ``Escape'' key.
+If present, the ``Help'', ``Prior'' and ``Next'' keys are synonyms for
+.RB ` ? ',
+.RB ` b ',
+and
+.RB ` f '
+keys, respectively.
+.PP
+The key bindings listed here are those that
+.B xdvi
+assigns by default. The names appearing in brackets at the beginning
+of the descriptions are the names of the actions associated with the
+keys; these can be used to customize the key bindings, as explained in
+more detail in the section
+.B CUSTOMIZATION
+below. If only a lowercase binding is listed, both upper- and lowercase
+keys will work for that binding.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"
+.\" SPECIAL KEYS
+.\"
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR ESC " key"
+.RB [ discard-number() ]
+The escape key discards the numerical prefix for all actions
+(useful when you mistyped a number).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR Return " key"
+.RB [ forward-page() ]
+Moves to the next page (or to the
+.IR n th
+next page if a number is given). Synonyms are
+.RB ` n ',
+.RB ` f '
+and Line Feed.
+.TP
+.BR Backspace " key"
+.RB [ back-page() ]
+Moves to the previous page (or back
+.I n
+pages). Synonyms are
+.RB ` p ',
+.RB ` b '
+and
+.BR Ctrl-h .
+.TP
+.BR Delete " key"
+.RB [ up-or-previous() ]
+Moves up two-thirds of a window-full, or to the top of the previous page
+if already at the top of the page. With a float argument, moves up the
+corresponding fraction of a window-full.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR Space " key"
+.RB [ unpause-or-next() ]
+Moves down two-thirds of a window-full, or to the next page if already at
+the bottom of the page.
+.br
+When the option
+.BI \-pause " special-string"
+is used and the display is currently paused, this key will instead
+display the next portion of the page until the next
+.I special-string
+or the end of the page is encountered. See the description of the
+.B \-pause
+option for details. The action
+.RB [ down-or-next() ]
+does a similar thing, but without pausing; it is not bound to a key
+by default.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR Ctrl-Home " (Xaw), " Ctrl-osfBeginLine " (Motif)"
+.RB [ goto-page(1) ]
+Moves to the first page of the document.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR Ctrl-End " (Xaw), " Ctrl-osfEndLine " (Motif)"
+.RB [ goto-page() ]
+Moves to the last page of the document.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR Home " (Xaw), " osfBeginLine " (Motif)"
+.RB [ home-or-top() ]
+Move to the ``home'' position of the page, or to the top of the page if
+the
+.I keep
+flag is set (in this case, the page doesn't scroll horizontally).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.BR End " (Xaw), " osfEndLine " (Motif)"
+.RB [ end-or-bottom() ]
+Move to the ``end'' position of the page (the lower right-hand corner),
+or to the bottom of the page if the
+.I keep
+flag is set (in this case, the page doesn't scroll horizontally).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"
+.\" ARROW KEYS
+.\"
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Down arrow
+.RB [ down(0.015) ]
+Scrolls page down.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Up arrow
+.RB [ up(0.015) ]
+Scrolls page up.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Right arrow
+.RB [ right(0.015) ]
+Scrolls page right.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Left arrow
+.RB [ left(0.015) ]
+Scrolls page left.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"
+.\" ORDINARY KEYS. Note that the special symbols ([ ] + - etc.) are not in
+.\" strict ASCII order (found that more intuitive). Sequence for each letter
+.\" is: Alt-Ctrl, Ctrl, uppercase, lowercase.
+.\"
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Alt-Ctrl-+
+.RB [ change-density(25) ]
+Increase the darkness of the fonts in the DVI window by adding to the gamma value
+(see also the
+.RB ` S '
+keystroke).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Alt-Ctrl--
+.RB [ change-density(-25) ]
+Decrease the darkness of the fonts in the DVI window by subtracting from the gamma value
+(see also the
+.RB ` S '
+keystroke).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-+
+.RB [ set-shrink-factor(+) ]
+Increase the shrink factor (see also the
+.RB ` s '
+keystroke).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl--
+.RB [ set-shrink-factor(-) ]
+Decrease the shrink factor (see also the
+.RB ` s '
+keystroke).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctr-[
+.RB [ pagehistory-delete-backward() ]
+Delete the current item in the page history and move to the history
+item before the deleted one. With a prefix argument
+.BR n ,
+delete
+.B n
+previous history items. See
+.B PAGE HISTORY
+for details.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B [
+.RB [ pagehistory-back() ]
+Move back in the page history (see
+.B PAGE HISTORY
+for details). With a prefix argument
+.BR n ,
+move back
+.B n
+history items.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctr-]
+.RB [ pagehistory-delete-forward() ]
+Delete the current item in the page history and move to the history
+item after the deleted one. With a prefix argument
+.BR n ,
+delete
+.B n
+next history items. See
+.B PAGE HISTORY
+for details.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B ]
+.RB [ pagehistory-forward() ]
+Move forward in the page history (see
+.B PAGE HISTORY
+for details). With a prefix argument
+.BR n ,
+move forward
+.B n
+history items.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B ^
+.RB [ home() ]
+Move to the ``home'' position of the page. This is normally the upper
+left-hand corner of the page, depending on the margins as described in the
+.B \-margins
+option, above.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B ?
+.RB [ help() ]
+Same as the
+.B h
+key (which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B B
+.RB [ htex-back() ]
+This key jumps back to the previous hyperlink anchor. See the
+section
+.B HYPERLINKS
+for more information on navigating the links.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B b
+.RB [ back-page() ]
+Moves to the previous page (or back
+.I n
+pages). Synonyms are
+.RB ` p ',
+.B Ctrl-h
+and
+.BR Backspace .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifcolor
+.TP
+.B C
+.RB [ set-color() ]
+This key toggles the use of color specials. The key sequences
+.RB ` 0C '
+and
+.RB ` 1C '
+turn interpretation of color specials off and on, respectively.
+See also the
+.B \-nocolor
+option.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B c
+.RB [ center() ]
+Moves the page so that the point currently beneath the mouse cursor is moved to
+the middle of the window, and warps the mouse cursor to the same place.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B D
+.RB [ toggle-grid-mode() ]
+This key toggles the use of a grid on the displayed page.
+If no number is given, the grid mode is switched on or off.
+By prepending a number from 1 to 3, 3 different grid levels can be set.
+The units of the grid are inches or centimeters, depending
+on whether the paper format is letter (in) or a4 (cm).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B d
+.RB [ down() ]
+Moves page down two thirds of a window-full. With a float argument to ``down'',
+moves down the corresponding fraction of a window-full.
+.\" Therefore, a more
+.\" ``smooth'' scrolling using the ``Up'' and ``Down'' keys can be
+.\" achieved by the following setting:
+.\" .sp
+.\" xdvi.mainTranslations: #override\e
+.\" .br
+.\" <Key>Up:up(0.01)\en\e
+.\" .br
+.\" <Key>Down:down(0.01)\en
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-f
+.RB [ find() ]
+Pop up a window to search for a string in the DVI file. See the section
+.BR "STRING SEARCH" ,
+below, for more details.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B f
+.RB [ forward-page() ]
+Moves to the next page (or to the
+.IR n th
+next page if a number is given). Synonyms are
+.RB ` n ',
+Return, and Line Feed.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifgrey
+.TP
+.B G
+.RB [ set-greyscaling() ]
+This key toggles the use of greyscale anti-aliasing for displaying shrunken
+bitmaps. In addition, the key sequences
+.RB ` 0G '
+and
+.RB ` 1G '
+clear and set this flag, respectively. See also the
+.B \-nogrey
+option.
+.sp
+If given a numeric argument that is not 0 or 1, greyscale anti-aliasing is
+turned on, and the gamma resource is set to the value divided by
+100. E.g.\&
+.RB ` 150G '
+turns on greyscale and sets gamma to 1.5.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-g
+.RB [ find-next() ]
+Find the next match string in the DVI file; this can be used instead
+of pressing the `Find' button in the search window.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B g
+.RB [ goto-page() ]
+Moves to the page with the given number. If no page number is given, xdvi jumps to the last page.
+.br
+If the option/resource
+.B useTeXpages
+is active, the numbers correspond to the actual page numbers in the TeX file;
+otherwise, absolute page numbers (starting from 1) are used. In the latter case,
+the page numbers can be changed with the
+.RB ` P '
+keystroke, below.
+Note that with the
+.B useTeXpages
+option it is possible that the same page number occurs multiple
+times; in such a case, xdvi will use the first page number that matches.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B h
+Pops up a help window with a short explanation of the most important key
+bindings and concepts.
+.\"
+.\" Ummh, surely nobody will use the following ...
+.\"
+.\" For I18n purposes, the help texts and menu entries are configurable
+.\" via the following X resources:
+.\" .BR helpGeneral ,
+.\" #ifhyper
+.\" .BR helpHypertex ,
+.\" #endif
+.\" .BR helpOthercommands ,
+.\" .BR helpMarking ,
+.\" .BR helpPagemotion ,
+.\" .BR helpMousebuttons ,
+.\" .BR helpRulermode ,
+.\" .BR helpSearch and
+.\" .BR helpSourcespecials .
+.\" The values of this resource should be a text string, the first line of
+.\" which should contain two fields separated by `\en'. The first field is
+.\" used as list entry for the list of help topics on the left of the help
+.\" window, and the second field is used as the heading on the right-hand side.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B k
+.RB [ set-keep-flag() ]
+Normally when
+.B xdvi
+switches pages, it moves to the home position as well. The
+.RB ` k '
+keystroke toggles a `keep-position' flag which, when set, will keep
+the same position when moving between pages. Also
+.RB ` 0k '
+and
+.RB ` 1k '
+clear and set this flag, respectively. See also the
+.B \-keep
+option.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-l
+.RB [ fullscreen(toggle) ]
+Toggles fullscreen mode (see the description of the
+.B \-fullscreen
+option for more information on this). This is even more flaky than
+using the command-line option: There is no universal standard
+how a window could change its own geometry or window decorations at
+run-time, so this will not work with most window managers or
+desktops. Generally, it's better to use the window manager controls to
+change the size or decorations of the xdvi window.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B l
+.RB [ left() ]
+Moves page left two thirds of a window-full.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B M
+.RB [ set-margins() ]
+Sets the margins so that the point currently under the mouse cursor defines
+the upper left-hand corner of the text in the page. Note that the command
+does
+.I not
+move the image, but only determines the margins
+for the page switching commands. For details on how the margins
+are used, see the
+.B \-margins
+option.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B m
+.RB [ toggle-mark() ]
+Toggles the mark for the current page in the page list. When a page
+is marked, it is displayed with a small star `*' next to the page number.
+The marked pages can then be printed or saved to a file.
+A page or several pages can also be marked by clicking or dragging
+.B Mouse-2
+in the page list.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-n
+.RB [ toggle-mark()forward-page() ]
+Toggles the mark for the current page in the page list, and moves to
+the next page. This lets you quickly mark a series of subsequent pages.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B n
+.RB [ forward-page() ]
+Moves to the next page (or to the
+.IR n th
+next page if a number is given). Synonyms are
+.RB ` f ',
+Return, and Line Feed.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-o
+.RB [ select-dvi-file() ]
+Read a new
+.I dvi
+file. A file-selection widget is popped up for you to choose the DVI
+file from. If a prefix argument
+.I n
+is given, the
+.I n th
+file from the file history is opened instead.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B P
+.RB [ declare-page-number() ]
+``This is page number
+.IR n .''
+This can be used to make the
+.RB ` g '
+keystroke refer to a different page number than the physical page.
+(If you want to use `logical' or \*(Te\& page numbers instead of physical pages,
+consider using the option
+.B \-useTeXpages
+instead.)
+The argument
+.I n
+should be given as prefix to this key.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-p
+.RB [ print() ]
+Opens a popup window for printing the DVI file, or parts of it.
+See the section
+.B PRINT DIALOG
+for an explanation of the options available, and the resources to customize
+the default behaviour.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B p
+.RB [ back-page() ]
+Moves to the previous page (or back
+.I n
+pages). Synonyms are
+.RB ` b ',
+.B Ctrl-h
+and
+.BR Backspace .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B q
+.RB [ quit() ]
+Quits the program.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-r
+.RB [ forward-page(0) ]
+Redisplays the current page.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B R
+.RB [ reread-dvi-file() ]
+Forces the
+.I dvi
+file to be reread. This allows you to preview many versions of the same
+file while running
+.B xdvi
+only once.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B r
+.RB [ right() ]
+Moves page right two thirds of a window-full.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-s
+.RB [ save() ]
+Opens a popup window for saving the DVI file, or parts of it. See the section
+SAVE DIALOG below for more information on this.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B S
+.RB [ set-density() ]
+Sets the density factor to be used when shrinking bitmaps. This should
+be a number between 0 and 100; higher numbers produce lighter characters.
+#ifgrey
+If greyscaling mode is in effect, this changes the value of gamma instead.
+The new value of gamma is the given number divided by 100; negative values
+are allowed.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B s
+.RB [ set-shrink-factor() ]
+Changes the shrink factor to the given number. If no number is given, the
+smallest factor that makes the entire page fit in the window will be used.
+(Margins are ignored in this computation.)
+.\" NOTE: following only works in action string, not interactively!!!
+.\" Two special values are
+.\" .B +
+.\" and
+.\" .B -
+.\" which zoom in and out respectively, by decrementing/incrementing the
+.\" shrinkfactor by one step.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B T
+.RB [ use-tex-pages() ]
+Use logical \*(Te\& pages (the values of the
+.I \ecount0
+register) instead of physical pages for the pagelist labels and
+when jumping to a page in a document via
+.BR goto-page() .
+See also the
+.B \-useTeXpages
+option.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B t
+.RB [ switch-magnifier-units() ]
+Switches the units used for the magnifier tick marks, and for reporting
+the distance between the mouse pointer and the ruler centre in
+ruler mode (see the section
+.BR MODES ).
+The default value is specified by the X resource
+.B tickUnits
+(`mm' by default). The units toggle through the following
+values; except for `px', they all correspond to \*(Te\&'s units:
+.I mm
+(millimeters)
+.I pt
+(\*(Te\& points),
+.I in
+(inches),
+.I sp
+(scaled points, the unit used internally by \*(Te\&)
+.I bp
+(big points or `PostScript points'),
+.I cc
+(cicero points),
+.I dd
+(didot points),
+.I pc
+(pica), and
+.I px
+(screen pixels).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-u
+.RB [ back-page()toggle-mark() ]
+Moves to the previous page, and toggles the mark for that page. This
+is the dual action to
+.BR Ctrl-n .
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B u
+.RB [ up() ]
+Moves page up two thirds of a window-full. With a float argument to ``up'',
+moves up the corresponding fraction of a window-full.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-v
+.RB [ show-source-specials() ]
+Show bounding boxes for every source special on the current page, and print
+the strings contained in these specials to stderr. With prefix 1,
+show every bounding box on the page. This is for debugging purposes mainly.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifghost
+.TP
+.B V
+.RB [ set-gs-alpha() ]
+This key toggles the anti-aliasing of PostScript<tm> specials when
+.B Ghostscript
+is used as renderer. In addition the key sequences
+.RB ` 0V '
+and
+.RB ` 1V '
+clear and set this flag, respectively. See also the
+.B \-gsalpha
+option.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifps
+.TP
+.B v
+.RB [ set-ps() ]
+This key toggles the rendering of PostScript<tm> specials between 3 states:
+.RS 7
+.TP 0
+.SB - specials (like EPS graphics) are displayed;
+.TP
+.SB - specials are displayed along with their bounding box (if available);
+.TP
+.SB - only the bounding box is displayed.
+.PP
+.sp
+The states can also be selected directly by using
+.RB ` 1v ',
+.RB ` 2v '
+and
+.RB ` 0v '
+respectively.
+See also the
+.B \-postscript
+option.
+.RE
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Ctrl-x
+.RB [ source-what-special() ]
+Display information about the source special next to the mouse cursor in the
+statusline. This is the same special that would be found by
+.IR source-special() ,
+but without invoking the editor. For debugging purposes.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B x
+.RB [ set-expert-mode() ]
+Toggles expert mode, in which
+the statusline, the scrollbars, the menu buttons, the toolbar (Motif only)
+and the page list are not shown.
+Typing
+.RB ` 1x '
+toggles the display of the statusline at the bottom of
+the window. Typing
+.RB ` 2x '
+toggles the scrollbars (if available). For Xaw,
+.RB ` 3x '
+toggles the menu buttons and the page list, for Motif,
+it toggles the page list. In Motif, the additional bindings
+.RB ` 4x '
+toggle the toolbar, and
+.RB ` 5x '
+the menu bar.
+.br
+Without a prefix argument, all of the mentioned GUI elements are either
+switched on (if they had been invisible before) or off.
+.br
+Toggling the scrollbars may behave erratically with the
+Xaw widgets; e.g. the scrollbars may reappear after
+resizing the window, and at certain window sizes one of the
+scrollbars may fail to disappear.
+.br
+See also the option
+.B \-expertmode
+(the numbers above correspond to the bits in the argument to
+.BR \-expertmode ).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH MOUSE ACTIONS IN THE MAIN WINDOW
+The mouse actions can be customized by setting the X resource
+.BR mouseTranslations .
+Since there are three different mouse modes (see the section
+.B MODES
+below), there is a special action
+.B mouse-modes
+which lists the actions for each of the three modes:
+\fBmouse-modes("ACTIONS-FOR-MODE1", "ACTIONS-FOR-MODE2", "ACTIONS-FOR-MODE3")\fR.
+If only one argument is specified, this action is used for all modes.
+The default bindings are as follows:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+xdvi.mouseTranslations: \e
+Shift<Btn1Down>:mouse-modes("drag(+)")\en\e
+Shift<Btn2Down>:mouse-modes("drag(|)")\en\e
+Shift<Btn3Down>:mouse-modes("drag(-)")\en\e
+Ctrl<Btn1Down>:mouse-modes("source-special()")\en\e
+<Btn1Down>: mouse-modes("do-href()magnifier(*2)", "text-selection()", "ruler()")\en\e
+<Btn2Down>: mouse-modes("do-href-newwindow()magnifier(*2)", "text-selection()", "ruler()")\en\e
+<Btn3Down>: mouse-modes("magnifier(*3)")\en\e
+<Btn4Down>: mouse-modes("wheel(-0.2)")\en\e
+<Btn5Down>: mouse-modes("wheel(0.2)")\en\e
+<Btn6Down>: mouse-modes("hwheel(-0.2)")\en\e
+<Btn7Down>: mouse-modes("hwheel(0.2)")\en\e
+.sp 1n
+.ft
+.fi
+.RE
+All of these actions are described in more detail below.
+Note the use of quote symbols around the action strings, which are necessary
+to group them into one argument.
+Buttons 4, 5, 6, and 7 refer to wheel movements (wheel up/down/left/right)
+on wheel mice. Not all mice support horizontal scrolling.
+.PP
+The X Toolkit routines that implement translations do not support event
+types of
+.B Btn6Down
+or
+.BR Btn7Down .
+Because of this,
+.B xdvi
+implements its own parser for translations given in
+.BR mouseTranslations .
+This parser is more limited than the parser built in to the X Toolkit.
+The string given in
+.B mouseTranslations
+should not begin with
+.RB `` #replace '',
+.RB `` #augment '',
+or
+.RB `` #override ''.
+Modifiers of the form
+.BI @ keysym
+are not supported, and the event type must be of the form
+.B BtnDown
+or
+.BI Btn n Down\fR,\fP
+where
+.I n
+is a positive integer without leading zeroes. Also, some limitations apply
+to the action field.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B do-href()
+.TP
+.B do-href-newwindow()
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+Usually, if a binding specifies more then one action, all actions
+are executed in a sequence. The hyperlink bindings
+.B do-href()
+and
+.B do-href-newwindow()
+are special in that they are used as an
+.I alternative
+to other actions that might follow them
+.I if
+the mouse is currently located on a hyperlink.
+In this case, none of the other actions will be executed;
+otherwise, only the other actions are executed.
+.br
+The action
+.B do-href()
+jumps to the link target in the current xdvi
+window (eventually switching to another page), and
+.B do-href-newwindow()
+opens a new instance of xdvi for the link target.
+In both cases, the location of the target is
+indicated by a small arrow drawn in the same color
+as a visited link
+in the left corner of the window.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B magnifier(n x m)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B magnifier(*n)
+This action will pop up a ``magnifying glass'' which shows the unshrunk
+image of the region around the mouse pointer. The magnifier disappears when
+the mouse button is released. Moving the mouse cursor while holding the button down will move the
+magnifier.
+.br
+Different mouse buttons produce different sized
+windows, as indicated by
+the argument of the
+.I magnifier()
+action. Its argument is either a string of the form
+.IR width x height ,
+as in the
+.BI \-mgs n
+command-line option, or one of the strings
+.B *1
+through
+.BR *5 ,
+referring to the value specified by the corresponding
+.BI \-mgs n
+option.
+.\" Note that in order to assign magnifier actions to
+.\" the buttons 4 or 5, you need to use the resource
+.\" .B wheelTranslations
+.\" (more about this resource below), e.g.:
+.\" .sp
+.\" xdvi.wheelTranslations: <Btn4Down>: magnifier(*4)\en\e
+.\" <Btn5Down>: magnifier(*5)\en
+.\" .sp
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B drag(+)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B drag(|)
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B drag(-)
+Drags the page with the mouse. This action should have one parameter, the character
+.RB `` | '',
+.RB `` - '',
+or
+.RB `` + '',
+indicating vertical dragging only, horizontal dragging only, or dragging in all
+directions.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B source-special()
+This action starts a ``reverse search'',
+opening the editor at the location in the \*(Te\& file corresponding
+to the pointer location in the DVI file.
+See the section on SOURCE SPECIALS, below, for more information on this.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B wheel()
+This action can be used to scroll the image with a wheel mouse, where it
+is usually bound to mouse button 4 (wheel up) or 5 (wheel down).
+The action takes one parameter, giving the distance to scroll the
+image. If the parameter contains a decimal point, the distance is
+given in wheel units; otherwise, pixels. A negative value scrolls up,
+a positive value scrolls down.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B hwheel()
+This action can be used to scroll the image horizontally with a wheel mouse,
+where it is usually bound to mouse button 6 (wheel left) or 7 (wheel right).
+The action takes one parameter, giving the distance to scroll the
+image. If the parameter contains a decimal point, the distance is
+given in wheel units; otherwise, pixels. A negative value scrolls left,
+a positive value scrolls right. Not all mice support horizontal scrolling;
+this is mostly for touchpads, trackpads, etc.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B text-selection()
+This action allows you to mark a rectangular region of text in the DVI file.
+The text is put into the X selection buffer and can be pasted into other
+applications (e.g. text editors). This works similar to the Plain text option
+in the
+.B Save
+dialog; see the discussion there for more information on encoding issues.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B ruler()
+This action creates a cross-shaped ruler. Moving the mouse and holding
+the button down drags the ruler and lets you measure distances on the page.
+See the section
+.B Ruler Mode
+for more information on this.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH UNBOUND ACTIONS
+The following actions are not bound to a key by default, but are available
+for customization.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B quit-confirm()
+Pops up a confirmation window to quit xdvi. To bind it to the
+.RB ` q '
+key instead of the default `quit()' action, put the following into your
+.I ~/.Xdefaults
+file:
+.sp
+xdvi.mainTranslations: #override\e
+.br
+<Key>q: quit-confirm()\en
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B down-or-next()
+Similar to
+.IR unpause-or-next() :
+Moves down two-thirds of a window-full, or to the next page if already
+at the bottom of the page.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B shrink-to-dpi()
+This action takes one (required) argument. It sets the shrink factor to
+an integer so as to approximate the use of fonts with the corresponding
+number of dots per inch. If
+.B xdvi
+is using fonts scaled for
+.I p
+dots per inch, and the argument to
+.B shrink-to-dpi
+is
+.IR n ,
+then the corresponding shrink factor is the ratio
+.IR p / n ,
+rounded to the nearest integer.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B user-exec()
+This action takes one (required) argument. Runs an external program
+specified by the argument, which is tokenized on whitespace. The
+.B XDVI_FILE
+environment variable is set to the absolute pathname of the DVI file,
+so that the program can find the DVI. As an example, to establish the
+key
+.RB ` m '
+as a keybinding that regenerates the DVI file with `make', put the
+following into your
+.I ~/.Xdefaults
+file:
+.sp
+xdvi.mainTranslations: #override\e
+.br
+<Key>m: user-exec(xdvi-remake)\en
+
+where `xdvi-remake' names a program in your
+.B PATH
+analogous to `cd $(dirname $XDVI_FILE) && make $(basename $XDVI_FILE)'.
+(See also the section
+.B SIGNALS
+for a way to get
+.B xdvi
+to reload the DVI file once it has been regenerated.)
+.PP
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH CUSTOMIZATION
+Key and mouse button assignments can be changed by setting the
+.B mainTranslations
+resource to a string of translations as defined in the documentation for the
+X toolkit. The actions should take the form of action names listed in the
+KEYSTROKES and MOUSE ACTIONS sections.
+.PP
+An exception to this are the Motif keys
+.IR osfPageUp " (" PgUp ),
+.IR osfPageDown " (" PgDown ),
+.IR osfBeginLine " (" Home )
+and
+.IR osfEndLine " (" End )
+which are currently not customizable in the Motif version.
+.PP
+Key actions will usually be without arguments; if they are passed an argument,
+it represents the optional number or `prefix argument' typed prior to the action.
+.PP
+Some key actions may take special arguments, as follows: The argument of
+.B goto-page
+may be the letter
+.RB ` e ',
+indicating the action of going to the end of the document.
+The argument of
+.B set-shrink-factor
+may be the letter
+.RB ` a ',
+indicating that the shrink factor should be set to the smallest value such that
+the page will fit in the window, or one of the signs
+.RB ` + '
+or
+.RB ` - ',
+indicating that the shrink factor should be increased or decreased, respectively.
+Finally, actions that would perform a toggle, such as
+.BR set-keep-flag ,
+may receive an argument
+.RB ` t ',
+indicating that the action should toggle regardless of the current prefix argument.
+.PP
+Mouse actions should refer only to
+.B ButtonPress
+events (e.g.\&
+.BR "<Btn1Down>:magnifier(*1)" ).
+The corresponding motion and release events will be handled internally.
+A key action may be bound to a mouse event, but not vice versa.
+.PP
+Usually the string of translations should begin with
+.RB `` #override '',
+indicating that the default key and mouse button assignments should not
+be discarded.
+.PP
+When keys or mouse buttons involving modifiers (such as Ctrl or Shift)
+are customized together with their non-modified equivalents, the modified
+keys should come first, for example:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+xdvi.mainTranslations: #override \e
+Shift<Key>s: select-dvi-file()\en\e
+Ctrl<Key>s: save()\en\e
+<Key>s: find()\en
+.sp 1n
+.ft
+.fi
+.RE
+.PP
+Because
+.B xdvi
+needs to capture pointer motion events, and because the X Toolkit
+translations mechanism cannot accommodate both motion events and double-click
+events at the same time, it is not possible to specify double-click
+actions in
+.B xdvi
+customizations. For information on this and other aspects of translations,
+see the X Toolkit Intrinsics documentation.
+.PP
+There is no command-line option to set the
+.B mainTranslations
+resource, since changing this resource on the command line would be cumbersome.
+To set the resource for testing purposes, use the
+.B -xrm
+command-line option provided by the X toolkit. For example,
+\fBxdvi \-xrm 'XDvi.mainTranslations: #override "z":quit()' ...\fR
+or
+.B "xdvi \-xrm 'XDvi.mainTranslations: #override <Key>z:quit()' ..."
+will cause the key
+.RB ` z '
+to quit
+.BR xdvi .
+.PP
+Some resources are provided to allow customization of the geometry of
+the Xaw command buttons. Again, they are not changeable via command-line
+options, other than via the
+.B \-xrm
+option. All of these resources take integer values.
+.TP
+.B buttonSideSpacing
+The number of pixels to be placed on either side of the buttons.
+The default value is 6.
+.TP
+.B buttonTopSpacing
+The number of pixels between the top button and the top of the window.
+The default value is 50.
+.TP
+.B buttonBetweenSpacing
+The number of pixels between the buttons.
+The default value is 20.
+.TP
+.B buttonBetweenExtra
+The number of pixels of additional space to be inserted if the
+.B buttonTranslations
+resource string contains an extra newline character.
+The default value is 50.
+.TP
+.B buttonBorderWidth
+The border width of the button windows. The default value is 1.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH PAGE LIST
+The scrollable page list on the right of the main window allows you to
+jump directly to a page in the DVI file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Mouse-1
+Jumps to the page the mouse is located on.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B Mouse-2
+.RB [ toggle-mark() ]
+Toggle the mark of the current page. The marks are used by the `Print'
+and `Save to file' dialogs to select only marked pages from the DVI file.
+.PP
+When the mouse pointer is inside the page list, the mouse wheel switches
+to the next or previous page.
+.PP
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SCROLLBARS
+The scrollbars (if present) behave in the standard way: pushing Button 2
+in a scrollbar moves the top or left edge of the scrollbar to that point
+and optionally drags it;
+pushing Button 1 moves the image up or right by an amount equal to the distance
+from the button press to the upper left-hand corner of the window; pushing
+Button 3 moves the image down or left by the same amount.
+.PP
+The scrollbars can be removed via the
+.I -expertmode
+flag/keystroke (which see).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH MAGNIFIER
+By default, the mouse buttons 1 to 5 will pop up a ``magnifying glass''
+that shows an unshrunken image of the page (i.e. an image at the resolution
+determined by the option/X resource
+.B pixels
+or
+.BR mfmode )
+at varying sizes. When the magnifier is moved, small ruler-like
+tick marks are displayed at the edges of the magnifier (unless
+the X resource
+.B delayRulers
+is set to false, in which case the tick marks will always be displayed).
+The unit of the marks is determined by the X resource
+.B tickUnits
+(mm by default). This unit can be changed at runtime via the action
+.BR switch-magnifier-units() ,
+by default bound to the keystroke
+.RB ` t '
+(see the description of that key, and of switch-magnifier-units() for
+more details on the units available).
+.br
+The length of the tick marks can be changed via the X resource
+.B tickLength
+(4 by default). A zero or negative value suppresses the tick marks.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH PAGE HISTORY
+.B Xdvi
+keeps a history of viewed pages, and you can move through the history
+and delete items using the keys
+.B [
+.RI ( pagehistory-back() ),
+.B ]
+.RI ( pagehistory-forward() ),
+.B Ctr-[
+.RI ( pagehistory-delete-backward() )
+and
+.B Ctr-]
+.RI ( pagehistory-delete-forward() ).
+.PP
+When one of the history commands is used, the page history is displayed
+in the status line at the bottom of the window, with the current list
+item marked by square brackets `[', `]' and a left and right context of
+at most 10 items. File boundaries are marked by `#'.
+.PP
+The size of the history can be customized with the X resource
+.B pageHistorySize
+(the default size is 1000 items). If the size is set to 0, the
+history commands are disabled.
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH HYPERLINKS
+The actions
+.B do-href()
+and
+.B do-href-newwindow()
+(by default bound to Mouse-1 and Mouse-2 if the pointer is currently located
+on a hyperlink) can be used to open the link target in the same window
+.RB ( do-href() )
+or in a new window
+.RB ( do-href-newwindow() ).
+.PP
+If the link target is not a file on the local disk,
+xdvi tries to launch a web browser (as specified by the
+.B -browser
+command line option, the
+.B BROWSER
+environment variable or the
+.B wwwBrowser
+X resource, in this order) to retrieve the document. See the description
+of the
+.B BROWSER
+environment variable, below, for an example setting.
+.PP
+If the file is a local file, xdvi tries to determine if it is a DVI
+file. If it is, xdvi will try to display the file; otherwise it will
+try to determine the MIME type of the file, and from that an
+application suitable for opening the file.
+This is done by parsing the files specified by the environment variable
+.B EXTENSIONMAPS
+for a mapping of filename extensions to MIME types,
+and the files determined by the environment variable
+.B MAILCAPS
+for a mapping of MIME types to application programs.
+See the descriptions of these variables in the section
+.BR ENVIRONMENT ,
+below, for a more detailed description and the default values of these
+variables. If no suitable files are found, a set of built-in default
+MIME types and applications is used.
+.PP
+.B Xdvi
+currently uses no heuristics apart from the filename suffix
+to determine the mime type of a file. If a filename has no suffix,
+the value of the resource
+.B noMimeSuffix
+is used (by default
+.IR application/x-unknown ).
+If the suffix doesn't match any of the suffixes in
+.BR mime.types ,
+the value of the resource
+.B unknownMimeSuffix
+is used (by default
+.IR application/x-unknown ).
+If the
+.B mailcap
+entries do not list a viewer for a given mime type, xdvi will show
+a warning popup. If you want to avoid this warning, and for example
+want to always use the netscape browser for unknown MIME types,
+you could add the following line to your ~/.mailcap file:
+.RS 4
+.nf
+.ft 3
+.sp 1n
+application/xdvi-unknown; \e
+ netscape -raise -remote 'openURL(%s,new-window)'
+.sp 1n
+.ft
+.fi
+.RE
+.\" As an example, consider the following settings, which are the default
+.\" settings for buttons 1 and 2:
+.\" .RS 5
+.\" .nf
+.\" .ft 3
+.\" .sp 1n
+.\" xdvi.mainTranslations: #override \e
+.\" <Btn1Down>: do-href()magnifier(*1)\en\e
+.\" <Btn2Down>: do-href-newwindow()magnifier(*2)\en\e
+.\" <Btn3Down>: magnifier(*3)\en
+.\" .sp 1n
+.\" .ft
+.\" .fi
+.\" .RE
+.\" .PP
+.\" If a link points to a file which is not a DVI file (e.g. HTML, or
+.\" PostScript), the files
+.\" .B mime.types
+.\" and
+.\" .B mailcap
+.\" are parsed to determine a suitable viewer; if no suitable
+.\" .B mailcap
+.\" entry was found, if the
+.\" .SB WWWBROWSER
+.\" environment variable is set, or
+.\" .B \-browser
+.\" was specified on the command line, the browser is launched to load the file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH STRING SEARCH
+The keystroke
+.I Ctrl-f
+or the menu entry
+.I File > Find ...
+(or the `Binoculars' symbol in the toolbar, for Motif)
+opens a dialog window to search for a text string or
+a regular expression in the DVI file.
+The keystroke
+.I Ctrl-g
+jumps to the next match (like pressing the `Find' button in the search window).
+.PP
+By default, the matches are highlighted in inverted color.
+If the display isn't running in TrueColor, or if the X resource
+.B matchHighlightInverted
+is set to false or the command-line option
+.B \-nomatchinverted
+is used, xdvi will instead draw a rectangle in
+.I highlight
+color (see the
+.B \-hl
+option) around the match.
+.PP
+If a match crosses a page boundary, only the part on the
+first page is highlighted.
+.B Xdvi
+will scan up to 2 adjacent pages to match strings crossing page
+boundaries; but note that header or footer
+lines, or intervening float pages will be treated as parts of the
+scanned text. Such text will usually cause multi-page matching to fail.
+.PP
+This emphasizes the fact that searching in the
+formatted text (the DVI output) works differently from
+searching in the source text: Searching in the DVI file makes it easier to
+skip formatting instructions, and makes it possible to search for e.g.\&
+hyphenation and equation numbers; but sometimes the
+formatting results can also get in the way, e.g. in the case of
+footnotes. In these cases it's better to search in the \*(Te\& source
+instead. The use of
+.I source specials
+will make switching between the
+xdvi display and the editor with the \*(Te\& source easier; see the
+section
+.B SOURCE SPECIALS
+below for more information on this.
+.PP
+The text extracted from the DVI file is in encoded in UTF-8
+(you can view that text by saving the file in UTF-8 format via the
+.I File > Save as ...
+menu item).
+If xdvi has been compiled with locale,
+.I nl_langinfo()
+and
+.I iconv
+support, the search term is converted from the character set
+specified by the current locale into UTF-8. (See the output of
+.B locale -a
+for a list of locale settings available on your system).
+If
+.I nl_langinfo()
+is not available, but
+.I iconv
+is, you can specify the input encoding for
+.I iconv
+via the X resource
+.I textEncoding
+(see the output of
+.B iconv -l
+for a list of valid encodings). If
+.I iconv
+support is not available, only the encodings
+.I ISO-8859-1
+and
+.I UTF-8
+are supported (these names are case-insensitive).
+.PP
+Ideographic characters from CJKV fonts are treated specially: All white space
+(spaces and newlines) before and after such characters is ignored in
+the search string and in the DVI file.
+.PP
+To match a newline character, use \fI\en\fR in the search string;
+to match the string \fI\en\fR, use \fI\e\en\fR.
+.PP
+If the checkbox
+.I Regular Expression
+is activated, the string is treated as a regular expression in
+extended POSIX syntax, with the following properties:
+.RS 2
+.TP 2
+-
+\fIa?\fR matches \fIa\fR zero or one times.
+.TP
+-
+\fIa*\fR matches \fIa\fR zero or more times.
+.TP
+-
+\fIa+\fR matches \fIa\fR one or more times.
+Note that \fI*\fR and \fI+\fR are greedy, i.e. they match the longest possible substring.
+.TP
+-
+The pattern \fI.\fR matches any character except for newline. To also match a newline, use `\fI(.|\en)\fR'.
+.TP
+-
+\fIa{n}\fR matches \fIa\fR exactly n times.
+.TP
+-
+\fIa{n,m}\fR matches \fIa\fR at least n and no more than m times.
+.TP
+-
+\fIa|b\fR matches \fIa\fR or \fIb\fR. Brackets can be used
+for grouping, e.g.: \fI(a|b)|c\fR.
+.TP
+-
+The string matched by the nth group can be referenced by \fI\en\fR, e.g. \fI\e1\fR refers to the
+first match.
+.TP
+-
+The characters \fI^\fR and \fI$\fR match the beginning and the end of a line, respectively.
+.TP
+-
+\fI[abc]\fR matches any of the letters a, b, c, and \fI[a-z]\fR matches all characters from a to z.
+.TP
+-
+Each item in a regular expression can also be one of the following POSIX
+character classes:
+.br
+.nf
+.I [[:alnum:]] [[:alpha:]] [[:blank:]] [[:cntrl:]] [[:digit:]]
+.I [[:graph:]] [[:lower:]] [[:print:]] [[:space:]] [[:upper:]]
+.fi
+
+
+These can be negated by inserting a \fI^\fR symbol after the first bracket:
+.I [^[:alpha:]]
+
+For more details on POSIX regular expressions, see e.g. the
+.B IEEE Std 1003.1
+standard definition available online from:
+
+.nf
+http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap09.html
+.fi
+.TP
+-
+As a non-standard extension, the following Perl-like abbreviations
+can be used instead of the POSIX classes:
+.nf
+.sp 1n
+.ta 1L +8L +30L
+Symbol Meaning POSIX Class
+
+ \fI\ew\fR an alphanumeric character \fI[[:alnum:]]\fR
+ \fI\eW\fR a non-alphanumeric character \fI[^[:alnum:]]\fR
+ \fI\ed\fR a digit character \fI[[:digit:]]\fR
+ \fI\eD\fR a non-digit character \fI[^[:digit:]]\fR
+ \fI\es\fR a whitespace character \fI[[:space:]]\fR
+ \fI\eS\fR a non-whitespace character \fI[^[:space:]]\fR
+.sp 1n
+.fi
+.TP
+-
+The following characters are special symbols; they need to be escaped
+with \fI\e\fR in order to match them literally: \fI ( ) [ ] . * ? + ^ $ \e\fR.
+.TP
+-
+Matches of length zero are silently skipped.
+.RE
+.PP
+The dialog also provides checkboxes to:
+.RS 2
+.TP 2
+-
+search backwards;
+.TP
+-
+match in a case-sensitive manner (the default is to ignore case, i.e. a search
+string
+.I Test
+will match both the strings
+.I test
+and
+.I TEST
+in the DVI file);
+.TP
+-
+ignore line breaks and hyphens: This removes all hyphens at the ends
+of lines and the following newline characters, and replaces all
+remaining newline characters by white spaces. So hyphenated words will
+appear as one word to the search, and a search for two words with a space
+in between will also match the words if they are separated by a linebreak.
+.br
+Note that the hyphen removal may cause unwanted side effects for compound words
+containing hyphens that are wrapped after the hyphen, and that replacing the
+newlines affects the interpretation of regular expressions as follows:
+The \fI.\fR pattern will also match newlines, and \fI^\fR and \fI$\fR won't match
+begin and end of lines any more. (Since currently there is no option for turning
+off the greediness of \fI*\fR and \fI+\fR, turning on this option will usually
+result in matches that are longer than desired.)
+.RE
+.PP
+The current checkbox settings are saved in the
+.I ~/.xdvirc
+file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH PRINT DIALOG
+The print dialog window allows you to print all pages, marked pages
+(click or drag Mouse-2 in the page list to mark them), or a range
+of pages. Note that the page numbers always refer to physical pages,
+so if you're using the option `use TeX pages', you may want to disable
+it to make it easier to determine the correct page numbers (or avoid this
+problem altogether by marking the pages to be printed).
+.PP
+The value of the
+.B Printer
+text filed is passed to
+.B dvips
+via the
+.B -o!
+mechanism, as a single argument after the `!'. Any arguments
+listed in the
+.B Dvips options
+field are segmented at whitespace and passed as separate arguments to dvips.
+If you e.g. want to print the file 2-up, you should enter
+the following string into the
+.B Printer
+field:
+.RS 5
+.nf
+.sp 1n
+ \fIpsnup -2 -q | lpr -Plp\fP
+.sp 1n
+.fi
+.RE
+.PP
+There are several resources for customizing the behaviour and the default entries
+of the print dialog:
+.TP
+.B dvipsPrinterString
+.TP
+.B dvipsOptionsString
+These can be used to provide default entries for the
+.B Printer
+and the
+.B Dvips options
+text fields, respectively. If no paper size is specified in the DVI file
+(via e.g. \eusepackage[dvips]{geometry} - this is the preferred method),
+the input field is initialized with the current value of the
+command line option/X resource
+.BR paper .
+E.g. the option
+.I -paper a4r
+is translated into the dvips options
+.IR "-t a4 -t landscape" .
+Note that no check is performed whether dvips actually understands these
+options (it will ignore them if it can't); currently not all options
+used by xdvi are also covered by dvips.
+.TP
+.B dvipsHangTime
+.TP
+.B dvipsFailHangTime
+These specify the time (in milliseconds) that the printing progress window will
+stay open after the
+.B dvips
+process has terminated. The value of
+.B dvipsHangTime
+is used if the process terminates successfully;
+.B dvipsFailHangTime
+is used if it terminates with an error. The default values are 1.5 and 5 seconds, respectively.
+If both values are negative, the window will stay open until it is closed by the user.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SAVE DIALOG
+This dialog allows you to save all or selected/marked pages in the current
+DVI file. You can save in one of the following formats:
+.RS 2
+.TP 2
+-
+PostScript (uses
+.B dvips
+to convert the DVI file to a PostScript file, just like when printing
+to a PostScript file).
+.TP
+-
+PDF (first uses
+.B dvips
+to convert the DVI file to a PostScript file, then uses
+.B ps2pdf
+to convert the PostScript file to PDF).
+.TP
+-
+Plain text in ISO-8859-1 or UTF-8 encoding. The latter will preserve more
+of the special LaTeX characters e.g. from mathematical mode. Note however
+that e.g. only few of LaTeX's mathematical symbols can be rendered correctly
+as text; so this functionality works best for plain text documents.
+If a character cannot be displayed in the selected
+charset, it is replaced by `\e' followed by the hexadecimal character code.
+If a character is not recognized at all, it is replaced by `?'.
+.RE
+.PP
+The programs for PostScript and PDF conversion can be customized via
+the command line options or X resources
+.BR -dvipspath / .dvipsPath
+and
+.BR -ps2pdfpath / .ps2pdfPath ,
+respectively; see the explanation of these options above for more details.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH MODES
+The keystroke
+.B Ctrl-m
+[\fBswitch-mode()\fR]
+switches between three different mouse bindings,
+which can also be activated via the
+.B Modes
+menu (in Motif, this is a submenu of the
+.B Options
+menu called
+.BR "Mouse Mode" ).
+The default mode at startup can be customized via the X resource
+.B mouseMode
+or the command-line option
+.BR \-mousemode .
+The default startup mode is Magnifier Mode.
+.PP
+.B Note:
+The modes are implemented by changing the
+.I magnifier()
+action. Switching the mode will not work if
+.B Mouse-1
+has been customized to an action sequence that does
+not contain the magnifier() action.
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B "Magnifier Mode"
+In this mode, the mouse buttons 1 to 5 pop up a ``magnifying glass''
+that shows an unshrunken image of the page (i.e. an image at the resolution
+determined by the option/X resource
+.B pixels
+or
+.BR mfmode )
+at varying sizes. When the magnifier is moved, small ruler-like
+tick marks are displayed at the edges of the magnifier (unless
+the X resource
+.B delayRulers
+is set to false, in which case the tick marks are always displayed).
+The unit of the marks is determined by the X resource
+.B tickUnits
+(mm by default). This unit can be changed at runtime via the action
+.BR switch-magnifier-units() ,
+by default bound to the keystroke
+.RB ` t '
+(see the description of that key, and of switch-magnifier-units() for
+more details on the units available).
+.br
+The length of the tick marks can be changed via the X resource
+.B tickLength
+(4 by default). A zero or negative value suppresses the tick marks.
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B "Text Selection Mode"
+This mode allows you to select a rectangular region of text in the DVI
+file by holding down
+.B Mouse-1
+and moving the mouse. The text is put into
+the X primary selection so that it can be pasted into other X applications
+with
+.B Mouse-2
+as usual.
+.br
+If xdvi has been compiled with locale,
+.I nl_langinfo()
+and
+.I iconv
+support, the selected text is converted into the character set of the
+current locale (see the output of
+.B locale -a
+for a list of locale settings available on your system).
+If
+.I nl_langinfo()
+is not available, but
+.I iconv
+is, you can specify the input encoding for
+.I iconv
+via the X resource
+.I textEncoding
+(see the output of
+.B iconv -l
+for a list of valid encodings). If
+.I iconv
+support is not available, only the encodings
+.I ISO-8859-1
+and
+.I UTF-8
+are supported (these names are case-insensitive).
+.br
+Note that UTF-8 is
+the only encoding that can render all characters (e.g. mathematical
+symbols) of a DVI file. If ISO-8859-1 is active, characters that cannot be displayed
+are replaced by `\e' followed by the hexadecimal character code.
+For other encodings, such characters may trigger iconv error messages.
+If a character is not recognized at all, it is replaced by `?'.
+.br
+To extract larger portions of text, you can alternatively
+save selected pages or the entire file in text format via the
+.B File > Save as ...
+menu.
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.B "Ruler Mode"
+This mode provides a simple way of measuring distances on the page.
+.br
+When this mode is activated, the mouse cursor changes into a
+thin cross, and a larger, cross-shaped ruler is drawn in the
+highlight color at the mouse location. The ruler doesn't have
+units attached to it; instead, the current distance between the
+ruler and the mouse cursor is continuously printed to the
+statusline.
+.br
+When activating Ruler Mode, the ruler is at first attached to
+the mouse and can be moved around. It can then be positioned at
+a fixed place by clicking
+.BR Mouse-1 .
+After that, the mouse cursor
+can be moved to measure the horizontal
+.RI ( dx ),
+vertical
+.RI ( dy )
+and direct (shortest)
+.RI ( dr )
+distance between the ruler center point and the mouse.
+.br
+Clicking
+.B Mouse-1
+again will move the ruler to the current mouse
+position, and holding down
+.B Mouse-1
+will drag the ruler around.
+.br
+In Ruler Mode, the following special keybindings extend or
+replace the default bindings:
+.RS 7
+.TP 7
+.B o
+.RB [ ruler-snap-origin() ]
+Snap the ruler back to the origin coordinate (0,0).
+.TP
+.B t
+\fR[overrides \fBswitch-magnifier-units()\fP]
+Toggle between various ruler units, which can be specified by the X
+resource
+.B tickUnits
+(`mm' by default).
+.TP
+.B P
+\fR[overrides \fBdeclare-page-number()\fP]
+Print the distances shown in the statusline to standard output.
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH TOOLBAR (Motif only)
+The Motif toolbar can also be customized. The XPM file used for the
+toolbar icons can be specified via the resource
+.BR toolbarPixmapFile ,
+which should contain a filename that can be found in one of
+.B XFILESEARCHPATH
+or
+.B XDVIINPUTS
+(see the section
+.B FILE SEARCHING
+below for more information on these variables).
+.B Xdvi
+will try to split this pixmap horizontally into
+.I n
+pieces, where each piece is as wide as the pixmap is high
+and is treated as an image for toolbar button
+.IR n .
+This means that each icon should be a square, and that the entire
+pixmap should have width
+\fIn\fR x \fIh\fR if \fIh\fR is the height of the pixmap.
+.PP
+The resource
+.B toolbarTranslations
+can be used to map icons/buttons to specific actions.
+The resource should contain a string separated by newline characters,
+similar to the resources
+.B mainTranslations
+and
+.BR menuTranslations .
+Every line must contain either a spacer definition, or an icon definition:
+.PP
+A spacer definition is a string \fBSPACER(\fIn\fB)\fR,
+where
+.I n
+is the number of pixels inserted as separator to the following button.
+.PP
+An icon definition is a colon-separated list containing the following elements:
+.RS 2
+.TP 2
+.SB - the index of an icon in the pixmap file (starting from zero);
+.TP
+.SB - a long tooltip string, displayed in the status area;
+.TP
+.SB - a short tooltip string, displayed as popup;
+.TP
+.SB - a sequence of actions to be performed when the corresponding toolbar button is pushed.
+.RE
+.PP
+To illustrate this, the default value of
+.B toolbarTranslations
+looks as follows:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+xdvi.toolbarTranslations: \e
+ SPACER(5)\en\e
+ 0:Open a new document (Key\e\e: Ctrl-f):\e
+ Open file:select-dvi-file()\en\e
+ SPACER(10)\en\e
+ 1:Reread this document (Key\e\e: R):\e
+ Reread file:reread-dvi-file()\en\e
+ SPACER(10)\en\e
+ 2:Go to the first page of this document (Key\e\e: 1g):\e
+ Go to first page:goto-page(1)\en\e
+ 3:Go to the previous page of this document (Key\e\e: p):\e
+ Go to previous page:back-page(1)\en\e
+ 4:Go to the next page of this document (Key\e\e: n):\e
+ Go to next page:forward-page(1)\en\e
+ 5:Go to the last page of this document (Key\e\e: g):\e
+ Go to last page:goto-page()\en\e
+ SPACER(10)\en\e
+ 6:Enlarge the display (Key\e\e: Ctrl-+):Zoom in:\e
+ set-shrink-factor(+)\en\e
+ 7:Shrink the display (Key\e\e: Ctrl--):Zoom out:\e
+ set-shrink-factor(-)\en\e
+ SPACER(10)\en\e
+ 8:Jump back to the previous hyperlink (Key\e\e: B):\e
+ Back hyperlink:htex-back()\en\e
+ SPACER(10)\en\e
+ 10:Print this document:Print:print()\en\e
+ SPACER(10)\en\e
+ 11:Toggle marks for odd pages (Key\e\e: 1m):\e
+ Toggle odd:toggle-mark(1)\en\e
+ 12:Toggle marks for even pages (Key\e\e: 2m):\e
+ Toggle even:toggle-mark(2)\en\e
+ 13:Toggle mark for current page (Key\e\e: 2m):\e
+ Toggle current:toggle-mark()\en\e
+ 14:Unmark all pages (Key\e\e: 0m):\e
+ Unmark all:toggle-mark(0)\en\e
+ SPACER(10)\en\e
+ 18:Display fonts darker (Key\e\e: Alt-Ctrl-+):\e
+ Fonts darker:change-density(5)\en\e
+ 19:Display fonts lighter (Key\e\e: Alt-Ctrl--):\e
+ Fonts lighter:change-density(-5)\en
+.sp 1n
+.ft
+.fi
+.RE
+.PP
+When the mouse remains over a toolbar button for a certain period, a `tooltip'
+window is shown, describing what the button does using the
+.I short tooltip string
+from the above resource. At the same time, the
+.I long tooltip string
+is displayed in the statusline.
+The appearance and behaviour of these tooltips can be customized via
+the following resources:
+.TP
+.B tipShell.background
+Background color of the tooltip window.
+.TP
+.B tipShell.fontSet
+Font used for the tooltip.
+.TP
+.B tipShell.waitPeriod
+The time (in milliseconds) the mouse pointer needs to be over
+the button before the tooltip is shown. Set it to a negative value
+to suppress the tooltips altogether.
+
+#ifgrey
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH GREYSCALING AND COLORMAPS
+The greyscale anti-aliasing feature in
+.B xdvi
+will not work at its best if the display does not have enough colors available.
+This can happen if other applications are using most of the colormap
+(even if they are iconified). If this occurs, then
+.B xdvi
+will print an error message and turn on the
+.B -copy
+option. This will result in overstrike characters appearing wrong;
+it may also result in poor display quality if the number of available
+colors is very small.
+.PP
+Typically this problem occurs on displays that allocate eight bits
+of video memory per pixel. To see how many bits per pixel your display
+uses, type
+.B xwininfo
+in an
+.B xterm
+window, and then click the mouse on the root window when asked. The
+``Depth:'' entry will tell you how many bits are allocated per pixel.
+.PP
+Displays using at least 15 bits per pixel are typically
+.B TrueColor
+visuals, which do not have this problem, since their colormap is
+permanently allocated and available to all applications. (The visual
+class is also displayed by
+.BR xwininfo .)
+For more information on visual classes see the documentation for the
+X Window System.
+.PP
+To alleviate this problem, therefore, one may (a) run with more bits
+per pixel (this may require adding more video memory or replacing the video
+card), (b) shut down other applications that may be using much of the colormap
+and then restart
+.BR xdvi ,
+or (c) run
+.B xdvi
+with the
+.B \-install
+option.
+.PP
+One application which is often the cause of this problem is
+.BR Netscape .
+In this case there are two more alternatives to remedying the situation.
+One can run
+.RB `` "netscape -install" ''
+to cause
+.B Netscape
+to install a private colormap. This can cause colors to change in
+bizarre ways when the mouse is moved to a different window.
+Or, one can run
+.RB `` "netscape -ncols 220" ''
+to limit
+.B Netscape
+to a smaller number of colors. A smaller number will ensure that
+other applications have more colors available, but will degrade the
+color quality in the
+.B Netscape
+window.
+#endif
+
+#ifps
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH HANDLING OF POSTSCRIPT FIGURES
+.B Xdvi
+can display Encapsulated PostScript (EPS) files included in the
+.I dvi
+file. Such files are first searched for in the directory where the
+.I dvi
+file is, and then using normal
+.B Kpathsea
+rules. There is an exception to this, however: if the file name begins
+with a backtick
+.RB ( ` ),
+then the remaining characters in the file name give a shell command (often
+.BR zcat )
+which is executed; its standard output is then sent to be interpreted as
+PostScript.
+Since the execution of arbitrary shell commands with the user's
+permissions is a huge security risk, evaluation of these backtick
+commands is disabled by default. It needs to be activated via the
+.B \-allowshell
+command-line option.
+.B NOTE:
+You should never use this option when viewing documents that you
+didn't compile yourself. The backtick specials are not needed for
+uncompressing gzipped PostScript files, since
+.B xdvi
+can do that on the fly if the filename ends with
+.I .eps.gz
+or
+.I .eps.Z
+(and if the first bytes of the file indicate that the file is indeed
+compressed). This is both safer and more flexible than the backtick
+approach, since the default file searching rules will apply to such
+filenames too.
+#endif
+#ift1
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH TYPE 1 FONTS
+Using FreeType (version 2),
+.B xdvi
+can render PostScript<tm> Type 1 fonts directly, without the
+route via \*(Te\& pixel (pk)
+fonts. The advantage of this is that only one size of each font needs
+to be stored on disk.
+Unless the
+.B -notype1fonts
+option is used,
+.B xdvi
+will try to render every font using FreeType. Only as a fallback will it
+invoke an external program (like
+.BR mktexpk ,
+which in turn may invoke utilities like
+.B ps2pk
+or
+.BR gsftopk )
+to generate a pixel font from the Type 1 source. The direct rendering
+of the
+.B Computer Modern
+fonts should work out-of-the box, whereas other Type 1 fonts such as
+the 35 `standard' PostScript<tm> fonts resident in printers may need
+to be made accessible for use with
+.BR xdvi ,
+unless your system
+administrator or TeX distribution has already done so (which is the case
+e.g. for current TeX Live systems). For the 35 PostScript<tm> resident
+fonts,
+.B xdvik
+will search using the
+.B Fontmap
+provided with
+.BR Ghostscript ,
+if necessary. Also, the
+.B xdvik
+distribution comes with a utility called
+.B t1mapper
+to make these fonts available for xdvi;
+see the manual page for t1mapper(1) for usage details. This program is
+likely to be dropped in the future, however, since it is probably not
+needed anymore.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SPECIALS (GENERALLY)
+Any of the specials used by
+.B xdvi
+may be preceded by the characters
+.RB `` xdvi: ''.
+Doing so does not change the behavior of the special under
+.BR xdvi ,
+but it tells other dvi drivers (such as e.g. dvips) to ignore the special.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SOURCE SPECIALS
+Some \*(Te\& implementations or macro packages provide the facility to
+automatically include so-called `source specials' into a DVI file.
+These contain the line number, eventually a column number, and the
+filename of the .tex source. This makes it possible to jump from a .dvi
+file to the corresponding place in the .tex source and vice versa (also
+called `inverse search' - jumping from the DVI file to the TeX file is
+also known as `reverse search', and jumping from the TeX file to the
+DVI file as `forward search').
+.P
+To be usable with
+.BR xdvi ,
+source specials in the
+.I dvi
+file must have one of the following formats:
+.RS 5
+.nf
+.sp 1n
+ \fBsrc:\fP\fIline\fP[ ]\fIfilename\fP
+ \fBsrc:\fP\fIline\fP\fB:\fP\fIcol\fP[ ]\fIfilename\fP
+ \fBsrc:\fP\fIline\fP
+ \fBsrc:\fP\fIline\fP\fB:\fP\fIcol\fP
+ \fBsrc::\fP\fIcol\fP
+.sp 1n
+.fi
+.RE
+If
+.I filename
+or
+.I line
+are omitted, the most recent values are used. The first source special on
+each page must be in one of the first two forms, since defaults are not
+inherited across pages.
+.sp
+You will need a \*(Te\& implementation that provides an appropriate
+switch (e.g.\&
+.IR -src )
+or a macro package
+(such as
+.I srcltx.sty
+or
+.IR srctex.sty ,
+available from CTAN:macros/latex/contrib/supported/srcltx/)
+to insert such source specials into the DVI file.
+.sp
+For reverse search, the combination
+.I Ctrl-Mouse 1
+will make xdvi open an editor (the value of the
+.I \-editor
+command line option) with the file and the line number of the .tex
+source. See the description of the
+.I \-editor
+option for more information
+and example settings.
+.P
+For forward search,
+.B xdvi
+has a
+.I \-sourceposition
+option that makes
+.B xdvi
+jump to the page in
+the DVI file corresponding to the given line (or the closest
+line having a source special) of the specified file and highlight
+the found region. See the description of the
+.I \-sourceposition
+option for more details.
+.PP
+More information on setting up various editors for use with source
+specials can be found at:
+.RS 5
+.nf
+.sp 1n
+http://xdvi.sourceforge.net/inverse-search.html
+.sp 1n
+.fi
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH PAPERSIZE SPECIALS
+.B xdvi
+accepts specials to set the paper size for the document. These specials
+should be of the form
+.RS 5
+.nf
+.sp 1n
+ \fBpapersize=\fP[\fB*\fP]\fIwidth\fP,\fIheight\fP
+.sp 1n
+.fi
+.RE
+.PP
+where
+.I width
+and
+.I height
+give the width and height of the paper, respectively. Each of these should
+appear in the form of a decimal number followed by any of the two-letter
+abbreviations for units accepted by \*(Te\&
+.RB ( pt ,
+.BR pc ,
+.BR in ,
+.BR bp ,
+.BR cm ,
+.BR mm ,
+.BR dd ,
+.BR cc ,
+or
+.BR sp ).
+If an asterisk
+.RB ( * )
+appears just before the width, then the measurements refer to the document
+dimensions (e.g.\&
+.B pt
+as opposed to
+.BR truept ).
+This allows a macro package to vary the page size according to elements
+of the document; e.g.\&
+.RS 5
+.ft 3
+.nf
+.sp 1n
+\especial{xdvi: papersize=*\enumber\ewd\emybox sp,
+ \enumber\eht\emybox sp}
+.sp 1n
+.ft
+.fi
+.RE
+.PP
+Except for the asterisk, this format is compatible with
+.BR dvips .
+.P
+The last
+.B papersize
+special on a page determines the size of that page. If there is no such
+special on a given page, the most recent
+.B papersize
+is used, or, if there are no
+.B papersize
+specials on any preceding page, then the value of the
+.B paper
+resource (or
+.B \-paper
+option on the command line) is used. Thus the paper size may vary for
+different pages of the
+.I dvi
+file.
+.P
+If the
+.B paper
+resource (or
+.B \-paper
+command-line option) begins with a plus sign
+.RB (` + '),
+then all
+.B papersize
+specials in the
+.I dvi
+file are ignored.
+#ifcolor
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH COLOR SPECIALS
+The color specials supported by
+.B xdvi
+are the same as those supported by
+.BR dvips ,
+except that the literal PostScript color specification (as in the
+.B AggiePattern
+example in the
+.B dvips
+documentation) is not supported.
+There are also some restrictions due to the way xdvi's drawing routines
+are implemented; e.g. the
+.B \ecolorbox
+and
+.B \efcolorbox
+macros don't work with
+.BR xdvi .
+See the section LIMITATIONS below for more information on these restrictions.
+.B Xdvi
+supports the same list of named colors as
+.B dvips
+does, namely:
+.P
+.BR Apricot ,
+.BR Aquamarine ,
+.BR Bittersweet ,
+.BR Black ,
+.BR Blue ,
+.BR BlueGreen ,
+.BR BlueViolet ,
+.BR BrickRed ,
+.BR Brown ,
+.BR BurntOrange ,
+.BR CadetBlue ,
+.BR CarnationPink ,
+.BR Cerulean ,
+.BR CornflowerBlue ,
+.BR Cyan ,
+.BR Dandelion ,
+.BR DarkOrchid ,
+.BR Emerald ,
+.BR ForestGreen ,
+.BR Fuchsia ,
+.BR Goldenrod ,
+.BR Gray ,
+.BR Green ,
+.BR GreenYellow ,
+.BR JungleGreen ,
+.BR Lavender ,
+.BR LimeGreen ,
+.BR Magenta ,
+.BR Mahogany ,
+.BR Maroon ,
+.BR Melon ,
+.BR MidnightBlue ,
+.BR Mulberry ,
+.BR NavyBlue ,
+.BR OliveGreen ,
+.BR Orange ,
+.BR OrangeRed ,
+.BR Orchid ,
+.BR Peach ,
+.BR Periwinkle ,
+.BR PineGreen ,
+.BR Plum ,
+.BR ProcessBlue ,
+.BR Purple ,
+.BR RawSienna ,
+.BR Red ,
+.BR RedOrange ,
+.BR RedViolet ,
+.BR Rhodamine ,
+.BR RoyalBlue ,
+.BR RoyalPurple ,
+.BR RubineRed ,
+.BR Salmon ,
+.BR SeaGreen ,
+.BR Sepia ,
+.BR SkyBlue ,
+.BR SpringGreen ,
+.BR Tan ,
+.BR TealBlue ,
+.BR Thistle ,
+.BR Turquoise ,
+.BR Violet ,
+.BR VioletRed ,
+.BR White ,
+.BR WildStrawberry ,
+.BR Yellow ,
+.BR YellowGreen ,
+.BR YellowOrange .
+.P
+Note that these names are case sensitive.
+.P
+The documentation of the La\*(Te\&
+.B color
+package provides more details on how to use such specials with
+La\*(Te\&; see the
+.B dvips
+documentation for a detailed description of the
+syntax and semantics of the color specials.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH SIGNALS
+When
+.B xdvi
+receives a
+.SB SIGUSR1
+signal, it rereads the
+.I dvi
+file.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.SH ENVIRONMENT
+.B Xdvik
+uses the same environment variables and algorithms for searching for
+font files as \*(Te\& and friends. See the documentation for the
+.B Kpathsea
+library,
+.BR kpathsea.dvi ,
+for a detailed description of these.
+.PP
+In addition,
+.B xdvik
+accepts the following variables:
+.TP
+.SB DISPLAY
+Specifies which graphics display terminal to use.
+#ifnokpathsea
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB XDVISIZES
+A list of font resolutions separated by colons. If a font cannot be found
+or made at its stated size, then these sizes are tried as a fallback.
+See the `Fallback font' section in the
+.B Kpathsea
+manual for more details.
+.B xdvi
+tries the actual size of the font before trying any of the given sizes.
+Each font resolution should be a positive integer, specifying the number
+of dots per inch, or a string of the form
+.BR magstep\fIn\fP ,
+where
+.I n
+is a number -9.5, -9, -8.5, ..., 8, 8.5, 9, or 9.5. The string
+.B magstep
+may be shortened to any non-empty initial substring (so that
+.B magstep0.5
+may be shortened to
+.B mag0.5
+or
+.B m0.5
+(but not
+.BR mag.5 )).
+The entries
+.BI magstep n
+signify the current pixels-per-inch value, multiplied by 1.2 raised to the
+.IR n th
+power, and rounded to the nearest integer.
+If the list begins with a colon, the system default sizes are used, as well.
+Sizes are expressed in dots per inch and must be integers.
+The current default set of sizes is @DEFAULT_FONT_SIZES@.
+#endif
+.TP
+.SB KPATHSEA_DEBUG
+Trace
+.B Kpathsea
+lookups; set it to
+.B -1
+(= all bits on) for complete tracing.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB EXTENSIONMAPS
+A list of files to be searched for mime types entries (as for Acrobat Reader).
+Earlier entries in one of these files override later ones.
+If this variable is not set, the following default path is used:
+.RS 7
+.nf
+.ft 3
+.sp 1n
+$HOME/.mime.types:/etc/mime.types:\e
+ /usr/etc/mime.types:/usr/local/etc/mime.types
+.sp 1n
+.ft
+.fi
+.RE
+
+.TP
+.SB MAILCAPS
+A list of files to be searched for mailcap entries, as defined by RFC
+1343. See this RFC or the
+.BR mailcap (4)
+manual page for a detailed description of the mailcap file format.
+Currently, only the following mailcap features are supported:
+.RS 7
+.TP 7
+.BI test= command
+The entry is only used if
+.I command
+can be executed via the
+.B system()
+call and if the system() call returns with value 0 (success).
+The
+.I command
+string may contain the format string
+.IR %s ,
+which will be replaced by the file name.
+.TP
+.B needsterminal
+If this flag is used, the command will be executed in a new xterm
+window by prepending
+.RI `` "xterm -e "''
+to the command string.
+.RE
+.PP
+.RS 7
+All other fields in the mailcap entry are ignored by xdvi.
+Earlier entries in one of these files override later ones.
+If the variable is not defined, the following default path is used:
+.RS 4
+.nf
+.ft 3
+.sp 1n
+$HOME/.mailcap:/etc/mailcap:/usr/etc/mailcap:\e
+ /usr/local/etc/mailcap
+.sp 1n
+.ft
+.fi
+.RE
+.br
+For security reasons, some special characters (i.e. ( ) ` \e ;)
+are escaped in the argument before passing it to
+.BR system() .
+.RE
+.TP
+.SB BROWSER
+Determines the web browser used to open external links (i.e. all URLs
+that don't start with the
+.RI ` file: '
+scheme and are not relative links in the local DVI file), and to open links
+for which no viewer has been specified in the
+.B mailcap
+files. The value of this variable is a colon-separated list of commands. Xdvi
+will try each of them in sequence until one succeeds (i.e. doesn't immediately
+return with status 0). This allows you to
+specify your favourite browser at the beginning,
+and fallback browsers at the end. Every occurrence of
+.I %s
+in the string is replaced by the target URL; every occurrence of
+.I %%
+is replaced by a single
+.IR % .
+If no
+.I %s
+is present, the URL string is added as an extra argument.
+.br
+An example setting is:
+.RS 7
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP 7
+.SB "netscape -raise -remote 'openURL(%s,new-window)':xterm -e lynx %s:xterm -e wget %s:lynx %s:wget %s"
+.TP
+See
+.TP
+.SB http://www.catb.org/~esr/BROWSER/
+.PP
+for more details on the
+.B BROWSER
+environment variable.
+.RE
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ift1
+.TP
+.SB GS_LIB
+A colon-separated list of directories to search for
+.B Fontmap
+files, etc., as used for Ghostscript. It has the same meaning as it does
+when running Ghostscript. In
+.BR xdvik ,
+it is used when searching for font files when the map file does not give a
+file name for the font (this should be quite rare). The command
+.B gs \-h
+will list the default value that Ghostscript uses. See also the
+.SB XDVI_GS_LIB
+environment variable (below).
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB XDVI_GS_LIB
+This has the same effect as
+.SB GS_LIB
+but affects only
+.BR xdvi .
+Use this when you want to use a different value for
+.SB GS_LIB
+when running
+.BR xdvi ,
+but use either the compiled-in default value or some other value when running
+Ghostscript. If both
+.SB GS_LIB
+and
+.SB XDVI_GS_LIB
+are set, then
+.B xdvi
+uses
+.SB XDVI_GS_LIB.
+To use the default value compiled in to
+.B xdvi
+while still retaining the ability to set
+.SB GS_LIB
+for use with Ghostscript, you can set
+.SB XDVI_GS_LIB
+to the empty string.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifps
+.TP
+.SB TMPDIR
+The directory to use for storing temporary files created when uncompressing
+PostScript files.
+#endif
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB XEDITOR
+Determines the editor command used for source special `reverse
+search', if neither the
+.I \-editor
+command-line option
+nor the
+.I .editor
+resource are specified. See the description of the
+.I \-editor
+command line option for details on the format.
+.TP
+.SB VISUAL
+Determines an editor to be opened in an xterm
+window if neither of
+.IR -editor ,
+.IR .editor ,
+or
+.I XEDITOR
+is specified.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB EDITOR
+Determines an editor to be opened in an xterm
+window if neither of
+.IR -editor ,
+.IR .editor ,
+.I XEDITOR
+or
+.I VISUAL
+is specified.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.TP
+.SB WWWBROWSER
+Obsolete; use
+.B BROWSER
+instead.
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#ifps
+.SH LIMITATIONS
+.B xdvi
+accepts many but not all types of PostScript specials accepted by
+.BR dvips .
+For example, it accepts most specials generated by
+.B epsf
+and
+.BR psfig .
+It does not, however, support
+.B bop\-hook
+or
+.BR eop\-hook ,
+nor does it allow PostScript commands to affect the rendering of things that
+are not PostScript (for example, the ``NEAT'' and rotated ``A'' examples in the
+.B dvips
+manual). These restrictions are due to the design of
+.BR xdvi ;
+in all likelihood they will always remain.
+.PP
+La\*(Te\&2e rotation specials are currently not supported.
+.PP
+.B MetaPost
+files containing included text are not supported.
+.PP
+.BR Xdvi 's
+color handling doesn't support the
+.B \ecolorbox
+and
+.B \efcolorbox
+macros; this is not likely to change in the near future. This also
+means that e.g. colored tables (as created by the
+.I colortbl
+package) may render incorrectly: Text in colors different from the
+default foreground color may not be displayed. When the page is
+redrawn (e.g. after using the magnifier), the background color of the
+cells may overdraw the text.
+#endif
+.SH FILES
+.TP
+.SB $HOME/.xdvirc
+A file that holds all settings that the user changed via the keys, the `Options'
+and the Xaw `Modes' menu and the dialogs, as X resources. These resources override the
+settings in
+.BR $HOME/.Xdefaults .
+This file is ignored if the
+.B \-q
+option is used or the
+.B noInitFile
+X resource is set.
+#ift1
+.TP
+.SB config.xdvi
+An optional configuration file for the Type 1 font setup, which specifies
+.BR dvips \-style
+map files specific to
+.BR xdvik .
+If used, it should be present in the directory determined by the
+.B TEXCONFIG
+environment variable. Its format is similar to configuration files for
+.BR dvips ,
+except that it is only scanned for the names of map files
+.RB ( p
+and
+.B p+
+directives).
+#endif
+.SH SEE ALSO
+.BR X (1),
+.BR dvips (1),
+.BR mktexpk (1),
+.BR ps2pk (1),
+.BR gsftopk (1),
+.BR t1mapper (1),
+.BR mailcap (4),
+the
+.B Kpathsea
+documentation,
+.BR https://ctan.org/pkg/xdvi/ .
+and the Xdvik home page at
+.BR http://xdvi.sourceforge.net/ .
+.SH AUTHORS
+Eric Cooper, CMU, did a version for direct output to a QVSS. Modified
+for X by Bob Scheifler, MIT Laboratory for Computer Science. Modified
+for X11 by Mark Eichin, MIT SIPB. Additional enhancements by many
+others.
+.PP
+The current maintainer of the original
+.B xdvi
+is Paul Vojta, U.C. Berkeley.
+.PP
+Code for the xdvik variant has been contributed
+by many people, whose names are scattered across the
+source files.
+.PP
+For the most up-to-date information, please visit:
+.PP
+.B http://xdvi.sourceforge.net
+.PP
+Please report all bugs to the SourceForge bug tracker:
+.PP
+.nf
+.B http://sourceforge.net/tracker/?func=add&group_id=23164&atid=377580
+.PP
diff --git a/Build/source/texk/xdvik/xdvi.c b/Build/source/texk/xdvik/xdvi.c
new file mode 100644
index 00000000000..9d14874288a
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi.c
@@ -0,0 +1,3623 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2014 Paul Vojta and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL PAUL
+VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+NOTE: xdvi is based on prior work as noted in the modification history, below.
+
+\*========================================================================*/
+
+/*
+ * DVI previewer for X.
+ *
+ * Eric Cooper, CMU, September 1985.
+ *
+ * Code derived from dvi-imagen.c.
+ *
+ * Modification history:
+ * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS.
+ * 7/1988 Modified for X.11 --Mark Eichin, MIT
+ * 12/1988 Added 'R' option, toolkit, magnifying glass
+ * --Paul Vojta, UC Berkeley.
+ * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto
+ * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ.
+ * 3/1990 Added VMS support --Scott Allendorf, U of Iowa
+ * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem
+ * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen
+ * and Lee Hetherington, MIT
+ * 7/1992 Added extra menu buttons--Nelson H. F. Beebe <beebe@math.utah.edu>
+ * 4/1994 Added DPS support, bounding box
+ * --Ricardo Telichevesky
+ * and Luis Miguel Silveira, MIT RLE.
+ * 2/1995 Added rulers support --Nelson H. F. Beebe <beebe@math.utah.edu>
+ * 1/2001 Added source specials --including ideas from Stefan Ulrich,
+ * U Munich
+ *
+ * Compilation options:
+ *
+ * VMS compile for VMS
+ * WORDS_BIGENDIAN store bitmaps internally with most significant bit first
+ * BMTYPE store bitmaps in unsigned BMTYPE
+ * BMBYTES sizeof(unsigned BMTYPE)
+ * ALTFONT default for -altfont option
+ * SHRINK default for -s option (shrink factor)
+ * MFMODE default for -mfmode option
+ * A4 use European size paper, and change default dimension to cm
+ * TEXXET support reflection dvi codes (right-to-left typesetting)
+ * GREY use grey levels to shrink fonts
+ * PS_GS use Ghostscript to render pictures/bounding boxes
+ * PS_DPS use display postscript to render pictures/bounding boxes
+ * PS_NEWS use the NeWS server to render pictures/bounding boxes
+ * GS_PATH path to call the Ghostscript interpreter by
+ * MAGICK use ImageMagick to render (external) image files
+ */
+
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "version.h"
+
+/* Xlib and Xutil are already included */
+#include <X11/cursorfont.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h> /* needed for def. of XtNiconX */
+
+#ifdef HAVE_X11_XMU_EDITRES_H
+# include <X11/Xmu/Editres.h>
+#endif
+
+/* to allow one common dependency file for Xaw/Motif,
+ we always include all the headers and have
+ #ifdef MOTIF
+ tests inside the headers.
+*/
+#if defined(NEW_MENU_CREATION) || defined(MOTIF)
+#include "menu.h"
+#else
+#include "xm_menu.h"
+#include "xaw_menu.h"
+#endif /* NEW_MENU_CREATION */
+#include "xm_toolbar.h"
+
+#ifdef MOTIF
+
+# include <Xm/Xm.h>
+# include <Xm/Frame.h>
+# include <Xm/PushB.h>
+# include <Xm/MainW.h>
+# include <Xm/ToggleB.h>
+# include <Xm/RowColumn.h>
+# include <Xm/ScrolledW.h>
+# include <Xm/MenuShell.h>
+# include <Xm/DrawingA.h>
+# include <Xm/Form.h>
+# include <Xm/PanedW.h>
+# include <Xm/List.h>
+# include <Xm/Protocols.h>
+
+# include <Xm/Display.h>
+
+# ifdef MOTIF11 /* FIXME: We'll probably need a config check for this? */
+/* used to set up XmStrings */
+XmStringCharSet G_charset = (XmStringCharSet)XmSTRING_DEFAULT_CHARSET;
+# else
+XmStringCharSet G_charset = XmFONTLIST_DEFAULT_TAG;
+# endif
+
+#else /* MOTIF */
+
+# include <X11/Xaw/Viewport.h>
+# include <X11/Xaw/AsciiText.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/Dialog.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Paned.h>
+# include <X11/Xaw/Scrollbar.h>
+# include <X11/Xaw/Command.h>
+
+#endif /* MOTIF */
+
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "xserver-info.h"
+
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/c-pathch.h"
+#include "kpathsea/c-stat.h"
+#include "kpathsea/progname.h"
+#include "kpathsea/tex-file.h"
+#include "kpathsea/tex-hush.h"
+#include "kpathsea/tex-make.h"
+#include "string-utils.h"
+#include "kpathsea/c-errno.h"
+
+#include "translations.h"
+#include "c-openmx.h"
+#include "xicon.h"
+#include "x_util.h"
+#include "message-window.h"
+#include "events.h"
+#include "mag.h"
+#include "pagesel.h"
+#include "dvi-draw.h"
+#include "statusline.h"
+#include "util.h"
+#include "hypertex.h"
+#include "xaw_menu.h"
+#include "xdvi-debug.h"
+#include "pagehist.h"
+#include "filehist.h"
+#include "print-internal.h"
+#include "exit-handlers.h"
+#include "xm_prefsP.h" /* for Xdvi_PREFS_BROWSER_DEFAULTS and Xdvi_PREFS_EDITOR_DEFAULTS */
+
+#if FREETYPE
+# include "font-open.h" /* for init_t1_lookup() */
+#endif
+
+#ifdef VMS
+# include "pixmaps/hand.xbm"
+# include "pixmaps/hand_mask.xbm"
+#endif
+#include "pixmaps/magglass.xbm"
+#include "pixmaps/magglass_mask.xbm"
+
+#ifdef DEBUG
+#include<asm/msr.h>
+unsigned long time_start=0, time_end=0;
+#endif
+
+
+#ifdef MOTIF
+#include <Xm/MwmUtil.h>
+
+#else /* MOTIF */
+
+/* need to fake it */
+
+/* bit definitions for MwmHints.flags */
+#define MWM_HINTS_FUNCTIONS (1L << 0)
+#define MWM_HINTS_DECORATIONS (1L << 1)
+#define MWM_HINTS_INPUT_MODE (1L << 2)
+#define MWM_HINTS_STATUS (1L << 3)
+
+/* bit definitions for MwmHints.decorations */
+#define MWM_DECOR_ALL (1L << 0)
+#define MWM_DECOR_BORDER (1L << 1)
+#define MWM_DECOR_RESIZEH (1L << 2)
+#define MWM_DECOR_TITLE (1L << 3)
+#define MWM_DECOR_MENU (1L << 4)
+#define MWM_DECOR_MINIMIZE (1L << 5)
+#define MWM_DECOR_MAXIMIZE (1L << 6)
+
+struct PropMotifWmHints {
+ unsigned long flags;
+ unsigned long functions;
+ unsigned long decorations;
+ long inputMode;
+ unsigned long status;
+};
+
+#define PROP_MOTIF_WM_HINTS_ELEMENTS 5
+
+#endif /* MOTIF */
+
+#if HAVE_X11_INTRINSICI_H
+# include <X11/IntrinsicI.h>
+#else
+
+/* Taken from <X11/TranslateI.h> in libXt-1.1.3 (June 2012) */
+typedef struct _LateBindings {
+ unsigned int knot:1;
+ unsigned int pair:1;
+ unsigned short ref_count; /* garbage collection */
+ KeySym keysym;
+} LateBindings, *LateBindingsPtr;
+
+#endif /* not HAVE_X11_INTRINSICI_H */
+
+struct mouse_acts *mouse_actions;
+
+char *dvi_property; /* for setting in window */
+size_t dvi_property_length; /* length of above, for efficiency */
+XImage *G_image;
+int G_backing_store;
+Display *DISP;
+Screen *SCRN;
+XtAccelerators G_accels_cr;
+
+#ifdef GREY
+Visual *G_visual;
+unsigned int G_depth;
+Colormap G_colormap;
+#else
+# define G_depth (unsigned int) DefaultDepthOfScreen(SCRN)
+# define G_visual DefaultVisualOfScreen(SCRN)
+# define G_colormap DefaultColormapOfScreen(SCRN)
+#endif
+
+/* global widgets */
+
+#if defined(MOTIF)
+Widget page_list;
+#if USE_XAW_PANNER
+#include "Panner.h"
+Widget panner;
+static Dimension g_save_shadow_thickness;
+#endif
+#endif
+
+static Atom mainDeleteWindow;
+
+#ifndef MOTIF
+static Atom wmProtocols;
+static void
+handle_delete_message(Widget widget, XtPointer closure, XEvent *event, Boolean *cont)
+{
+ UNUSED(cont);
+ UNUSED(widget);
+
+ ASSERT(closure == NULL, "handle_delete_message doesn't accept a non-NULL closure argument");
+ if (event->type == ClientMessage
+ && event->xclient.message_type == wmProtocols
+ && (unsigned)(event->xclient.data.l[0]) == mainDeleteWindow) {
+ /* non-k xdvi also evaluates closure, but we don't, since it's a function pointer
+ which isn't convertible to void * in ANSI C */
+ xdvi_exit(EXIT_SUCCESS);
+ }
+}
+#endif
+
+#ifdef TEST_SCROLLING
+#warning ========== compiling with TEST_SCROLLING ==========
+#endif
+
+
+/* for measuring distance from the ruler */
+int g_ruler_pos_x, g_ruler_pos_y;
+
+Boolean ignore_papersize_specials = False;
+
+#ifndef ALTFONT
+# define ALTFONT "cmr10"
+#endif
+
+#ifndef SHRINK
+# define SHRINK 8
+#endif
+
+#ifndef MFMODE
+# define MFMODE NULL
+#endif
+
+#undef MKTEXPK
+#define MKTEXPK MAKEPK
+
+#if defined(PS_GS) && !defined(GS_PATH)
+# define GS_PATH "gs"
+#endif
+
+static Dimension bwidth = 2;
+
+struct x_resources resource;
+
+struct program_globals globals;
+
+/* color of cursor */
+static XColor m_cursor_color;
+
+
+struct WindowRec mane = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 };
+
+/* currwin is temporary storage except for within redraw() */
+struct WindowRec currwin = { (Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0 };
+
+#define offset(field) XtOffsetOf(struct x_resources, field)
+static int base_tick_length = 4;
+
+static char XtRBool3[] = "Bool3"; /* resource for Bool3 */
+
+static XtResource application_resources[] = {
+ {"regression", "Regression", XtRBoolean, sizeof(Boolean),
+ offset(regression), XtRString, "false"},
+ {"geometry", "Geometry", XtRString, sizeof(char *),
+ offset(geometry), XtRString, (XtPointer) NULL},
+ {"windowSize", "WindowSize", XtRString, sizeof(char *),
+ offset(windowsize), XtRString, (XtPointer) NULL},
+ {"rememberWindowSize", "RememberWindowSize", XtRBoolean, sizeof(Boolean),
+ offset(remember_windowsize), XtRString, "false"},
+ /* used to check whether app-defaults file is out of sync. Initialize
+ to a low default value (one before the resource was introduced) */
+ {"appDefaultsFileVersion", "AppDefaultsFileVersion", XtRInt, sizeof(int),
+ offset(app_defaults_fileversion), XtRImmediate, (XtPointer)20030302 },
+ {"shrinkFactor", "ShrinkFactor", XtRInt, sizeof(int),
+ offset(shrinkfactor), XtRImmediate, (XtPointer) SHRINK},
+ {"delayRulers", "DelayRulers", XtRBoolean, sizeof(Boolean),
+ offset(delay_rulers), XtRString, "true"},
+ {"useTeXPages", "UseTeXPages", XtRBoolean, sizeof(Boolean),
+ offset(use_tex_pages), XtRString, "false"},
+ {"densityPercent", "DensityPercent", XtRInt, sizeof(int),
+ offset(density), XtRString, "40"},
+ {"omega", "Omega", XtRBoolean, sizeof(Boolean),
+ offset(omega), XtRString, "true"},
+ {"mainTranslations", "MainTranslations", XtRString, sizeof(char *),
+ offset(main_translations), XtRString, (XtPointer) NULL},
+ {"mouseTranslations", "MouseTranslations", XtRString, sizeof(char *),
+ offset(mouse_translations), XtRString, (XtPointer) NULL },
+ {"wheelUnit", "WheelUnit", XtRInt, sizeof(int),
+ offset(wheel_unit), XtRImmediate, (XtPointer) 80},
+ {"mouseMode", "MouseMode", XtRInt, sizeof(int),
+ offset(mouse_mode), XtRImmediate, (XtPointer) MOUSE_MODE1 },
+ {"mouseMode1Name", "MouseMode1Name", XtRString, sizeof(char *),
+ offset(mouse_mode1_name), XtRString, (XtPointer) "Magnifier"},
+ {"mouseMode1Description", "MouseMode1Description", XtRString, sizeof(char *),
+ offset(mouse_mode1_description), XtRString, (XtPointer) "click to enlarge text"},
+ {"mouseMode1Cursor", "MouseMode1Cursor", XtRInt, sizeof(int),
+ offset(mouse_mode1_cursor), XtRImmediate, (XtPointer) -1},
+ {"mouseMode2Name", "MouseMode2Name", XtRString, sizeof(char *),
+ offset(mouse_mode2_name), XtRString, (XtPointer) "Text Selection"},
+ {"mouseMode2Description", "MouseMode2Description", XtRString, sizeof(char *),
+ offset(mouse_mode2_description), XtRString, (XtPointer) "click and drag to select a region of text"},
+ {"mouseMode2Cursor", "MouseMode2Cursor", XtRInt, sizeof(int),
+ offset(mouse_mode2_cursor), XtRImmediate, (XtPointer) XC_cross },
+ {"mouseMode3Name", "MouseMode3Name", XtRString, sizeof(char *),
+ offset(mouse_mode3_name), XtRString, (XtPointer) "Ruler"},
+ {"mouseMode3Description", "MouseMode3Description", XtRString, sizeof(char *),
+ offset(mouse_mode3_description), XtRString, (XtPointer) "click and drag to set/move ruler"},
+ {"mouseMode3Cursor", "MouseMode3Cursor", XtRInt, sizeof(int),
+ offset(mouse_mode3_cursor), XtRImmediate, (XtPointer) XC_crosshair },
+#ifdef GREY
+ {"gamma", "Gamma", XtRFloat, sizeof(float),
+ offset(gamma), XtRString, "1"},
+ /* {"invertedFactor", "InvertedFactor", XtRFloat, sizeof(float), */
+ /* offset(inverted_factor), XtRString, "3.0"}, */
+#endif
+ {"pixelsPerInch", "PixelsPerInch", XtRInt, sizeof(int),
+ offset(pixels_per_inch), XtRImmediate, (XtPointer) BDPI},
+ {"sideMargin", "Margin", XtRString, sizeof(char *),
+ offset(sidemargin), XtRString, (XtPointer) NULL},
+ {"tickLength", "TickLength", XtRInt, sizeof(int),
+ offset(tick_length), XtRInt, (XtPointer) &base_tick_length},
+ {"tickUnits", "TickUnits", XtRString, sizeof(char *),
+ offset(tick_units), XtRString, "mm"},
+ {"topMargin", "Margin", XtRString, sizeof(char *),
+ offset(topmargin), XtRString, (XtPointer) NULL},
+ {"xOffset", "Offset", XtRString, sizeof(char *),
+ offset(xoffset), XtRString, (XtPointer) NULL},
+ {"yOffset", "Offset", XtRString, sizeof(char *),
+ offset(yoffset), XtRString, (XtPointer) NULL},
+ {"useCurrentOffset", "UseCurrentOffset", XtRBoolean, sizeof(Boolean),
+ offset(use_current_offset), XtRString, "False" },
+ {"paper", "Paper", XtRString, sizeof(char *),
+ offset(paper), XtRString, (XtPointer) DEFAULT_PAPER},
+ {"paperLandscape", "PaperLandscape", XtRBoolean, sizeof(Boolean),
+ offset(paper_landscape), XtRString, "false"},
+ {"altFont", "AltFont", XtRString, sizeof(char *),
+ offset(alt_font), XtRString, (XtPointer) ALTFONT},
+ {"makePk", "MakePk", XtRBoolean, sizeof(Boolean),
+ offset(makepk), XtRString,
+#ifdef MAKE_TEX_PK_BY_DEFAULT
+ "true"
+#else
+ "false"
+#endif
+ },
+ {"mfMode", "MfMode", XtRString, sizeof(char *),
+ offset(mfmode), XtRString, MFMODE},
+ {"editor", "Editor", XtRString, sizeof(char *),
+ offset(editor), XtRString, (XtPointer) NULL},
+#if FREETYPE
+ {"type1", "Type1", XtRBoolean, sizeof(Boolean),
+ offset(freetype), XtRString, "true"},
+#endif
+#if HAVE_XI21
+ {"xi2Scrolling", "Xi2Scrolling", XtRBoolean, sizeof(Boolean),
+ offset(xi2scrolling), XtRString, "true"},
+#endif
+ {"sourcePosition", "SourcePosition", XtRString, sizeof(char *),
+ offset(src_pos), XtRString, (XtPointer) NULL},
+ {"findString", "FindString", XtRString, sizeof(char *),
+ offset(find_string), XtRString, (XtPointer) NULL},
+ {"textEncoding", "TextEncoding", XtRString, sizeof(char *),
+ offset(text_encoding), XtRString, (XtPointer) NULL},
+ {"fork", "Fork", XtRBoolean, sizeof(Boolean),
+ offset(src_fork), XtRString, "true"},
+#ifdef RGB_ANTI_ALIASING
+ {"subPixels", "SubPixels", XtRString, sizeof(char *),
+ offset(sub_pixels), XtRString, "Unknown"},
+#endif
+ {"noFileArgUseHistory", "NoFileArgUseHistory", XtRBoolean, sizeof(Boolean),
+ offset(no_file_arg_use_history), XtRString, "true"},
+ {"fileHistory", "FileHistory", XtRString, sizeof(char *),
+ offset(file_history), XtRString, (XtPointer) NULL},
+ {"fileHistorySize", "FileHistorySize", XtRInt, sizeof(int),
+ offset(file_history_size), XtRImmediate, (XtPointer)20},
+ {"unique", "Unique", XtRBoolean, sizeof(Boolean),
+ offset(unique), XtRString, "false"},
+ {"listFonts", "ListFonts", XtRBoolean, sizeof(Boolean),
+ offset(list_fonts), XtRString, "false"},
+ {"reverseVideo", "ReverseVideo", XtRBoolean, sizeof(Boolean),
+ offset(reverse), XtRString, "false"},
+ {"warnSpecials", "WarnSpecials", XtRBoolean, sizeof(Boolean),
+ offset(warn_spec), XtRString, "false"},
+ {"hush", "Hush", XtRBoolean, sizeof(Boolean),
+ offset(hush), XtRString, "false"},
+ {"hushLostChars", "HushLostChars", XtRBoolean, sizeof(Boolean),
+ offset(hush_chars), XtRString, "false"},
+ {"hushChecksums", "HushChecksums", XtRBoolean, sizeof(Boolean),
+ offset(hush_chk), XtRString, "false"},
+ {"hushStdout", "HushStdout", XtRBoolean, sizeof(Boolean),
+ offset(hush_stdout), XtRString, "false"},
+ {"hushBell", "HushBell", XtRBoolean, sizeof(Boolean),
+ offset(hush_bell), XtRString, "false"},
+ {"safer", "Safer", XtRBoolean, sizeof(Boolean),
+ offset(safer), XtRString, "false"},
+#ifdef VMS
+ {"foreground", "Foreground", XtRString, sizeof(char *),
+ offset(fore_color), XtRString, (XtPointer) NULL},
+ {"background", "Background", XtRString, sizeof(char *),
+ offset(back_color), XtRString, (XtPointer) NULL},
+#endif
+ {"iconGeometry", "IconGeometry", XtRString, sizeof(char *),
+ offset(icon_geometry), XtRString, (XtPointer) NULL},
+ {"keepPosition", "KeepPosition", XtRBoolean, sizeof(Boolean),
+ offset(keep_flag), XtRString, "false"},
+#ifdef PS
+ {"postscript", "Postscript", XtRInt, sizeof(int),
+ offset(postscript), XtRImmediate, (XtPointer)1},
+ {"allowShell", "AllowShell", XtRBoolean, sizeof(Boolean),
+ offset(allow_shell), XtRString, "false"},
+# ifdef PS_DPS
+ {"dps", "DPS", XtRBoolean, sizeof(Boolean),
+ offset(useDPS), XtRString, "true"},
+# endif
+# ifdef PS_NEWS
+ {"news", "News", XtRBoolean, sizeof(Boolean),
+ offset(useNeWS), XtRString, "true"},
+# endif
+# ifdef PS_GS
+ {"ghostscript", "Ghostscript", XtRBoolean, sizeof(Boolean),
+ offset(useGS), XtRString, "true"},
+ {"gsSafer", "Safer", XtRBoolean, sizeof(Boolean),
+ offset(gs_safer), XtRString, "true"},
+ {"gsAlpha", "Alpha", XtRBoolean, sizeof(Boolean),
+ offset(gs_alpha), XtRString, "false"},
+ {"interpreter", "Interpreter", XtRString, sizeof(char *),
+ offset(gs_path), XtRString, (XtPointer) GS_PATH},
+ {"palette", "Palette", XtRString, sizeof(char *),
+ offset(gs_palette), XtRString, (XtPointer) "Color"},
+ {"gsTimeout", "GSTimeout", XtRInt, sizeof(int),
+ offset(gs_timeout), XtRImmediate, (XtPointer)3000},
+# endif /* PS_GS */
+# ifdef MAGICK
+ {"magick", "ImageMagick", XtRBoolean, sizeof(Boolean),
+ offset(useMAGICK), XtRString, "true"},
+ {"magick_cache", "MagickCache", XtRString, sizeof(char *),
+ offset(magick_cache), XtRString, (XtPointer) NULL},
+# endif
+#endif /* PS */
+ {"prescan", "Prescan", XtRBoolean, sizeof(Boolean),
+ offset(prescan), XtRString, "true"},
+ {"tempFile", "TempFile", XtRBoolean, sizeof(Boolean),
+ offset(use_temp_fp), XtRString, "true"},
+ {"copy", "Copy", XtRBoolean, sizeof(Boolean),
+ offset(copy), XtRString, "false"},
+ {"thorough", "Thorough", XtRBoolean, sizeof(Boolean),
+ offset(thorough), XtRString, "false"},
+ {"fullscreen", "Fullscreen", XtRBoolean, sizeof(Boolean),
+ offset(fullscreen), XtRString, "false"},
+ {"pause", "Pause", XtRBoolean, sizeof(Boolean),
+ offset(pause), XtRString, "false"},
+ {"pauseSpecial", "PauseSpecial", XtRString, sizeof(char *),
+ offset(pause_special), XtRString, (XtPointer)"xdvi:pause"},
+ {"debugLevel", "DebugLevel", XtRString, sizeof(char *),
+ offset(debug_arg), XtRString, (XtPointer) NULL},
+ {"menuTranslations", "MenuTranslations", XtRString, sizeof(char *),
+ offset(menu_translations), XtRString, (XtPointer) default_menu_config},
+ {"watchFile", "WatchFile", XtRFloat, sizeof(float),
+ offset(watch_file), XtRString, "0"},
+ {"expert", "Expert", XtRBoolean, sizeof(Boolean),
+ offset(expert), XtRString, (XtPointer) NULL},
+ {"expertMode", "ExpertMode", XtRInt, sizeof(int),
+ offset(expert_mode), XtRImmediate, (XtPointer)31 /* everything on */ },
+#ifndef MOTIF
+ {"buttonSideSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension),
+ offset(btn_side_spacing), XtRImmediate, (XtPointer) 8},
+ {"buttonTopSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension),
+ offset(btn_top_spacing), XtRImmediate, (XtPointer) 16},
+ {"buttonBetweenSpacing", "ButtonSpacing", XtRDimension, sizeof(Dimension),
+ offset(btn_between_spacing), XtRImmediate, (XtPointer) 8},
+ /* only used if menus consist of buttons only */
+ {"buttonBetweenExtra", "ButtonSpacing", XtRDimension, sizeof(Dimension),
+ offset(btn_between_extra), XtRImmediate, (XtPointer)16},
+ {"buttonBorderWidth", "BorderWidth", XtRDimension, sizeof(Dimension),
+ offset(btn_border_width), XtRImmediate, (XtPointer) 1},
+#endif /* MOTIF */
+ {"statusline", "Statusline", XtRBoolean, sizeof(Boolean),
+ offset(statusline), XtRString, (XtPointer) NULL},
+#ifdef MOTIF
+ {"toolbarTranslations", "ToolbarTranslations", XtRString, sizeof(char *),
+ offset(toolbar_translations), XtRString, (XtPointer) default_toolbar_translations},
+ {"toolbarPixmapFile", "ToolbarPixmapFile", XtRString, sizeof(char *),
+ offset(toolbar_pixmap_file), XtRString, (XtPointer) "toolbar.xpm"},
+ {"toolbarButtonsRaised", "ToolbarButtonsRaised", XtRBoolean, sizeof(Boolean),
+ offset(toolbar_buttons_raised), XtRString, "True"},
+ {"tooltipsInStatusline", "TooltipsInStatusline", XtRBoolean, sizeof(Boolean),
+ offset(tooltips_in_statusline), XtRString, "True"},
+ {"showTooltips", "ShowTooltips", XtRBoolean, sizeof(Boolean),
+ offset(show_tooltips), XtRString, "True"},
+#endif /* MOTIF */
+ {"pageListHighlightCurrent", "PageListHighlightCurrent", XtRBoolean, sizeof(Boolean),
+ offset(pagelist_highlight_current), XtRString, "True"},
+ {"pageListWidth", "PageListWidth", XtRDimension, sizeof(Dimension),
+ offset(pagelist_width), XtRImmediate, (XtPointer) 80},
+ {"magnifierSize1", "MagnifierSize", XtRString, sizeof(char *),
+ offset(mg_arg[0]), XtRString, (XtPointer) NULL},
+ {"magnifierSize2", "MagnifierSize", XtRString, sizeof(char *),
+ offset(mg_arg[1]), XtRString, (XtPointer) NULL},
+ {"magnifierSize3", "MagnifierSize", XtRString, sizeof(char *),
+ offset(mg_arg[2]), XtRString, (XtPointer) NULL},
+ {"magnifierSize4", "MagnifierSize", XtRString, sizeof(char *),
+ offset(mg_arg[3]), XtRString, (XtPointer) NULL},
+ {"magnifierSize5", "MagnifierSize", XtRString, sizeof(char *),
+ offset(mg_arg[4]), XtRString, (XtPointer) NULL},
+#if COLOR
+ {"color", "Color", XtRBoolean, sizeof(Boolean),
+ offset(use_color), XtRString, "true"},
+#endif /* COLOR */
+ {"dvipsPath", "DvipsPath", XtRString, sizeof(char *),
+ offset(dvips_path), XtRString, (XtPointer)DEFAULT_DVIPS_PATH},
+ {"ps2pdfPath", "Ps2PdfPath", XtRString, sizeof(char *),
+ offset(ps2pdf_path), XtRString, (XtPointer)DEFAULT_PS2PDF_PATH},
+ {"dvipsHangTime", "DvipsHangTime", XtRInt, sizeof(int),
+ offset(dvips_hang), XtRImmediate, (XtPointer) -1500},
+ {"dvipsFailHangTime", "DvipsFailHangTime", XtRInt, sizeof(int),
+ offset(dvips_fail_hang), XtRImmediate, (XtPointer) -5000},
+ {"dvipsPrinterString", "DvipsPrinterString", XtRString, sizeof(char *),
+ offset(dvips_printer_str), XtRString, (XtPointer)NULL},
+ {"dvipsOptionsString", "DvipsOptionsString", XtRString, sizeof(char *),
+ offset(dvips_options_str), XtRString, (XtPointer)NULL},
+ {"defaultSavingFormat", "DefaultSavingFormat", XtRInt, sizeof(int),
+ offset(default_saving_format), XtRImmediate, (XtPointer)0},
+ {"defaultPrintingTarget", "DefaultPrintingTarget", XtRInt, sizeof(int),
+ offset(default_printing_target), XtRImmediate, (XtPointer)1},
+#ifdef GREY
+ {"grey", "Grey", XtRBoolean, sizeof(Boolean),
+ offset(use_grey), XtRString, "true"},
+ {"install", "Install", XtRBool3, sizeof(Bool3),
+ offset(install), XtRString, "maybe"},
+#endif /* GREY */
+ {"matchInverted", "MatchInverted", XtRBoolean, sizeof(Boolean),
+ offset(match_highlight_inverted), XtRString, "true"},
+ {"ruleColor", "RuleColor", XtRPixel, sizeof(Pixel),
+ offset(rule_pixel), XtRPixel, (XtPointer) &resource.rule_pixel},
+ {"ruleColor", "RuleColor", XtRString, sizeof(char *),
+ offset(rule_color), XtRString, (XtPointer) NULL},
+ /* linkStyle: style for presenting links:
+ link_style is a bitsmask `xy' with x = color, y = underline, viz.:
+ 0: no highlighting at all
+ 1: underline with linkColor
+ 2: no underlining, text with linkColor
+ 3: underlining and text with linkColor
+ */
+ {"linkStyle", "LinkStyle", XtRInt, sizeof(int),
+ offset(link_style), XtRImmediate, (XtPointer) 3},
+ {"linkColor", "LinkColor", XtRString, sizeof(char *),
+ offset(link_color), XtRString, (XtPointer)LINK_COLOR_FALLBACK},
+ {"visitedLinkColor", "VisitedLinkColor", XtRString, sizeof(char *),
+ offset(visited_link_color), XtRString, (XtPointer)VISITED_LINK_COLOR_FALLBACK},
+ {"wwwBrowser", "WWWBrowser", XtRString, sizeof(char *),
+ offset(browser), XtRString, (XtPointer) NULL},
+#ifdef MOTIF
+ {"prefsBrowserList", "PrefsBrowserList", XtRString, sizeof(char *),
+ offset(prefs_browser_list), XtRString, (XtPointer)Xdvi_PREFS_BROWSER_DEFAULTS },
+ {"prefsEditorList", "PrefsEditorList", XtRString, sizeof(char *),
+ offset(prefs_editor_list), XtRString, (XtPointer)Xdvi_PREFS_EDITOR_DEFAULTS },
+# if USE_COMBOBOX
+ {"searchHistory", "SearchHistory", XtRString, sizeof(char *),
+ offset(search_history), XtRString, (XtPointer)NULL },
+ {"searchHistorySize", "SearchHistorySize", XtRInt, sizeof(int),
+ offset(search_history_size), XtRImmediate, (XtPointer)20},
+# endif
+#endif
+ /* defaults for unknown mime types */
+ {"unknownMimeSuffix", "UnknownMimeSuffix", XtRString, sizeof(char *),
+ offset(unknown_mime_suffix), XtRString, "application/x-unknown"},
+ {"noMimeSuffix", "NoMimeSuffix", XtRString, sizeof(char *),
+ offset(no_mime_suffix), XtRString, "application/x-unknown"},
+ {"anchorPosition", "AnchorPosition", XtRString, sizeof(char *),
+ offset(anchor_pos), XtRString, (XtPointer) NULL},
+ /* bitmask for current search window settings; only used internally! */
+ {"searchWindowDefaults", "SearchWindowDefaults", XtRInt, sizeof(int),
+ offset(search_window_defaults), XtRImmediate, (XtPointer)0},
+ /* whether to open file in new window from file selector (only for DVI files) */
+ {"fileselOpenNewWindow", "FileselOpenNewWindow", XtRBoolean, sizeof(Boolean),
+ offset(filesel_open_new_window), XtRString, "False"},
+ /* resources for help text */
+ {"helpGeneral", "HelpGeneral", XtRString, sizeof(char *),
+ offset(help_general), XtRString, NULL},
+ {"helpHypertex", "HelpHypertex", XtRString, sizeof(char *),
+ offset(help_hypertex), XtRString, NULL},
+ {"helpOthercommands", "HelpOthercommands", XtRString, sizeof(char *),
+ offset(help_othercommands), XtRString, NULL},
+ {"helpMarking", "HelpMarking", XtRString, sizeof(char *),
+ offset(help_marking), XtRString, NULL},
+ {"helpPagemotion", "HelpPagemotion", XtRString, sizeof(char *),
+ offset(help_pagemotion), XtRString, NULL},
+ {"helpMousebuttons", "HelpMousebuttons", XtRString, sizeof(char *),
+ offset(help_mousebuttons), XtRString, NULL},
+ {"helpModes", "HelpModes", XtRString, sizeof(char *),
+ offset(help_modes), XtRString, NULL},
+ {"helpSearch", "HelpSearch", XtRString, sizeof(char *),
+ offset(help_search), XtRString, NULL},
+ {"helpSourcespecials", "HelpSoucespecials", XtRString, sizeof(char *),
+ offset(help_sourcespecials), XtRString, NULL},
+#ifdef GREY
+ {"pageHistorySize", "PageHistorySize", XtRInt, sizeof(int),
+ offset(page_history_size), XtRImmediate, (XtPointer)1000},
+};
+
+static XtResource app_pixel_resources[] = { /* get these later */
+#endif /* GREY */
+ {"foreground", "Foreground", XtRPixel, sizeof(Pixel),
+ offset(fore_Pixel), XtRString, XtDefaultForeground},
+ {"background", "Background", XtRPixel, sizeof(Pixel),
+ offset(back_Pixel), XtRString, XtDefaultBackground},
+ /* {"borderColor", "BorderColor", XtRPixel, sizeof(Pixel), */
+ /* offset(brdr_Pixel), XtRPixel, (XtPointer) &resource.fore_Pixel}, */
+ {"highlight", "Highlight", XtRPixel, sizeof(Pixel),
+ offset(hl_Pixel), XtRPixel, (XtPointer) &resource.fore_Pixel},
+ {"cursorColor", "CursorColor", XtRPixel, sizeof(Pixel),
+ offset(cr_Pixel), XtRImmediate, (XtPointer)ULONG_MAX},
+};
+#undef offset
+
+
+#ifndef MOTIF
+
+# ifdef NOQUERY
+# define drawWidgetClass widgetClass
+# else
+
+static XtGeometryResult
+QueryGeometry(Widget w,
+ XtWidgetGeometry *constraints,
+ XtWidgetGeometry *reply)
+{
+ UNUSED(w);
+ UNUSED(constraints);
+ reply->request_mode = CWWidth | CWHeight;
+ reply->width = globals.page.w;
+ reply->height = globals.page.h;
+
+ return XtGeometryAlmost;
+}
+
+# include <X11/IntrinsicP.h>
+# include <X11/CoreP.h>
+
+/* if the following gives you trouble, just compile with -DNOQUERY */
+static WidgetClassRec drawingWidgetClass = {
+ {
+ /* superclass */ &widgetClassRec,
+ /* class_name */ "Draw",
+ /* widget_size */ sizeof(WidgetRec),
+ /* class_initialize */ NULL,
+ /* class_part_initialize */ NULL,
+ /* class_inited */ FALSE,
+ /* initialize */ NULL,
+ /* initialize_hook */ NULL,
+ /* realize */ XtInheritRealize,
+ /* actions */ NULL,
+ /* num_actions */ 0,
+ /* resources */ NULL,
+ /* num_resources */ 0,
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ FALSE,
+ /* compress_exposure */ TRUE,
+ /* compress_enterleave */ FALSE,
+ /* visible_interest */ FALSE,
+ /* destroy */ NULL,
+ /* resize */ XtInheritResize,
+ /* expose */ XtInheritExpose,
+ /* set_values */ NULL,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ XtInheritAcceptFocus,
+ /* version */ XtVersion,
+ /* callback_offsets */ NULL,
+ /* tm_table */ XtInheritTranslations,
+ /* query_geometry */ QueryGeometry,
+ /* display_accelerator */ XtInheritDisplayAccelerator,
+ /* extension */ NULL
+ }
+};
+
+# define drawWidgetClass &drawingWidgetClass
+
+# endif /* NOQUERY */
+#endif /* not MOTIF */
+
+
+int
+atopix(const char *arg)
+{
+ int len = strlen(arg);
+ const char *arg_end = arg;
+ char tmp[16];
+ double factor, val;
+
+ while ((*arg_end >= '0' && *arg_end <= '9') || *arg_end == '.')
+ ++arg_end;
+
+ if (arg_end >= arg + XtNumber(tmp) - 1) { /* should be rare */
+ char *tmp_var = xstrndup(arg, arg_end - arg);
+ val = atof(tmp_var);
+ free(tmp_var);
+ }
+ else {
+ memcpy(tmp, arg, arg_end - arg);
+ tmp[arg_end - arg] = '\0';
+ val = atof(tmp);
+ }
+
+#if A4
+ factor = 1.0 / 2.54; /* cm */
+#else
+ factor = 1.0; /* inches */
+#endif
+ if (len > 2)
+ switch (arg[len - 2] << 8 | arg[len - 1]) {
+#if A4
+ case 'i' << 8 | 'n':
+ factor = 1.0;
+ break;
+#else
+ case 'c' << 8 | 'm':
+ factor = 1.0 / 2.54;
+ break;
+#endif
+ case 'm' << 8 | 'm':
+ factor = 1.0 / 25.4;
+ break;
+ case 'p' << 8 | 't':
+ factor = 1.0 / 72.27;
+ break;
+ case 'p' << 8 | 'c':
+ factor = 12.0 / 72.27;
+ break;
+ case 'b' << 8 | 'p':
+ factor = 1.0 / 72.0;
+ break;
+ case 'd' << 8 | 'd':
+ factor = 1238.0 / 1157.0 / 72.27;
+ break;
+ case 'c' << 8 | 'c':
+ factor = 12 * 1238.0 / 1157.0 / 72.27;
+ break;
+ case 's' << 8 | 'p':
+ factor = 1.0 / 72.27 / 65536;
+ break;
+ }
+
+ return factor * val * resource.pixels_per_inch + 0.5;
+}
+
+int
+atopix_signed(const char *arg)
+{
+ return *arg == '-' ? -atopix(arg + 1) : atopix(arg);
+}
+
+#if CHECK_APP_FILEVERSION
+static void
+check_app_defaults_fileversion(void)
+{
+ /* update this when new essential resources are introduced */
+ static const int required_version = 20030303;
+
+ if (resource.app_defaults_fileversion < required_version) {
+ const char *filename = kpse_find_file("XDvi", kpse_program_text_format, 0);
+ if (filename == NULL)
+ filename = "XDvi";
+
+ fprintf(stderr, "filename: %d\n", resource.app_defaults_fileversion);
+ popup_message(globals.widgets.top_level,
+ MSG_WARN,
+ NULL,
+ "Your application defaults file `%s' is outdated. "
+ "This version of xdvi requires a file "
+ "with date >= %d. Your file is older, or doesn't have a date.\n"
+ "Please obtain a new version of the file `XDvi', e.g. from:\n"
+ "http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/xdvi/xdvik/texk/xdvik/texmf/\n"
+ "and copy it to a directory in your $XDVIINPUTS path.",
+ filename, required_version);
+ }
+}
+#endif
+
+
+
+#ifdef GREY
+static Arg temp_args1[] = {
+ {XtNdepth, (XtArgVal) 0},
+ {XtNvisual, (XtArgVal) 0},
+ {XtNcolormap, (XtArgVal) 0},
+};
+
+/*
+ * Alternate routine to convert color name to Pixel (needed to substitute
+ * "black" or "white" for BlackPixelOfScreen, etc., since a different visual
+ * and colormap are in use).
+ */
+
+static Boolean
+XdviCvtStringToPixel(Display *dpy,
+ XrmValuePtr args, Cardinal *num_args,
+ XrmValuePtr fromVal, XrmValuePtr toVal,
+ XtPointer *closure_ret)
+{
+ XrmValue replacement_val;
+ Boolean default_is_fg;
+
+ if ((strcmp((String) fromVal->addr, XtDefaultForeground) == 0
+ && (default_is_fg = True, True))
+ || (strcmp((String) fromVal->addr, XtDefaultBackground) == 0
+ && ((default_is_fg = False), True))) {
+ replacement_val.size = sizeof(String);
+ replacement_val.addr = (default_is_fg == resource.reverse)
+ ? "white" : "black";
+ fromVal = &replacement_val;
+ }
+
+ return XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret);
+}
+
+#endif
+
+
+/*
+ * Set the `sourceposition' propery of the window `w' to `source_str'.
+ * This is usually done in `client' mode to notify the instance of
+ * xdvi running in window `w' to start a forward search. After this,
+ * the client usually exits normally.
+ */
+static void
+set_sourceposition_property(const char *source_str, Window win)
+{
+ /* parse the special in order to expand the filename */
+ struct src_parsed_special data;
+ char *new_special = NULL;
+ char *expanded_filename = NULL;
+
+ data.filename_len = 0;
+ data.filename = NULL;
+
+ src_parse(source_str, strlen(source_str), &data);
+
+ if (data.filename_len == 0) {
+ /* can't give a GUI warning in `client' mode - just exit with error */
+ XDVI_FATAL((stderr,
+ "Filename missing in -sourceposition argument (%s)!",
+ source_str));
+ }
+
+ TRACE_CLIENT((stderr, "got data: line %d, col %d, file |%s|, len %lu\n",
+ data.line, data.col, data.filename, (unsigned long)data.filename_len));
+
+ /* expand -sourceposition argument if it contains a path component.
+ We don't use REALPATH here, because `tex -src' doesn't expand
+ symlinks either. Instead, use canonicalize_path() to expand
+ `../' and './' manually. */
+ if (strchr(data.filename, '/') != NULL
+ && (expanded_filename = expand_filename(data.filename, USE_CWD_PATH)) != NULL) {
+ char *tmp = canonicalize_path(expanded_filename);
+ free(data.filename);
+ free(expanded_filename);
+ expanded_filename = tmp;
+ }
+ else
+ expanded_filename = data.filename;
+
+ TRACE_CLIENT((stderr, "expanded1: |%s|\n", expanded_filename));
+
+ new_special = xmalloc(2 * LENGTH_OF_INT + 2 /* 2 for `:' and separating space */
+ + strlen(expanded_filename) + 1);
+ sprintf(new_special, "%d:%d %s", data.line, data.col, expanded_filename);
+ free(expanded_filename);
+
+ TRACE_CLIENT((stderr, "matched!"));
+ set_string_property(new_special, atom_src_goto(), win);
+ free(new_special);
+ set_string_property("", atom_raise(), win);
+}
+
+static void
+set_stringsearch_property(const char *str, Window win)
+{
+ set_string_property(str, atom_find_string(), win);
+ set_string_property("", atom_raise(), win);
+}
+
+
+
+/* Translation of valid paper types to dimensions,
+ which are used internally. The newline characters are a hack
+ to format the list neatly for error messages.
+ A* series measures are taken from
+ http://www.cl.cam.ac.uk/~mgk25/iso-paper.html
+*/
+static const char *paper_types[] = {
+ "us", "8.5x11in",
+ "letter", "8.5x11in", /* dvips compatibility */
+ "ledger", "17x11in", /* dvips compatibility */
+ "tabloid", "11x17in", /* dvips compatibility */
+ "usr", "11x8.5in",
+ "legal", "8.5x14in",
+ "legalr", "14x8.5in",
+ "foolscap", "13.5x17.0in", /* ??? */
+ "foolscapr", "17.0x13.5in",
+ "", "0",
+
+ /* ISO `A' formats, Portrait */
+ "a0", "841x1189mm",
+ "a1", "594x841mm",
+ "a2", "420x594mm",
+ "a3", "297x420mm",
+ "a4", "210x297mm",
+ "a5", "148x210mm",
+ "a6", "105x148mm",
+ "a7", "74x105mm",
+ "a8", "52x74mm",
+ "a9", "37x52mm",
+ "a10","26x37mm",
+ "", "0",
+
+ /* ISO `A' formats, Landscape */
+ "a0r", "1189x841mm",
+ "a1r", "841x594mm",
+ "a2r", "594x420mm",
+ "a3r", "420x297mm",
+ "a4r", "297x210mm",
+ "a5r", "210x148mm",
+ "a6r", "148x105mm",
+ "a7r", "105x74mm",
+ "a8r", "74x52mm",
+ "a9r", "52x37mm",
+ "a10r","37x26mm",
+ "", "0",
+
+ /* ISO `B' formats, Portrait */
+ "b0", "1000x1414mm",
+ "b1", "707x1000mm",
+ "b2", "500x707mm",
+ "b3", "353x500mm",
+ "b4", "250x353mm",
+ "b5", "176x250mm",
+ "b6", "125x176mm",
+ "b7", "88x125mm",
+ "b8", "62x88mm",
+ "b9", "44x62mm",
+ "b10","31x44mm",
+ "", "0",
+
+ /* ISO `B' formats, Landscape */
+ "b0r", "1414x1000mm",
+ "b1r", "1000x707mm",
+ "b2r", "707x500mm",
+ "b3r", "500x353mm",
+ "b4r", "353x250mm",
+ "b5r", "250x176mm",
+ "b6r", "176x125mm",
+ "b7r", "125x88mm",
+ "b8r", "88x62mm",
+ "b9r", "62x44mm",
+ "b10r","44x31mm",
+ "", "0",
+
+ /* ISO `C' formats, Portrait */
+ "c0", "917x1297mm",
+ "c1", "648x917mm",
+ "c2", "458x648mm",
+ "c3", "324x458mm",
+ "c4", "229x324mm",
+ "c5", "162x229mm",
+ "c6", "114x162mm",
+ "c7", "81x114mm",
+ "c8", "57x81mm",
+ "c9", "40x57mm",
+ "c10","28x40mm",
+ "", "0",
+
+ /* ISO `C' formats, Landscape */
+ "c0r", "1297x917mm",
+ "c1r", "917x648mm",
+ "c2r", "648x458mm",
+ "c3r", "458x324mm",
+ "c4r", "324x229mm",
+ "c5r", "229x162mm",
+ "c6r", "162x114mm",
+ "c7r", "114x81mm",
+ "c8r", "81x57mm",
+ "c9r", "57x40mm",
+ "c10r","40x28mm",
+};
+
+/* access methods for paper_types */
+const char **get_paper_types(void) {
+ return paper_types;
+}
+
+size_t get_paper_types_size(void) {
+ return XtNumber(paper_types);
+}
+
+/* Set the icon name and title name standard properties on `globals.widgets.top_level'.
+ * We use the basename of the DVI file (without the .dvi), so different xdvi
+ * invocations can be distinguished, yet do not use up too much real estate.
+ *
+ * This function returns freshly allocated memory in *icon_name and *title_name
+ * which the caller is responsible for free()ing again.
+ */
+void
+get_icon_and_title(const char *filename, char **icon_name, char **title_name)
+{
+ /* Use basename of DVI file for name in icon and title. */
+ const char *ptr;
+ char *ptr2;
+
+ /* SU 2000/12/16: added page number information */
+ const char *const title_name_fmt = "%s: %s (%d page%s)";
+
+ MYTRACE((stderr, "get_icon_and_title called with: |%s|", filename));
+
+ ptr = strrchr(filename, '/');
+ if (ptr != NULL)
+ ++ptr;
+ else {
+ ptr = filename;
+ }
+
+ /*
+ * Remove the `file:' prefix from the icon name; since some windowmanagers
+ * only display a prefix in window lists etc., it's more significant this
+ * way.
+ */
+
+ if (memcmp(ptr, "file:", 5) == 0) {
+ ptr += 5;
+ }
+ *icon_name = xstrdup(ptr);
+
+ MYTRACE((stderr, "before chopping: icon_name: |%s|", *icon_name));
+ if ((ptr2 = strstr(*icon_name, ".dvi")) != NULL) {
+ /* chop off .dvi extension */
+ *ptr2 = '\0';
+ }
+ MYTRACE((stderr, "after chopping: icon_name: |%s|", *icon_name));
+
+ *title_name = xmalloc(strlen(title_name_fmt)
+ + strlen(XDVIK_PROGNAME)
+ + strlen(*icon_name)
+ + LENGTH_OF_INT
+ + 2); /* 2 for additional plural `s' */
+ MYTRACE((stderr, "total_pages: %d", total_pages));
+ sprintf(*title_name, title_name_fmt, XDVIK_PROGNAME, *icon_name, total_pages,
+ (total_pages > 1) ? "s" : "");
+
+ MYTRACE((stderr, "title_name, icon_name: |%s|%s|", *title_name, *icon_name));
+}
+
+void
+set_icon_and_title(const char *icon_name, const char *title_name)
+{
+ if (!XtIsRealized(globals.widgets.top_level)) {
+ MYTRACE((stderr, "set_icon_and_title: returning"));
+ return;
+ }
+ XtVaSetValues(globals.widgets.top_level, XtNtitle, (XtArgVal) title_name, XtNiconName, (XtArgVal) icon_name, NULL);
+ XSetStandardProperties(DISP, XtWindow(globals.widgets.top_level), title_name, icon_name,
+ (Pixmap) 0, NULL, 0, NULL);
+}
+
+static void
+get_window_constraints(XtWidgetGeometry *reply,
+ Dimension screen_w, Dimension screen_h,
+ int *add_h)
+{
+ XtWidgetGeometry constraints;
+
+ constraints.request_mode = reply->request_mode = 0;
+
+ /* fprintf(stderr, "setting constraints.width to %d\n", globals.page.w); */
+ constraints.width = globals.page.w;
+ if (globals.page.w > screen_w) {
+ constraints.request_mode |= CWWidth;
+ constraints.width = screen_w;
+ }
+
+/* fprintf(stderr, "setting constraints.height to %d; screen_h = %d\n", globals.page.h, screen_h); */
+ constraints.height = globals.page.h;
+ if (constraints.height > screen_h) {
+ constraints.request_mode |= CWHeight;
+ constraints.height = screen_h;
+ }
+
+ if (constraints.request_mode != 0
+ && constraints.request_mode != (CWWidth | CWHeight)) {
+#ifdef MOTIF
+ (void)XtQueryGeometry(globals.widgets.main_window, &constraints, reply);
+#else
+ (void)XtQueryGeometry(globals.widgets.vport_widget, &constraints, reply);
+#endif
+ }
+/* fprintf(stderr, "reply height: %d; screen_h: %d; add_h: %d\n", reply->height, screen_h, *add_h); */
+ if (!(reply->request_mode & CWWidth))
+ reply->width = constraints.width;
+ if (reply->width >= screen_w)
+ reply->width = screen_w;
+ if (!(reply->request_mode & CWHeight)) {
+ reply->height = constraints.height - 2 * bwidth;
+ }
+
+ if (reply->height + *add_h >= screen_h) {
+ reply->height = screen_h
+#ifdef MOTIF
+ - 1.5
+#else
+ - 2
+#endif
+ * *add_h - 2 * bwidth;
+ }
+}
+
+void
+set_windowsize(Dimension *ret_w, Dimension *ret_h, int add_w, int add_h, Boolean override)
+{
+ static Arg set_wh_args[] = {
+ {XtNwidth, (XtArgVal) 0},
+ {XtNheight, (XtArgVal) 0},
+ };
+ Dimension screen_w, screen_h;
+
+ const char *test_geometry = resource.geometry;
+
+ if (resource.fullscreen) {
+ Dimension w = WidthOfScreen(SCRN), h = HeightOfScreen(SCRN);
+
+ if (currwin.shrinkfactor == 0) { /* if not set by user */
+ Dimension height_factor = ROUNDUP(globals.page.unshrunk_h, h);
+ currwin.shrinkfactor = ROUNDUP(globals.page.unshrunk_w, w);
+ if (height_factor >= currwin.shrinkfactor)
+ currwin.shrinkfactor = height_factor;
+ /* fprintf(stderr, "factor was 0, using %d\n", currwin.shrinkfactor); */
+ }
+ /* else */
+ /* fprintf(stderr, "factor != 0, using %d\n", currwin.shrinkfactor); */
+
+ mane.shrinkfactor = currwin.shrinkfactor;
+ init_page();
+ set_wh_args[0].value = (XtArgVal)w;
+ set_wh_args[1].value = (XtArgVal)h;
+ *ret_w = w;
+ *ret_h = h;
+#ifdef MOTIF
+#if USE_XAW_PANNER
+ XtVaGetValues(globals.widgets.main_window, XmNshadowThickness, &g_save_shadow_thickness, NULL);
+#endif
+ XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, 0, NULL);
+#endif
+ XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args));
+ }
+ else if (override) {
+ set_wh_args[0].value = (XtArgVal)*ret_w;
+ set_wh_args[1].value = (XtArgVal)*ret_h;
+ XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args));
+ }
+ else { /* determine a window size that fits the current shrink factor */
+ Arg temp_args3 = { XtNborderWidth, (XtArgVal)&bwidth };
+ XtWidgetGeometry reply;
+
+ XtGetValues(globals.widgets.top_level, &temp_args3, 1); /* get border width */
+ screen_w = WidthOfScreen(SCRN) - 2 * bwidth;
+
+ screen_w -= add_w;
+ /* screen_h = HeightOfScreen(SCRN) - 2 * bwidth - get_statusline_height() - 6; */
+ screen_h = HeightOfScreen(SCRN) - 2 * bwidth;
+ for (;;) { /* actually, at most two passes */
+ Dimension height_factor;
+
+ TRACE_GUI((stderr, "geometry: |%s|; remember: %d, windowsize: %s",
+ resource.geometry ? resource.geometry : "<NULL>",
+ resource.remember_windowsize,
+ resource.windowsize ? resource.windowsize : "<NULL>"));
+
+ if (resource.geometry == NULL && !resource.remember_windowsize) {
+ /* geometry not set by user, try to find geometry that fits the shrink factor */
+ get_window_constraints(&reply, screen_w, screen_h, &add_h);
+ TRACE_GUI((stderr, "w: %d, h: %d, add_h: %d, reply: %d x %d",
+ screen_w, screen_h, add_h, reply.width, reply.height));
+ }
+ else {
+ int x, y;
+ unsigned int width, height;
+ int flags;
+
+ if (resource.remember_windowsize && resource.windowsize != NULL)
+ test_geometry = resource.windowsize;
+ else
+ test_geometry = resource.geometry;
+ flags = XParseGeometry(test_geometry, &x, &y, &width, &height);
+
+ if (!(flags & WidthValue) || !(flags & HeightValue)) {
+ /* no geometry specified, use fallback */
+ get_window_constraints(&reply, screen_w, screen_h, &add_h);
+ }
+
+ /* warn about bad values */
+ if (flags & WidthValue) {
+ if (width > (unsigned int)(2 * bwidth + add_w)) {
+ TRACE_GUI((stderr, "width: %u, bwidth: %hu, add_w: %d",
+ width, bwidth, add_w));
+ reply.width = width - 2 * bwidth - add_w;
+ }
+ else {
+ reply.width = width;
+ }
+ }
+ if (flags & HeightValue) {
+ if (height > (unsigned int)(2 * bwidth + add_h)) {
+ TRACE_GUI((stderr, "height: %u, bwidth: %hu, add_h: %d",
+ height, bwidth, add_h));
+ reply.height = height - 2 * bwidth - add_h;
+ }
+ else {
+ reply.height = height;
+ }
+ }
+ TRACE_GUI((stderr, "setting geometry: %dx%d", (int)reply.width, (int)reply.height));
+ }
+
+ /* now reply.{width,height} contain max. usable window size */
+
+ /* User didn't use `-s 0', use either default or other user-specified value */
+ if (currwin.shrinkfactor != 0) {
+ /* fprintf(stderr, "factor != 0, using %d\n", currwin.shrinkfactor); */
+ break;
+ }
+ /* else { */
+ /* fprintf(stderr, "factor was 0, using %d\n", currwin.shrinkfactor); */
+ /* } */
+
+ /* else, try to find a suitable shrink factor: */
+ currwin.shrinkfactor = ROUNDUP(globals.page.unshrunk_w, reply.width - 2);
+ /* fprintf(stderr, "factor w: %d\n", currwin.shrinkfactor); */
+
+ height_factor = ROUNDUP(globals.page.unshrunk_h, reply.height - 2);
+ /* fprintf(stderr, "factor h: %d\n", height_factor); */
+ if (height_factor >= currwin.shrinkfactor)
+ currwin.shrinkfactor = height_factor;
+
+ /* fprintf(stderr, "factor now is: %d\n", currwin.shrinkfactor); */
+
+ mane.shrinkfactor = currwin.shrinkfactor;
+ init_page();
+ set_wh_args[0].value = (XtArgVal)globals.page.w;
+ set_wh_args[1].value = (XtArgVal)globals.page.h;
+ *ret_w = globals.page.w;
+ *ret_h = globals.page.h;
+ XtSetValues(globals.widgets.draw_widget, set_wh_args, XtNumber(set_wh_args));
+ }
+#ifdef MOTIF
+ /*
+ SU 2002/11/23: Added scrollbar width to height computation.
+ Otherwise, when the vertical space isn't sufficient, a
+ vertical scrollbar will be added, but since this makes the
+ display narrower, a horizontal scrollbar will be added as
+ well, even if this wouldn't be neccessary.
+
+ SU 2003/09/30: Apparently the size computation works now, even
+ though I'm not sure why (scrollbar value isn't in add_w). Investigate.
+ */
+ /* HACK ALERT: 4 for window decoration borders - FIXME: get actual values?? */
+ set_wh_args[0].value = reply.width + add_w + (test_geometry == NULL ? 4 : 0);
+ set_wh_args[1].value = reply.height + add_h + (test_geometry == NULL ? 4 : 0);
+ XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args));
+
+#else /* MOTIF */
+
+ set_wh_args[0].value = reply.width + add_w + 2 * bwidth; /* + (test_geometry == NULL ? 15 : (2 * bwidth)); */
+ /*
+ FIXME: use real height of statusline here
+ Somehow I didn't manage to use XtVaCreateWidget in a call to
+ create_statusline() above, and XtManageChild() below.
+ In that case, we could do without get_statusline_height().
+ */
+ set_wh_args[1].value = reply.height + (test_geometry == NULL ? (2 * bwidth + add_h) : 0);
+ XtSetValues(globals.widgets.top_level, set_wh_args, XtNumber(set_wh_args));
+ set_wh_args[0].value -= add_w;
+ XtSetValues(globals.widgets.vport_widget, set_wh_args, XtNumber(set_wh_args));
+
+#endif /* MOTIF */
+ *ret_w = set_wh_args[0].value;
+ *ret_h = set_wh_args[1].value;
+ TRACE_GUI((stderr, "returning: w=%d, h=%d", *ret_w, *ret_h));
+ }
+}
+
+static void
+net_wm_toggle_fullscreen(int flag)
+{
+ Atom NET_WM_FULLSCREEN = XInternAtom(DISP, "_NET_WM_STATE_FULLSCREEN", True);
+
+ if (NET_WM_FULLSCREEN) {
+ XEvent ev;
+ Atom NET_WM_STATE = XInternAtom(DISP, "_NET_WM_STATE", False);
+
+ /* XDVI_INFO((stdout, "trying _NET_WM_STATE_FULLSCREEN ...")); */
+
+ ev.type = ClientMessage;
+ ev.xclient.serial = 0;
+ ev.xclient.send_event = True;
+ ev.xclient.display = DISP;
+ ev.xclient.window = XtWindow(globals.widgets.top_level);
+ ev.xclient.message_type = NET_WM_STATE;
+ ev.xclient.format = 32;
+ ev.xclient.data.l[0] = flag; /* _NET_WM_STATE_REMOVE (0) or _NET_WM_STATE_ADD (1) */
+ ev.xclient.data.l[1] = NET_WM_FULLSCREEN;
+ ev.xclient.data.l[2] = 0L;
+
+ XSendEvent(DISP, DefaultRootWindow(DISP), False,
+ SubstructureNotifyMask, &ev);
+ }
+ else {
+ XDVI_INFO((stdout, "_NET_WM_STATE_FULLSCREEN not supported by this window manager."));
+ }
+}
+
+void
+reconfigure_window(Boolean fullscreen, Dimension width, Dimension height,
+ Boolean save_position)
+{
+ static int x_old = 5, y_old = 15;
+#ifdef SIZECONFIGURE_WORKS
+ int sizeconfiguremask;
+ XWindowChanges sizeconfigure;
+#endif /* SIZECONFIGURE_WORKS */
+#ifdef MOTIF
+ static int save_wm_decorations;
+#else
+ static struct PropMotifWmHints MWMHints = {MWM_HINTS_DECORATIONS, 0, 0, 0, 0};
+ Atom WM_HINTS = XInternAtom(DISP, "_MOTIF_WM_HINTS", True);
+#endif
+ int x, y;
+
+#ifdef SIZECONFIGURE_WORKS
+ sizeconfiguremask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
+ sizeconfigure.width = width;
+ sizeconfigure.height = height;
+#endif /* SIZECONFIGURE_WORKS */
+
+ if (fullscreen) {
+#if 0
+ static Boolean first_time = True;
+ /* offsets between the raw window and the decorated window */
+ static int wm_x_offset = 0;
+ static int wm_y_offset = 0;
+#endif
+ Window dummy;
+
+#ifdef SIZECONFIGURE_WORKS
+ sizeconfigure.x = 0;
+ sizeconfigure.y = 0;
+ sizeconfigure.border_width = 0;
+#endif /* SIZECONFIGURE_WORKS */
+
+ /* Note ZLB: avoid to call XTranslateCoordinates if the window is
+ not yet mapped since XTranslateCoordinates implicitly maps the
+ window (note: calling the function XGetWindowAttributes also
+ makes the window mapped).
+
+ This effectively eliminates the flashing effect when xdvik is
+ started in fullscreen mode for the Motif version. For the Xaw
+ version we still get flashing effect (seems that the window is
+ already mapped). */
+
+ if (save_position) {
+ /* save current window coordinates so that we can change them back */
+ (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level),
+ RootWindowOfScreen(SCRN),
+ 0, 0,
+ &x_old, &y_old,
+ &dummy);
+#if 0
+ if (first_time) {
+ first_time = False;
+ /* This is a hack for finding out wm_x_offset, wm_y_offset */
+ XMoveWindow(DISP, XtWindow(globals.widgets.top_level), 0, 0);
+ XSync(DISP, False);
+ (void)XTranslateCoordinates(DISP, XtWindow(globals.widgets.top_level),
+ RootWindowOfScreen(SCRN),
+ 0, 0, &wm_x_offset, &wm_y_offset,
+ &dummy);
+ fprintf(stderr, "wm offset = (%d,%d)\n",
+ wm_x_offset, wm_y_offset);
+ }
+ x_old -= wm_x_offset;
+ y_old -= wm_y_offset;
+#endif
+ }
+
+ x = y = 0;
+
+#ifdef MOTIF
+ XtVaGetValues(globals.widgets.top_level, XmNmwmDecorations, &save_wm_decorations, NULL);
+ /* FIXME: this doesn't work e.g. with KDE */
+ XtVaSetValues(globals.widgets.top_level,
+ XmNmwmDecorations, 0,
+ XmNgeometry, "+0+0",
+ NULL);
+ XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, 0, NULL);
+#else
+ MWMHints.decorations = 0;
+ if (WM_HINTS != None) {
+ XChangeProperty(DISP, XtWindow(globals.widgets.top_level),
+ WM_HINTS, WM_HINTS, 32,
+ PropModeReplace, (unsigned char *)&MWMHints,
+ sizeof(MWMHints) / 4);
+ }
+#endif
+ /* SU: apparently some new standard that is supposed to work
+ with some WMs ... but it doesn't with my versions of Gnome and KDE. */
+ net_wm_toggle_fullscreen(1);
+
+#ifdef SIZECONFIGURE_WORKS
+ XConfigureWindow(DISP, XtWindow(globals.widgets.top_level), sizeconfiguremask, &sizeconfigure);
+#endif /* SIZECONFIGURE_WORKS */
+ }
+ else {
+#ifdef SIZECONFIGURE_WORKS
+ sizeconfiguremask = CWWidth | CWHeight | CWX | CWY;
+ sizeconfigure.x = x_old;
+ sizeconfigure.y = y_old;
+ sizeconfigure.border_width = 20;
+#endif /* SIZECONFIGURE_WORKS */
+ XtVaSetValues(globals.widgets.top_level, XtNx, x_old, XtNy, y_old, NULL);
+#ifdef MOTIF
+ XtVaSetValues(globals.widgets.top_level, XmNmwmDecorations, save_wm_decorations, NULL);
+#if USE_XAW_PANNER
+ XtVaSetValues(globals.widgets.main_window, XmNshadowThickness, g_save_shadow_thickness, NULL);
+#endif
+#else
+ MWMHints.decorations = MWM_DECOR_ALL;
+ if (WM_HINTS != None) {
+ XChangeProperty(DISP, XtWindow(globals.widgets.top_level),
+ WM_HINTS, WM_HINTS, 32,
+ PropModeReplace, (unsigned char *)&MWMHints,
+ sizeof(MWMHints) / 4);
+ }
+#endif
+ net_wm_toggle_fullscreen(0);
+
+ x = x_old;
+ y = y_old;
+ }
+
+#if 1
+#if 0
+ XUnmapWindow(DISP, XtWindow(globals.widgets.top_level));
+#else
+ XWithdrawWindow(DISP, XtWindow(globals.widgets.top_level), XScreenNumberOfScreen(SCRN));
+#endif
+
+ /* Note ZLB: Placing XResizeWindow before XUnmapWindow or after XMapWindow
+ makes the fullscreen window size smaller than the screen size when
+ using `mwm' of Lesstif */
+ XSetWindowBorderWidth(DISP, XtWindow(globals.widgets.top_level), 0);
+ XResizeWindow(DISP, XtWindow(globals.widgets.top_level), width, height);
+
+ XMapRaised(DISP, XtWindow(globals.widgets.top_level));
+
+ /* Note ZLB: XMapWindow might change the window position with some WMs
+ (like Sawfish), so we place the window position after it's mapped. */
+ XMoveWindow(DISP, XtWindow(globals.widgets.top_level), x, y);
+#endif /* 0 */
+
+ /* need to redraw the page to avoid artifacts */
+ globals.ev.flags |= EV_NEWPAGE;
+ XFlush(DISP);
+}
+
+
+/*
+ * Parse colors from resource.{visited_}link_color, saving them
+ * to g_{visited_}link_color and {visited_}link_pix.
+ */
+static void
+get_link_colors(Pixel *link_pix, Pixel *visited_link_pix)
+{
+ XrmValue from1, from2, to1, to2;
+
+ XColor exact, approx;
+ double r, g, b;
+ double factor = 65535.0;
+ int ret;
+
+ /* get rgb values from color for links */
+ if ((ret = XLookupColor(DISP, G_colormap,
+ resource.link_color,
+ &exact, &approx)) != 0) {
+ }
+ else {
+ XDVI_WARNING((stderr, "XLookupColor failed for resource.link_color \"%s\"\n"
+ "- using fallback color \"%s\".",
+ resource.visited_link_color, LINK_COLOR_FALLBACK));
+ XLookupColor(DISP, G_colormap, LINK_COLOR_FALLBACK, &exact, &approx);
+ }
+
+#if 0
+ fprintf(stderr, "lookup color for %s returned: %d, %d, %d\n",
+ resource.link_color, exact.red, exact.green, exact.blue);
+#endif
+ r = exact.red / factor;
+ g = exact.green / factor;
+ b = exact.blue / factor;
+ g_link_color_rgb = xmalloc(strlen("push rgb 0.00 0.00 0.00") + 1);
+ sprintf(g_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b);
+
+ /* same for visited links */
+ if ((ret = XLookupColor(DISP, G_colormap,
+ resource.visited_link_color,
+ &exact, &approx)) != 0) {
+ }
+ else {
+ XDVI_WARNING((stderr, "XLookupColor failed for resource.visited_link_color \"%s\"\n"
+ "- using fallback color \"%s\".",
+ resource.visited_link_color, VISITED_LINK_COLOR_FALLBACK));
+ XLookupColor(DISP, G_colormap, VISITED_LINK_COLOR_FALLBACK, &exact, &approx);
+ }
+
+#if 0
+ fprintf(stderr, "lookup color for %s returned: %d, %d, %d\n",
+ resource.visited_link_color, exact.red, exact.green, exact.blue);
+#endif
+ r = exact.red / factor;
+ g = exact.green / factor;
+ b = exact.blue / factor;
+ g_visited_link_color_rgb = xmalloc(strlen("push rgb 0.00 0.00 0.00") + 1);
+ sprintf(g_visited_link_color_rgb, "push rgb %.2f %.2f %.2f", r, g, b);
+
+ /* 2nd part: Create CG for the underlines. */
+ from1.addr = resource.link_color;
+ from1.size = strlen(from1.addr) + 1;
+ to1.addr = (XtPointer)link_pix;
+ to1.size = sizeof(Pixel);
+ if (!XtConvertAndStore(globals.widgets.top_level, XtRString, &from1, XtRPixel, &to1)) {
+ XDVI_WARNING((stderr, "String to pixel conversion failed for resource.link_color \"%s\"\n"
+ "- using fallback color \"%s\".",
+ resource.link_color, LINK_COLOR_FALLBACK));
+ from1.addr = LINK_COLOR_FALLBACK;
+ from1.size = strlen(from1.addr) + 1;
+ to1.addr = (XtPointer)link_pix;
+ to1.size = sizeof(Pixel);
+ XtConvertAndStore(globals.widgets.top_level, XtRString, &from1, XtRPixel, &to1);
+ }
+ from2.addr = resource.visited_link_color;
+ from2.size = strlen(from2.addr) + 1;
+ to2.addr = (XtPointer)visited_link_pix;
+ to2.size = sizeof(Pixel);
+ if (!XtConvertAndStore(globals.widgets.top_level, XtRString, &from2, XtRPixel, &to2)) {
+ XDVI_WARNING((stderr, "String to pixel conversion failed for resource.visited_link_color \"%s\"\n"
+ "- using fallback color \"%s\".",
+ resource.visited_link_color, VISITED_LINK_COLOR_FALLBACK));
+ from2.addr = VISITED_LINK_COLOR_FALLBACK;
+ from2.size = strlen(from2.addr) + 1;
+ to2.addr = (XtPointer)visited_link_pix;
+ to2.size = sizeof(Pixel);
+ XtConvertAndStore(globals.widgets.top_level, XtRString, &from2, XtRPixel, &to2);
+ }
+}
+
+/* Widget globals.widgets.main_row, globals.widgets.menu_bar; */
+
+
+#ifdef MOTIF
+/* make sure the translations for the drawing area are properly set
+ (Motif 2.x seems to somehow overwrite them somewhere in the
+ initialization phase; bug #610206).
+*/
+void
+motif_translations_hack(void)
+{
+ static XtTranslations xlats = NULL;
+ const char *const translations = \
+ "<Key>osfPageUp:back-page()\n"
+ "<Key>osfPageDown:forward-page()\n"
+ "Ctrl<Key>osfBeginLine:goto-page(1)\n"
+ "Ctrl<Key>osfEndLine:goto-page()\n"
+ "<Key>osfBeginLine:home-or-top()\n"
+ "<Key>osfEndLine:end-or-bottom()\n"
+#if 0
+ /* AFAIK the following don't have any effect with Motif */
+#ifdef XK_KP_Left
+ "<Key>KP_Home:home()\n"
+ "<Key>KP_End:down()\n"
+ "<Key>KP_Prior:back-page()\n"
+ "<Key>KP_Next:forward-page()\n"
+#endif
+#endif
+ ;
+
+ if (xlats == NULL) {
+ xlats = XtParseTranslationTable(translations);
+ }
+
+ ASSERT(globals.widgets.clip_widget != NULL, "globals.widgets.clip_widget must have been initialized");
+ ASSERT(globals.widgets.draw_widget != NULL, "globals.widgets.draw_widget must have been initialized");
+ XtOverrideTranslations(globals.widgets.clip_widget, xlats);
+}
+#endif /* MOTIF */
+
+/* return an empty cursor. Lifted from unclutter.c */
+static Cursor
+h_get_empty_cursor(Display *display, Window root)
+{
+ Pixmap cursormask;
+ XGCValues xgc;
+ GC gc;
+ XColor dummycolour;
+ Cursor cursor;
+
+ cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/);
+ xgc.function = GXclear;
+ gc = XCreateGC(display, cursormask, GCFunction, &xgc);
+ XFillRectangle(display, cursormask, gc, 0, 0, 1, 1);
+ dummycolour.pixel = 0;
+ dummycolour.red = 0;
+ dummycolour.flags = 04;
+ cursor = XCreatePixmapCursor(display,
+ cursormask, cursormask,
+ &dummycolour, &dummycolour,
+ 0, 0);
+ XFreePixmap(display, cursormask);
+ XFreeGC(display, gc);
+ return cursor;
+}
+
+
+
+static void
+create_cursors(void)
+{
+ XColor bg_Color;
+ Pixmap temp;
+ Pixmap mask;
+
+ /* first try colors by name, as fix for #804294; fall back on
+ WhitePixelOfScreen() etc. if this fails:
+ */
+ if (resource.cr_Pixel != (Pixel)ULONG_MAX) {
+ m_cursor_color.pixel = resource.cr_Pixel;
+ XQueryColor(DISP, G_colormap, &m_cursor_color);
+ }
+ else {
+ if (XParseColor(DISP, G_colormap, "black", &m_cursor_color) == 0) { /* lookup failure */
+ m_cursor_color.pixel = BlackPixelOfScreen(SCRN);
+ XQueryColor(DISP, G_colormap, &m_cursor_color);
+ }
+ }
+ if (XParseColor(DISP, G_colormap, "white", &bg_Color) == 0) { /* lookup failure */
+ bg_Color.pixel = WhitePixelOfScreen(SCRN);
+ XQueryColor(DISP, G_colormap, &bg_Color);
+ }
+
+ /* wait cursor */
+ globals.cursor.wait = XCreateFontCursor(DISP, XC_watch);
+
+ if (resource.mouse_mode1_cursor == -1) { /* Use default ready cursor (custom bitmap) */
+ temp = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN),
+ (char *)magglass_bits,
+ magglass_width, magglass_height);
+ mask = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN),
+ (char *)magglass_mask_bits,
+ magglass_mask_width, magglass_mask_height);
+
+ globals.cursor.mode1 = XCreatePixmapCursor(DISP, temp, mask,
+ &m_cursor_color, &bg_Color,
+ magglass_x_hot, magglass_y_hot);
+ XFreePixmap(DISP, temp);
+ XFreePixmap(DISP, mask);
+ }
+ else {
+ globals.cursor.mode1 = XCreateFontCursor(DISP, resource.mouse_mode1_cursor);
+ }
+
+ globals.cursor.corrupted = XCreateFontCursor(DISP, XC_watch);
+
+ /* empty cursor */
+ globals.cursor.empty = h_get_empty_cursor(DISP, RootWindowOfScreen(SCRN));
+
+#if !COLOR
+ XRecolorCursor(DISP, globals.cursor.ready, &m_cursor_color, &bg_Color);
+ XRecolorCursor(DISP, globals.cursor.wait, &m_cursor_color, &bg_Color);
+#endif
+ /* Cursor when page is paused */
+#ifdef VMS
+ temp = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN),
+ (char *)hand_bits, hand_width, hand_height);
+ mask = XCreateBitmapFromData(DISP, RootWindowOfScreen(SCRN),
+ (char *)hand_mask_bits, hand_mask_width, hand_mask_height);
+ globals.cursor.pause = XCreatePixmapCursor(DISP, temp, mask,
+ &m_cursor_color, &bg_Color, 6, 6);
+ XFreePixmap(DISP, temp);
+ XFreePixmap(DISP, mask);
+#else
+ globals.cursor.pause = XCreateFontCursor(DISP, XC_watch);
+#endif
+
+ /* cursors indicating dragging direction */
+ globals.cursor.drag_v = XCreateFontCursor(DISP, XC_sb_v_double_arrow);
+
+ globals.cursor.drag_h = XCreateFontCursor(DISP, XC_sb_h_double_arrow);
+
+ globals.cursor.drag_a = XCreateFontCursor(DISP, XC_fleur);
+
+#ifdef VMS
+ globals.cursor.link = globals.cursor.ready;
+ globals.cursor.mode2 = globals.cursor.ready;
+ globals.cursor.mode3 = globals.cursor.ready;
+#else
+ globals.cursor.link = XCreateFontCursor(DISP, XC_hand2);
+ globals.cursor.mode2 = XCreateFontCursor(DISP, resource.mouse_mode2_cursor);
+ globals.cursor.mode3 = XCreateFontCursor(DISP, resource.mouse_mode3_cursor);
+ /* globals.cursor.text = XCreateFontCursor(DISP, XC_tcross); */
+#endif
+}
+
+/* Initialize a forward search if the source_position argument is not NULL. */
+static void
+do_forward_search(const char *source_position)
+{
+ /* parse the special to expand the filename */
+ struct src_parsed_special data;
+ char *new_special = NULL;
+ char *expanded_filename = NULL;
+
+ if (source_position == NULL) /* nothing to do */
+ return;
+
+ data.filename_len = 0;
+ data.filename = NULL;
+
+ src_parse(source_position, strlen(source_position), &data);
+
+ if (data.filename_len == 0) { /* malformed argument: tell user, and ignore it */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ /* helptext */
+ "The format of the -sourceposition argument should be:\n"
+ "-sourceposition '<nn>[ ]*<filename'\n"
+ "with <nn> = linenumber, [ ]* = an arbitrary number of spaces, "
+ "and <filename> = TeX source file.",
+ /* error message */
+ "Filename missing in `-sourceposition' argument \"%s\". "
+ "Could not perform forward search.",
+ source_position);
+ }
+ else {
+ TRACE_CLIENT((stderr, "got data: line %d, col %d, file |%s|, len %lu\n",
+ data.line, data.col, data.filename, (unsigned long)data.filename_len));
+
+ /* expand -sourceposition argument if it contains a path component, like above */
+ if (strchr(data.filename, '/') != NULL
+ && (expanded_filename = expand_filename(data.filename, USE_CWD_PATH)) != NULL) {
+ char *tmp = canonicalize_path(expanded_filename);
+ free(data.filename);
+ free(expanded_filename);
+ expanded_filename = tmp;
+ }
+ else
+ expanded_filename = data.filename;
+
+ TRACE_CLIENT((stderr, "expanded source_position: |%s|\n", expanded_filename));
+
+ new_special = xmalloc(2 * LENGTH_OF_INT + 2 /* 2 for `:' and separating space */
+ + strlen(expanded_filename) + 1);
+ sprintf(new_special, "%d:%d %s", data.line, data.col, expanded_filename);
+ free(expanded_filename);
+ globals.src.fwd_string = new_special;
+ globals.ev.flags |= EV_SRC;
+ }
+}
+
+
+/*
+ * Routines for compile_mouse_actions
+ */
+
+struct modifierinf {
+ int len;
+ const char *name;
+ Modifiers mask;
+ KeySym keysym;
+};
+
+/* Allowed modifiers, sorted by length and then lexicographically. */
+
+static struct modifierinf modifiers[] = {
+ {1, "a", 0, XK_Alt_L},
+ {1, "c", ControlMask, 0},
+ {1, "h", 0, XK_Hyper_L},
+ {1, "l", LockMask, 0},
+ {1, "m", 0, XK_Meta_L},
+ {1, "s", ShiftMask, 0},
+ {2, "su", 0, XK_Super_L},
+ {3, "Alt", 0, XK_Alt_L},
+ {4, "Ctrl", ControlMask, 0},
+ {4, "Lock", LockMask, 0},
+ {4, "Meta", 0, XK_Meta_L},
+ {4, "Mod1", Mod1Mask, 0},
+ {4, "Mod2", Mod2Mask, 0},
+ {4, "Mod3", Mod3Mask, 0},
+ {4, "Mod4", Mod4Mask, 0},
+ {4, "Mod5", Mod5Mask, 0},
+ {5, "Hyper", 0, XK_Hyper_L},
+ {5, "Shift", ShiftMask, 0},
+ {5, "Super", 0, XK_Super_L},
+ {7, "Button1", Button1Mask, 0},
+ {7, "Button2", Button2Mask, 0},
+ {7, "Button3", Button3Mask, 0},
+ {7, "Button4", Button4Mask, 0},
+ {7, "Button5", Button5Mask, 0},
+};
+
+#define MODSCTRLINDEX 1 /* index of "c" in the above array */
+#define MODSMETAINDEX 4 /* index of "m" */
+
+
+static Boolean
+compile_modifiers(const char **pp, struct mouse_acts *mactp)
+{
+ const char *p = *pp;
+ const char *p1;
+ LateBindingsPtr latep = NULL;
+ int nlate = 3;
+
+ while (*p == ' ' || *p == '\t')
+ ++p;
+
+ p1 = p;
+ while (isalpha((int) *p1))
+ ++p1;
+
+ if (p1 - p == 3 && memcmp(p, "Any", 3) == 0) {
+ mactp->mask = mactp->value = 0;
+ p = p1;
+ while (*p == ' ' || *p == '\t')
+ ++p;
+ if (*p != '<')
+ return False;
+ }
+ else if (p1 - p == 4 && memcmp(p, "None", 4) == 0) {
+ mactp->mask = ~0;
+ mactp->value = 0;
+ p = p1;
+ while (*p == ' ' || *p == '\t')
+ ++p;
+ if (*p != '<')
+ return False;
+ }
+ else {
+ if (*p == '!') {
+ do {
+ ++p;
+ } while (*p == ' ' || *p == '\t');
+ }
+
+ for (;;) {
+ Boolean negated = False;
+ struct modifierinf *mp;
+
+ if (*p == '<')
+ break;
+
+ if (*p == '~') {
+ negated = True;
+ ++p;
+ }
+
+ if (*p == '^') {
+ mp = &modifiers[MODSCTRLINDEX];
+ ++p;
+ }
+ else if (*p == '$') {
+ mp = &modifiers[MODSMETAINDEX];
+ ++p;
+ }
+ else {
+ int min, max;
+
+ p1 = p;
+ while (isalnum((int) *p))
+ ++p;
+
+ /* do binary search */
+ min = -1;
+ max = XtNumber(modifiers);
+ for (;;) {
+ int i, diff;
+
+ i = (min + max) / 2;
+ if (i == min)
+ return False; /* if not found */
+ mp = &modifiers[i];
+
+ diff = (p - p1) - mp->len;
+ if (diff == 0)
+ diff = memcmp(p1, mp->name, p - p1);
+
+ if (diff == 0)
+ break;
+ if (diff > 0) min = i;
+ else max = i;
+ }
+ }
+ if (mp->mask) {
+ mactp->mask |= mp->mask;
+ if (!negated) mactp->value |= mp->mask;
+ }
+ else {
+ LateBindingsPtr lp1;
+
+ if (latep == NULL) {
+ /* nlate = 3; (done earlier to avoid compiler warning) */
+ latep = xmalloc(3 * sizeof(LateBindings));
+ latep->ref_count = 1;
+ }
+ else {
+ nlate += 2;
+ latep = xrealloc(latep, nlate * sizeof(LateBindings));
+ }
+ lp1 = &latep[nlate - 3];
+ lp1->knot = lp1[1].knot = negated;
+ lp1->pair = True;
+ lp1->keysym = mp->keysym;
+ ++lp1;
+ lp1->pair = False;
+ lp1->ref_count = 0;
+ lp1->keysym = mp->keysym + 1;
+ ++lp1;
+ lp1->knot = lp1->pair = False;
+ lp1->ref_count = 0;
+ lp1->keysym = 0;
+ }
+
+ while (*p == ' ' || *p == '\t')
+ ++p;
+ }
+ }
+
+ mactp->late_bindings = latep;
+ *pp = p;
+
+ return True;
+}
+
+static Boolean
+compile_evtype(const char **pp, unsigned int *buttonp)
+{
+ const char *p = *pp;
+ const char *p0;
+
+ ++p; /* already assumed to be '<' */
+ while (*p == ' ' || *p == '\t')
+ ++p;
+
+ p0 = p;
+ while (isalpha((int) *p) && p - p0 < 3)
+ ++p;
+
+ if (p - p0 != 3 || memcmp(p0, "Btn", 3) != 0)
+ return False;
+
+ if (*p >= '1' && *p <= '9') {
+ unsigned int n = *p - '0';
+
+ while (*++p >= '0' && *p <= '9')
+ n = n * 10 + (*p - '0');
+
+ *buttonp = n;
+ }
+
+ p0 = p;
+ while (isalpha((int) *p))
+ ++p;
+
+ if (p - p0 != 4 || memcmp(p0, "Down", 4) != 0)
+ return False;
+
+ while (*p == ' ' || *p == '\t')
+ ++p;
+
+ if (*p++ != '>')
+ return False;
+
+ while (*p == ' ' || *p == '\t')
+ ++p;
+
+ if (*p++ != ':')
+ return False;
+
+ *pp = p;
+
+ return True;
+}
+
+static void
+compile_mouse_actions(void)
+{
+ struct mouse_acts **mactpp;
+ struct mouse_acts *mactp;
+ const char *p = resource.mouse_translations;
+ const char *p_end;
+ const char *p_base = base_mouse_translations;
+ struct mouse_acts mact;
+
+ mactpp = &mouse_actions;
+
+ if (p == NULL) {
+ p = p_base;
+ p_base = NULL;
+ }
+
+ do { /* loop over translations strings */
+ p_end = p + strlen(p);
+ for (;;) {
+ while (*p == ' ' || *p == '\t')
+ ++p;
+
+ if (*p == '\n') continue;
+ if (*p == '\0') break;
+
+ mact.mask = mact.value = 0;
+ mact.button = 0;
+
+ if (!compile_modifiers(&p, &mact)
+ || !compile_evtype(&p, &mact.button)) {
+ XDVI_WARNING((stderr, "syntax error in wheel translations"));
+ }
+ else if (compile_action(p, &mact.action) || mact.action != NULL) {
+ mactp = xmalloc(sizeof(struct mouse_acts));
+ *mactp = mact;
+
+ *mactpp = mactp;
+ mactpp = &mactp->next;
+ }
+
+ p = memchr(p, '\n', p_end - p);
+ if (p == NULL) break;
+ ++p;
+ }
+
+ p = p_base;
+ p_base = NULL;
+ }
+ while (p != NULL);
+
+ *mactpp = NULL;
+}
+
+
+#if HAVE_XI21
+
+void
+xi2_init_valuators(struct xi2_slave *sp, XIAnyClassInfo **classes,
+ int num_classes)
+{
+ unsigned int flags;
+ int i;
+
+ sp->flags = flags = 0;
+ sp->btn_mask = 0;
+ sp->vert.number = sp->horiz.number = -1;
+
+ for (i = 0; i < num_classes; ++i)
+ if (classes[i]->type == XIScrollClass) {
+ XIScrollClassInfo *scroll = (XIScrollClassInfo *) classes[i];
+
+ if (scroll->scroll_type == XIScrollTypeVertical) {
+ sp->vert.number = scroll->number;
+ sp->vert.increment = scroll->increment;
+ flags |= XI2_SLAVE_VERT;
+ }
+ else if (scroll->scroll_type == XIScrollTypeHorizontal) {
+ sp->horiz.number = scroll->number;
+ sp->horiz.increment = scroll->increment;
+ flags |= XI2_SLAVE_HORIZ;
+ }
+ }
+
+ if (flags == 0) {
+ TRACE_EVENTS((stderr,
+ "No scroll valuators found for slave device %d", sp->id));
+ return;
+ }
+
+ TRACE_EVENTS((stderr,
+ "Found XI2 device %d with one or more scroll valuators:", sp->id));
+ if (flags & XI2_SLAVE_VERT)
+ TRACE_EVENTS((stderr, " Vertical valuator %d has increment %.2f",
+ sp->vert.number, sp->vert.increment));
+ if (flags & XI2_SLAVE_HORIZ)
+ TRACE_EVENTS((stderr, " Horizontal valuator %d has increment %.2f",
+ sp->horiz.number, sp->horiz.increment));
+
+ for (i = 0; i < num_classes; ++i)
+ if (classes[i]->type == XIValuatorClass) {
+ XIValuatorClassInfo *valuator;
+ valuator = (XIValuatorClassInfo *) classes[i];
+
+ /* The min and max fields have been seen to be 0 and -1, */
+ /* respectively (what do those mean)? */
+ if (flags & XI2_SLAVE_VERT
+ && valuator->number == sp->vert.number) {
+ sp->vert.lastval = valuator->value;
+ sp->vert.lastexact = valuator->value;
+ sp->vert.factor = 0;
+ sp->vert.serial = LastKnownRequestProcessed(DISP);
+ sp->flags |= XI2_SLAVE_VERT;
+ sp->btn_mask |= (1<<4) | (1<<5);
+ }
+ else if (flags & XI2_SLAVE_HORIZ
+ && valuator->number == sp->horiz.number) {
+ sp->horiz.lastval = valuator->value;
+ sp->horiz.lastexact = valuator->value;
+ sp->horiz.factor = 0;
+ sp->horiz.serial = LastKnownRequestProcessed(DISP);
+ sp->flags |= XI2_SLAVE_HORIZ;
+ sp->btn_mask |= (1<<6) | (1<<7);
+ }
+ }
+
+ if (sp->flags != flags)
+ TRACE_EVENTS((stderr,
+ "For slave device %d, valuator class(es) missing (%x vs. %x)",
+ sp->id, sp->flags, flags));
+}
+
+void
+xi2_activate(void)
+{
+ XIEventMask eventmask;
+ unsigned char mask[2] = {0, 0}; /* the actual event mask */
+ struct xi2_master *mp;
+
+ mask[0] = mask[1] = 0;
+ eventmask.mask = mask;
+ eventmask.mask_len = sizeof mask;
+ XISetMask(mask, XI_Motion);
+ XISetMask(mask, XI_Enter);
+
+ for (mp = xi2_masters; mp != NULL; mp = mp->next) {
+ eventmask.deviceid = mp->id;
+ XISelectEvents(DISP, XtWindow(globals.widgets.draw_widget),
+ &eventmask, 1);
+# if MOTIF
+ XISelectEvents(DISP, XtWindow(globals.widgets.clip_widget),
+ &eventmask, 1);
+# endif
+ }
+
+ xi2_active = True;
+ xi2_current = xi2_masters; /* this is just an optimization */
+}
+
+static void
+xi2_init(void)
+{
+ int event, error;
+ int major, minor;
+ XIEventMask eventmask;
+ unsigned char mask[2] = {0, 0}; /* the actual event mask */
+ XIDeviceInfo *info;
+ int ndevices;
+ struct xi2_master **mpp;
+ struct xi2_master *mp;
+ struct xi2_slave **spp;
+ struct xi2_slave *sp;
+ unsigned int all_flags;
+ int i;
+
+ /* Check for user turning it off */
+
+ if (!resource.xi2scrolling) {
+ TRACE_EVENTS((stderr,
+ "X Input extension turned off at user request."));
+ return;
+ }
+
+ /* Check for extension */
+
+ if (!XQueryExtension(DISP, "XInputExtension", &xi2_opcode, &event,
+ &error)) {
+ TRACE_EVENTS((stderr, "X Input extension not available."));
+ return;
+ }
+
+ /* Check XI2 version number */
+ major = 2;
+ minor = 1;
+ if (XIQueryVersion(DISP, &major, &minor) == BadRequest) {
+ TRACE_EVENTS((stderr, "XI2 not available."));
+ return;
+ }
+ if (major == 2 && minor < 1) {
+ TRACE_EVENTS((stderr, "XI2 version 2.1 is not supported."));
+ return;
+ }
+
+ TRACE_EVENTS((stderr, "Found XI2 extension version %d.%d.",
+ major, minor));
+
+ XISetMask(mask, XI_HierarchyChanged);
+ XISetMask(mask, XI_DeviceChanged);
+ eventmask.deviceid = XIAllDevices;
+ eventmask.mask_len = sizeof(mask);
+ eventmask.mask = mask;
+
+ XISelectEvents(DISP, DefaultRootWindow(DISP), &eventmask, 1);
+
+ info = XIQueryDevice(DISP, XIAllDevices, &ndevices);
+
+# if XIAllDevices != 0
+ xi2_no_slave.id = XIAllDevices;
+# endif
+
+ /* Find slave devices */
+
+ all_flags = 0;
+ spp = &xi2_slaves; /* link for next slave device */
+
+ for (i = 0; i < ndevices; ++i)
+ if (info[i].use == XISlavePointer || info[i].use == XIFloatingSlave)
+ {
+ sp = xmalloc(sizeof (struct xi2_slave));
+ sp->id = info[i].deviceid;
+ sp->enabled = info[i].enabled;
+ xi2_init_valuators(sp, info[i].classes, info[i].num_classes);
+ all_flags |= sp->flags;
+ *spp = sp;
+ spp = &sp->next;
+ }
+ *spp = NULL;
+
+ /* Find master devices */
+
+ mpp = &xi2_masters; /* link for next master device */
+
+ for (i = 0; i < ndevices; ++i)
+ if (info[i].use == XIMasterPointer
+ || info[i].use == XIMasterKeyboard) {
+ mp = xmalloc(sizeof (struct xi2_master));
+ mp->id = info[i].deviceid;
+ mp->slave = &xi2_no_slave;
+ *mpp = mp;
+ mpp = &mp->next;
+ }
+ *mpp = NULL;
+
+ XIFreeDeviceInfo(info);
+
+ if (xi2_masters == NULL) {
+ TRACE_EVENTS((stderr,
+ "No master pointers found (!!); not using XI2."));
+ return;
+ }
+
+ if (!all_flags) {
+ TRACE_EVENTS((stderr,
+ "No scroll valuators found; not using XI2 (for now)."));
+ return;
+ }
+
+ xi2_activate();
+}
+
+#endif /* HAVE_XI21 */
+
+
+static void
+create_colormaps(void)
+{
+#ifdef GREY
+ G_depth = (unsigned int)DefaultDepthOfScreen(SCRN);
+ G_visual = DefaultVisualOfScreen(SCRN);
+ G_colormap = DefaultColormapOfScreen(SCRN);
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- G_depth: %d\n", G_depth);
+#endif
+
+ if (resource.install != False && G_visual->class == PseudoColor) {
+ /* look for a TrueColor visual with more bits */
+ XVisualInfo template;
+ XVisualInfo *list;
+ int nitems_return;
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- looking for a better TrueColor visual\n");
+#endif
+
+ template.screen = XScreenNumberOfScreen(SCRN);
+ template.class = TrueColor;
+ list = XGetVisualInfo(DISP, VisualScreenMask | VisualClassMask,
+ &template, &nitems_return);
+ if (list != NULL) {
+ XVisualInfo *list1;
+ XVisualInfo *best = NULL;
+
+ for (list1 = list; list1 < list + nitems_return; ++list1) {
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- checking %d\n", list1->depth);
+#endif
+ if ((unsigned int)list1->depth > G_depth
+# if PS_GS
+ /* patch by Toni Ronkko <tronkko@hytti.uku.fi>, fixes bug #458057:
+ * SGI supports additional depths of 12 and 30, but
+ * these are not supported by ghostscript (see
+ * xdev->vinfo->depth in gdevxcmp.c (ghostscript-6.51)),
+ * so we restrict the values to those supported by gs.
+ */
+ && (list1->depth == 1 || list1->depth == 2
+ || list1->depth == 4 || list1->depth == 8
+ || list1->depth == 15 || list1->depth == 16
+ || list1->depth == 24 || list1->depth == 32)
+# endif
+ && (best == NULL || list1->depth > best->depth))
+ best = list1;
+ }
+ if (best != NULL) {
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- best depth: %d\n", best->depth);
+#endif
+ G_depth = best->depth;
+ G_visual = best->visual;
+ G_colormap = XCreateColormap(DISP,
+ RootWindowOfScreen(SCRN),
+ G_visual, AllocNone);
+ XInstallColormap(DISP, G_colormap);
+ temp_args1[0].value = (XtArgVal) G_depth;
+ temp_args1[1].value = (XtArgVal) G_visual;
+ temp_args1[2].value = (XtArgVal) G_colormap;
+ XtSetValues(globals.widgets.top_level, temp_args1, XtNumber(temp_args1));
+ XtSetTypeConverter(XtRString, XtRPixel,
+ XdviCvtStringToPixel,
+ (XtConvertArgList) colorConvertArgs, 2,
+ XtCacheByDisplay, NULL);
+ {
+ /* This is needed so that popup windows have the right
+ visual and colormap. It is unnecessary for newer
+ versions of Motif (Motif 2.1.0, Solaris 9) but
+ needed for older versions (Motif 1.2.5, Solaris 2.6),
+ and for Xaw.
+ */
+ XrmDatabase db = XtScreenDatabase(SCRN);
+ XrmValue val;
+
+ val.size = sizeof G_visual;
+ val.addr = (XtPointer) &G_visual;
+ XrmPutResource(&db, "XDvi*visual", XtRVisual, &val);
+
+ val.size = sizeof G_colormap;
+ val.addr = (XtPointer) &G_colormap;
+ XrmPutResource(&db, "XDvi*colormap", XtRColormap, &val);
+ }
+ }
+ XFree(list);
+ }
+ }
+
+#ifdef MOTIF
+ if (globals.debug & DBG_GUI) {
+ printf("Compiled with %s, runtime version %d.%d\n",
+ /* XmVERSION, XmREVISION, XmUPDATE_LEVEL, */
+ XmVERSION_STRING,
+ xmUseVersion / 1000, xmUseVersion % 1000);
+ }
+#endif
+
+ if (resource.install == True && G_visual->class == PseudoColor) {
+ XColor tmp_color;
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- PseudoColor, trying to install colormap\n");
+#endif
+
+ /* This next bit makes sure that the standard black and white pixels
+ are allocated in the new colormap. */
+ tmp_color.pixel = BlackPixelOfScreen(SCRN);
+ XQueryColor(DISP, G_colormap, &tmp_color);
+ XAllocColor(DISP, G_colormap, &tmp_color);
+
+ tmp_color.pixel = WhitePixelOfScreen(SCRN);
+ XQueryColor(DISP, G_colormap, &tmp_color);
+ XAllocColor(DISP, G_colormap, &tmp_color);
+
+ G_colormap = XCopyColormapAndFree(DISP, G_colormap);
+ temp_args1[2].value = (XtArgVal) G_colormap;
+ XtSetValues(globals.widgets.top_level, temp_args1 + 2, 1);
+ }
+
+ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource,
+ app_pixel_resources, XtNumber(app_pixel_resources),
+ (ArgList)NULL, 0);
+
+#endif /* GREY */
+
+ globals.gc.do_copy = resource.copy;
+
+#if GREY || COLOR
+ color_data[0].pixel = resource.fore_Pixel;
+ color_data[1].pixel = resource.back_Pixel;
+ XQueryColors(DISP, G_colormap, color_data, 2);
+#endif
+
+#if COLOR
+ fg_initial.r = color_data[0].red;
+ fg_initial.g = color_data[0].green;
+ fg_initial.b = color_data[0].blue;
+ bg_initial.r = color_data[1].red;
+ bg_initial.g = color_data[1].green;
+ bg_initial.b = color_data[1].blue;
+
+#endif
+
+#if GREY
+ if (G_depth == 1) {
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- using depth 1\n");
+#endif
+ resource.use_grey = False;
+ }
+ if (resource.use_grey && G_visual->class != TrueColor) {
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- using grey, but not TrueColor\n");
+#endif
+ init_plane_masks();
+ if (!globals.gc.do_copy) {
+ /* Retain color_data[1].pixel for psgs.c. */
+ XColor tmp_color;
+#ifdef XSERVER_INFO
+ if (globals.debug & DBG_ALL)
+ fprintf(stdout, "--- not using copy\n");
+#endif
+
+ tmp_color = color_data[1];
+ tmp_color.pixel = resource.back_Pixel;
+ XStoreColor(DISP, G_colormap, &tmp_color);
+ }
+ }
+#endif
+}
+
+static void
+create_widgets(
+#ifdef MOTIF
+ Widget tool_bar, Widget form,
+#endif
+ int *add_w, int *add_h)
+{
+
+#ifdef MOTIF
+ Widget status_line;
+
+#if 0
+ {
+ int i, n, longest_page = 0;
+ Dimension width, height;
+ char tmpbuf[1024];
+ char *fontname;
+ XmString tmpstring;
+ Widget dummy_list;
+ XmRendition rendition;
+ XmRenderTable rtable;
+ Arg args[10];
+ /*
+ * Try to determine width of longest page string:
+ */
+ for (i = 0; i < total_pages; i++) {
+ int curr = abs(pageinfo_get_number(i));
+ if (curr > longest_page)
+ longest_page = curr;
+ }
+ fprintf(stderr, "longest page number: %d\n", longest_page);
+ sprintf(tmpbuf, "* %d", longest_page);
+ tmpstring = XmStringCreateLocalized(tmpbuf);
+ dummy_list = XtCreateWidget("PageList", xmListWidgetClass, form, NULL, 0);
+ fprintf(stderr, "rendition table\n");
+ n = 0;
+ /* XtVaGetValues(globals.widgets.top_level, XmNfontList, &fontname, NULL); */
+ /* fprintf(stderr, "fontname: |%s|\n", fontname); */
+ XtSetArg(args[n], XmNfontName, "8x16"); n++;
+ XtSetArg(args[n], XmNfontType, XmFONT_IS_FONT); n++;
+ rendition = XmRenditionCreate(dummy_list, XmFONTLIST_DEFAULT_TAG, args, n);
+ rtable = XmRenderTableAddRenditions(NULL, &rendition, 1, XmMERGE_REPLACE);
+ XtVaSetValues(dummy_list, XmNrenderTable, rtable, NULL);
+
+ /* rendition = XmRenditionCreate(globals.widgets.top_level, XmFONTLIST_DEFAULT_TAG, NULL, 0); */
+ fprintf(stderr, "extent\n");
+ XmStringExtent(rtable, tmpstring, &width, &height);
+ fprintf(stderr, "string %s has width %d, height %d\n", tmpbuf, width, height);
+ XtDestroyWidget(dummy_list);
+ XmRenditionFree(rendition);
+ XmStringFree(tmpstring);
+ }
+#endif
+ {
+#define ARG_LEN 20
+ int n = 0;
+ Arg list_args[ARG_LEN];
+
+ XtSetArg(list_args[n], XmNlistSizePolicy, XmVARIABLE); n++;
+ XtSetArg(list_args[n], XmNwidth, resource.pagelist_width); n++;
+#if defined(USE_PANNER) && USE_XAW_PANNER
+ XtSetArg(list_args[n], XmNheight, globals.page.h - 62); n++;
+#else
+ XtSetArg(list_args[n], XmNheight, globals.page.h); n++;
+#endif
+ /* XtSetArg(list_args[n], XmNspacing, 10); n++; */
+#if defined(USE_PANNER) && USE_XAW_PANNER
+ XtSetArg(list_args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
+ XtSetArg(list_args[n], XmNtopWidget, panner); n++;
+#else
+ XtSetArg(list_args[n], XmNtopAttachment, XmATTACH_FORM); n++;
+#endif
+ XtSetArg(list_args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
+ XtSetArg(list_args[n], XmNleftAttachment, XmATTACH_FORM); n++;
+ XtSetArg(list_args[n], XmNrightAttachment, XmATTACH_OPPOSITE_FORM); n++;
+ XtSetArg(list_args[n], XmNrightOffset, -resource.pagelist_width); n++;
+ XtSetArg(list_args[n], XmNresizable, True); n++;
+ XtSetArg(list_args[n], XmNtopOffset, 2); n++;
+ XtSetArg(list_args[n], XmNleftOffset, 2); n++;
+ ASSERT(n < ARG_LEN, "list_args too short");
+#undef ARG_LEN
+ /* TODO: Find a smart way to determine size of pagelist instead of using resource.pagelist_width,
+ and find a smart way of resizing it when switching to a file with larger page numbers!
+ */
+ page_list = XmCreateScrolledList(form, "PageList", list_args, n);
+ }
+
+ if (resource.expert_mode == XPRT_SHOW_NONE) {
+ XtUnmanageChild(XtParent(page_list));
+ XtUnmanageChild(page_list);
+ }
+
+ globals.widgets.main_window = XtVaCreateManagedWidget("mainWindow",
+ xmScrolledWindowWidgetClass, form,
+ XmNscrollingPolicy, XmAUTOMATIC,
+ XmNleftAttachment, XmATTACH_WIDGET,
+ /* lesstif balks if we just use page_list, so use its parent,
+ the xmScrolledWindow, for alignment: */
+ XmNleftWidget, XtParent(page_list),
+ XmNallowResize, True,
+ /* XmNtopOffset, 2, */
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ /* XmNleftOffset, 10, */
+ XmNresizable, True,
+ XmNborderWidth, 0,
+ NULL);
+ XtManageChild(form);
+
+ globals.widgets.x_bar = XtNameToWidget(globals.widgets.main_window, "HorScrollBar");
+ globals.widgets.y_bar = XtNameToWidget(globals.widgets.main_window, "VertScrollBar");
+
+
+#ifdef TEST_SCROLLING
+ /* TODO: try the following to prevent `flashing' effect - still breaks
+ scrolling in its current form though */
+ globals.widgets.draw_background = XtVaCreateManagedWidget("drawing_bg",
+ xmFormWidgetClass, globals.widgets.main_window,
+ XmNwidth, globals.page.w,
+ XmNheight, globals.page.h,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNbottomAttachment, XmATTACH_FORM,
+ XmNrightAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNhighlightThickness, 0,
+ XmNbackground, resource.back_Pixel,
+ XmNrubberPositioning, True,
+ NULL);
+#endif
+ globals.widgets.draw_widget = XtVaCreateWidget("drawing",
+ xmDrawingAreaWidgetClass,
+#ifdef TEST_SCROLLING
+ globals.widgets.draw_background,
+#else
+ globals.widgets.main_window,
+#endif
+ XmNwidth, globals.page.w,
+ XmNheight, globals.page.h,
+ XmNhighlightThickness, 0,
+ XmNrubberPositioning, True,
+ XtNbackground, resource.back_Pixel,
+ NULL);
+
+#if !FIXED_FLUSHING_PAGING
+ ASSERT(XtParent(globals.widgets.draw_widget) != NULL, "");
+ XtVaSetValues(XtParent(globals.widgets.draw_widget), XtNbackground, resource.back_Pixel, NULL);
+#endif
+
+#ifdef TEST_SCROLLING
+ fprintf(stderr, "globals.widgets.draw_widget is: %p\n", globals.widgets.draw_widget);
+#endif
+ XtVaGetValues(globals.widgets.main_window, XmNclipWindow, &globals.widgets.clip_widget, NULL);
+
+ XtVaSetValues(globals.widgets.main_row,
+ XmNmenuBar, globals.widgets.menu_bar,
+ XmNcommandWindow, XtParent(tool_bar),
+ XmNworkWindow, form,
+ NULL);
+
+ XtVaSetValues(globals.widgets.main_window,
+ XmNworkWindow, globals.widgets.draw_widget,
+ NULL);
+
+ XtManageChild(globals.widgets.draw_widget);
+
+ status_line = create_statusline(globals.widgets.main_row);
+ XtVaSetValues(globals.widgets.main_row,
+ XmNmessageWindow, status_line,
+ NULL);
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) == 0) {
+ XtUnmanageChild(status_line);
+ }
+
+ XtManageChild(globals.widgets.main_row);
+
+ if ((resource.expert_mode & XPRT_SHOW_TOOLBAR) != 0) {
+ if (resource.toolbar_unusable)
+ statusline_error(STATUS_LONG,
+ "Error creating the toolbar pixmaps - toolbar is disabled!");
+ else
+ XtManageChild(XtParent(tool_bar));
+ }
+
+ if ((resource.expert_mode & XPRT_SHOW_MENUBAR) != 0)
+ XtManageChild(globals.widgets.menu_bar);
+
+ XmAddTabGroup(globals.widgets.draw_widget);
+
+ /*
+ note: a few more custom translations for page_list are defined in
+ pagesel.c, since the actions are only known there.
+ */
+ {
+ XtTranslations xlats;
+
+ xlats = XtParseTranslationTable(base_key_translations);
+
+ XtOverrideTranslations(globals.widgets.main_row, xlats);
+ /* XtOverrideTranslations(globals.widgets.menu_bar, xlats); */
+ XtOverrideTranslations(tool_bar, xlats);
+ XtOverrideTranslations(page_list, xlats);
+ XtOverrideTranslations(globals.widgets.main_window, xlats);
+ XtOverrideTranslations(globals.widgets.clip_widget, xlats);
+ XtOverrideTranslations(globals.widgets.draw_widget, xlats);
+
+ xlats = XtParseTranslationTable("<BtnDown>: press()\n"
+ "<Motion>: motion()\n"
+ "<BtnUp>: release()\n");
+
+ XtOverrideTranslations(globals.widgets.clip_widget, xlats);
+ XtOverrideTranslations(globals.widgets.draw_widget, xlats);
+ }
+
+ if (resource.main_translations != NULL) {
+ XtTranslations xlats = XtParseTranslationTable(resource.main_translations);
+ XtOverrideTranslations(globals.widgets.draw_widget, xlats);
+ XtOverrideTranslations(globals.widgets.clip_widget, xlats);
+ XtOverrideTranslations(globals.widgets.main_row, xlats);
+ XtOverrideTranslations(globals.widgets.menu_bar, xlats);
+ XtOverrideTranslations(globals.widgets.main_window, xlats);
+ /* don't do it for the page list, otherwise mouse customizations will
+ break the default list bindings too. */
+ /* XtOverrideTranslations(page_list, xlats); */
+ }
+
+ compile_mouse_actions();
+
+#else /* MOTIF */
+
+ globals.widgets.form_widget = XtVaCreateManagedWidget("form", formWidgetClass, globals.widgets.top_level,
+ XtNdefaultDistance, 0,
+ NULL);
+ globals.widgets.vport_widget = XtVaCreateManagedWidget("vport", viewportWidgetClass,
+ globals.widgets.form_widget,
+ XtNborderWidth, 0,
+ XtNtop, XtChainTop,
+ XtNbottom, XtChainBottom,
+ XtNleft, XtChainLeft,
+ XtNright, XtChainRight,
+ XtNallowHoriz, True,
+ XtNallowVert, True,
+ NULL);
+ globals.widgets.clip_widget = XtNameToWidget(globals.widgets.vport_widget, "clip");
+
+ globals.widgets.draw_widget = XtVaCreateManagedWidget("drawing", drawWidgetClass, globals.widgets.vport_widget,
+ XtNwidth, globals.page.w,
+ XtNheight, globals.page.h,
+ XtNx, 0,
+ XtNy, 0,
+ XtNlabel, "",
+ NULL);
+
+ XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(base_key_translations));
+
+ if (resource.main_translations != NULL) {
+ XtOverrideTranslations(globals.widgets.form_widget, XtParseTranslationTable(resource.main_translations));
+ }
+
+ {
+ XtTranslations xlats = XtParseTranslationTable("<BtnDown>: press()\n"
+ "<Motion>: motion()\n"
+ "<BtnUp>: release()\n");
+ XtOverrideTranslations(globals.widgets.form_widget, xlats);
+ XtOverrideTranslations(globals.widgets.draw_widget, xlats);
+ }
+
+ compile_mouse_actions();
+
+
+ /* set background colors of the drawing widget */
+ XtVaSetValues(globals.widgets.draw_widget, XtNbackground, resource.back_Pixel, NULL);
+
+#if !FIXED_FLUSHING_PAGING
+ XtVaSetValues(globals.widgets.clip_widget, XtNbackground, resource.back_Pixel, NULL);
+#endif
+
+ /* initialize add_w with width of button panel */
+ create_menu_buttons(globals.widgets.form_widget, add_w);
+
+#endif /* MOTIF */
+
+ /* activate expert mode and related settings */
+ toggle_statusline();
+ toggle_scrollbars();
+#ifdef MOTIF
+ toggle_pagelist();
+ toggle_toolbar();
+ toggle_menubar();
+#else
+ if ((resource.expert_mode & XPRT_SHOW_BUTTONS) == 0)
+ toggle_buttons();
+#endif
+
+ *add_h = 0;
+#ifdef MOTIF
+ *add_w = 0;
+ if (resource.expert_mode & XPRT_SHOW_PAGELIST)
+ *add_w += xm_get_width(page_list);
+/* if (globals.widgets.y_bar != NULL) */
+/* add_w += xm_get_width(globals.widgets.y_bar); */
+/* if (globals.widgets.x_bar != NULL) */
+/* add_h += xm_get_width(globals.widgets.x_bar); */
+ if (resource.expert_mode & XPRT_SHOW_MENUBAR)
+ *add_h += xm_get_height(globals.widgets.menu_bar);
+ if (resource.expert_mode & XPRT_SHOW_TOOLBAR)
+ *add_h += xm_get_height(tool_bar);
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE)
+ *add_h += xm_get_height(status_line);
+#else
+ /* add_w has been initialized by create_menu_buttons() call above.
+ Reset to 0 if we're in expert mode. */
+ if (!(resource.expert_mode & XPRT_SHOW_BUTTONS)) {
+ *add_w = 0;
+ }
+ if (resource.expert_mode & XPRT_SHOW_STATUSLINE) {
+ /* FIXME: Unfortunately the statusline hasn't been created at this point for Xaw,
+ so the value is still the built-in default.
+ */
+ *add_h += get_statusline_height();
+ }
+#endif
+}
+
+
+static void
+realize_widgets(Dimension main_win_w, Dimension main_win_h, int add_w)
+{
+ /*
+ * Realize the widgets (or windows).
+ */
+
+#ifndef MOTIF
+ realize_button_panel(main_win_h);
+#endif
+
+ XtAddEventHandler(
+#ifdef MOTIF
+ globals.widgets.clip_widget,
+#else
+ globals.widgets.vport_widget,
+#endif
+ StructureNotifyMask, False,
+ handle_resize, (XtPointer) NULL);
+
+ XtAddEventHandler(globals.widgets.top_level, PropertyChangeMask, False,
+ handle_property_change, (XtPointer) NULL);
+ XtAddEventHandler(globals.widgets.draw_widget, ExposureMask, False, handle_expose,
+ (XtPointer) &mane);
+ XtRealizeWidget(globals.widgets.top_level);
+
+ mainDeleteWindow = XInternAtom(DISP, "WM_DELETE_WINDOW", False);
+
+#ifdef MOTIF
+ /* for Xaw, event handlers for scrollbars are added inside get_geom(), events.c */
+ ASSERT(globals.widgets.x_bar != NULL, "");
+ ASSERT(globals.widgets.y_bar != NULL, "");
+#ifdef USE_PANNER
+ XtAddEventHandler(globals.widgets.x_bar, ButtonPressMask | ButtonReleaseMask, False, handle_x_scroll, NULL);
+ XtAddEventHandler(globals.widgets.y_bar, ButtonPressMask | ButtonReleaseMask, False, handle_y_scroll, NULL);
+#endif
+ XmAddWMProtocolCallback(globals.widgets.top_level, mainDeleteWindow, xdvi_exit_callback, NULL);
+#else
+ wmProtocols = XInternAtom(DISP, "WM_PROTOCOLS", False);
+ XSetWMProtocols(DISP, XtWindow(globals.widgets.top_level), &mainDeleteWindow, 1);
+ XtAddEventHandler(globals.widgets.top_level, NoEventMask, True, handle_delete_message, NULL);
+#endif
+
+ /* check whether we want to run in fullscreen mode */
+ if (resource.fullscreen) {
+ reconfigure_window(resource.fullscreen, main_win_w + add_w, main_win_h, False);
+ }
+
+#ifdef MOTIF
+ XmProcessTraversal(globals.widgets.draw_widget, XmTRAVERSE_CURRENT);
+ TRACE_GUI((stderr, "toplevel: %p", (void *)globals.widgets.top_level));
+ create_tips(globals.widgets.top_level);
+#else
+ if ((resource.expert_mode & XPRT_SHOW_STATUSLINE) != 0) {
+ create_statusline();
+ }
+#endif
+
+ currwin.win = mane.win = XtWindow(globals.widgets.draw_widget);
+
+ {
+ XWindowAttributes attrs;
+
+ (void)XGetWindowAttributes(DISP, mane.win, &attrs);
+ G_backing_store = attrs.backing_store;
+ }
+
+#ifdef HAVE_X11_XMU_EDITRES_H
+ /*
+ * Enable editres protocol (see "man editres").
+ * Usually will need to add -lXmu to the linker line as well.
+ */
+ XtAddEventHandler(globals.widgets.top_level, (EventMask)0, True, _XEditResCheckMessages,
+ (XtPointer)NULL);
+#endif
+}
+
+/*
+ * Create colors and GCs.
+ * In color mode, color changes affect globals.gc.fore, globals.gc.fore2,
+ * and globals.gc.rule, but not globals.gc.copy or globals.gc.high.
+ */
+static void
+create_gcs(void)
+{
+
+#if GREY
+ if (resource.gamma == 0.0)
+ resource.gamma = 1.0;
+#endif
+
+ if (!resource.rule_color)
+ resource.rule_pixel = resource.fore_Pixel;
+
+#if !COLOR
+
+#if GREY
+ if (resource.use_grey)
+ init_pix();
+ else
+#endif
+ { /* not #defined GREY, or not resource.use_grey */
+ XGCValues values;
+ Pixel set_bits = (Pixel) (resource.fore_Pixel & ~resource.back_Pixel);
+ Pixel clr_bits = (Pixel) (resource.back_Pixel & ~resource.fore_Pixel);
+ Boolean copy_tmp = resource.copy;
+
+ globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel);
+ if (copy_tmp || (set_bits && clr_bits)) {
+ globals.gc.rule = globals.gc.copy;
+ if (!resource.thorough)
+ copy_tmp = True;
+ }
+ if (copy_tmp) {
+ globals.gc.fore = globals.gc.rule;
+ if (!resource.copy) {
+ warn_overstrike();
+ }
+ }
+ else {
+ if (set_bits) {
+ globals.gc.fore = set_or_make_gc(NULL, GXor, set_bits, 0);
+ }
+ if (clr_bits || !set_bits)
+ *(globals.gc.fore ? &globals.gc.fore2 : &globals.gc.fore) = set_or_make_gc(NULL, GXandInverted, clr_bits, 0);
+ if (!globals.gc.rule)
+ globals.gc.rule = globals.gc.fore;
+ }
+ }
+#endif /* !COLOR */
+
+ {
+ Pixel link_pix, visited_link_pix;
+ get_link_colors(&link_pix, &visited_link_pix);
+ globals.gc.linkcolor = set_or_make_gc(NULL, GXcopy, link_pix, resource.back_Pixel);
+ globals.gc.visited_linkcolor = set_or_make_gc(NULL, GXcopy, visited_link_pix, resource.back_Pixel);
+ }
+
+#if COLOR
+ /* Not affected by color changes. */
+ globals.gc.copy = set_or_make_gc(NULL, GXcopy, resource.fore_Pixel, resource.back_Pixel);
+#endif
+ globals.gc.high = set_or_make_gc(NULL, GXcopy, resource.hl_Pixel, resource.back_Pixel);
+
+ globals.gc.ruler = set_or_make_gc(NULL, GXcopy, resource.rule_pixel, resource.fore_Pixel);
+
+#if XAW
+ /*
+ * There's a bug in the Xaw toolkit, in which it uses the
+ * DefaultGCOfScreen to do vertical scrolling in the Text widget.
+ * This leads to a BadMatch error if our visual is not the default one.
+ * The following kludge works around this.
+ */
+ DefaultGCOfScreen(SCRN) = globals.gc.copy;
+#endif
+}
+
+static void
+do_fork(void)
+{
+ TRACE_CLIENT((stderr, "no other instance of xdvi found, forking ..."));
+ /*
+ * No suitable xdvi found, so we start one by
+ * self-backgrounding.
+ */
+ /* flush output buffers to avoid double buffering (i.e. data
+ waiting in the output buffer being written twice, by the parent
+ and the child) */
+ fflush(stdout);
+ fflush(stderr);
+ XFlush(DISP);
+ if (fork()) /* if initial process (do NOT use vfork()!) */
+ _exit(0);
+}
+
+#if defined(MOTIF) && defined(USE_PANNER) && USE_XAW_PANNER
+static void
+panner_cb(Widget widget, XtPointer closure, XtPointer report_ptr)
+{
+ fprintf(stderr, "panner_cb called!\n");
+}
+#endif
+
+#if !DELAYED_MKTEXPK
+
+static XtIntervalId m_font_popup_id = 0;
+static Widget m_font_popup = 0;
+
+static void
+remove_font_popup(XtPointer client_data, XtIntervalId *id)
+{
+ UNUSED(client_data);
+ UNUSED(id);
+
+ if (m_font_popup != 0) {
+ kill_message_window(m_font_popup);
+ }
+}
+
+static void
+remove_font_popup_exit_cb(XtPointer arg)
+{
+ UNUSED(arg);
+ xdvi_exit(EXIT_SUCCESS);
+}
+
+static void
+create_font_popup(XtPointer client_data, XtIntervalId *id)
+{
+ int *curr_timeout = (int *)client_data;
+ static int new_timeout = 0;
+
+ UNUSED(client_data);
+ UNUSED(id);
+
+/* fprintf(stderr, "+++++++++++++++ create_font_popup\n"); */
+
+ if (m_font_popup_id) {
+ if (*curr_timeout > 0) {
+ XtRemoveTimeOut(m_font_popup_id);
+ m_font_popup_id = XtAppAddTimeOut(globals.app, *curr_timeout, create_font_popup, (XtPointer)&new_timeout);
+ }
+ else {
+ m_font_popup = choice_dialog(globals.widgets.top_level,
+ MSG_INFO, NULL,
+#ifndef MOTIF
+ NULL,
+#endif
+ NULL, NULL, /* no pre_callbacks */
+ NULL, NULL, NULL, /* default arguments for `OK' */
+ "Exit Xdvi", remove_font_popup_exit_cb, (XtPointer)NULL,
+ "Loading %s\n(may take some time creating fonts ...)",
+ globals.dvi_name);
+ }
+ }
+}
+
+void
+register_font_popup(void)
+{
+ /* Use a two-step process, so that when the timeout is removed by unregister_font_popup(),
+ it will occur before new_timeout. create_font_popup() will call XtAppAddTimeOut() again
+ with new_timeout = 0.
+ */
+ static int new_timeout = 50;
+/* fprintf(stderr, "+++++++++++++++ registered font popup\n"); */
+ m_font_popup_id = XtAppAddTimeOut(globals.app, 100, create_font_popup, (XtPointer)&new_timeout);
+}
+
+void
+unregister_font_popup(void)
+{
+/* fprintf(stderr, "+++++++++++++++ unregister_font_popup\n"); */
+ if (m_font_popup_id) {
+ XtRemoveTimeOut(m_font_popup_id);
+ m_font_popup_id = 0;
+ /* FIXME: calling this directly crashes xdvi?? */
+ /* m_font_popup_id = XtAppAddTimeOut(globals.app, 1, remove_font_popup, (XtPointer)NULL); */
+ remove_font_popup(NULL, NULL);
+ }
+}
+#endif /* !DELAYED_MKTEXPK */
+
+/* revert resources */
+void
+load_app_resources(Boolean also_pixels)
+{
+ /* /\* reset some resources to built-in defaults *\/ */
+ /* resource.browser = NULL; */
+ /* resource.editor = NULL; */
+ /* resource.gamma = 1; */
+ /* resource.link_style = 3; */
+ /* resource.link_color = LINK_COLOR_FALLBACK; */
+ /* resource.visited_link_color = VISITED_LINK_COLOR_FALLBACK; */
+ /* resource.expert_mode = 31; */
+ /* resource.use_color = True; */
+ /* resource.match_highlight_inverted = True; */
+
+ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource,
+ application_resources, XtNumber(application_resources),
+ (ArgList)NULL, 0);
+
+ if (also_pixels) {
+ XtGetApplicationResources(globals.widgets.top_level, (XtPointer)&resource,
+ app_pixel_resources, XtNumber(app_pixel_resources),
+ (ArgList)NULL, 0);
+ }
+ /* fprintf(stderr, "gamma: %f\n", resource.gamma); */
+}
+
+/*
+ * Unfortunately this must be a callback, for the file selector ...
+ * This is the second part of Main: Create all widgets, initialize the DVI file,
+ * and enter the main event loop.
+ */
+void
+run_dvi_file(const char *filename, void *data)
+{
+ Boolean tried_dvi_ext = False;
+ struct startup_info *cb = (struct startup_info *)data;
+
+#ifdef MOTIF
+ Widget tool_bar = 0;
+ Widget form = 0;
+#endif
+
+ char *title_name = NULL;
+ char *icon_name = NULL;
+ dviErrFlagT errflag = NO_ERROR;
+
+ int add_w = 0, add_h = 0;
+ Dimension main_win_w, main_win_h;
+
+ UNUSED(data);
+ ASSERT(filename != NULL, "filename must have been initialized here!");
+
+ globals.dvi_name = xstrdup(filename);
+ file_history_push(globals.dvi_name);
+
+ TRACE_FILES((stderr, "globals.dvi_name is: |%s| %p\n", globals.dvi_name, globals.dvi_name));
+
+ globals.dvi_file.dirname = get_dir_component(globals.dvi_name);
+ xdvi_assert(XDVI_VERSION_INFO, __FILE__, __LINE__,
+ globals.dvi_file.dirname != NULL,
+ "globals.dvi_name (%s) must contain a dir component",
+ globals.dvi_name);
+ globals.dvi_file.dirlen = strlen(globals.dvi_file.dirname);
+
+ form_dvi_property();
+
+ /*
+ If `unique' is active, we may need to pass the file to a different instance of xdvi:
+ */
+ if (resource.unique) {
+ Window w1 = 0, w2 = 0;
+ if ((w1 = get_xdvi_window_id(True, NULL)) != 0 || (w2 = get_xdvi_window_id(False, NULL)) != 0) {
+ if (w1 != 0) { /* another xdvi instance, same file: reload */
+ w2 = w1;
+ set_string_property("", atom_reload(), w2);
+ }
+ else { /* another xdvi instance, different file: load new file */
+ set_string_property(globals.dvi_name, atom_newdoc(), w2);
+ }
+ if (cb->page_arg != NULL) { /* switch to different page */
+ if (strlen(cb->page_arg) == 0) { /* special case: treat `+' as last page */
+ set_string_property("+", atom_newpage(), w2);
+ }
+ else {
+ set_string_property(cb->page_arg, atom_newpage(), w2);
+ }
+ }
+ else {
+ /* if page_arg is empty, go to 1st page so that this page is
+ inserted into the page history (fix for #1044891) */
+ set_string_property("1", atom_newpage(), w2);
+ }
+ /* in all cases, raise the window of the other instance */
+ set_string_property("", atom_raise(), w2);
+ xdvi_exit(EXIT_SUCCESS);
+ }
+ else if (resource.src_fork) {
+ do_fork();
+ }
+ }
+
+ /*
+ Similar for forward search or string search:
+ */
+ if (resource.src_pos != NULL || resource.find_string != NULL) {
+ Window w;
+ if ((w = get_xdvi_window_id(True, NULL)) != 0) {
+ /* another instance of xdvi running, displaying the same file */
+ TRACE_CLIENT((stderr, "Match; changing property of client and exiting ..."));
+ if (resource.src_pos != NULL)
+ set_sourceposition_property(resource.src_pos, w);
+ else
+ set_stringsearch_property(resource.find_string, w);
+ xdvi_exit(EXIT_SUCCESS);
+ }
+ else if (resource.src_fork) {
+ do_fork();
+ }
+ }
+
+ /* Needed for source specials and for calling ghostscript. */
+ xputenv("DISPLAY", XDisplayString(DISP));
+
+
+ if (globals.debug) {
+ fprintf(stderr, "%s %s, kpathsea: %s\n", XDVIK_PROGNAME, XDVI_VERSION_INFO, kpathsea_version_string);
+ fprintf(stderr,
+ "configured with: ppi=%d shrink=%d mfmode=%s alt_font=%s paper=%s\n",
+ resource.pixels_per_inch,
+ currwin.shrinkfactor,
+ resource.mfmode ? resource.mfmode : "<NONE>",
+ resource.alt_font,
+ resource.paper);
+ }
+
+ kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile);
+ /* janl 16/11/98: I have changed this. The above line used to
+ say the settings in resource.makepk was supplied on the
+ commandline, resulting in it overriding _all other_
+ settings, derived from the environment or texmf.cnf, no
+ matter what the value. The value in resource.makepk could
+ be the compile-time default...
+
+ Personaly I like the environment/texmf.cnf to override
+ resources and thus changed the 'level' of this setting to
+ kpse_src_compile so the environment/texmf.cnf will override
+ the values derived by Xt.
+
+ Previous comment here:
+
+ ``Let true values as an X resource/command line override false
+ values in texmf.cnf/envvar.'' */
+
+ /*
+ * Step 2: Settle colormap issues. This should be done before
+ * other widgets are created, so that they get the right
+ * pixel values. (The top-level widget won't have the right
+ * values, but I don't think that makes any difference.)
+ */
+
+#ifdef XSERVER_INFO
+ print_xserver_info();
+#endif
+
+ create_colormaps();
+
+
+#ifdef TESTING_OPEN_FILES
+ fprintf(stderr, "open_max: %ld\n", OPEN_MAX);
+ for (i = 0; i < OPEN_MAX - 10; i++) {
+ FILE *fp;
+ if ((fp = fopen("/tmp/foo", "r")) == NULL) {
+ perror("fopen");
+ xdvi_exit(EXIT_FAILURE);
+ }
+ }
+ fprintf(stderr, "opened %d files.\n", i);
+#endif
+
+
+ /* toolbar code may open files, but we have no check close_a_file() in
+ the toolbar code; so do this before prescan() possibly opens lots of files.
+ */
+#ifdef MOTIF
+ globals.widgets.main_row = XmCreateMainWindow(globals.widgets.top_level, "main", NULL, 0);
+
+ create_menu_buttons(globals.widgets.main_row, &globals.widgets.menu_bar);
+
+ /* seems to be needed for enabling `XmNhighlightOnEnter' for the toolbar buttons
+ - is this the correct place to do it? */
+ XtVaSetValues(globals.widgets.top_level, XmNkeyboardFocusPolicy, (XtArgVal)XmPOINTER, NULL);
+
+ form = XtVaCreateWidget("form", xmFormWidgetClass, globals.widgets.main_row,
+ XmNshadowThickness, 0,
+ NULL);
+
+ if (resource.main_translations != NULL) {
+ XtOverrideTranslations(form, XtParseTranslationTable(resource.main_translations));
+ }
+
+
+#if defined(USE_PANNER) && USE_XAW_PANNER
+ panner = XtVaCreateWidget("panner", pannerWidgetClass, form,
+ XmNtopAttachment, XmATTACH_FORM,
+ XmNleftAttachment, XmATTACH_FORM,
+ XmNleftOffset, 20,
+ XmNrightAttachment, XmATTACH_OPPOSITE_FORM,
+ XmNrightOffset, -resource.pagelist_width + 20,
+ XmNtopOffset, 2,
+ XmNleftOffset, 2,
+ XtNheight, 60,
+ XtNwidth, resource.pagelist_width - 50,
+ XtNsliderX, 5,
+ XtNsliderY, 7,
+ XtNinternalSpace, 0,
+ XtNshadowThickness, 0,
+ NULL);
+#endif
+#endif
+
+ /* use bounding box for highlighting if our visual isn't TrueColor
+ (not worth the trouble ...) */
+ if (G_visual->class != TrueColor) {
+ resource.match_highlight_inverted = False;
+ }
+
+ /*
+ * Step 3: Initialize the dvi file and set titles.
+ */
+
+#if FREETYPE
+ /*
+ At this point DISP, G_visual, G_depth and G_colormap must
+ be defined. Also, init_t1_lookup() must go before internal_open_dvi(),
+ since read_postamble will define some fonts and insert them into
+ fontmaps_hash, but we need a clean fontmaps_hash for detecting
+ duplicate entries in the map file.
+ */
+
+ if (resource.freetype) {
+ if (!init_t1_lookup()) {
+ /* nag 'em with a popup so that they'll do something about this */
+ popup_message(globals.widgets.top_level,
+ MSG_ERR,
+ "Direct Type 1 font rendering via FreeType gives you "
+ "many benefits, such as:\n"
+ " - quicker startup time, since no bitmap fonts need "
+ "to be generated;\n"
+ " - saving disk space for storing the bitmap fonts.\n"
+ "To fix this error, check that the file `ps2pk.map' "
+ "is located somewhere in your XDVIINPUTS path. "
+ "Have a look at the xdvi wrapper shell script "
+ "(type \"which xdvi\" to locate that shell script) "
+ "for the current setting of XDVIINPUTS.",
+ "Could not load any of the map files listed in xdvi.cfg "
+ "- disabling FreeType.");
+ resource.freetype = False;
+ }
+ }
+#endif /* FREETYPE */
+
+#if DELAYED_MKTEXPK
+ /* Open and initialize the DVI file. First, disable creation of PK fonts
+ * so that we can count the missing fonts that are to be generated. */
+ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile);
+#endif
+
+ setup_signal_handlers(False);
+
+#if !DELAYED_MKTEXPK
+ /* Notify users that fonts are being created. This is just a hack
+ and no replacement for true asynchronous font creation since it
+ doesn't give details (is just invoked if startup takes somewhat
+ longer) and freezes during font creation.
+ */
+ register_font_popup();
+#endif
+
+ /* open and initialize the DVI file, but don't read the fonts yet */
+ if (!internal_open_dvi(globals.dvi_name, &errflag, True
+#if DELAYED_MKTEXPK
+ , False /* read fonts, but don't initialize data structures */
+#endif
+ )) {
+ if (tried_dvi_ext) {
+ XDVI_FATAL((stderr, "Could not open %s: %s, and %s.dvi doesn't exist either - exiting.",
+ globals.dvi_name, get_dvi_error(errflag), globals.dvi_name));
+ }
+ else {
+ XDVI_FATAL((stderr, "Could not open %s: %s.",
+ globals.dvi_name, get_dvi_error(errflag)));
+ }
+ }
+
+#if DELAYED_MKTEXPK
+ fprintf(stderr, "after opening ...\n");
+ /* Now re-enable PK creation and read the postamble for a second time.
+ * FIXME: Actually we don't need this re-reading, could as well read the
+ * entire thing in the first run, not quit early and correctly initialize
+ * the fonts without creating them. */
+ kpse_set_program_enabled(kpse_any_glyph_format, resource.makepk, kpse_src_compile);
+
+ if (!internal_open_dvi(globals.dvi_name, &errflag, True, True)) {
+ if (tried_dvi_ext) {
+ XDVI_FATAL((stderr, "Could not open %s: %s, and %s.dvi doesn't exist either - exiting.",
+ globals.dvi_name, get_dvi_error(errflag), globals.dvi_name));
+ }
+ else {
+ XDVI_FATAL((stderr, "Could not open %s: %s.",
+ globals.dvi_name, get_dvi_error(errflag)));
+ }
+ }
+#else
+ unregister_font_popup();
+#endif
+
+ if (cb->page_arg != NULL) {
+ if (cb->page_arg[0] == '\0') { /* empty page_arg -> goto last page */
+ current_page = total_pages - 1;
+ page_history_insert(current_page);
+ }
+ else {
+ char *testptr;
+ current_page = strtoul(cb->page_arg, &testptr, 10) - 1;
+ if (*testptr != '\0') {
+ XDVI_FATAL((stderr, "Invalid page number: `%s'.", cb->page_arg));
+ }
+ current_page = check_goto_page(current_page, True);
+ }
+ }
+ else {
+ page_history_insert(current_page);
+ }
+ file_history_set_page(current_page);
+
+ ASSERT(globals.dvi_file.bak_fp != NULL, "Backup file pointer must have been initialized here");
+ if (resource.prescan) {
+ prescan(globals.dvi_file.bak_fp);
+ }
+
+ globals.page.unshrunk_w = pageinfo_get_page_width(current_page);
+ globals.page.unshrunk_h = pageinfo_get_page_height(current_page);
+ TRACE_GUI((stderr, "globals.page.unshrunk_w: %d, h: %d; window: %d, %d",
+ globals.page.unshrunk_w, globals.page.unshrunk_h,
+ pageinfo_get_window_width(current_page),
+ pageinfo_get_window_height(current_page)));
+
+ init_page();
+
+ /*
+ * Step 4: Create widgets, and set initial window size.
+ */
+
+ /* currently these override expert mode - using this is deprecated
+ in favour of `-expertmode'; inform user about this: */
+ if (resource.statusline) {
+ XDVI_WARNING((stderr, "The option/X resource `statusline' is obsolete; "
+ "use `-expertmode <flag>' instead, e.g. `-expertmode 1'\n"
+ "to switch on the status line, or `-expertmode 6'\n"
+ "to switch it off. See the xdvi man page for details."));
+ resource.expert_mode |= XPRT_SHOW_STATUSLINE;
+ }
+
+ /* XtRealizeWidget(globals.widgets.top_level); */
+
+#ifdef MOTIF
+ tool_bar = create_toolbar(globals.widgets.main_row, globals.widgets.menu_bar);
+ if (resource.main_translations != NULL) {
+ XtOverrideTranslations(tool_bar, XtParseTranslationTable(resource.main_translations));
+ }
+#endif
+
+ create_widgets(
+#ifdef MOTIF
+ tool_bar, form,
+#endif
+ &add_w, &add_h);
+
+ TRACE_GUI((stderr, "add_w = %d, add_h = %d\n", add_w, add_h));
+ /* fprintf(stderr, "geometry xdvirc: |%s|, orig: |%s|\n", resource.xdvirc_geometry, resource.geometry); */
+
+ /*
+ * Set initial window size.
+ * This needs to be done before colors are assigned because if
+ * -s 0 is specified, we need to compute the shrink factor
+ * (which in turn affects whether init_pix is called).
+ */
+ set_windowsize(&main_win_w, &main_win_h, add_w, add_h, False);
+
+ realize_widgets(main_win_w, main_win_h, add_w);
+
+ /* this needs to be done after total_pages is known (via internal_open_dvi) */
+ get_icon_and_title(globals.dvi_name, &icon_name, &title_name);
+ add_icon(globals.widgets.top_level, title_name, icon_name);
+ /* this needs to be done after the widgets have been created */
+ set_icon_and_title(icon_name, title_name);
+ free(icon_name);
+ free(title_name);
+ icon_name = title_name = NULL;
+
+
+ G_image = XCreateImage(DISP, G_visual, 1, XYBitmap, 0,
+ (char *)NULL, 0, 0, BMBITS, 0);
+ G_image->bitmap_unit = BMBITS;
+#ifdef WORDS_BIGENDIAN
+ G_image->bitmap_bit_order = MSBFirst;
+#else
+ G_image->bitmap_bit_order = LSBFirst;
+#endif
+ {
+ short endian = MSBFirst << 8 | LSBFirst;
+ G_image->byte_order = *((char *)&endian);
+ }
+
+ /* Store window id for use by get_xdvi_window_id(). */
+ {
+ long data = XtWindow(globals.widgets.top_level);
+
+ XChangeProperty(DISP, DefaultRootWindow(DISP),
+ atom_xdvi_windows(), atom_xdvi_windows(), 32,
+ PropModePrepend, (unsigned char *)&data, 1);
+ set_dvi_property();
+ }
+
+
+#if HAVE_XI21
+ xi2_init(); /* Set up hi-res (smooth) scrolling */
+#endif
+
+ /*
+ * Step 5: Assign colors and GCs.
+ * Because of the latter, this has to go after the widgets are realized.
+ */
+
+ create_gcs();
+
+ create_cursors();
+
+#ifdef MOTIF
+#if defined(USE_PANNER) && USE_XAW_PANNER
+ XtVaSetValues(panner, XtNsliderWidth, globals.page.w / 2,
+ XtNsliderHeight, globals.page.h / 2,
+ XtNcanvasWidth, globals.page.w,
+ XtNcanvasHeight, globals.page.h,
+ NULL);
+ XtManageChild(panner);
+ XtAddCallback(panner, XtNreportCallback, panner_cb, (XtPointer)NULL);
+#endif
+ create_pagelist();
+#endif
+
+ /* trigger forward search */
+ do_forward_search(resource.src_pos);
+
+ /* trigger string search */
+ if (resource.find_string != NULL) {
+ globals.ev.flags |= EV_FIND;
+ }
+
+ /* trigger anchor search */
+ if (resource.anchor_pos != NULL) {
+ g_anchor_pos = xstrdup(resource.anchor_pos);
+ g_anchor_len = strlen(g_anchor_pos);
+ globals.ev.flags |= EV_ANCHOR;
+ }
+
+#if defined(MOTIF) && HAVE_XPM
+ tb_check_navigation_sensitivity(current_page);
+#endif
+
+#if CHECK_APP_FILEVERSION
+ check_app_defaults_fileversion();
+#endif
+
+ /* can do this only after scrollbars have been realized */
+ if (!BROKEN_RECONFIG && (resource.expert_mode & XPRT_SHOW_SCROLLBARS) == 0) {
+ toggle_scrollbars();
+ }
+
+ /* initialize file watching */
+ if (resource.watch_file > 0.0) {
+#if XDVI_XT_TIMER_HACK
+ watch_file_cb(NULL, NULL);
+#else
+ XDVI_WARNING((stderr, "Could not redefine XtAppAddTimeOut(); `watchfile' not available."));
+#endif
+ }
+
+ /* raise `early' message windows */
+ raise_message_windows();
+
+ {
+ String args[1];
+ char mmode[LENGTH_OF_INT];
+ snprintf(mmode, LENGTH_OF_INT, "%d", resource.mouse_mode);
+ args[0] = mmode;
+ XtCallActionProc(globals.widgets.top_level, "switch-mode", NULL, args, 1);
+ }
+
+ /* go to home position on first page to honor -(side|top)margin flags */
+ if (!resource.keep_flag)
+ home(False);
+
+ do_pages();
+}
diff --git a/Build/source/texk/xdvik/xdvi.desktop b/Build/source/texk/xdvik/xdvi.desktop
new file mode 100644
index 00000000000..500a349958f
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=XDvi
+GenericName=DVI Viewer
+Exec=xdvi %f
+Type=Application
+Terminal=false
+Categories=Graphics;Viewer;
+Keywords=documents;
diff --git a/Build/source/texk/xdvik/xdvi.h b/Build/source/texk/xdvik/xdvi.h
new file mode 100644
index 00000000000..41cc3fcdfda
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi.h
@@ -0,0 +1,1203 @@
+/*========================================================================*\
+
+Copyright (c) 1990-2019 Paul Vojta
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+NOTE:
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
+
+\*========================================================================*/
+
+/*
+ * Original version by Eric C. Cooper, CMU
+ */
+
+#ifndef XDVI_H_
+#define XDVI_H_
+
+/* headers used by all modules */
+#include "xdvi-debug.h"
+
+#include "kpathsea/config.h" /* kpathsea definitions */
+
+/********************************
+ * The C environment *
+ *******************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+/* in case stdlib.h doesn't define these ... */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+#ifdef HAVE_WORKING_NL_LANGINFO_CODESET
+# define USE_LANGINFO 1
+#else
+# define USE_LANGINFO 0
+#endif
+
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+
+#ifndef WIFEXITED
+# define WIFEXITED(status) (((status) & 255) == 0)
+#endif
+
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(status) ((unsigned)(status) >> 8)
+#endif
+
+#ifndef WIFSIGNALED
+# ifndef WIFSTOPPED
+# define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
+# endif
+# define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status))
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(status) ((status) & 0x7f)
+#endif
+
+#if A4
+# define DEFAULT_PAPER "a4"
+#else
+# define DEFAULT_PAPER "us"
+#endif
+
+/*
+ * Define to 1 if you want to use the experimental font creation code
+ */
+#define DELAYED_MKTEXPK 0
+
+#ifdef __hpux
+/* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED
+ * leads to poll() not realizing that a file descriptor is writable in psgs.c.
+ */
+# define _HPUX_SOURCE 1
+#else
+# ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 600
+# endif
+# define _XOPEN_SOURCE_EXTENDED 1
+# define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */
+# define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */
+# define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */
+#endif
+
+/* Some O/S dependent kludges. */
+#ifdef _AIX
+# define _ALL_SOURCE 1
+#endif
+
+/* just a kludge, no real portability here ... */
+#define DIR_SEPARATOR '/'
+
+#if STDC_HEADERS
+# include <stddef.h>
+# include <stdlib.h>
+/* the following works around the wchar_t problem */
+# include <X11/X.h>
+# if HAVE_X11_XOSDEFS_H
+# include <X11/Xosdefs.h>
+# endif
+# ifdef X_NOT_STDC_ENV
+# undef X_NOT_STDC_ENV
+# undef X_WCHAR
+# include <X11/Xlib.h>
+# define X_NOT_STDC_ENV
+# endif
+#endif /* STDC_HEADERS */
+
+/* For wchar_t et al., that the X files might want. */
+#include "kpathsea/systypes.h"
+#include "kpathsea/c-memstr.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h> /* this should define MAXPATHLEN */
+#endif
+
+#include "kpathsea/c-pathmx.h" /* get fallback for PATH_MAX if all else fails */
+
+#include <X11/Xlib.h> /* include Xfuncs.h, if available */
+#include <X11/Xutil.h> /* needed for XDestroyImage */
+#include <X11/Xos.h>
+
+#include <X11/Xfuncs.h>
+#include <X11/Intrinsic.h>
+
+#if HAVE_XI21
+# include <X11/extensions/XInput2.h> /* for hi-res (smooth) scrolling */
+#endif
+
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# define MAXPATHLEN PATH_MAX
+# else
+# define MAXPATHLEN 1024
+# endif
+#endif
+
+typedef char Bool3; /* Yes/No/Maybe */
+#define True 1
+#define False 0
+#define Maybe 2
+
+
+#ifdef DEBUG
+# include<asm/msr.h>
+extern unsigned long time_start, time_end;
+#endif
+
+#include <X11/Xmd.h> /* get WORD64 and LONG64 */
+
+#if defined(HAVE_STDINT_H)
+#include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#endif
+
+/* for unused parameters */
+#ifndef UNUSED
+# define UNUSED(x) ((void)(x))
+#endif
+
+#include <string.h>
+
+#include <stdio.h>
+#include <setjmp.h>
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+/* all of these are POSIX and should have been defined by unistd.h: */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* see C FAQ; additional +1 for '\0' */
+#define LENGTH_OF_INT ((sizeof(int) * CHAR_BIT + 2) / 3 + 1 + 1)
+#define LENGTH_OF_LONG ((sizeof(long) * CHAR_BIT + 2) / 3 + 1 + 1)
+#define LENGTH_OF_ULONG ((sizeof(unsigned long) * CHAR_BIT + 2) / 3 + 1 + 1)
+
+#include "kpathsea/c-dir.h" /* dirent.h, NAMLEN */
+
+#include <stdarg.h>
+#include "kpathsea/c-fopen.h"
+#include "kpathsea/version.h"
+
+#ifndef _XFUNCPROTOBEGIN
+# define _XFUNCPROTOBEGIN
+# define _XFUNCPROTOEND
+#endif
+
+
+/* If xmkmf is broken and there's a symlink from /usr/include/X11 to the right
+ * place, then there will be no -I... argument on the cc command line for the
+ * X include files. Since gcc version 3 and higher sets __STDC__ to 0 when
+ * including system header files on some platforms, we may end up with
+ * NeedFunctionPrototypes set to 0 when it should be 1. So, let's force the
+ * issue.
+ */
+#if __STDC__ && !defined(FUNCPROTO)
+/* FUNCPROTO is a bitmask specifying ANSI conformance (see Xfuncproto.h).
+ The single bits specify varargs, const availability, prototypes etc.;
+ we enable everything here. */
+# define FUNCPROTO (-1)
+#endif
+
+#ifndef VOLATILE
+# if __STDC__ || (defined(__stdc__) && defined(__convex__))
+# define VOLATILE volatile
+# else
+# define VOLATILE /* as nothing */
+# endif
+#endif
+
+#ifndef OPEN_MODE
+/*
+ * SU, 2001/01/07: xdvi defines OPEN_MODE as "r" or as "r", "ctx=stm" (for VMS),
+ * but we use the definition of FOPEN_R_MODE from kpathsea/c-fopen.h instead:
+ */
+# define OPEN_MODE FOPEN_R_MODE
+#endif /* OPEN_MODE */
+
+#ifndef VMS
+# define OPEN_MODE_ARGS const char *
+#else
+# define OPEN_MODE_ARGS const char *, const char *
+#endif
+
+#ifndef __LINE__
+# define __LINE__ 0
+#endif
+
+#ifndef __FILE__
+# define __FILE__ "?"
+#endif
+
+#define MAXDIM 32767
+
+typedef unsigned char ubyte;
+
+typedef unsigned int wide_ubyte;
+typedef int wide_bool;
+
+#if defined(MAKEPK) && !defined(MKTEXPK)
+# define MKTEXPK 1
+#endif
+
+#define spell_conv0(n, f) ((long) (n * f))
+#define spell_conv(n) spell_conv0(n, dimconv)
+
+typedef BMTYPE bmTypeT;
+typedef unsigned BMTYPE bmUnitT;
+/* #define BMUNIT unsigned BMTYPE */
+#define BMBITS (8 * BMBYTES) /* number of bits in a bmTypeT */
+
+#define ADD(a, b) ((bmUnitT *) (((char *) a) + b))
+#define SUB(a, b) ((bmUnitT *) (((char *) a) - b))
+
+extern bmUnitT bit_masks[BMBITS + 1];
+
+/* for safely printing char *s that might be NULL */
+#define STRING_OR_NULL(x) ((x == NULL ? "<NULL>" : x))
+
+#define INSIDE_MANE_WIN ((currwin.win == mane.win))
+#define MAGNIFIER_ACTIVE ((magnifier.win != 0))
+/* #define MAGNIFIER_ACTIVE ((globals.cursor.flags & CURSOR_MAG)) */
+
+#define mane_base_x 0
+#define mane_base_y 0
+
+
+struct frame {
+ /* dvi_h and dvi_v is the horizontal and vertical baseline position;
+ it is the responsability of the set_char procedure to update
+ them. */
+ struct framedata {
+ long dvi_h, dvi_v, w, x, y, z;
+ int pxl_v;
+ } data;
+ struct frame *next, *prev;
+};
+
+#ifdef TEXXET
+typedef void setcharRetvalT;
+#else
+typedef long setcharRetvalT;
+#endif
+
+typedef setcharRetvalT (*set_char_proc) (
+#ifdef TEXXET
+ wide_ubyte cmd,
+#endif
+ wide_ubyte ch);
+
+#define ROUNDUP(x,y) (((x)+(y)-1)/(y))
+
+#ifndef BDPI
+# define BDPI 600
+#endif
+
+#if defined(GS_PATH) && !defined(PS_GS)
+# define PS_GS 1
+#endif
+
+#if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS)
+# define PS 1
+#else
+# define PS 0
+#endif
+
+#ifdef MOTIF
+# include <Xm/Xm.h>
+
+/* Note: non-k xdvi has MOTIF_TIMERS here, we use XDVI_XT_TIMER_HACK instead (see above) */
+
+# ifndef DDIST
+# define DDIST 4
+# endif
+# ifndef DDIST_MAJOR
+# define DDIST_MAJOR 10
+# endif
+# ifndef DDIST_MINOR
+# define DDIST_MINOR 5
+# endif
+
+extern XmStringCharSet G_charset;
+
+/*
+ * Whether to use some widgets which are only available with Motif 2.0.
+ * In these cases, the LessTif versions are either buggy or visually
+ * inferior (as of lesstif-0.93.18), in which case suitable replacements
+ * should be used; e.g. cascade button or a textfield plus button for
+ * a combobox, or a textfield plus button for a spinbox.
+ */
+# if XmVersion >= 2000 && !defined(LESSTIF_VERSION)
+# define USE_COMBOBOX 1
+# define Xdvi_COMBO_BOX_ARROW_SIZE 15 /* the default arrows are *way* too big */
+# define USE_SPINBOX 1
+# else
+# define USE_COMBOBOX 0
+# define USE_SPINBOX 0
+# endif
+
+#endif /* MOTIF */
+
+typedef enum {
+ XPRT_SHOW_NONE = 0U,
+ XPRT_SHOW_STATUSLINE = 1,
+ XPRT_SHOW_SCROLLBARS = 2,
+#ifdef MOTIF
+ XPRT_SHOW_PAGELIST = 4,
+ XPRT_SHOW_TOOLBAR = 8,
+ XPRT_SHOW_MENUBAR = 16,
+ XPRT_SHOW_ALL = 31
+#else
+ XPRT_SHOW_BUTTONS = 4,
+ XPRT_SHOW_ALL = 7
+#endif /* MOTIF */
+} expertFlagT;
+
+typedef enum {
+ MOUSE_MODE1,
+ MOUSE_MODE2,
+ MOUSE_MODE3,
+ MOUSE_MODE_MAX
+} mouseModeT;
+
+typedef enum {
+ NO_MODE_ACTIVE,
+ RULER_MODE_ACTIVE,
+ TEXT_MODE_ACTIVE
+} modeFlagT;
+
+/* SUBPIXEL_NONE for no subpixel rendering, otherwise order of subpixels
+ (from option/resource subPixels) */
+typedef enum { SUBPIXEL_NONE, SUBPIXEL_RGB, SUBPIXEL_BGR } subpixelOrderT;
+
+/*
+ * X resources.
+ */
+extern struct x_resources {
+ /* NOTE: we don't use CFGFILE */
+ Boolean no_init_file;
+ Boolean regression;
+ const char *geometry;
+ const char *windowsize;
+ Boolean remember_windowsize;
+ int app_defaults_fileversion;
+ mouseModeT mouse_mode;
+ Boolean use_tex_pages;
+ int shrinkfactor;
+ const char *main_translations;
+ const char *mouse_translations;
+/* const char *wheel_translations; */
+ int wheel_unit;
+ int density;
+ Boolean omega;
+ const char *mouse_mode1_name;
+ const char *mouse_mode1_description;
+ int mouse_mode1_cursor;
+ const char *mouse_mode2_name;
+ const char *mouse_mode2_description;
+ int mouse_mode2_cursor;
+ const char *mouse_mode3_name;
+ const char *mouse_mode3_description;
+ int mouse_mode3_cursor;
+#ifdef GREY
+ float gamma;
+/* float inverted_factor; */
+#endif
+ int pixels_per_inch;
+ Boolean delay_rulers;
+ int tick_length;
+ char *tick_units;
+ const char *sidemargin;
+ int sidemargin_int;
+ const char *topmargin;
+ int topmargin_int;
+ const char *xoffset;
+ int xoffset_int;
+ const char *yoffset;
+ int yoffset_int;
+ Boolean use_current_offset; /* only used internally */
+ const char *paper;
+ Boolean paper_landscape; /* only used internally */
+ const char *alt_font;
+#ifdef MKTEXPK
+ Boolean makepk;
+#endif
+ const char *mfmode;
+ const char *editor;
+#ifdef MOTIF
+ char *prefs_editor_list;
+#endif
+ Boolean freetype;
+#if HAVE_XI21
+ Boolean xi2scrolling;
+#endif
+ const char *src_pos;
+ const char *find_string;
+ const char *text_encoding;
+ Boolean src_fork;
+ const char *sub_pixels;
+ const char *file_history;
+ int file_history_size;
+ Boolean no_file_arg_use_history;
+#if RGB_ANTI_ALIASING
+ subpixelOrderT subpixel_order;
+ float subpixel_energy[3];
+#endif
+ Boolean unique;
+ Boolean list_fonts;
+ Boolean reverse;
+ Boolean warn_spec;
+ Boolean hush;
+ Boolean hush_chars;
+ Boolean hush_chk;
+ Boolean hush_stdout;
+ Boolean hush_bell;
+ Boolean safer;
+#ifdef VMS
+ const char *fore_color;
+ const char *back_color;
+#endif
+ Pixel fore_Pixel;
+ Pixel back_Pixel;
+ /* Pixel brdr_Pixel; */
+ Pixel hl_Pixel;
+ Pixel cr_Pixel;
+ const char *icon_geometry;
+ Boolean keep_flag;
+ Boolean copy;
+ Boolean thorough;
+ Boolean pause;
+ const char *pause_special;
+ Boolean fullscreen;
+#ifdef PS
+ int postscript;
+ Boolean allow_shell;
+# ifdef PS_DPS
+ Boolean useDPS;
+# endif
+# ifdef PS_NEWS
+ Boolean useNeWS;
+# endif
+# ifdef PS_GS
+ Boolean useGS;
+ Boolean gs_safer;
+ Boolean gs_alpha;
+ const char *gs_path;
+ const char *gs_palette;
+ int gs_timeout;
+# endif
+# ifdef MAGICK
+ Boolean useMAGICK;
+ const char *magick_cache;
+# endif
+#endif /* PS */
+ Boolean prescan;
+ Boolean use_temp_fp;
+ const char *debug_arg;
+ const char *menu_translations;
+ Boolean expert;
+ float watch_file; /* check DVI file every so often, in seconds */
+ int expert_mode;
+#ifndef MOTIF
+ Dimension btn_side_spacing;
+ Dimension btn_top_spacing;
+ Dimension btn_between_spacing;
+ /* ignored, only for backwards compatibility */
+ Dimension btn_between_extra;
+ Dimension btn_border_width;
+#else /* MOTIF */
+ const char *toolbar_translations;
+#endif /* MOTIF */
+ Boolean statusline;
+#ifdef MOTIF
+ /* not a user-level resource; indicates a problem with the toolbar, in
+ which case the toolbar is disabled. */
+ Boolean toolbar_unusable;
+ const char *toolbar_pixmap_file;
+ Boolean toolbar_buttons_raised;
+ Boolean tooltips_in_statusline;
+ int tooltips_wait_period; /* used for communication with Tip.c */
+ int tooltips_wait_period_bak; /* uncustomized value */
+ Boolean show_tooltips;
+#endif /* MOTIF */
+ Boolean pagelist_highlight_current;
+ Dimension pagelist_width;
+ const char *mg_arg[5];
+#if COLOR
+ Boolean use_color;
+#endif
+#ifdef GREY
+ Boolean use_grey;
+ Bool3 install;
+#endif
+ Boolean match_highlight_inverted;
+ const char *dvips_path;
+ const char *ps2pdf_path;
+ int dvips_hang;
+ int dvips_fail_hang;
+ const char *dvips_printer_str;
+ const char *dvips_options_str;
+ int default_saving_format;
+ int default_printing_target;
+ int grid_mode;
+ char *rule_color;
+ Pixel rule_pixel;
+ int link_style;
+ char *link_color;
+ char *visited_link_color;
+ char *browser;
+#ifdef MOTIF
+ char *prefs_browser_list;
+# if USE_COMBOBOX
+ char *search_history;
+ int search_history_size;
+# endif
+#endif /* MOTIF */
+ char *unknown_mime_suffix;
+ char *no_mime_suffix;
+ char *anchor_pos;
+ /* whether to open file in new window from file selector (only for DVI files) */
+ Boolean filesel_open_new_window;
+ /* bitmask of current search window settings */
+ unsigned int search_window_defaults;
+ /* char * _scroll_pages; */
+ char *help_general;
+ char *help_hypertex;
+ char *help_othercommands;
+ char *help_pagemotion;
+ char *help_marking;
+ char *help_modes;
+ char *help_search;
+ char *help_mousebuttons;
+ char *help_sourcespecials;
+ int page_history_size;
+} resource;
+
+extern void load_app_resources(Boolean also_pixels);
+
+
+struct WindowRec {
+ Window win;
+ int shrinkfactor;
+ int base_x;
+ int base_y;
+ unsigned int width;
+ unsigned int height;
+ /* for pending expose events */
+ int min_x;
+ int max_x;
+ int min_y;
+ int max_y;
+};
+
+struct event_info {
+ int flags;
+ VOLATILE int ctr;
+ jmp_buf canit;
+ jmp_buf next; /* to skip next event */
+};
+
+struct pause_info {
+ int num;
+ int *num_save;
+ Boolean flag;
+};
+
+struct gc_info {
+ GC rule;
+ GC fore;
+ GC inverted;
+ GC high;
+ GC linkcolor;
+ GC visited_linkcolor;
+ GC fore2;
+ GC fore2_bak;
+ GC fore2_bak1;
+ GC copy;
+ GC ruler;
+ Boolean do_copy;
+};
+
+/* flags for special cursor states */
+#define CURSOR_LINK 1 /* hyperlink */
+#define CURSOR_MAG 2 /* magnifier is mapped */
+#define CURSOR_DRAG_V 4 /* vertical dragging */
+#define CURSOR_DRAG_H 8 /* horizontal dragging */
+#define CURSOR_DRAG_A 16 /* dragging in any direction */
+#define CURSOR_CORRUPTED 32 /* DVI file corrupted */
+#define CURSOR_TEXT 64 /* DVI file corrupted */
+#define CURSOR_RULER 128 /* DVI file corrupted */
+
+/* cursors for all states */
+struct cursor_info {
+ Cursor mode1;
+ Cursor mode2;
+ Cursor mode3;
+
+ Cursor wait;
+ Cursor corrupted;
+ /* hyperlink */
+ Cursor link;
+ /* horizontal/vertical/all directions drag */
+ Cursor drag_h;
+ Cursor drag_v;
+ Cursor drag_a;
+ /* support for `pause' feature */
+ Cursor pause;
+ /* empty cursor */
+ Cursor empty;
+
+ /* one of the flags defined above */
+ unsigned long flags;
+};
+
+struct window_expose_info {
+ int min_x, max_x, min_y, max_y;
+};
+
+/* for communication with forward search in dvi-draw.c */
+struct src_info {
+ int fwd_box_page;
+ const char *fwd_string;
+};
+
+struct widget_info {
+ Widget top_level;
+ Widget draw_widget, draw_background, clip_widget;
+ Widget x_bar, y_bar;
+#ifdef MOTIF
+ Widget main_window, main_row, tool_bar, top_row, menu_bar;
+#else
+ Widget vport_widget, form_widget, paned;
+#endif
+};
+
+struct page_info {
+ unsigned int w, h;
+ unsigned int unshrunk_w, unshrunk_h;
+};
+
+struct dvi_file_info {
+ char *dirname;
+ size_t dirlen;
+ FILE *bak_fp;
+ time_t time; /* last file modification time */
+};
+
+/* struct to hold global settings that can't go into the resources,
+ * as a replacement for global variables:
+ */
+extern struct program_globals {
+ XtAppContext app;
+ const char *program_name; /* argv[0] without the directory part */
+ const char *cwd; /* directory where xdvi is running in (for childs who need to change back to it) */
+ char *dvi_name; /* dvi file name, fully expanded with REALPATH */
+ Boolean load_init_file; /* whether to read/save ~/.xdvirc */
+ char *orig_locale; /* original locale we are running in */
+ unsigned long debug; /* debugging option */
+
+ /* for older Motif versions or LessTif, which have broken
+ handling of Act_motion() / Act_release() events */
+ Boolean broken_motif_event_handling;
+
+ /* offset from c-style (0 based) numbers to real pagenumbers;
+ also contains the offset that user has set via Act_declare_page_number() */
+ int pageno_correct;
+
+ /* paper unit used for grid mode */
+ unsigned int grid_paper_unit;
+
+ /* whether we warn about unrecognized specials. Copy of resource.warn_spec value,
+ set to False in the drawing routine to reduce the amount of warnings given.
+ Better maybe replace with hash lookup similar to fonts warnings? */
+ Boolean warn_spec_now;
+
+ /* used to save X resource values */
+ char *curr_paper;
+ char *curr_editor;
+ char *curr_browser;
+ float curr_gamma;
+ Boolean curr_use_color;
+
+ modeFlagT curr_mode;
+
+ /* forward search info */
+ struct src_info src;
+
+ /* event information */
+ struct event_info ev;
+
+ /* support for `-pause' feature */
+ struct pause_info pausing;
+
+ /* window expose information */
+ struct window_expose_info win_expose;
+
+ struct gc_info gc;
+
+ /* cursor information */
+ struct cursor_info cursor;
+
+ /* widget information */
+ struct widget_info widgets;
+
+ /* page size info */
+ struct page_info page;
+
+ /* DVI file and modification time info */
+ struct dvi_file_info dvi_file;
+
+} globals;
+
+
+/* TODO: put these into globals as well */
+extern struct WindowRec mane;
+extern struct WindowRec currwin;
+extern struct WindowRec magnifier;
+
+
+extern XtAppContext app;
+extern char *dvi_property; /* for setting in window */
+extern size_t dvi_property_length;
+extern XImage *G_image;
+extern int G_backing_store;
+/* extern int home_x, home_y; */
+
+extern Display *DISP;
+extern Screen *SCRN;
+
+extern XtAccelerators G_accels_cr;
+#ifdef GREY
+extern Visual *G_visual;
+extern unsigned int G_depth;
+extern Colormap G_colormap;
+#else
+# define G_depth (unsigned int) DefaultDepthOfScreen(SCRN)
+# define G_visual DefaultVisualOfScreen(SCRN)
+# define G_colormap DefaultColormapOfScreen(SCRN)
+#endif
+
+
+#define TNTABLELEN 30 /* length of TeXnumber array (dvi file) */
+#define VFTABLELEN 5 /* length of TeXnumber array (virtual fonts) */
+
+extern struct font *tn_table[TNTABLELEN];
+extern struct font *font_head;
+extern struct tn *tn_head;
+extern wide_ubyte maxchar;
+extern unsigned short current_timestamp;
+
+extern int current_page;
+extern int total_pages;
+
+extern unsigned long magnification;
+extern double dimconv;
+extern double tpic_conv;
+
+/* whether this file contains source specials, so that we need to
+ update the `windows' property for forward search on expose events:
+*/
+extern Boolean have_src_specials;
+
+extern Boolean dragcurs; /* whether drag cursor is active; needed by hypertex.c */
+extern int drag_flags; /* 1 = vert, 2 = horiz; also needed by hypertex.c */
+
+typedef void (*mouse_proc) (XEvent *);
+extern mouse_proc mouse_motion;
+extern mouse_proc mouse_release;
+
+struct mouse_acts {
+ Modifiers mask;
+ Modifiers value;
+ struct _LateBindings *late_bindings;
+ unsigned int button;
+ struct xdvi_action *action;
+ struct mouse_acts *next;
+};
+
+extern struct mouse_acts *mouse_actions;
+
+#if GREY
+extern Pixel plane_masks[4];
+#endif
+
+#if GREY || COLOR
+extern XColor color_data[2];
+#endif
+
+#if COLOR
+struct rgb {
+ unsigned short r, g, b;
+};
+
+struct pagecolor {
+ struct rgb bg;
+ unsigned int stacksize;
+ struct rgb *colorstack;
+};
+struct pagecolor_info {
+ /* different from non-k xdvi, we also need the allocated stack size,
+ since it might differ from the number of pages (e.g. when loading
+ a new file). */
+ size_t size;
+ /* this is const in non-k xdvi, but some instances of it may ultimately
+ get free()d in full_reset_colors(), so it's not *really* const ...
+ */
+ struct pagecolor *stack;
+};
+
+/* Information on background color and initial color stack for each page. */
+extern struct pagecolor_info page_colors;
+
+/* The initial color stack is obtained from the pagecolor record for a page. */
+extern struct rgb *color_bottom;
+extern unsigned int color_bot_size; /* number of entries */
+
+/* Additions to the runtime color stack on a given page are stored in a linked
+ list. "struct colorframe" is defined in special.c. */
+extern struct colorframe *rcs_top;
+
+/* Color states. */
+
+/*
+ * For each (foreground, background) color pair, we keep information (depending
+ * on the color model). It is organized as a linked list of linked lists,
+ * with background color more significant.
+ */
+
+struct bgrec {
+ struct bgrec *next;
+ struct rgb color;
+ struct fgrec *fg_head;
+ Boolean pixel_good; /* if the pixel entry is valid */
+ Pixel pixel;
+};
+
+struct fgrec {
+ struct fgrec *next;
+ struct rgb color;
+ Boolean pixel_good; /* if the pixel entry is valid */
+ Pixel pixel;
+# if GREY
+ Boolean palette_good; /* if the palette entry is valid */
+ Pixel palette[16]; /* non-TrueColor only */
+# endif
+};
+
+extern struct rgb fg_initial; /* Initial fg (from command line) */
+extern struct rgb bg_initial; /* Initial bg */
+extern struct bgrec *bg_head; /* head of list */
+extern struct bgrec *bg_current; /* current bg value */
+extern struct fgrec *fg_current; /* current fg value */
+extern struct fgrec *fg_active; /* where the GCs are */
+
+/* List of allocated colors (to be deallocated upon document change) */
+extern Pixel *color_list; /* list of colors */
+extern unsigned int color_list_len; /* current len of list */
+extern unsigned int color_list_max; /* allocated size */
+
+/* Whether the color situation has been warned about. */
+extern Boolean color_warned;
+#endif /* COLOR */
+
+
+#if HAVE_XI21
+struct xi2_valinfo {
+ int number;
+ double increment;
+ double lastval;
+ double lastexact;
+ double factor;
+ unsigned long serial;
+};
+
+struct xi2_slave {
+ int id; /* slave device id */
+ unsigned int flags;
+ unsigned char enabled;
+ unsigned char btn_mask; /* buttons corresponding to valuators */
+ struct xi2_valinfo vert, horiz;
+ struct xi2_slave *next;
+};
+
+ /* flag bits */
+# define XI2_SLAVE_VERT (1<<0) /* if vert. valuator present */
+# define XI2_SLAVE_HORIZ (1<<1) /* if horiz. valuator present */
+
+struct xi2_master {
+ int id; /* master device id */
+ struct xi2_slave *slave; /* currently active slave dev */
+ struct xi2_master *next;
+};
+
+
+extern int xi2_opcode;
+extern Boolean xi2_active;
+extern struct xi2_master *xi2_masters; /* linked list of master devs */
+extern struct xi2_master *xi2_current; /* current master device */
+extern struct xi2_slave *xi2_slaves; /* linked list of slave devs */
+
+extern struct xi2_slave xi2_no_slave; /* if no slave assigned yet */
+
+extern void xi2_init_valuators(struct xi2_slave *, XIAnyClassInfo **, int);
+extern void xi2_activate(void);
+
+#endif /* HAVE_XI21 */
+
+
+extern Boolean dvi_file_corrupted;
+
+extern short magnifier_stat; /* 1 = wait for expose, -1 = destroy upon expose */
+
+extern void run_dvi_file(const char *filename, void *data);
+
+/*
+ ================================================================================
+ globals from dvi-draw.c
+ ================================================================================
+*/
+
+/*
+ * The following is set when we're prescanning before opening up the windows,
+ * and we hit a PostScript header file. We can't start up gs until we get
+ * a window to associate the process to, so we have to prescan twice.
+ */
+#if PS_GS
+extern Boolean gs_postpone_prescan;
+#endif
+
+#if PS
+extern int scanned_page_ps; /* last page scanned for PS specials */
+extern int scanned_page_ps_bak; /* save the above if PS is turned off */
+#endif
+
+#if COLOR
+extern int scanned_page_color; /* last page scanned for color spcls */
+#endif /* COLOR */
+
+extern int scanned_page; /* last page prescanned */
+extern int scanned_page_reset; /* number to reset the above to */
+extern ubyte *G_dvi_buf_ptr;
+extern struct drawinf currinf;
+extern Boolean drawing_mag;
+extern Boolean htex_inside_href;
+
+/* globals from hypertex.h */
+/* current anchor to search for, either from command-line or from clicking mouse */
+extern char *g_anchor_pos;
+extern size_t g_anchor_len;
+
+extern char *g_link_color_rgb;
+extern char *g_visited_link_color_rgb;
+
+/* globals from special.h */
+/*
+ * If we're in the middle of a PSFIG special.
+ */
+extern Boolean psfig_begun;
+/*
+ * Set if the -paper option overrides papersize specials.
+ */
+extern Boolean ignore_papersize_specials;
+extern Boolean have_raw_postscript;
+#if PS
+extern struct psprocs psp, no_ps_procs;
+#endif
+
+#ifdef MAGICK
+/* TODO: put access functions for these in special.c */
+extern int bbox_angle;
+extern Boolean bbox_valid;
+extern unsigned int bbox_width;
+extern unsigned int bbox_height;
+extern int bbox_voffset;
+#endif
+
+/* globals from statusline.h */
+extern Widget statusline;
+
+
+/*
+ * The cursor shape in the magnifying glass is determined by which
+ * window received the button press event. Under Motif, it's mane.win,
+ * under XAW, it's the parent of mane.win.
+ */
+#ifdef MOTIF
+# define CURSORWIN mane.win
+#else
+/* # define CURSORWIN XtWindow(globals.widgets.form_widget) */
+# define CURSORWIN mane.win
+#endif
+
+
+/*
+ * This was MOTIF_TIMERS in the non-k xdvi version, but since xdvik
+ * also uses XtAppAddTimeOut() for Xaw, we always need to define it.
+ * See the comment in events.c for further explanations.
+ */
+#if LD_ALLOWS_MULTIPLE_DEFINITIONS
+# define XDVI_XT_TIMER_HACK 1
+#else
+# define XDVI_XT_TIMER_HACK 0
+#endif
+
+extern const char **get_paper_types(void);
+extern size_t get_paper_types_size(void);
+
+extern void register_font_popup(void);
+extern void unregister_font_popup(void);
+
+struct startup_info {
+ int file_idx;
+ char *page_arg;
+};
+
+#ifdef STATUSLINE
+/* this is only for the initialization; the statusline will reset it to a more adequate value: */
+# define XTRA_H 17
+#endif
+
+/*
+ * Generic structure for DVI scans; contains a buffer for longjmp()ing
+ * out of the scanning process if it's interrupted by the user (ugh ...)
+ * and a generic `void *' to scan-specific info.
+ */
+struct scan_info {
+ jmp_buf done_env;
+ void (*geom_special)(struct scan_info *info, const char *str, int str_len);
+ void *data;
+};
+
+/*
+ * Used by the geometry-scanning routines.
+ * It passes pointers to routines to be called at certain
+ * points in the dvi file, and other information.
+ */
+struct geom_info {
+ void (*geom_box)(struct scan_info *, long, long, long, long);
+ void *geom_data;
+};
+
+#define get_byte(fp) ((unsigned char)getc(fp))
+#define get_lbyte(fp) ((long)get_byte(fp))
+
+extern void get_icon_and_title(const char *filename, char **icon_name, char **title_name);
+extern void set_icon_and_title(const char *icon_name, const char *title_name);
+extern void reconfigure_window(Boolean fullsize, Dimension w, Dimension h,
+ Boolean save_position);
+extern void set_windowsize(Dimension *ret_w, Dimension *ret_h, int add_w, int add_h, Boolean override);
+
+#ifdef MOTIF
+extern void motif_translations_hack(void);
+#endif
+
+#ifndef MAX
+# define MAX(i, j) ((i) > (j) ? (i) : (j))
+#endif
+
+#ifndef MIN
+# define MIN(i, j) ((i) < (j) ? (i) : (j))
+#endif
+
+#ifndef ABS
+# define ABS(x) (((x) < 0) ? (-(x)) : (x))
+#endif
+
+#define REPORT_XDVI_BUG_TEMPLATE "Please report this as a bug to:\n\
+ http://sourceforge.net/tracker/?group_id=23164&atid=377580\n"
+
+#if HAVE_ICONV && HAVE_ICONV_H
+# undef HAVE_ICONV_H
+# define HAVE_ICONV_H 1
+#else
+# undef HAVE_ICONV_H
+# define HAVE_ICONV_H 0
+#endif
+
+
+#if HAVE_GOOD_SETSID_VFORK
+# if HAVE_VFORK_H
+# include <vfork.h>
+# endif
+#else /* HAVE_GOOD_SETSID_VFORK */
+/* Mac OS X 10.3 (Panther) (11/2003) doesn't allow setsid() within vfork() */
+# undef vfork
+# define vfork fork
+#endif /* HAVE_GOOD_SETSID_VFORK */
+
+
+/* XawtextScrollWhenNeeded has been ditched in Xaw7
+ (e.g. Xfree >= 4.x); from the man page:
+
+ The value XawtextScrollWhenNeeded (and whenNeeded, recognized by
+ the converter), is accepted for backwards compatibilty with
+ resource specifications written for the Xaw6 Text widget, but
+ ignored (effectively treated as XawtextScrollNever).
+
+ So we're forced to use `scrollAlways' here.
+*/
+#define XAW_SCROLL_ALWAYS XawtextScrollAlways
+
+/* the reconfig stuff has been fixed in XFree 4.1.0, vendor release 6510 (Slackware 8.0) */
+#define BROKEN_RECONFIG (( \
+ (strstr(ServerVendor(DISP), "XFree") != NULL) \
+ && VendorRelease(DISP) >= 4000 \
+ && VendorRelease(DISP) < 4002 \
+ ))
+
+/* enable the following if you're getting unresolved messages about `iconv_open' etc.: */
+#if 0
+#define LIBICONV_PLUG
+#define iconv_open libiconv_open
+#define iconv_close libiconv_close
+#define iconv libiconv
+#endif /* 0 */
+
+#if HAVE_ICONV_H
+typedef ICONV_CHAR_PPTR_TYPE iconv_char_pptrT;
+#endif /* HAVE_ICONV_H */
+
+#define DEVEL_MODE 0
+
+#endif /* XDVI_H_ */
diff --git a/Build/source/texk/xdvik/xdvi.icon b/Build/source/texk/xdvik/xdvi.icon
new file mode 100644
index 00000000000..dcfd263510f
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvi.icon
@@ -0,0 +1,27 @@
+#define xdvi_width 48
+#define xdvi_height 48
+static const unsigned char xdvi_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x22, 0x00, 0x00, 0x01, 0x00, 0x00, 0xa2, 0xe0, 0x44, 0x38, 0x95, 0x13,
+ 0x9e, 0x17, 0x45, 0x45, 0x55, 0xf4, 0x82, 0xf0, 0x28, 0x3d, 0xd5, 0x13,
+ 0x82, 0x10, 0x28, 0x05, 0x55, 0x10, 0x82, 0xe0, 0x10, 0x39, 0x8a, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x00,
+ 0x79, 0x18, 0x18, 0x13, 0x16, 0x00, 0x69, 0x10, 0x18, 0x0e, 0x16, 0x00,
+ 0xcf, 0x20, 0x1c, 0x0e, 0xd6, 0x00, 0xe9, 0xc3, 0x7b, 0x84, 0x3f, 0x01,
+ 0x09, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0xcc,
+ 0x08, 0x00, 0x00, 0x00, 0x30, 0x52, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x52,
+ 0x0a, 0xc0, 0xff, 0x03, 0x30, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0xc0, 0xff, 0x03, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf0, 0x17,
+ 0x0b, 0x0c, 0x3c, 0xc0, 0x93, 0x20, 0x0c, 0x0e, 0x43, 0x20, 0x96, 0x40,
+ 0x0c, 0x8e, 0x81, 0x10, 0x96, 0xbe, 0x0a, 0x8d, 0x81, 0x19, 0x90, 0x82,
+ 0x8a, 0x8c, 0x81, 0x0d, 0x90, 0x42, 0x48, 0x8c, 0x81, 0xed, 0x91, 0x3e,
+ 0x6a, 0x0c, 0xc3, 0x1d, 0x96, 0x12, 0x38, 0x0c, 0xbc, 0x0d, 0x1c, 0x02,
+ 0xf8, 0x3f, 0x80, 0x0d, 0x1c, 0x3e, 0x0b, 0x0c, 0x80, 0x0c, 0x1c, 0x00,
+ 0x0b, 0x0c, 0xc3, 0x18, 0x1c, 0x00, 0x0a, 0x0c, 0x63, 0x10, 0x16, 0x00,
+ 0x89, 0x3f, 0x1e, 0xe0, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x1f, 0xae, 0x0f, 0x00, 0x80, 0x84, 0x0a, 0xae,
+ 0x87, 0x64, 0x86, 0x84, 0x08, 0x42, 0x42, 0x45, 0xe2, 0x1c, 0x07, 0x42};
diff --git a/Build/source/texk/xdvik/xdvizilla b/Build/source/texk/xdvik/xdvizilla
new file mode 100755
index 00000000000..fb0005085af
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvizilla
@@ -0,0 +1,175 @@
+#! /bin/sh
+#
+# This is a kludge to fix helper apps in mozilla. See mozilla bugs #57420
+# and also #78919.
+#
+# It's also useful for tar files with Netscape 4.x
+#
+# Copyright (c) 2002-2004 Paul Vojta
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF OR CONTRIBUTOR TO
+# THIS SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+# Some changes suggested by Thomas Esser included by
+# <stefanulrich@users.sourceforge.net>.
+
+IN_FILE=
+NO_RM=
+TMP_DIR=
+progname=xdvizilla
+
+do_cleanup()
+{
+exit 0
+ exitval=$?
+ if [ -z "$NO_RM" -a -n "$IN_FILE" ] ; then
+ rm -f "$IN_FILE"
+ fi
+ test -n "$TMP_DIR" && rm -rf "$TMP_DIR"
+ exit $exitval
+}
+
+do_abort()
+{
+ xmessage -nearmouse "$progname: $1"
+ do_cleanup
+ exit 1
+}
+
+usage()
+{
+ xmessage -nearmouse "Usage: $progname [-no-rm] <file>"
+ do_cleanup
+ exit 1
+}
+
+
+# Solaris' file command fails to identify DVI files (bug #1508963),
+# so add an extra check for these; otherwise, output result of 'file' command.
+get_filetype()
+{
+ f="$1"
+ have_solaris=`uname -a | grep -i sunos`
+ if [ "$have_solaris"xxx = "xxx" ]
+ then
+ ret=`file "$f"`
+ else
+ # we're on solaris, get first 2 bytes of file
+ magic=`od -N 2 -x "$f" | cut -d ' ' -f 2 | sed 1q | tr 'ABCDEF' 'abcdef'`
+ case "$magic" in
+ "f702" | "02f7")
+ ret="TeX DVI file"
+ ;;
+ *)
+ ret=`file "$f"`
+ ;;
+ esac
+ fi
+ echo "$ret"
+}
+
+trap 'do_cleanup' 1 2 3 7 13 15
+
+### create a temporary directory only read/writable by user
+### try mktemp if it's available
+TMP_DIR=${TMPDIR-${TEMP-${TMP-/tmp}}}/${progname}.XXXXXX
+TMP_DIR=`mktemp -d "$TMP_DIR" 2> /dev/null`
+if [ $? -ne 0 ]; then
+ ### fall back to unsafe creation
+ TMP_DIR=${TMPDIR-${TEMP-${TMP-/tmp}}}/${progname}.$$
+ (umask 077; mkdir "$TMP_DIR") || do_abort "Could not create directory \`$TMP_DIR'"
+fi
+
+### we hard-wire the magic for DVI files here since some "file" implementations
+### (e.g. on Solaris 9) don't recognize DVI files (bug #1508963)
+TMP_MAGIC_FILE="$TMP_DIR"/tmp-magic
+### Note: 3 tabs in the following line!
+echo '0 string \367\002 TeX DVI file' > "$TMP_MAGIC_FILE"
+
+if [ $# -gt 1 -a "x$1" = "x-no-rm" ]; then
+ NO_RM=y
+ shift
+fi
+
+if [ $# -ne 1 ]; then
+ usage
+fi
+
+DIR=`dirname "$0"`
+
+if [ "$DIR" = . ]; then
+ DIR=
+elif [ -f "$DIR"/xdvi -a -x "$DIR"/xdvi ]; then
+ DIR="$DIR"/
+else
+ DIR=
+fi
+
+# set -x
+
+# need to preserve IN_FILE for eventual deletion
+IN_FILE="$1"
+TMP_FILE="$IN_FILE"
+
+while [ 1 ]; do
+ [ -f "$TMP_FILE" ] || do_abort "$TMP_FILE: File not found."
+ #FILETYPE=`file -m "$TMP_MAGIC_FILE" "$TMP_FILE"`
+ FILETYPE=`get_filetype "$TMP_FILE"`
+ case "$FILETYPE" in
+ *"gzip compressed data"*)
+ out="$TMP_DIR"/tmp-gz
+ gunzip -c "$TMP_FILE" > "$out"
+ TMP_FILE="$out"
+ ;;
+ *"compressed data"* | *"compress'd data"*)
+ out="$TMP_DIR"/tmp-compress
+ uncompress -c "$TMP_FILE" > "$out"
+ TMP_FILE="$out"
+ ;;
+ "$TMP_FILE: empty")
+ do_abort "$TMP_FILE is an empty file
+(probably a bug in Mozilla?)"
+ ;;
+ *" tar archive")
+ ### do sanity checks on the tar archive, to avoid overwriting user files:
+ dangerous=`tar tf "$TMP_FILE" | egrep '^(/|.*\.\./)'`
+ [ -z "$dangerous" ] || do_abort "Tar file contains files with absolute paths or \`../' components,
+which may overwrite user files. Not unpacking it."
+ ### also check for gzipped DVI files inside the archive ...
+ out="$TMP_DIR"/`tar tf "$TMP_FILE" | egrep '\.(dvi|dvi.gz|dvi.Z)$' | head -1`
+ if [ -z "$out" ]; then
+ do_abort "Tar file does not contain a dvi file."
+ else
+ cat "$TMP_FILE" | (cd "$TMP_DIR"; tar xf -)
+ TMP_FILE="$out"
+ fi
+ ;;
+ *"DVI file"*)
+ "$DIR"xdvi -safer "$TMP_FILE"
+ break
+ ;;
+ *)
+ do_abort "$TMP_FILE: Unrecognized file format!"
+ ;;
+ esac
+done
+
+do_cleanup
+
+exit 0
diff --git a/Build/source/texk/xdvik/xdvizilla.1 b/Build/source/texk/xdvik/xdvizilla.1
new file mode 100644
index 00000000000..62b0d91c2de
--- /dev/null
+++ b/Build/source/texk/xdvik/xdvizilla.1
@@ -0,0 +1,115 @@
+.\" Copyright (c) 2002-2004 Paul Vojta
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining a copy
+.\" of this software and associated documentation files (the "Software"), to
+.\" deal in the Software without restriction, including without limitation the
+.\" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+.\" sell copies of the Software, and to permit persons to whom the Software is
+.\" furnished to do so, subject to the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included in
+.\" all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+.\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+.\" PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+.\" IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+.\" CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.TH XDVIZILLA 1 "11 October 2002" "X Version 11"
+.SH NAME
+xdvizilla \- Helper application for running xdvi
+.SH SYNOPSIS
+.B xdvizilla
+[\fB\-no\-rm\fP]
+.I file
+.SH DESCRIPTION
+Presently (October 2002), Mozilla has some bugs with helper applications:
+it passes gzipped
+.RB ( .gz )
+files directly to the helper application without uncompressing, and it
+passes compressed
+.RB ( .Z )
+files as empty files.
+.PP
+To work around these problems,
+.B xdvizilla
+was written to look at files and decompress them correctly (depending on
+their file types).
+.PP
+In addition, some sites produced tarred
+.I dvi
+files (including the
+.I dvi
+file as well as some included figures), and
+.B xdvizilla
+correctly handles those files as well.
+.SH OPTIONS
+Only one option is supported:
+.TP
+.B \-no\-rm
+Normally
+.B xdvizilla
+will remove
+.I file
+before finishing. This option inhibits this behavior.
+.SH INSTALLATION
+In addition to installing
+.B xdvizilla
+in a directory on the default search path, it is necessary to set it up
+as a helper application within the browser.
+.PP
+For
+.BR "Netscape 4.x" ,
+add the following lines to the
+.B mailcap
+file:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+application/x-dvi; xdvi -safer %s
+application/x-dvi-tar; xdvizilla -no-rm %s
+.sp 1n
+.ft
+.fi
+.RE
+.PP
+For
+.BR "Netscape 6.x" ,
+.BR "Netscape 7.x" ,
+or
+.BR "Mozilla 1.x" ,
+add the following lines to the
+.B mailcap
+file:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+application/x-dvi; xdvizilla %s
+application/x-dvi-tar; xdvizilla %s
+.sp 1n
+.ft
+.fi
+.RE
+.PP
+In addition, it would be useful to check that the following line is included
+in the
+.B mime.types
+file:
+.RS 5
+.nf
+.ft 3
+.sp 1n
+type=application/x-dvi exts="dvi" desc="TeX dvi file"
+.sp 1n
+.ft
+.fi
+.RE
+.SH SEE ALSO
+.BR X (1),
+.BR xdvi (1).
+.SH AUTHOR
+Paul Vojta, U.C. Berkeley.
diff --git a/Build/source/texk/xdvik/xserver-info.c b/Build/source/texk/xdvik/xserver-info.c
new file mode 100644
index 00000000000..3a47c0ef1b2
--- /dev/null
+++ b/Build/source/texk/xdvik/xserver-info.c
@@ -0,0 +1,280 @@
+/* Xserver debugging functions, lifted from X11 R6.6's xdpyinfo.c.
+ Original copyright follows:
+*/
+
+/*
+ Copyright 1988, 1998 The Open Group
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation.
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name of The Open Group shall not be
+ used in advertising or otherwise to promote the sale, use or other dealings
+ in this Software without prior written authorization from The Open Group.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ */
+
+#include "xdvi-config.h"
+#include "xdvi.h"
+#include "xserver-info.h"
+
+#ifdef XSERVER_INFO
+
+static void
+print_display_info (Display *dpy)
+{
+ char dummybuf[40];
+ char *cp;
+ int minkeycode, maxkeycode;
+ int i, n;
+ /* long req_size; */
+ XPixmapFormatValues *pmf;
+ Window focuswin;
+ int focusrevert;
+
+ printf("name of display: %s\n", DisplayString (dpy));
+ printf("version number: %d.%d\n",
+ ProtocolVersion (dpy), ProtocolRevision (dpy));
+ printf("vendor string: %s\n", ServerVendor (dpy));
+ printf("vendor release number: %d\n", VendorRelease (dpy));
+ /* apparently AIX 3 does not have XExtendedMaxRequestSize.
+ We don't really need it either.
+ */
+ /* req_size = XExtendedMaxRequestSize (dpy); */
+ /* if (!req_size) req_size = XMaxRequestSize (dpy); */
+ /* printf("maximum request size: %ld bytes\n", req_size * 4); */
+ /* printf("motion buffer size: %lu\n", XDisplayMotionBufferSize (dpy)); */
+
+ switch (BitmapBitOrder (dpy)) {
+ case LSBFirst: cp = "LSBFirst"; break;
+ case MSBFirst: cp = "MSBFirst"; break;
+ default:
+ sprintf(dummybuf, "unknown order %d", BitmapBitOrder (dpy));
+ cp = dummybuf;
+ break;
+ }
+ printf("bitmap unit: %d, bit order: %d (%s), padding: %d\n",
+ BitmapUnit (dpy), BitmapBitOrder(dpy), cp, BitmapPad (dpy));
+
+ switch (ImageByteOrder (dpy)) {
+ case LSBFirst: cp = "LSBFirst"; break;
+ case MSBFirst: cp = "MSBFirst"; break;
+ default:
+ sprintf(dummybuf, "unknown order %d", ImageByteOrder (dpy));
+ cp = dummybuf;
+ break;
+ }
+ printf("image byte order: %d (%s)\n", ImageByteOrder(dpy), cp);
+
+ pmf = XListPixmapFormats (dpy, &n);
+ printf("number of supported pixmap formats: %d\n", n);
+ if (pmf) {
+ printf("supported pixmap formats:\n");
+ for (i = 0; i < n; i++) {
+ printf(" depth %d, bits_per_pixel %d, scanline_pad %d\n",
+ pmf[i].depth, pmf[i].bits_per_pixel, pmf[i].scanline_pad);
+ }
+ XFree ((char *) pmf);
+ }
+
+
+ /*
+ * when we get interfaces to the PixmapFormat stuff, insert code here
+ */
+
+ XDisplayKeycodes (dpy, &minkeycode, &maxkeycode);
+ printf("keycode range: minimum %d, maximum %d\n",
+ minkeycode, maxkeycode);
+
+ XGetInputFocus (dpy, &focuswin, &focusrevert);
+ printf("focus: ");
+ switch (focuswin) {
+ case PointerRoot:
+ printf("PointerRoot\n");
+ break;
+ case None:
+ printf("None\n");
+ break;
+ default:
+ printf("window 0x%lx, revert to ", focuswin);
+ switch (focusrevert) {
+ case RevertToParent:
+ printf("Parent\n");
+ break;
+ case RevertToNone:
+ printf("None\n");
+ break;
+ case RevertToPointerRoot:
+ printf("PointerRoot\n");
+ break;
+ default: /* should not happen */
+ printf("%d\n", focusrevert);
+ break;
+ }
+ break;
+ }
+
+ /* print_extension_info (dpy); */
+
+ printf("default screen number: %d\n", DefaultScreen (dpy));
+ printf("number of screens: %d\n", ScreenCount (dpy));
+}
+
+static void
+print_visual_info (XVisualInfo *vip)
+{
+ char errorbuf[40]; /* for sprintfing into */
+ char *class = NULL; /* for printing */
+
+ switch (vip->class) {
+ case StaticGray: class = "StaticGray"; break;
+ case GrayScale: class = "GrayScale"; break;
+ case StaticColor: class = "StaticColor"; break;
+ case PseudoColor: class = "PseudoColor"; break;
+ case TrueColor: class = "TrueColor"; break;
+ case DirectColor: class = "DirectColor"; break;
+ default:
+ sprintf(errorbuf, "unknown class %d", vip->class);
+ class = errorbuf;
+ break;
+ }
+
+ printf(" visual:\n");
+ printf(" visual id: 0x%lx\n", vip->visualid);
+ printf(" class: %s\n", class);
+ printf(" depth: %d plane%s\n", vip->depth,
+ vip->depth == 1 ? "" : "s");
+ if (vip->class == TrueColor || vip->class == DirectColor)
+ printf(" available colormap entries: %d per subfield\n",
+ vip->colormap_size);
+ else
+ printf(" available colormap entries: %d\n",
+ vip->colormap_size);
+ printf(" red, green, blue masks: 0x%lx, 0x%lx, 0x%lx\n",
+ vip->red_mask, vip->green_mask, vip->blue_mask);
+ printf(" significant bits in color specification: %d bits\n",
+ vip->bits_per_rgb);
+}
+
+static void
+print_screen_info (Display *dpy, int scr)
+{
+ Screen *s = ScreenOfDisplay (dpy, scr); /* opaque structure */
+ XVisualInfo viproto; /* fill in for getting info */
+ XVisualInfo *vip; /* retured info */
+ int nvi; /* number of elements returned */
+ int i; /* temp variable: iterator */
+ /* char eventbuf[80]; */ /* want 79 chars per line + nul */
+ static char *yes = "YES", *no = "NO", *when = "WHEN MAPPED";
+ double xres, yres;
+ int ndepths = 0, *depths = NULL;
+ unsigned int width, height;
+
+
+ /*
+ * there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
+ *
+ * dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
+ * = N pixels / (M inch / 25.4)
+ * = N * 25.4 pixels / M inch
+ */
+
+ xres = ((((double) DisplayWidth(dpy,scr)) * 25.4) /
+ ((double) DisplayWidthMM(dpy,scr)));
+ yres = ((((double) DisplayHeight(dpy,scr)) * 25.4) /
+ ((double) DisplayHeightMM(dpy,scr)));
+
+ printf("\n");
+ printf("screen #%d:\n", scr);
+ printf(" dimensions: %dx%d pixels (%dx%d millimeters)\n",
+ DisplayWidth (dpy, scr), DisplayHeight (dpy, scr),
+ DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr));
+ printf(" resolution: %dx%d dots per inch\n",
+ (int) (xres + 0.5), (int) (yres + 0.5));
+ depths = XListDepths (dpy, scr, &ndepths);
+ if (!depths) ndepths = 0;
+ printf(" depths (%d): ", ndepths);
+ for (i = 0; i < ndepths; i++) {
+ printf("%d", depths[i]);
+ if (i < ndepths - 1) {
+ putchar (',');
+ putchar (' ');
+ }
+ }
+ putchar ('\n');
+ if (depths) XFree ((char *) depths);
+ printf(" root window id: 0x%lx\n", RootWindow (dpy, scr));
+ printf(" depth of root window: %d plane%s\n",
+ DisplayPlanes (dpy, scr),
+ DisplayPlanes (dpy, scr) == 1 ? "" : "s");
+ printf(" number of colormaps: minimum %d, maximum %d\n",
+ MinCmapsOfScreen(s), MaxCmapsOfScreen(s));
+ printf(" default colormap: 0x%lx\n", DefaultColormap (dpy, scr));
+ printf(" default number of colormap cells: %d\n",
+ DisplayCells (dpy, scr));
+ printf(" preallocated pixels: black %lu, white %lu\n",
+ BlackPixel (dpy, scr), WhitePixel (dpy, scr));
+ printf(" options: backing-store %s, save-unders %s\n",
+ (DoesBackingStore (s) == NotUseful) ? no :
+ ((DoesBackingStore (s) == Always) ? yes : when),
+ DoesSaveUnders (s) ? yes : no);
+ XQueryBestSize (dpy, CursorShape, RootWindow (dpy, scr), 65535, 65535,
+ &width, &height);
+ if (width == 65535 && height == 65535)
+ printf(" largest cursor: unlimited\n");
+ else
+ printf(" largest cursor: %dx%d\n", width, height);
+ printf(" current input event mask: 0x%lx\n", EventMaskOfScreen (s));
+ /* (void) print_event_mask (eventbuf, 79, 4, EventMaskOfScreen (s)); */
+
+
+ nvi = 0;
+ viproto.screen = scr;
+ vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi);
+ printf(" number of visuals: %d\n", nvi);
+ printf(" default visual id: 0x%lx\n",
+ XVisualIDFromVisual (DefaultVisual (dpy, scr)));
+ for (i = 0; i < nvi; i++) {
+ print_visual_info (vip+i);
+ }
+ if (vip) XFree ((char *) vip);
+}
+
+
+/*
+ public function: when DBG_ALL is enabled, dump info on Xserver
+ to stdout.
+*/
+void
+print_xserver_info(void)
+{
+ int i;
+ if (globals.debug & DBG_PK) {
+ puts("========== Xserver properties info begin ==========\n");
+ print_display_info(DISP);
+ for (i = 0; i < ScreenCount(DISP); i++) {
+ print_screen_info(DISP, i);
+ }
+ puts("========== Xserver properties info end ==========\n");
+ }
+}
+
+
+#else
+/* silence `empty compilation unit' warnings */
+static void bar(void); static void foo(void) { bar(); } static void bar(void) { foo(); }
+#endif /* XSERVER_INFO */
diff --git a/Build/source/texk/xdvik/xserver-info.h b/Build/source/texk/xdvik/xserver-info.h
new file mode 100644
index 00000000000..d9e9d1d2c1f
--- /dev/null
+++ b/Build/source/texk/xdvik/xserver-info.h
@@ -0,0 +1,10 @@
+#ifndef XSERVER_INFO_H_
+#define XSERVER_INFO_H_
+
+#ifdef XSERVER_INFO
+
+extern void print_xserver_info(void);
+
+#endif /* XSERVER_INFO */
+
+#endif /* XSERVER_INFO_H_ */