summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pmpostdir
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2014-09-16 09:01:26 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2014-09-16 09:01:26 +0000
commited35ca7560a0e1ec82107722d95212d02e0f6120 (patch)
tree14fd43985a1c2a418f80fa2c33ebacae4fe833d5 /Build/source/texk/web2c/pmpostdir
parent4394fcebb4df6385e6d02bea16726df0dd9df005 (diff)
Build system: Add texk/web2c/pmpostdir/ for pMetaPost and upMetaPost
git-svn-id: svn://tug.org/texlive/trunk@35184 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/pmpostdir')
-rw-r--r--Build/source/texk/web2c/pmpostdir/ChangeLog6
-rw-r--r--Build/source/texk/web2c/pmpostdir/am/pmpost.am183
-rw-r--r--Build/source/texk/web2c/pmpostdir/pmp.ch361
-rw-r--r--Build/source/texk/web2c/pmpostdir/pmpost.ch288
-rwxr-xr-xBuild/source/texk/web2c/pmpostdir/pmpost.test13
-rw-r--r--Build/source/texk/web2c/pmpostdir/pmpxout.ch539
-rw-r--r--Build/source/texk/web2c/pmpostdir/ppsout.ch95
-rw-r--r--Build/source/texk/web2c/pmpostdir/psvgout.ch77
-rw-r--r--Build/source/texk/web2c/pmpostdir/ptfmin.ch104
-rw-r--r--Build/source/texk/web2c/pmpostdir/upmp.ch12
-rwxr-xr-xBuild/source/texk/web2c/pmpostdir/upmpost.test13
11 files changed, 1691 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/pmpostdir/ChangeLog b/Build/source/texk/web2c/pmpostdir/ChangeLog
new file mode 100644
index 00000000000..98677828d27
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/ChangeLog
@@ -0,0 +1,6 @@
+2014-09-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Import pMetaPost and upMetaPost from ???.
+ * Rename change files and adapt to TeX Live build system.
+ * Handle pMetaPost/upMetaPost differences via '#ifdef UPMP'.
+ * pmpost.test, upmpost.test: Shell scripts for simple test.
diff --git a/Build/source/texk/web2c/pmpostdir/am/pmpost.am b/Build/source/texk/web2c/pmpostdir/am/pmpost.am
new file mode 100644
index 00000000000..71c0de0bc16
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/am/pmpost.am
@@ -0,0 +1,183 @@
+## texk/web2c/pmpostdir/am/pmpost.am: Makefile fragment for pMetaPost.
+##
+## Copyright (C) 2014 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+
+## pMetaPost and upMetaPost
+##
+if PMP
+bin_PROGRAMS += pmpost
+if WIN32
+noinst_PROGRAMS += call_pmpost
+install_exe_links += install-pmpost-links
+uninstall_exe_links += uninstall-pmpost-links
+else !WIN32
+bin_links += pmpost$(EXEEXT):pdvitomp
+endif !WIN32
+endif PMP
+if UPMP
+bin_PROGRAMS += upmpost
+if WIN32
+noinst_PROGRAMS += call_upmpost
+install_exe_links += install-upmpost-links
+uninstall_exe_links += uninstall-upmpost-links
+else !WIN32
+bin_links += upmpost$(EXEEXT):updvitomp
+endif !WIN32
+endif UPMP
+EXTRA_PROGRAMS += pmpost upmpost
+
+call_pmpost_CPPFLAGS = -DEXEPROG=\"pmpost.exe\"
+nodist_call_pmpost_SOURCES = callexe.c
+call_pmpost_LDADD =
+
+call_upmpost_CPPFLAGS = -DEXEPROG=\"upmpost.exe\"
+nodist_call_upmpost_SOURCES = callexe.c
+call_upmpost_LDADD =
+
+pmpost_CPPFLAGS = $(MPFR_INCLUDES) $(GMP_INCLUDES) $(CAIRO_INCLUDES) $(PIXMAN_INCLUDES) \
+ $(LIBPNG_INCLUDES) $(ZLIB_INCLUDES) $(PTEXENC_INCLUDES) $(AM_CPPFLAGS) -I$(srcdir)/mplibdir
+pmpost_LDADD = $(PTEXENC_LIBS) $(KPATHSEA_LIBS) $(MPFR_LIBS) $(GMP_LIBS) \
+ $(CAIRO_LIBS) $(PIXMAN_LIBS) $(LIBPNG_LIBS) $(ZLIB_LIBS) libmputil.a
+
+upmpost_CPPFLAGS = -DUPMP $(pmpost_CPPFLAGS)
+upmpost_LDADD = $(pmpost_LDADD)
+
+.PHONY: install-pmpost-links install-upmpost-links uninstall-pmpost-links uninstall-upmpost-links
+if WIN32
+install-pmpost-links: call_pmpost$(EXEEXT)
+ $(INSTALL_PROGRAM) call_pmpost$(EXEEXT) $(DESTDIR)$(bindir)/pdvitomp$(EXEEXT)
+install-upmpost-links: call_upmpost$(EXEEXT)
+ $(INSTALL_PROGRAM) call_upmpost$(EXEEXT) $(DESTDIR)$(bindir)/updvitomp$(EXEEXT)
+uninstall-pmpost-links:
+ rm -f $(DESTDIR)$(bindir)/pdvitomp$(EXEEXT)
+uninstall-upmpost-links:
+ rm -f $(DESTDIR)$(bindir)/updvitomp$(EXEEXT)
+endif WIN32
+
+# Creating one file: just one rule
+pmp_ctangle = $(ctangle_silent)CWEBINPUTS=.:$(srcdir)/pmpostdir $(ctangle)
+# Creating several files: need stamp file and two rules with identical recipes
+pmp_ctangle_sh = CWEBINPUTS=.:$(srcdir)/pmpostdir AM_V_P=$(AM_V_P) $(SHELL) ./tangle-sh $@ $(CTANGLE)
+
+## pMetaPost C sources
+nodist_pmpost_SOURCES = $(pmp_c_h) $(pmpmath_c_h) $(pmpmathbinary_c_h) $(pmpmathdecimal_c_h) \
+ $(pmpmathdouble_c_h) pmpost.c $(pmpstrings_c_h) $(pmpxout_c_h) \
+ $(ppngout_c_h) $(ppsout_c_h) $(psvgout_c_h) ptfmin.c
+pmp_c_h = pmp.c pmplib.h pmpmp.h
+pmpmath_c_h = pmpmath.c pmpmath.h
+pmpmathbinary_c_h = pmpmathbinary.c pmpmathbinary.h
+pmpmathdecimal_c_h = pmpmathdecimal.c pmpmathdecimal.h
+pmpmathdouble_c_h = pmpmathdouble.c pmpmathdouble.h
+pmpstrings_c_h = pmpstrings.h pmpstrings.c
+pmpxout_c_h = pmpxout.c pmpxout.h
+ppngout_c_h = pmplibpng.h pmppngout.h ppngout.c
+ppsout_c_h = pmppsout.h ppsout.c pmplibps.h
+psvgout_c_h = pmplibsvg.h pmpsvgout.h psvgout.c
+
+## upMetaPost C sources
+nodist_upmpost_SOURCES = $(nodist_pmpost_SOURCES)
+
+# sed script
+pmp_sed_main = 's/mpxout\.h/pmpxout.h/;s/mpmp\.h/pmpmp.h/;s/mplib\.h/pmplib.h/;s/mpstrings\.h/pmpstrings.h/'
+pmp_sed_math = 's/mpmath\([a-z]*\)\.h/pmpmath\1.h/'
+pmp_sed_ps = 's/mplibps\.h/pmplibps.h/;s/mppsout\.h/pmppsout.h/'
+pmp_sed_svg = 's/mplibsvg\.h/pmplibsvg.h/;s/mpsvgout\.h/pmpsvgout.h/'
+pmp_sed_png = 's/mplibpng\.h/pmplibpng.h/;s/mppngout\.h/pmppngout.h/'
+pmp_sed = sed -e $(pmp_sed_main) -e $(pmp_sed_math) -e $(pmp_sed_ps) -e $(pmp_sed_svg) -e $(pmp_sed_png)
+
+pmp.w: mplibdir/mp.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/mp.w >$@
+pmpmath.c: mpmath.c
+ $(AM_V_GEN)$(pmp_sed) mpmath.c >$@
+pmpmath.h: mpmath.h
+ $(AM_V_GEN)$(pmp_sed) mpmath.h >$@
+pmpmathbinary.c: mpmathbinary.c
+ $(AM_V_GEN)$(pmp_sed) mpmathbinary.c >$@
+pmpmathbinary.h: mpmathbinary.h
+ $(AM_V_GEN)$(pmp_sed) mpmathbinary.h >$@
+pmpmathdecimal.c: mpmathdecimal.c
+ $(AM_V_GEN)$(pmp_sed) mpmathdecimal.c >$@
+pmpmathdecimal.h: mpmathdecimal.h
+ $(AM_V_GEN)$(pmp_sed) mpmathdecimal.h >$@
+pmpmathdouble.c: mpmathdouble.c
+ $(AM_V_GEN)$(pmp_sed) mpmathdouble.c >$@
+pmpmathdouble.h: mpmathdouble.h
+ $(AM_V_GEN)$(pmp_sed) mpmathdouble.h >$@
+pmpost.w: mplibdir/mpost.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/mpost.w >$@
+pmpstrings.c: mpstrings.c
+ $(AM_V_GEN)$(pmp_sed) mpstrings.c >$@
+pmpstrings.h: mpstrings.h
+ $(AM_V_GEN)$(pmp_sed) mpstrings.h >$@
+pmpxout.w: mplibdir/mpxout.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/mpxout.w >$@
+pmplibpng.h: mplibpng.h
+ $(AM_V_GEN)$(pmp_sed) mplibpng.h >$@
+pmppngout.h: mppngout.h
+ $(AM_V_GEN)$(pmp_sed) mppngout.h >$@
+ppngout.c: pngout.c
+ $(AM_V_GEN)$(pmp_sed) pngout.c >$@
+ppsout.w: mplibdir/psout.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/psout.w >$@
+psvgout.w: mplibdir/svgout.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/svgout.w >$@
+ptfmin.w: mplibdir/tfmin.w
+ $(AM_V_GEN)$(pmp_sed) $(srcdir)/mplibdir/tfmin.w >$@
+
+# Creating one file: just one rule
+pmpost.c: ctangle$(EXEEXT) pmpost.w pmpostdir/pmpost.ch
+ $(pmp_ctangle) pmpost pmpost
+ptfmin.c: ctangle$(EXEEXT) ptfmin.w pmpostdir/ptfmin.ch
+ $(pmp_ctangle) ptfmin ptfmin
+
+# Creating several files: need stamp file and two rules with identical recipes
+$(pmp_c_h): pmp-tangle
+ @$(pmp_ctangle_sh) pmp pmp
+pmp-tangle: ctangle$(EXEEXT) pmp.w pmpostdir/pmp.ch tangle-sh
+ @$(pmp_ctangle_sh) pmp pmp
+
+$(pmpxout_c_h): pmpxout-tangle
+ @$(pmp_ctangle_sh) pmpxout pmpxout
+pmpxout-tangle: ctangle$(EXEEXT) pmpxout.w pmpostdir/pmpxout.ch tangle-sh
+ @$(pmp_ctangle_sh) pmpxout pmpxout
+
+$(ppsout_c_h): ppsout-tangle
+ @$(pmp_ctangle_sh) ppsout ppsout
+ppsout-tangle: ctangle$(EXEEXT) ppsout.w pmpostdir/ppsout.ch tangle-sh
+ @$(pmp_ctangle_sh) ppsout ppsout
+
+$(psvgout_c_h): psvgout-tangle
+ @$(pmp_ctangle_sh) psvgout psvgout
+psvgout-tangle: ctangle$(EXEEXT) psvgout.w pmpostdir/psvgout.ch tangle-sh
+ @$(pmp_ctangle_sh) psvgout psvgout
+
+## pMetaPost CWeb sources
+pmpost_web = pmpostdir/pmp.ch pmpostdir/pmpost.ch pmpostdir/pmpxout.ch pmpostdir/ppsout.ch \
+ pmpostdir/psvgout.ch pmpostdir/ptfmin.ch
+
+$(pmpost_OBJECTS) $(upmpost_OBJECTS): $(nodist_pmpost_SOURCES) $(PTEXENC_DEPEND) \
+ $(LIBPNG_DEPEND) $(CAIRO_DEPEND) $(MPFR_DEPEND)
+
+EXTRA_DIST += pmpostdir/ChangeLog $(pmpost_web)
+
+DISTCLEANFILES += $(nodist_pmpost_SOURCES) \
+ pmp.w pmpost.w pmpxout.w ppsout.w psvgout.w ptfmin.w \
+ pmp-tangle pmpxout-tangle ppsout-tangle psvgout-tangle
+
+## (u)pMetaPost Tests
+##
+pmp_tests = pmpostdir/pmpost.test pmpostdir/upmpost.test
+
+EXTRA_DIST += $(pmp_tests)
+
+if PMP
+TESTS += pmpostdir/pmpost.test
+endif PMP
+if UPMP
+TESTS += pmpostdir/upmpost.test
+endif UPMP
+
+## Unresolved pMetaPost/upMetaPost diff
+EXTRA_DIST += pmpostdir/upmp.ch
+
diff --git a/Build/source/texk/web2c/pmpostdir/pmp.ch b/Build/source/texk/web2c/pmpostdir/pmp.ch
new file mode 100644
index 00000000000..aef89a90598
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/pmp.ch
@@ -0,0 +1,361 @@
+% jMetaPost change file for MetaPost
+%
+% written by Michio Matsuyama <fwhw5892@mb.infoweb.ne.jp>
+% Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp>
+%
+% $Id: jmp.ch,v 1.42 2000/03/20 02:55:50 hideyuki Exp $
+
+%
+%
+% change file of mp.w for pMetaPost (CWEB version)
+% Akira Kakuto (translated the WEB version)
+%
+%
+
+@x
+@d default_banner "This is MetaPost, Version 1.999" /* printed when \MP\ starts */
+@y
+@z
+
+@x
+#define metapost_version "1.999"
+@y
+#ifdef UPMP
+#define metapost_name "upMetaPost"
+#define metapost_version "1.999-0.04-u1.11"
+#else
+#define metapost_name "pMetaPost"
+#define metapost_version "1.999-0.04"
+#endif
+#define default_banner "This is " metapost_name ", Version " metapost_version /* printed when \MP\ starts */
+@z
+
+@x
+# include <unistd.h> /* for access */
+#endif
+@y
+# include <unistd.h> /* for access */
+#endif
+#include <kpathsea/config.h>
+#include <kpathsea/kpathsea.h>
+#include <ptexenc/ptexenc.h>
+#include <errno.h>
+@z
+
+@x
+void mp_close_file (MP mp, void *f) {
+ (void) mp;
+ if (f != NULL)
+ fclose ((FILE *) f);
+@y
+void mp_close_file (MP mp, void *f) {
+ (void) mp;
+#ifdef WIN32
+ if (f != NULL) {
+ clear_infile_enc((FILE *)f);
+ fclose ((FILE *) f);
+ }
+#else
+ if (f != NULL)
+ fclose ((FILE *) f);
+#endif
+@z
+
+@x
+mp->buf_size = 200;
+@y
+{
+ char *kpse_buf = kpse_var_value("buf_size");
+ if(kpse_buf) {
+ mp->buf_size = atoi(kpse_buf);
+ free(kpse_buf);
+ } else {
+ mp->buf_size = 500000;
+ }
+}
+@z
+
+@x
+static boolean mp_input_ln (MP mp, void *f) {
+ /* inputs the next line or returns |false| */
+ char *s;
+ size_t size = 0;
+ mp->last = mp->first; /* cf.\ Matthew 19\thinspace:\thinspace30 */
+ s = (mp->read_ascii_file) (mp, f, &size);
+ if (s == NULL)
+ return false;
+ if (size > 0) {
+ mp->last = mp->first + size;
+ if (mp->last >= mp->max_buf_stack) {
+ mp->max_buf_stack = mp->last + 1;
+ while (mp->max_buf_stack > mp->buf_size) {
+ mp_reallocate_buffer (mp, (mp->buf_size + (mp->buf_size >> 2)));
+ }
+ }
+ (void) memcpy ((mp->buffer + mp->first), s, size);
+ }
+ free (s);
+ return true;
+}
+@y
+static boolean mp_input_ln (MP mp, void *f ) {
+ int i = EOF;
+ mp->last = input_line2((FILE *)f, mp->buffer, mp->first, mp->buf_size, &i);
+ if (i == EOF && errno != EINTR && mp->last == mp->first)
+ return false;
+ if (i != EOF && i != '\n' && i != '\r') {
+ fprintf (stderr, "! Unable to read an entire line---bufsize=%u.\n",
+ (unsigned) mp->buf_size);
+ fputs ("Please increase buf_size in texmf.cnf.\n", stderr);
+ exit (1);
+ }
+ if (i == '\r') {
+ while ((i = getc ((FILE *)f)) == EOF && errno == EINTR)
+ ;
+ if (i != '\n')
+ ungetc (i, f);
+ }
+ return true;
+}
+@z
+
+@x
+wterm (mp->banner);
+@y
+wterm (mp->banner);
+wterm(" (");
+wterm(getencstring());
+wterm(")");
+@z
+
+@x
+} four_quarters;
+typedef union {
+ integer sc;
+ four_quarters qqqq;
+} font_data;
+@y
+} four_quarters;
+typedef struct {
+ halfword RH, LH;
+} two_halves;
+typedef union {
+ two_halves hh;
+ integer sc;
+ four_quarters qqqq;
+} font_data;
+@z
+
+%
+% tategaki support
+%
+% Suppose h==(0,height), d==(0,-depth) && w==(width,0) in horizontal string,
+% && h==(height,0), d==(-depth,0) && w==(0,-width) in vertical string.
+% Four vertices of the bounding box is h, d, h+w && d+w && those of the
+% transformed boundig box is Th, Td, T(h+w) && T(d+w), so that the values
+% of Th, Td && Tw are compared here.
+
+@x
+@ The height width and depth information stored in a text node determines a
+rectangle that needs to be transformed according to the transformation
+parameters stored in the text node.
+
+@y
+@ The height width and depth information stored in a text node determines a
+rectangle that needs to be transformed according to the transformation
+parameters stored in the text node.
+
+Boundig box depends on JFM font ID.
+
+@d yoko_jfm_id 11 /* `yoko-kumi' fonts */
+@d tate_jfm_id 9 /* `tate-kumi' fonts */
+@d font_jfm_p(A) (mp->font_id[(A)]!=0)
+
+@z
+
+@x
+ mp_number x0a, y0a, x1a, y1a, arg1;
+ mp_text_node p0 = (mp_text_node)p;
+ new_number (x0a);
+ new_number (x1a);
+ new_number (y0a);
+ new_number (y1a);
+ new_number (arg1);
+ number_clone (arg1, p0->depth);
+ number_negate (arg1);
+ take_scaled (x1a, p0->txx, p0->width);
+ take_scaled (y0a, p0->txy, arg1);
+ take_scaled (y1a, p0->txy, p0->height);
+@y
+ mp_number x0a, y0a, x1a, y1a, arg1, arg2;
+ mp_text_node p0 = (mp_text_node)p;
+ new_number (x0a);
+ new_number (x1a);
+ new_number (y0a);
+ new_number (y1a);
+ new_number (arg1);
+ new_number (arg2);
+ number_clone (arg1, p0->depth);
+ number_negate (arg1);
+ number_clone (arg2, p0->width);
+ number_negate (arg2);
+ if ( mp->font_id[mp_font_n(p)]!=tate_jfm_id ) {
+ take_scaled (x1a, p0->txx, p0->width);
+ take_scaled (y0a, p0->txy, arg1);
+ take_scaled (y1a, p0->txy, p0->height);
+ } else {
+ take_scaled (x1a, p0->txy, arg2);
+ take_scaled (y0a, p0->txx, arg1);
+ take_scaled (y1a, p0->txx, p0->height);
+ }
+@z
+
+@x
+ take_scaled (x1a, p0->tyx, p0->width);
+ number_clone (arg1, p0->depth);
+ number_negate (arg1);
+ take_scaled (y0a, p0->tyy, arg1);
+ take_scaled (y1a, p0->tyy, p0->height);
+@y
+ if ( mp->font_id[mp_font_n(p)]!=tate_jfm_id ) {
+ take_scaled (x1a, p0->tyx, p0->width);
+ number_clone (arg1, p0->depth);
+ number_negate (arg1);
+ take_scaled (y0a, p0->tyy, arg1);
+ take_scaled (y1a, p0->tyy, p0->height);
+ } else {
+ number_clone (arg1, p0->depth);
+ number_negate (arg1);
+ number_clone (arg2, p0->width);
+ number_negate (arg2);
+ take_scaled (x1a, p0->tyy, arg2);
+ take_scaled (y0a, p0->tyx, arg1);
+ take_scaled (y1a, p0->tyx, p0->height);
+ }
+@z
+
+@x
+ wlog (mp->banner);
+@y
+ wlog (mp->banner);
+ wlog (" (");
+ wlog (getencstring());
+ wlog (")");
+@z
+
+%
+% char type pointers
+@x
+eight_bits *font_bc;
+eight_bits *font_ec; /* first and last character code */
+@y
+eight_bits *font_bc;
+eight_bits *font_ec; /* first and last character code */
+halfword *font_nt;
+halfword *font_id;
+@z
+
+@x
+int *char_base; /* base address for |char_info| */
+@y
+int *char_base; /* base address for |char_info| */
+int *ctype_base;
+@z
+
+@x
+xfree (mp->char_base);
+@y
+xfree (mp->font_id);
+xfree (mp->font_nt);
+xfree (mp->char_base);
+xfree (mp->ctype_base);
+@z
+
+@x
+ XREALLOC (mp->char_base, l, int);
+@y
+ XREALLOC (mp->font_id, l, halfword);
+ XREALLOC (mp->font_nt, l, halfword);
+ XREALLOC (mp->char_base, l, int);
+ XREALLOC (mp->ctype_base, l, int);
+@z
+
+
+@x
+mp->char_base[null_font] = 0;
+@y
+mp->font_id[null_font] = 0;
+mp->font_nt[null_font] = 0;
+mp->char_base[null_font] = 0;
+mp->ctype_base[null_font] = 0;
+@z
+
+@x
+@d char_mp_info(A,B) mp->font_info[mp->char_base[(A)]+(B)].qqqq
+@y
+@d char_mp_info(A,B) mp->font_info[mp->char_base[(A)]+(B)].qqqq
+@d ctype_char_end(A) (A)].hh.LH
+@d ctype_char(A) mp->font_info[mp->ctype_base[(A)]+ctype_char_end
+@d ctype_type_end(A) (A)].hh.RH
+@d ctype_type(A) mp->font_info[mp->ctype_base[(A)]+ctype_type_end
+@z
+
+%
+% lookup character type table
+@x
+void mp_set_text_box (MP mp, mp_text_node p) {
+@y
+@<Declare JFM function for text measuring@>;
+void mp_set_text_box (MP mp, mp_text_node p) {
+#ifdef UPMP
+ integer cx; /* code for Japanese two byte character */
+#endif
+@z
+
+@x
+ if ((*(mp_text_p (p)->str + k) < bc) || (*(mp_text_p (p)->str + k) > ec)) {
+ mp_lost_warning (mp, f, *(mp_text_p (p)->str + k));
+ } else {
+ cc = char_mp_info (f, *(mp_text_p (p)->str + k));
+@y
+ if ( ((*(mp_text_p (p)->str + k) < bc) || (*(mp_text_p (p)->str + k) > ec)) && (mp->font_id[f]==0) ) {
+ mp_lost_warning (mp, f, *(mp_text_p (p)->str + k));
+ } else {
+ if (mp->font_id[f]!=0) {
+#ifdef UPMP
+ if (multistrlen(mp_text_p (p)->str, kk, k)>1) {
+ cx=fromBUFF(mp_text_p (p)->str, kk, k);
+ k=k+multistrlen(mp_text_p (p)->str, kk, k)-1;
+ } else {
+ cx=*(mp_text_p (p)->str + k);
+ }
+ cc=char_mp_info(f,mp_lookup_ctype(mp, f, cx));
+#else
+ cc=char_mp_info(f,mp_lookup_ctype(mp, f,fromBUFF(mp_text_p(p)->str,limit,k)));
+ k++;
+#endif
+ } else {
+ cc = char_mp_info (f, *(mp_text_p (p)->str + k));
+ }
+@z
+
+@x
+@* Debugging.
+@y
+@ @<Declare JFM function for text measuring@>=
+static int mp_lookup_ctype (MP mp,font_number f, integer c)
+{
+ int l, u, r, ch;
+ l=0; u=mp->font_nt[f]-1;
+ while ( l<u ) {
+ r=(l+u)/2;
+ ch=ctype_char(f)(r);
+ if ( (ch==c) ) {
+ return ctype_type(f)(r);};
+ if ( (ch<c) ) l=r+1;
+ else u=r-1;
+ };
+ return 0;
+}
+@* Debugging.
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/pmpost.ch b/Build/source/texk/web2c/pmpostdir/pmpost.ch
new file mode 100644
index 00000000000..250ad137585
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/pmpost.ch
@@ -0,0 +1,288 @@
+@x
+#include <kpathsea/kpathsea.h>
+@y
+#include <kpathsea/kpathsea.h>
+#include <ptexenc/ptexenc.h>
+char kanjioption[16];
+@z
+
+@x
+@d TEX "tex"
+@y
+@z
+
+@x
+#ifndef MPXCOMMAND
+#define MPXCOMMAND "makempx"
+#endif
+@y
+#ifdef UPMP
+#define TEX "eptex"
+#ifndef MPXCOMMAND
+#define MPXCOMMAND "upmakempx"
+#endif
+#define mpost_name "upmpost"
+#define dvitomp_name "updvitomp"
+#else
+#define TEX "euptex"
+#ifndef MPXCOMMAND
+#define MPXCOMMAND "pmakempx"
+#endif
+#define mpost_name "pmpost"
+#define dvitomp_name "pdvitomp"
+#endif
+@z
+
+@x
+ if (cnf_cmd!=NULL && (strcmp (cnf_cmd, "1")!=0)) {
+ if (mp_troff_mode(mp)!=0)
+ cmd = concatn (cnf_cmd, " -troff ",
+ qmpname, " ", qmpxname, NULL);
+ else if (mpost_tex_program!=NULL && *mpost_tex_program != '\0')
+ cmd = concatn (cnf_cmd, " -tex=", mpost_tex_program, " ",
+ qmpname, " ", qmpxname, NULL);
+@y
+ if (cnf_cmd!=NULL && (strcmp (cnf_cmd, "1")!=0)) {
+ if (kanjioption[0])
+ cnf_cmd = concatn (cnf_cmd, " --kanji=", kanjioption, NULL);
+ if (mp_troff_mode(mp))
+ cmd = concatn (cnf_cmd, " -troff ",
+ qmpname, " ", qmpxname, NULL);
+ else if (mpost_tex_program!=NULL && *mpost_tex_program != '\0')
+ cmd = concatn (cnf_cmd, " -tex=", mpost_tex_program, " ",
+ qmpname, " ", qmpxname, NULL);
+@z
+
+@x
+ if (mpost_tex_program != NULL && *mpost_tex_program != '\0') {
+ maincmd = mpost_xstrdup(mpost_tex_program);
+ } else {
+ if (mpxmode == mpx_tex_mode) {
+ s = kpse_var_value("TEX");
+ if (s==NULL) s = kpse_var_value("MPXMAINCMD");
+ if (s==NULL) s = mpost_xstrdup (TEX);
+ maincmd = (char *)mpost_xmalloc (strlen(s)+strlen(default_args)+1);
+ strcpy(maincmd,s);
+@y
+ if (mpost_tex_program != NULL && *mpost_tex_program != '\0') {
+ if (kanjioption[0]) {
+ maincmd = (char *)mpost_xmalloc (strlen(mpost_tex_program) +
+ strlen(kanjioption) + 15);
+ strcpy(maincmd, mpost_tex_program);
+ strcat(maincmd, " --kanji=");
+ strcat(maincmd, kanjioption);
+ } else
+ maincmd = mpost_xstrdup(mpost_tex_program);
+ } else {
+ if (mpxmode == mpx_tex_mode) {
+ s = kpse_var_value("TEX");
+ if (s==NULL) s = kpse_var_value("MPXMAINCMD");
+ if (s==NULL) s = mpost_xstrdup (TEX);
+ if (kanjioption[0])
+ maincmd = (char *)mpost_xmalloc (strlen(s)+strlen(default_args)+
+ strlen(kanjioption)+13);
+ else
+ maincmd = (char *)mpost_xmalloc (strlen(s)+strlen(default_args)+1);
+ strcpy(maincmd,s);
+ if (kanjioption[0]) {
+ strcat(maincmd, " --kanji=");
+ strcat(maincmd, kanjioption);
+ }
+@z
+
+@x
+ const char *banner = "% Written by metapost version ";
+@y
+ const char *banner = "% Written by " mpost_name " version ";
+@z
+
+@x
+ const char *banner = "% Written by dvitomp version ";
+@y
+ const char *banner = "% Written by " dvitomp_name " version ";
+@z
+
+@x
+ { "kpathsea-debug", 1, 0, 0 },
+@y
+ { "kpathsea-debug", 1, 0, 0 },
+ { "kanji", 1, 0, 0 },
+@z
+
+@x
+ if (user_progname == NULL)
+ user_progname = optarg;
+ }
+@y
+ if (user_progname == NULL)
+ user_progname = optarg;
+ }
+ } else if (ARGUMENT_IS ("kanji")) {
+ strcpy(kanjioption, optarg);
+ if(!set_enc_string(optarg, optarg)) {
+ fprintf(stderr,"Ignoring unknown argument `%s' to --kanji", optarg);
+ }
+@z
+
+@x
+ { "no-kpathsea", 0, &nokpse, 1 },
+@y
+ { "no-kpathsea", 0, &nokpse, 1 },
+ { "kanji", 1, 0, 0 },
+@z
+
+@x
+ } else if (option_is ("progname")) {
+ user_progname = optarg;
+@y
+ } else if (option_is ("progname")) {
+ user_progname = optarg;
+ } else if (option_is ("kanji")) {
+ strcpy (kanjioption, optarg);
+ if(!set_enc_string(optarg, optarg)) {
+ fprintf(stderr,"Ignoring unknown argument `%s' to --kanji", optarg);
+ }
+@z
+
+@x
+ fprintf(stdout, "This is dvitomp %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, "This is MetaPost %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@y
+ fprintf(stdout, "This is " dvitomp_name " %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, "This is " metapost_name " %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@z
+
+@x
+"Usage: mpost [OPTION] [&MEMNAME] [MPNAME[.mp]] [COMMANDS]\n"
+" mpost --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"\n"
+" Run MetaPost on MPNAME, usually creating MPNAME.NNN (and perhaps\n"
+" MPNAME.tfm), where NNN are the character numbers generated.\n"
+" Any remaining COMMANDS are processed as MetaPost input,\n"
+" after MPNAME is read.\n\n"
+" With a --dvitomp argument, MetaPost acts as DVI-to-MPX converter only.\n"
+" Call MetaPost with --dvitomp --help for option explanations.\n\n");
+fprintf(stdout,
+" -ini be inimpost, for dumping mem files\n"
+@y
+"Usage: " mpost_name " [OPTION] [&MEMNAME] [MPNAME[.mp]] [COMMANDS]\n"
+" " mpost_name " --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"\n"
+" Run " metapost_name " on MPNAME, usually creating MPNAME.NNN (and perhaps\n"
+" MPNAME.tfm), where NNN are the character numbers generated.\n"
+" Any remaining COMMANDS are processed as " metapost_name " input,\n"
+" after MPNAME is read.\n\n"
+" With a --dvitomp argument, " metapost_name " acts as DVI-to-MPX converter only.\n"
+" Call " metapost_name " with --dvitomp --help for option explanations.\n\n");
+fprintf(stdout,
+" -ini be ini" mpost_name ", for dumping mem files\n"
+@z
+
+@x
+" -jobname=STRING set the job name to STRING\n"
+@y
+" -jobname=STRING set the job name to STRING\n"
+" -kanji=STRING set the Japanese encoding to STRING\n"
+@z
+
+@x
+" -version output version information and exit\n"
+"\n"
+"Email bug reports to mp-implementors@@tug.org.\n"
+@y
+" -version output version information and exit\n"
+@z
+
+@x
+ fprintf(stdout, "This is dvitomp %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, "This is MetaPost %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@y
+ fprintf(stdout, "This is " dvitomp_name " %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, "This is " metapost_name " %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@z
+
+@x
+"Usage: dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+" mpost --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+@y
+"Usage: " dvitomp_name " DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+" " mpost_name " --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+@z
+
+@x
+" -progname=STRING set program name to STRING\n"
+@y
+" -progname=STRING set program name to STRING\n"
+#ifdef UPMP
+" -kanji=STRING set kanji encoding (STRING=euc|jis|sjis|utf8|uptex)\n"
+#else
+" -kanji=STRING set kanji encoding (sjis, jis, euc, utf8)\n"
+#endif
+@z
+
+@x
+ fprintf(stdout, "dvitomp (MetaPost) %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, "MetaPost %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@y
+ fprintf(stdout, dvitomp_name " (" metapost_name ") %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+else
+ fprintf(stdout, metapost_name " %s" WEB2CVERSION " (%s)\n", s, kpathsea_version_string);
+@z
+
+@x
+"Current maintainer of MetaPost: Luigi Scarso.\n\n"
+@y
+"Current maintainer of MetaPost: Luigi Scarso.\n"
+#ifdef UPMP
+"Authors of upMetaPost: Michio Matsuyama, Hideyuki Suzuki, Takuji Tanaka.\n\n"
+#else
+"Authors of pMetaPost: Michio Matsuyama, Hideyuki Suzuki.\n\n"
+#endif
+@z
+
+@x
+ const char * banner = "This is MetaPost, version ";
+@y
+ const char * banner = "This is " metapost_name ", version ";
+@z
+
+@x
+ if (dvitomp_only) {
+ @<Read and set dvitomp command line options@>;
+ } else {
+@y
+ kanjioption[0] = '\0';
+#ifdef UPMP
+ enable_UPTEX (true);
+ set_enc_string("uptex", "uptex");
+#else
+ enable_UPTEX (false);
+#if defined(WIN32)
+ set_enc_string("sjis", "sjis");
+#else
+ set_enc_string("utf8", "euc");
+#endif
+#endif
+
+ if (dvitomp_only) {
+ @<Read and set dvitomp command line options@>;
+ } else {
+#ifdef WIN32
+ options->mem_name =
+ strlwr(kpse_program_basename(argv[0]));
+#else
+ options->mem_name =
+ kpse_program_basename(argv[0]);
+#endif
+@z
+
+@x
+ if(putenv(xstrdup("engine=metapost")))
+@y
+ if(putenv(xstrdup("engine=" mpost_name)))
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/pmpost.test b/Build/source/texk/web2c/pmpostdir/pmpost.test
new file mode 100755
index 00000000000..fab9d16dc65
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/pmpost.test
@@ -0,0 +1,13 @@
+#! /bin/sh
+
+# Copyright (C) 2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+./pmpost -version || exit 1
+
+./pmpost -help || exit 1
+
+./pmpost -dvitomp -version || exit 1
+
+./pmpost -dvitomp -help || exit 1
+
diff --git a/Build/source/texk/web2c/pmpostdir/pmpxout.ch b/Build/source/texk/web2c/pmpostdir/pmpxout.ch
new file mode 100644
index 00000000000..0f4acf0f524
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/pmpxout.ch
@@ -0,0 +1,539 @@
+@x
+#include "avl.h"
+@y
+#include "avl.h"
+#include <ptexenc/ptexenc.h>
+@z
+
+@x
+@d virtual_space 1000000 /* maximum total bytes of typesetting commands for virtual fonts */
+@d max_fonts 1000 /* maximum number of distinct fonts per \.{DVI} file */
+@d max_fnums 3000 /* maximum number of fonts plus fonts local to virtual fonts */
+@d max_widths (256*max_fonts) /* maximum number of different characters among all fonts */
+@d line_length 79 /* maximum output line length (must be at least 60) */
+@d stack_size 100 /* \.{DVI} files shouldn't |push| beyond this depth */
+@d font_tolerance 0.00001
+@y
+@ @<Glob...@>=
+#ifdef UPMP
+#define virtual_space 2000000 /* maximum total bytes of typesetting commands for virtual fonts */
+#else
+#define virtual_space 1000000 /* maximum total bytes of typesetting commands for virtual fonts */
+#endif
+#define max_fonts 1000 /* maximum number of distinct fonts per \.{DVI} file */
+#define max_fnums 3000 /* maximum number of fonts plus fonts local to virtual fonts */
+#ifdef UPMP
+#define max_widths 2000000 /* maximum number of different characters among all fonts */
+#else
+#define max_widths 512000 /* maximum number of different characters among all fonts */
+#endif
+#define line_length 79 /* maximum output line length (must be at least 60) */
+#define stack_size 100 /* \.{DVI} files shouldn't |push| beyond this depth */
+#define font_tolerance 0.00001
+@z
+
+@x
+@d undefined_commands 250: case 251: case 252: case 253: case 254: case 255
+@y
+@d dir 255 /* p\TeX\ direction */
+@d undefined_commands 250: case 251: case 252: case 253: case 254
+@z
+
+@x
+mpx_read_tfm_word(mpx); lh=mpx->b2*(int)(256)+mpx->b3;
+@y
+mpx_read_tfm_word(mpx);
+@<Read the pTeX header data@>;@/
+lh=mpx->b2*(int)(256)+mpx->b3;
+@z
+
+@x
+ if ( mpx->b0<128 )
+ mpx->tfm_check_sum=((mpx->b0*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3;
+ else
+ mpx->tfm_check_sum=(((mpx->b0-256)*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3;
+ }
+ if ( k==5 ) {
+ if (mpx->mode == mpx_troff_mode) {
+ mpx->font_design_size[f]=(((mpx->b0*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3)/(65536.0*16);
+ }
+ }
+}
+@y
+ if ( mpx->b0<128 )
+ mpx->tfm_check_sum=((mpx->b0*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3;
+ else
+ mpx->tfm_check_sum=(((mpx->b0-256)*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3;
+ }
+ if ( k==5 ) {
+ if (mpx->mode == mpx_troff_mode) {
+ mpx->font_design_size[f]=(((mpx->b0*(int)(256)+mpx->b1)*256+mpx->b2)*256+mpx->b3)/(65536.0*16);
+ }
+ }
+}
+@<Read JFM character type table@>;
+@z
+
+@x
+@<Width of character |c| in font |f|@>=
+floor(mpx->dvi_scale*mpx->font_scaled_size[f]*char_width(f,c))
+
+@ @<Width of character |p| in font |cur_font|@>=
+floor(mpx->dvi_scale*mpx->font_scaled_size[cur_font]*char_width(cur_font,p))
+@y
+@ @c @<Declare JFM character type table lookup routine@>@; /* p\TeX */
+static integer mpx_scaled_char_width (MPX mpx,integer f,integer c)
+{
+ if (mpx->font_id[f]!=0) c=mpx_lookup_ctype(mpx, f,c);
+ return floor(mpx->dvi_scale*mpx->font_scaled_size[f]*char_width(f,c));
+}
+@z
+
+@x
+@ @c @<Declare a procedure called |finish_last_char|@>@;
+static void mpx_do_set_char (MPX mpx,web_integer f, web_integer c) {
+ if ( (c<mpx->font_bc[f])||(c>mpx->font_ec[f]) )
+ mpx_abort(mpx,"attempt to typeset invalid character %d",c);
+@.attempt to typeset...@>
+@y
+@ (u)pDVItoMP: |do_set_char| is called with non-virtual font.
+In the case of non-virtual Kanji font, the width is looked up
+with the character type, and the character is printed by the
+function |set_kanji_char|.
+
+When the width written in the virtual font is same as
+the width of the substituted font, the next character can be
+written in the same string in output mpx file.
+In other words, the width of the character is calculated
+in |do_dvi_commands|. So even if the width is wrong here, the output PostScript file is not affected.
+
+@ @c @<Declare a procedure called |finish_last_char|@>@;
+static void mpx_do_set_char (MPX mpx,integer f,integer c)
+{
+integer kkk;
+
+if (mpx->font_id[f]!=0) {
+ kkk=mpx_lookup_ctype(mpx, f,c);
+ if ( (kkk<mpx->font_bc[f]) || (kkk>mpx->font_ec[f]) )
+ mpx_abort(mpx,"attempt to typeset invalid character (JFM) %d",c);
+} else if ( (c<mpx->font_bc[f])||(c>mpx->font_ec[f]) ) {
+ mpx_abort(mpx,"attempt to typeset invalid character %d",c);
+}
+@.attempt to typeset...@>
+@z
+
+@x
+ if ((mpx->h!=mpx->str_h2)||(mpx->v!=mpx->str_v)||
+ (f!=mpx->str_f)||(mpx->dvi_scale!=mpx->str_scale) ) {
+@y
+ if ((mpx->h!=mpx->str_h2)||(mpx->v!=mpx->str_v2)||
+ (f!=mpx->str_f)||(mpx->dvi_scale!=mpx->str_scale) ) {
+@z
+
+@x
+ fprintf(mpx->mpxfile,"_s("); mpx->print_col=3;@/
+ mpx->str_scale=mpx->dvi_scale; mpx->str_f=f;
+ mpx->str_v=mpx->v; mpx->str_h1=mpx->h;
+@y
+ if ((mpx->d==0) || (mpx->font_id[f]==9)) {
+ fprintf(mpx->mpxfile,"_s("); mpx->print_col=3;}@/
+ else {
+ fprintf(mpx->mpxfile,"_sr("); mpx->print_col=4;}@/
+ mpx->str_scale=mpx->dvi_scale; mpx->str_f=f;
+ mpx->str_v1=mpx->v; mpx->str_h1=mpx->h;
+@z
+
+@x
+ mpx_print_char(mpx, (unsigned char)c);
+ mpx->str_h2=(web_integer)(mpx->h+@<Width of character |c| in font |f|@>);
+@y
+ if (mpx->font_id[f]!=0)
+ mpx_print_kanji_char(mpx, c);
+ else
+ mpx_print_char(mpx, c);
+ if (mpx->d==0) {
+ mpx->str_h2=mpx->h+mpx_scaled_char_width(mpx, f, c);
+ mpx->str_v2=mpx->v;
+ } else {
+ mpx->str_h2=mpx->h;
+ mpx->str_v2=mpx->v+mpx_scaled_char_width(mpx, f, c);
+ }
+@z
+
+@x
+web_integer str_h1;
+web_integer str_v; /* starting position for current output string */
+web_integer str_h2; /* where the current output string ends */
+@y
+integer str_h1;
+integer str_v1; /* starting position for current output string */
+integer str_h2;
+integer str_v2; /* where the current output string ends */
+@z
+
+@x
+ fprintf(mpx->mpxfile,"vardef _s(expr _t,_f,_m,_x,_y)(text _c)=\n");
+ fprintf(mpx->mpxfile,
+ " addto _p also _t infont _f scaled _m shifted (_x,_y) _c; enddef;\n");
+@y
+ fprintf(mpx->mpxfile,"vardef _s(expr _t,_f,_m,_x,_y)(text _c)=\n");
+ fprintf(mpx->mpxfile,
+ " addto _p also _t infont _f scaled _m shifted (_x,_y) _c; enddef;\n");
+ fprintf(mpx->mpxfile,"vardef _sr(expr _t,_f,_m,_x,_y)=\n");
+ fprintf(mpx->mpxfile," addto _p also _t infont _f rotated -90");
+ fprintf(mpx->mpxfile," scaled _m shifted (_x,_y); enddef;\n");
+@z
+
+@x
+ x=mpx->conv*mpx->str_h1;
+ y=mpx->conv*(-mpx->str_v);
+@y
+ x=mpx->conv*mpx->str_h1;
+ y=mpx->conv*(-mpx->str_v1);
+@z
+
+@x
+@<Handle a special rule that determines the box size@>=
+{
+ mpx->pic_wd=mpx->h; mpx->pic_dp=mpx->v; mpx->pic_ht=ht-mpx->v;
+}
+@y
+@<Handle a special rule that determines the box size@>=
+{ if (mpx->d==0) {
+ mpx->pic_wd=mpx->h; mpx->pic_dp=mpx->v; mpx->pic_ht=ht-mpx->v;
+ } else {
+ mpx->pic_wd=mpx->v; mpx->pic_dp=-mpx->h; mpx->pic_ht=ht+mpx->h;
+ }
+}
+@z
+
+@x
+ mpx->str_v=0;
+ mpx->str_h2=0;
+ mpx->str_scale=1.0; /* values don't matter */
+@y
+ mpx->str_h2=0;
+ mpx->str_v2=0;
+ mpx->str_scale=1.0; /* values don't matter */
+@z
+
+@x
+dd=-mpx->pic_dp*mpx->conv;
+w=mpx->conv*mpx->pic_wd;
+h=mpx->conv*mpx->pic_ht;
+fprintf(mpx->mpxfile,
+ "setbounds _p to (0,%1.4f)--(%1.4f,%1.4f)--\n"
+ " (%1.4f,%1.4f)--(0,%1.4f)--cycle;\n",dd,w,dd,w,h,h)
+@y
+if (mpx->d==0) {
+ dd=-mpx->pic_dp*mpx->conv;
+ w=mpx->conv*mpx->pic_wd;
+ h=mpx->conv*mpx->pic_ht;
+ fprintf(mpx->mpxfile,
+ "setbounds _p to (0,%1.4f)--(%1.4f,%1.4f)--\n",dd,w,dd);
+ fprintf(mpx->mpxfile,
+ " (%1.4f,%1.4f)--(0,%1.4f)--cycle;\n",w,h,h);
+} else {
+ dd=-mpx->pic_dp*mpx->conv;
+ w=-mpx->pic_wd*mpx->conv;
+ h=mpx->conv*mpx->pic_ht;
+ fprintf(mpx->mpxfile,
+ "setbounds _p to (%1.4f,0)--(%1.4f,%1.4f)--\n",h,h,w);
+ fprintf(mpx->mpxfile,
+ " (%1.4f,%1.4f)--(%1.4f,0)--cycle;\n", dd,w,dd);
+}
+@z
+
+@x
+web_integer w;web_integer x;web_integer y;web_integer z;
+ /* current state values (|h| and |v| have already been declared) */
+web_integer hstack[(stack_size+1)];
+web_integer vstack[(stack_size+1)];
+web_integer wstack[(stack_size+1)];
+web_integer xstack[(stack_size+1)];
+web_integer ystack[(stack_size+1)];
+web_integer zstack[(stack_size+1)]; /* pushed down values in \.{DVI} units */
+@y
+integer w;integer x;integer y;integer z;integer d;
+ /* current state values (|h| and |v| have already been declared) */
+integer hstack[(stack_size+1)];
+integer vstack[(stack_size+1)];
+integer wstack[(stack_size+1)];
+integer xstack[(stack_size+1)];
+integer ystack[(stack_size+1)];
+integer zstack[(stack_size+1)];
+integer dstack[(stack_size+1)]; /* pushed down values in \.{DVI} units */
+@z
+
+@x
+mpx->h=0; mpx->v=0;
+@y
+mpx->h=0; mpx->v=0; mpx->d=0;
+@z
+
+@x
+ mpx->hstack[mpx->stk_siz]=mpx->h;
+ mpx->vstack[mpx->stk_siz]=mpx->v; mpx->wstack[mpx->stk_siz]=mpx->w;
+ mpx->xstack[mpx->stk_siz]=mpx->x;
+ mpx->ystack[mpx->stk_siz]=mpx->y; mpx->zstack[mpx->stk_siz]=mpx->z;
+@y
+ mpx->hstack[mpx->stk_siz]=mpx->h;
+ mpx->vstack[mpx->stk_siz]=mpx->v; mpx->wstack[mpx->stk_siz]=mpx->w;
+ mpx->xstack[mpx->stk_siz]=mpx->x;
+ mpx->ystack[mpx->stk_siz]=mpx->y; mpx->zstack[mpx->stk_siz]=mpx->z;
+ mpx->dstack[mpx->stk_siz]=mpx->d;
+@z
+
+@x
+ mpx->h=mpx->hstack[mpx->stk_siz];
+ mpx->v=mpx->vstack[mpx->stk_siz]; mpx->w=mpx->wstack[mpx->stk_siz];
+ mpx->x=mpx->xstack[mpx->stk_siz];
+ mpx->y=mpx->ystack[mpx->stk_siz]; mpx->z=mpx->zstack[mpx->stk_siz];
+@y
+ mpx->h=mpx->hstack[mpx->stk_siz];
+ mpx->v=mpx->vstack[mpx->stk_siz]; mpx->w=mpx->wstack[mpx->stk_siz];
+ mpx->x=mpx->xstack[mpx->stk_siz];
+ mpx->y=mpx->ystack[mpx->stk_siz]; mpx->z=mpx->zstack[mpx->stk_siz];
+ mpx->d=mpx->dstack[mpx->stk_siz];
+@z
+
+@x
+ case z0: return mpx->z; break;
+@y
+ case z0: return mpx->z; break;
+ case dir: return mpx_get_byte(mpx); break;
+@z
+
+@x
+ mpx->h += @<Width of character |p| in font |cur_font|@>;
+@y
+ if (mpx->d==0) {
+ mpx->h+=mpx_scaled_char_width(mpx, cur_font, p);
+ } else {
+ mpx->v+=mpx_scaled_char_width(mpx, cur_font, p);
+ }
+@z
+
+@x
+ mpx->h += q;
+@y
+ if (mpx->d==0) {
+ mpx->h += q;
+ } else {
+ mpx->v += q;
+ }
+@z
+
+@x
+case pop:
+ mpx_do_pop(mpx);
+ break;
+@y
+case pop:
+ mpx_do_pop(mpx);
+ break;
+case dir:
+ mpx->d=p;
+ break;
+@z
+
+@x
+case four_cases(right1):
+ mpx->h += trunc(p*mpx->dvi_scale);
+ break;
+case w0: case four_cases(w1):
+ mpx->w = (web_integer)trunc(p*mpx->dvi_scale); mpx->h += mpx->w;
+ break;
+case x0: case four_cases(x1):
+ mpx->x = (web_integer)trunc(p*mpx->dvi_scale); mpx->h += mpx->x;
+ break;
+case four_cases(down1):
+ mpx->v += trunc(p*mpx->dvi_scale);
+ break;
+case y0: case four_cases(y1):
+ mpx->y = (web_integer)trunc(p*mpx->dvi_scale); mpx->v += mpx->y;
+ break;
+case z0: case four_cases(z1):
+ mpx->z = (web_integer)trunc(p*mpx->dvi_scale); mpx->v += mpx->z;
+ break;
+@y
+case four_cases(right1):
+ if (mpx->d==0) {
+ mpx->h+=trunc(p*mpx->dvi_scale);
+ } else {
+ mpx->v+=trunc(p*mpx->dvi_scale);
+ }
+ break;
+case w0: case four_cases(w1):
+ if (mpx->d==0) {
+ mpx->h+=mpx->w;
+ } else {
+ mpx->v+=mpx->w;
+ }
+ break;
+case x0: case four_cases(x1):
+ if (mpx->d==0) {
+ mpx->h+=mpx->x;
+ } else {
+ mpx->v+=mpx->x;
+ }
+ break;
+case four_cases(down1):
+ if (mpx->d==0) {
+ mpx->v+=trunc(p*mpx->dvi_scale);
+ } else {
+ mpx->h-=trunc(p*mpx->dvi_scale);
+ }
+ break;
+case y0: case four_cases(y1):
+ if (mpx->d==0) {
+ mpx->v+=mpx->y;
+ } else {
+ mpx->h-=mpx->y;
+ }
+ break;
+case z0: case four_cases(z1):
+ if (mpx->d==0) {
+ mpx->v+=mpx->z;
+ } else {
+ mpx->h-=mpx->z;
+ }
+ break;
+@z
+
+@x
+@<Check if mp file is newer than mpxfile, exit if not@>=
+if (mpx_newer(mpxopt->mpname, mpxopt->mpxname))
+ return 0
+@y
+@<Check if mp file is newer than mpxfile, exit if not@>=
+if (mpx_newer(mpxopt->mpname, mpxopt->mpxname))
+ return 0
+
+@ ASCII p\TeX JFM ID
+@d yoko_jfm_id 11 /* for `yoko-kumi' fonts */
+@d tate_jfm_id 9 /* for `tate-kumi' fonts */
+@d font_jfm_p(A) (mpx->font_id[(A)]!=0)
+
+@ @<Global...@>=
+integer font_nt[max_fonts+1]; /* number of words in ctype table */
+integer font_id[max_fonts+1];
+integer jfm_char_code[max_widths+1];
+integer jfm_char_type[max_widths+1];
+integer jfm_char_index[max_fonts+1];
+integer next_jfm_char_index;
+
+@ @<Set init...@>=
+mpx->font_nt[0]=0;
+mpx->font_id[0]=0;
+mpx->jfm_char_type[0]=0;
+mpx->next_jfm_char_index=0;
+
+@ JFM character type table is stored in the array |jfm_char_code| and
+|jfm_char_type|. The character code and the character type of $i$-th
+record is stored in |jfm_char_code[i]| and |jfm_char_type[i]|, respectively.
+The table is in the order of character code.
+
+@<Read the pTeX header data@>=
+mpx->font_id[f]=mpx->b0*(int)(256)+mpx->b1;
+if ((mpx->font_id[f]==yoko_jfm_id) || (mpx->font_id[f]==tate_jfm_id)) {
+ mpx->font_nt[f]=mpx->b2*(int)(256)+mpx->b3;
+ mpx_read_tfm_word(mpx);
+} else {
+ mpx->font_id[f]=0;
+ mpx->font_nt[f]=0;
+}
+
+@ @<Read JFM character type table@>=
+mpx->jfm_char_index[f]=mpx->next_jfm_char_index;
+k=mpx->jfm_char_index[f];
+mpx->next_jfm_char_index+=mpx->font_nt[f];
+while (k<mpx->next_jfm_char_index) {
+ mpx_read_tfm_word(mpx);
+ mpx->jfm_char_code[k]=mpx->b0*(int)(256)+mpx->b1;
+ mpx->jfm_char_type[k]=mpx->b2*(int)(256)+mpx->b3;
+ k++;
+}
+
+@ JFM character type table is looked up by binary search.
+
+@<Declare JFM character type table lookup routine@>=
+static integer mpx_lookup_ctype (MPX mpx,integer f, integer c)
+{
+ integer l, u, r, ch;
+ l=0; u=mpx->font_nt[f]-1;
+ while (l<u) {
+ r=(l+u)/2;
+ ch=mpx->jfm_char_code[mpx->jfm_char_index[f]+r];
+ if (ch==c) {
+ return mpx->jfm_char_type[mpx->jfm_char_index[f]+r];
+ }
+ if (ch<c)
+ l=r+1;
+ else
+ u=r-1;
+ }
+ return 0;
+}
+
+@ All Kanji characters are supposed to be printable here,
+so that the state always results in normal at the end of the procedure.
+Kanji characters need to be converted into output Kanji encoding
+from DVI(JIS).
+
+@<Declare subroutines for printing strings@>=
+static void mpx_print_kanji_char (MPX mpx,integer c)
+{
+#ifdef UPMP
+#define BYTE1(x) (((x)>>24) & 0xff)
+#define BYTE2(x) (((x)>>16) & 0xff)
+#define BYTE3(x) (((x)>> 8) & 0xff)
+#define BYTE4(x) ( (x) & 0xff)
+ int pflag = 0;
+#else
+#define Hi(x) (((x)>> 8) & 0xff)
+#define Lo(x) ( (x) & 0xff)
+#endif
+ if (mpx->print_col+2>line_length-2 ) {
+ if (mpx->state==normal) {
+ fprintf(mpx->mpxfile, "\"");
+ mpx->state=special;
+ }
+ fprintf(mpx->mpxfile, " \n");
+ mpx->print_col=0;
+ }
+ if (mpx->state==special) {
+ fprintf(mpx->mpxfile,"&");
+ mpx->print_col++;
+ }
+ if (mpx->state!=normal) {
+ fprintf(mpx->mpxfile, "\"");
+ mpx->print_col++;
+ mpx->state=normal;
+ }
+ c=toBUFF(fromDVI(c));
+#ifdef UPMP
+ if (BYTE1(c)!=0) pflag = 1;
+ if (pflag) {
+ putc2(BYTE1(c), mpx->mpxfile);
+ mpx->print_col++;
+ }
+ if (BYTE2(c)!=0) pflag = 1;
+ if (pflag) {
+ putc2(BYTE2(c), mpx->mpxfile);
+ mpx->print_col++;
+ }
+ if (BYTE3(c)!=0) pflag = 1;
+ if (pflag) {
+ putc2(BYTE3(c), mpx->mpxfile);
+ mpx->print_col++;
+ }
+ putc2(BYTE4(c), mpx->mpxfile);
+#else
+ putc2(Hi(c), mpx->mpxfile);
+ mpx->print_col++;
+ putc2(Lo(c), mpx->mpxfile);
+#endif
+ mpx->print_col++;
+}
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/ppsout.ch b/Build/source/texk/web2c/pmpostdir/ppsout.ch
new file mode 100644
index 00000000000..f1ca7cfe6c4
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/ppsout.ch
@@ -0,0 +1,95 @@
+%
+%
+% change file of psout.w for jMetaPost (CWEB version)
+% Akira Kakuto (translated the WEB version)
+%
+%
+
+@x
+#include <math.h>
+@y
+#include <math.h>
+#include <ptexenc/ptexenc.h>
+#ifdef UPMP
+#include <ptexenc/unicode.h>
+#endif
+@z
+
+% Treat all Kanji fonts as used
+@x
+ if ( mp->font_info[p].qqqq.b3==mp_used )
+@y
+ if ( mp->font_info[p].qqqq.b3==mp_used || mp->font_id[f]!=0)
+@z
+
+%
+% Kanji string output
+@x
+static void mp_print_initial_comment(MP mp,mp_edge_object *hh, int prologues);
+@y
+static void mp_print_initial_comment(MP mp,mp_edge_object *hh, int prologues);
+
+#define Hi(x) (((x) >> 8) & 0xff)
+#define Lo(x) ((x) & 0xff)
+
+@ @c
+static void mp_ps_kanji_string_out (MP mp, char *s)
+{
+ int i, c;
+#ifdef UPMP
+ int cx;
+#endif
+ size_t len;
+
+ len = strlen(s);
+ i=0;
+ mp_ps_print(mp, "<");
+ while (i<len) {
+ if ( mp->ps->ps_offset+5>mp->max_print_line )
+ mp_ps_print_ln(mp);
+#ifdef UPMP
+ c=toDVI(fromBUFF((unsigned char*)s, len, i));
+ i=i+multistrlen((unsigned char*)s, len, i);
+ if (isinternalUPTEX() && c>65535) {
+ cx=UTF32toUTF16HS(c); /* High surrogate */
+ mp_hex_digit_out(mp, Hi(cx) / 16);
+ mp_hex_digit_out(mp, Hi(cx) % 16);
+ mp_hex_digit_out(mp, Lo(cx) / 16);
+ mp_hex_digit_out(mp, Lo(cx) % 16);
+ c=UTF32toUTF16LS(c); /* Low surrogate */
+ }
+#else
+ c=toDVI(fromBUFF((unsigned char*)s, i+2, i));
+ i=i+2;
+#endif
+ mp_hex_digit_out(mp, Hi(c) / 16);
+ mp_hex_digit_out(mp, Hi(c) % 16);
+ mp_hex_digit_out(mp, Lo(c) / 16);
+ mp_hex_digit_out(mp, Lo(c) % 16);
+ };
+ mp_ps_print(mp, ">");
+};
+@z
+
+@x
+ mp_ps_print_nl(mp, "%%Creator: MetaPost ");
+@y
+#ifdef UPMP
+ mp_ps_print_nl(mp, "%%Creator: MetaPost (upTeX version) ");
+#else
+ mp_ps_print_nl(mp, "%%Creator: MetaPost (Japanese version) ");
+#endif
+@z
+
+%
+% Call Kanji string output routine if the font is JFM.
+@x
+ mp_ps_string_out(mp, gr_text_p(p),gr_text_l(p));
+ mp_ps_name_out(mp, mp->font_name[gr_font_n(p)],false);
+@y
+ if (mp->font_id[gr_font_n(p)]!=0)
+ mp_ps_kanji_string_out(mp, gr_text_p(p));
+ else
+ mp_ps_string_out(mp, gr_text_p(p),gr_text_l(p));
+ mp_ps_name_out(mp, mp->font_name[gr_font_n(p)],false);
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/psvgout.ch b/Build/source/texk/web2c/pmpostdir/psvgout.ch
new file mode 100644
index 00000000000..5e624585709
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/psvgout.ch
@@ -0,0 +1,77 @@
+@x
+#include <math.h>
+@y
+#include <math.h>
+#include <ptexenc/ptexenc.h>
+#ifdef UPMP
+#include <ptexenc/unicode.h>
+#endif
+@z
+
+@x
+@<Character |k| is not allowed in SVG output@>=
+ (k=='&')||(k=='>')||(k=='<')
+@y
+@<Character |k| is not allowed in SVG output@>=
+ (k=='&')||(k=='>')||(k=='<')||(k>=0x7F)
+@z
+
+@x
+@ Now for outputting the actual graphic objects.
+@y
+@ Now for outputting the actual graphic objects.
+
+@d yoko_jfm_id 11 /* `yoko-kumi' fonts */
+@d tate_jfm_id 9 /* `tate-kumi' fonts */
+@d font_jfm_p(A) (mp->font_id[(A)]!=0)
+@z
+
+@x Even if prologues=3, Japanese texts are not converted into paths.
+ if (prologues == 3 ) {
+@y
+ if (prologues == 3 && mp->font_id[gr_font_n(p)]==0) {
+@z
+
+@x To realise vertical Japanese texts ...
+ mp_svg_attribute(mp, "font-size", mp->svg->buf);
+@y
+ mp_svg_attribute(mp, "font-size", mp->svg->buf);
+ if ( mp->font_id[gr_font_n(p)]==tate_jfm_id ) {
+ mp_svg_reset_buf(mp);
+ append_string("tb-rl");
+ mp_svg_attribute(mp, "writing-mode", mp->svg->buf);
+ }
+@z
+
+@x
+ while (l-->0) {
+@y
+ if ( mp->font_id[gr_font_n(p)]!=0 ) {
+#ifdef UPMP
+ if (is_internalUPTEX() ) {
+ while (l>0) {
+ append_string("&#");
+ mp_svg_store_int(mp,UTF8StoUCS(s));
+ append_char(';');
+ k = UTF8length((int)*s); s += k; l -= k;
+ }
+ } else /* 1 charatcer = 2 bytes */
+#endif
+ {
+ l >>= 1;
+ while (l-->0) {
+ k =((int)*s++)*0x100; k += (int)*s++;
+ append_string("&#");
+ mp_svg_store_int(mp,toUCS(k));
+ append_char(';');
+ }
+ }
+ } else
+ while (l-->0) {
+@z
+
+@x
+ mp_svg_print(mp, "<?xml version=\"1.0\"?>");
+@y
+ mp_svg_print(mp, "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/ptfmin.ch b/Build/source/texk/web2c/pmpostdir/ptfmin.ch
new file mode 100644
index 00000000000..0cfc5b12f72
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/ptfmin.ch
@@ -0,0 +1,104 @@
+@x
+#include <w2c/config.h>
+@y
+#include <kpathsea/kpathsea.h>
+#include <w2c/config.h>
+@z
+
+%
+% local variable "nt" && "ct"
+@x
+ halfword lf,tfm_lh,bc,ec,nw,nh,nd; /* subfile size parameters */
+@y
+ halfword lf,tfm_lh,bc,ec,nw,nh,nd,nt; /* subfile size parameters */
+@z
+
+@x
+ int h_and_d; /* height and depth indices being unpacked */
+@y
+ int h_and_d; /* height and depth indices being unpacked */
+ halfword ct; /* char and type */
+ halfword id; /* JFM font id */
+@z
+
+@x
+@<Read the character data and the width, height, and depth tables and
+ |goto done|@>
+@y
+@<Read the character type table@>;
+@<Read the character data and the width, height, and depth tables and
+ |goto done|@>
+@z
+
+%
+% routine to process JFM file format
+@x
+@<Read the \.{TFM} size fields@>=
+tfget; read_two(lf);
+@y
+@d yoko_jfm_id 11 /* `yoko-kumi' fonts */
+@d tate_jfm_id 9 /* `tate-kumi' fonts */
+@d font_jfm_p(A) (mp->font_id[(A)]!=0)
+@d incr(A) (A)=(A)+1 /* increase a variable by unity */
+@<Read the \.{TFM} size fields@>=
+tfget; read_two(lf);
+if ( (lf==yoko_jfm_id) || (lf==tate_jfm_id) ) {
+ id=lf;
+ tfget; read_two(nt);
+ tfget; read_two(lf);
+} else {
+ id=0; nt=0;
+};
+@z
+
+@x
+whd_size=(size_t)((ec+1-bc)+nw+nh+nd);
+@y
+whd_size=(size_t)((ec+1-bc)+nt+nw+nh+nd);
+@z
+
+%
+% reserve space for character type table
+@x
+mp->char_base[n]=(int)(mp->next_fmem-(size_t)bc);
+mp->width_base[n]=(int)(mp->next_fmem+(size_t)(ec-bc)+1);
+@y
+mp->font_id[n]=id;
+mp->font_nt[n]=nt;
+mp->ctype_base[n]=mp->next_fmem;
+mp->char_base[n]=(int)(mp->next_fmem+nt-(size_t)bc);
+mp->width_base[n]=(int)(mp->next_fmem+nt+(size_t)(ec-bc)+1);
+@z
+
+%
+% read character type table
+%
+@x
+tf_ignore(4*(tfm_lh-2))
+@y
+tf_ignore(4*(tfm_lh-2))
+
+@ @<Read the character type table@>=
+ii=mp->ctype_base[n]+nt;
+i=mp->ctype_base[n];
+while ( i<ii ) {
+ tfget; read_two(ct);
+ mp->font_info[i].hh.LH=ct;
+ tfget; read_two(ct);
+ mp->font_info[i].hh.RH=ct;
+ incr(i);
+}
+@z
+
+@x
+mp_pack_file_name(mp, mp->cur_name,mp->cur_area,mp->cur_ext);
+mp->tfm_infile = (mp->open_file)(mp, mp->name_of_file, "r",mp_filetype_metrics);
+@y
+mp_pack_file_name(mp, mp->cur_name,mp->cur_area,mp->cur_ext);
+{
+ char *fulln;
+ fulln = kpse_find_file(fname, kpse_tfm_format, 1);
+ mp->tfm_infile = (mp->open_file)(mp, fulln, "r",mp_filetype_metrics);
+ if(fulln) mp_xfree(fulln);
+}
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/upmp.ch b/Build/source/texk/web2c/pmpostdir/upmp.ch
new file mode 100644
index 00000000000..a7e99a0cc4b
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/upmp.ch
@@ -0,0 +1,12 @@
+%
+% routine to process JFM file format
+@x
+@d read_two(A) { (A)=tfbyte;
+ if ( (A)>127 ) goto BAD_TFM;
+ tfget; (A)=(A)*0400+tfbyte;
+}
+@y
+@d read_two(A) { (A)=tfbyte;
+ tfget; (A)=(A)*0400+tfbyte;
+}
+@z
diff --git a/Build/source/texk/web2c/pmpostdir/upmpost.test b/Build/source/texk/web2c/pmpostdir/upmpost.test
new file mode 100755
index 00000000000..289afd9c75c
--- /dev/null
+++ b/Build/source/texk/web2c/pmpostdir/upmpost.test
@@ -0,0 +1,13 @@
+#! /bin/sh
+
+# Copyright (C) 2014 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+./upmpost -version || exit 1
+
+./upmpost -help || exit 1
+
+./upmpost -dvitomp -version || exit 1
+
+./upmpost -dvitomp -help || exit 1
+