---
 texk/kpathsea/texmf.cnf              |    1 
 texk/web2c/Makefile.am               |    3 
 texk/web2c/ac/web2c.ac               |    1 
 texk/web2c/pmpostdir/Makefile        |  107 +++++++
 texk/web2c/pmpostdir/am/pmpost.am    |  118 ++++++++
 texk/web2c/pmpostdir/jfm.ch          |  104 +++++++
 texk/web2c/pmpostdir/jmp.ch          |  342 ++++++++++++++++++++++++
 texk/web2c/pmpostdir/jmppsw.ch       |   74 +++++
 texk/web2c/pmpostdir/mp.ch           |   20 +
 texk/web2c/pmpostdir/mpmathdouble.ch |   76 +++++
 texk/web2c/pmpostdir/mpost.ch        |  298 +++++++++++++++++++++
 texk/web2c/pmpostdir/mpxout.ch       |    8 
 texk/web2c/pmpostdir/pdvitomp.ch     |  492 +++++++++++++++++++++++++++++++++++
 texk/web2c/pmpostdir/psout.ch        |   42 ++
 texk/web2c/pmpostdir/svgout.ch       |   59 ++++
 15 files changed, 1745 insertions(+)

--- texlive-bin.orig/texk/kpathsea/texmf.cnf
+++ texlive-bin/texk/kpathsea/texmf.cnf
@@ -624,6 +624,7 @@
 % Used by makempx to run TeX.  We use "etex" because MetaPost is
 % expecting DVI, and not "tex" because we want first line parsing.
 TEX = etex
+TEX.pmpost = eptex
 
 % These variables specify the external program called for the
 % interactive `e' option.  %d is replaced by the line number and %s by
--- texlive-bin.orig/texk/web2c/Makefile.am
+++ texlive-bin/texk/web2c/Makefile.am
@@ -177,6 +177,9 @@
 ## MetaPost
 include $(srcdir)/mplibdir/am/mplib.am
 
+## pMetaPost
+include $(srcdir)/pmpostdir/am/pmpost.am
+
 ## libmplib, used by MetaPost and luaTeX
 include $(srcdir)/mplibdir/am/libmplib.am
 
--- texlive-bin.orig/texk/web2c/ac/web2c.ac
+++ texlive-bin/texk/web2c/ac/web2c.ac
@@ -41,6 +41,7 @@
 [[pdftex], [yes], [yes], [pdfTeX],  [xpdf libpng]],
 [[luatex], [yes], [],    [luaTeX],  [poppler cairo libpng zziplib]],
 [[mp],     [yes], [],    [MetaPost],[cairo libpng]],
+[[pmp],    [yes], [],    [pMetaPost], [cairo libpng ptexenc]],
 [[xetex],  [yes], [yes], [XeTeX],   [poppler libpng freetype2 icu teckit graphite2 harfbuzz]],
 ])[]dnl
 m4_foreach([Kpse_Prog], [kpse_tex_progs],
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/Makefile
@@ -0,0 +1,107 @@
+#
+# Makefile for W32
+#
+PTEXENCDIR=../../ptexenc
+
+RM = rm -f
+CC = cl
+LD = cl
+CTANGLE = ../ctangle
+CTIE = ctie
+AR = lib
+
+CAIROVER=cairo-1.12.8
+#CAIROVER=cairo-1.12.12
+
+KPSEBUILDDIR = ../../kpathsea
+KPSESRCDIR = ../..
+KPSELIB=$(KPSEBUILDDIR)/libkpathsea.lib
+PTEXENCLIB= ../../ptexenc/libptexenc.lib
+CAIROLIB = ../../../libs/cairo/$(CAIROVER)/src/release/cairo-static.lib
+PNGLIB = ../../../libs/libpng/libpng.lib
+ZLIBLIB = ../../../libs/zlib/libz.lib
+SYSLIBS = user32.lib advapi32.lib gdi32.lib
+ADDLIBS = $(ZLIBLIB) $(PNGLIB) $(CAIROLIB) $(SYSLIBS)
+
+MPLIBBUILDDIR = .
+MPLIBSRCDIR = .
+MPLIB = libjmplib.lib
+
+# LDEBUG=-link /DEBUG
+LDEBUG=
+
+# CFLAGS = -nologo -w -MT -Od -Zi -DMPXOUT=1 -DWIN32=1 -DMSVC=1 -DR_OK=4
+
+CFLAGS = -nologo -w -MT -O2 -DMPXOUT=1 -DWIN32=1 -DMSVC=1 -DR_OK=4 \
+-Dstrcasecmp=stricmp -DHAVE_SNPRINTF=1 -D_CRT_SECURE_NO_DEPRECATE=1 \
+-DCAIRO_WIN32_STATIC_BUILD=1 \
+-DNO_KPSE_DLL=1 -I. -I../.. -I../../kpathsea \
+-I$(PTEXENCDIR) -I.. \
+-I../../../libs/cairo/$(CAIROVER)/src \
+-I../../../libs/libpng
+
+OBJECTS = mpost.obj mpxout.obj
+LIBOBJECTS = avl.obj mp.obj pngout.obj psout.obj svgout.obj tfmin.obj \
+mpmath.obj mpmathdouble.obj mpstrings.obj
+
+pmpost.exe: $(MPLIB) $(OBJECTS) $(KPSELIB)
+	$(LD) -Fe$@ $(OBJECTS) setargv.obj $(MPLIB) $(KPSELIB) $(PTEXENCLIB) $(ADDLIBS) $(LDEBUG)
+
+$(MPLIB): $(LIBOBJECTS)
+	$(AR) -out:$@ $(LIBOBJECTS)
+
+.w.c:
+	$(CTANGLE) $< $@
+
+mpost.c: mpost.w mpost.ch mpxout.c
+	$(CTANGLE) mpost.w mpost.ch
+
+mpxout.c: mpxout.w mpxout-tot.ch
+	$(CTANGLE) mpxout.w mpxout-tot.ch
+
+mpxout-tot.ch: mpxout.w mpxout.ch pdvitomp.ch
+	$(CTIE) -c $@ mpxout.w mpxout.ch pdvitomp.ch
+
+mpmathdouble.c: mpmathdouble.w mpmathdouble.ch
+	$(CTANGLE) mpmathdouble.w mpmathdouble.ch
+
+mp.c: mp.w mp-tot.ch pngout.c psout.c svgout.c tfmin.c mpmath.c \
+mpmathdouble.c mpstrings.c
+	$(CTANGLE) mp.w mp-tot.ch
+
+mp-tot.ch: mp.w mp.ch jmp.ch
+	$(CTIE) -c $@ mp.w mp.ch jmp.ch
+
+tfmin.c: tfmin.w jfm.ch
+	$(CTANGLE) tfmin.w jfm.ch
+ 
+mpstrings.c: mpstrings.w
+	$(CTANGLE) mpstrings.w
+
+psout.c: psout.w psout-tot.ch mpstrings.c
+	$(CTANGLE) psout.w psout-tot.ch 
+
+psout-tot.ch: psout.w psout.ch jmppsw.ch
+	$(CTIE) -c $@ psout.w psout.ch jmppsw.ch
+
+svgout.c: svgout.w svgout.ch
+	$(CTANGLE) svgout.w svgout.ch
+
+mpmath.c: mpmath.w
+	$(CTANGLE) mpmath.w
+
+$(OBJECTS): %.obj: %.c
+	$(CC) -c $(CFLAGS) $< -Fo$@
+
+$(LIBOBJECTS): %.obj: %.c
+	$(CC) -c $(CFLAGS) $< -Fo$@
+
+clean:
+	$(RM) *.obj mp.c mpxout.c psout.c psout.h mp*.h *.scn \
+        *.idx *.toc *.pdf *.log mpmath.c mpost.c tfmin.c svgout.c \
+        mpstrings.c *~ pngout.c mpmathdouble.c mp-tot.ch mpxout-tot.ch \
+        psout-tot.ch *.pdb *.eps *.exp *.exe *.lib
+
+install: pmpost.exe
+	cp -p pmpost.exe c:/usr/local/bin/
+	cp -p pmpost.exe c:/usr/work/edrive/wk/dist/PTEX/bin/
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/am/pmpost.am
@@ -0,0 +1,118 @@
+## texk/web2c/pmpostdir/am/pmpost.am: Makefile fragment for pMetaPost.
+
+CTIE = ./ctie
+ctie = $(ctie_silent)CWEBINPUTS=.:$(srcdir) $(buildenv) $(CTIE)
+ctie_silent = $(ctie_silent_$(V))
+ctie_silent_ = $(ctie_silent_$(AM_DEFAULT_VERBOSITY))
+ctie_silent_0 = @echo "  CTIE    " $@; $(SHELL) ./silent-sh $@ #
+ctie_silent_1 = 
+
+
+if PMP
+bin_PROGRAMS += pmpost
+bin_links += pmpost$(EXEEXT):pdvitomp
+endif PMP
+EXTRA_PROGRAMS +=pmpost
+
+pmpost_CPPFLAGS = $(CAIRO_INCLUDES) $(PIXMAN_INCLUDES) $(AM_CPPFLAGS) $(ZLIB_INCLUDES) $(LIBPNG_INCLUDES) -I$(srcdir)/mplibdir  -I$(srcdir)/pmpostdir $(PTEXENC_INCLUDES)
+pmpost_LDADD = $(KPATHSEA_LIBS) $(CAIRO_LIBS) $(PIXMAN_LIBS) $(LIBPNG_LIBS) $(ZLIB_LIBS) -lm $(PTEXENC_LIBS)
+
+
+.PHONY: install-pmpost-links uninstall-pmpost-links
+
+# 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
+pmpost_SOURCES = mplibdir/avl.h mplibdir/avl.c
+nodist_pmpost_SOURCES = ptfmin.c $(pmp_c_h) $(pmpmath_c_h) $(pmpmathdouble_c_h) $(ppsout_c_h) $(psvgout_c_h) $(ppngout_c_h) $(pmpstrings_c_h) pmpost.c  $(pmpxout_c_h)
+pmp_c_h =  pmp.c pmplib.h pmpmp.h
+pmpmath_c_h = pmpmath.h pmpmath.c
+pmpmathdouble_c_h = pmpmathdouble.h pmpmathdouble.c
+pmpstrings_c_h = pmpstrings.h pmpstrings.c
+ppsout_c_h = pmppsout.h ppsout.c pmplibps.h
+psvgout_c_h = pmplibsvg.h pmpsvgout.h psvgout.c
+ppngout_c_h = pmplibpng.h pmppngout.h ppngout.c
+pmpxout_c_h = pmpxout.c pmpxout.h
+
+# 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\\.h/pmpmath.h/;s/mpmathdouble\\.h/pmpmathdouble.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)
+
+# Creating one file: just one rule
+ptfmin.c: ctangle$(EXEEXT) mplibdir/tfmin.w
+	cat $(srcdir)/mplibdir/tfmin.w | $(pmp_sed) > ptfmin.w
+	$(pmp_ctangle) ptfmin.w jfm.ch
+pmpost.c: ctangle$(EXEEXT) mplibdir/mpost.w
+	cat $(srcdir)/mplibdir/mpost.w | $(pmp_sed) > pmpost.w
+	$(pmp_ctangle) pmpost.w mpost.ch
+
+
+# Creating several files: need stamp file and two rules with identical recipes
+$(pmp_c_h): pmp-tangle
+	@$(pmp_ctangle_sh) pmp.w pmp-tot.ch
+pmp-tangle: ctangle$(EXEEXT) mplibdir/mp.w pmp-tot.ch tangle-sh
+	@$(pmp_ctangle_sh) pmp.w pmp-tot.ch
+pmp-tot.ch: ctie$(EXEEXT) mplibdir/mp.w pmpostdir/mp.ch pmpostdir/jmp.ch
+	cat $(srcdir)/mplibdir/mp.w | $(pmp_sed) > pmp.w
+	$(ctie) -c pmp-tot.ch pmp.w pmpostdir/mp.ch pmpostdir/jmp.ch
+
+$(pmpmath_c_h): pmpmath-tangle
+	@$(pmp_ctangle_sh) pmpmath
+pmpmath-tangle: ctangle$(EXEEXT) mplibdir/mpmath.w tangle-sh
+	cat $(srcdir)/mplibdir/mpmath.w | $(pmp_sed) > pmpmath.w
+	@$(pmp_ctangle_sh) pmpmath
+
+$(pmpmathdouble_c_h): pmpmathdouble-tangle
+	@$(pmp_ctangle_sh) pmpmathdouble pmpostdir/mpmathdouble.ch
+pmpmathdouble-tangle: ctangle$(EXEEXT) mplibdir/mpmathdouble.w pmpostdir/mpmathdouble.ch tangle-sh
+	cat $(srcdir)/mplibdir/mpmathdouble.w | $(pmp_sed) > pmpmathdouble.w
+	@$(pmp_ctangle_sh) pmpmathdouble mpmathdouble.ch
+
+$(pmpstrings_c_h): pmpstrings-tangle
+	@$(pmp_ctangle_sh) pmpstrings
+pmpstrings-tangle: ctangle$(EXEEXT) mplibdir/mpstrings.w tangle-sh
+	cat $(srcdir)/mplibdir/mpstrings.w | $(pmp_sed) > pmpstrings.w
+	@$(pmp_ctangle_sh) pmpstrings
+
+$(ppsout_c_h): ppsout-tangle
+	@$(pmp_ctangle_sh) ppsout.w ppsout-tot.ch
+ppsout-tangle: ctangle$(EXEEXT) mplibdir/psout.w ppsout-tot.ch tangle-sh
+	@$(pmp_ctangle_sh) ppsout.w ppsout-tot.ch
+ppsout-tot.ch: ctie$(EXEEXT) mplibdir/psout.w pmpostdir/psout.ch pmpostdir/jmppsw.ch
+	cat $(srcdir)/mplibdir/psout.w | $(pmp_sed) > ppsout.w
+	$(ctie) -c ppsout-tot.ch ppsout.w pmpostdir/psout.ch pmpostdir/jmppsw.ch
+
+$(psvgout_c_h): psvgout-tangle
+	@$(pmp_ctangle_sh) psvgout svgout.ch
+psvgout-tangle: ctangle$(EXEEXT) mplibdir/svgout.w pmpostdir/svgout.ch tangle-sh
+	cat $(srcdir)/mplibdir/svgout.w | $(pmp_sed) > psvgout.w
+	@$(pmp_ctangle_sh) psvgout svgout.ch
+$(ppngout_c_h): ppngout-tangle
+	@$(pmp_ctangle_sh) ppngout
+ppngout-tangle: ctangle$(EXEEXT) mplibdir/pngout.w tangle-sh
+	cat $(srcdir)/mplibdir/pngout.w | $(pmp_sed) > ppngout.w
+	@$(pmp_ctangle_sh) ppngout
+
+$(pmpxout_c_h): pmpxout-tangle
+	@$(pmp_ctangle_sh) pmpxout pmpxout-tot.ch
+pmpxout-tangle: ctangle$(EXEEXT) mplibdir/mpxout.w pmpxout-tot.ch tangle-sh
+	@$(pmp_ctangle_sh) pmpxout pmpxout-tot.ch
+pmpxout-tot.ch: ctie$(EXEEXT) mplibdir/mpxout.w pmpostdir/mpxout.ch pmpostdir/pdvitomp.ch
+	cat $(srcdir)/mplibdir/mpxout.w | $(pmp_sed) > pmpxout.w
+	$(ctie) -c pmpxout-tot.ch pmpxout.w pmpostdir/mpxout.ch pmpostdir/pdvitomp.ch
+
+## pMetaPost CWeb sources
+pmpost_web = mplibdir/mpost.w mplibdir/mpxout.w
+pmpost_web += mplibdir/mp.w mplibdir/psout.w mplibdir/svgout.w mplibdir/pngout.w
+pmpost_web += mplibdir/mpmath.w mplibdir/mpmathdouble.w mplibdir/mpstrings.w mplibdir/tfmin.w
+
+$(pmpost_OBJECTS): $(nodist_pmpost_SOURCES)
+
+DISTCLEANFILES += $(nodist_pmpost_SOURCES)
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/jfm.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
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/jmp.ch
@@ -0,0 +1,342 @@
+% 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.802" /* printed when \MP\ starts */
+@y
+@d default_banner "This is pMetaPost, Version 1.802-0.04" /* printed when \MP\ starts */
+@z
+
+@x
+#define metapost_version "1.802"
+@y
+#define metapost_version "1.802-0.04"
+@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 (f)) == EOF && errno == EINTR)
+      ;
+    if (i != '\n')
+      ungetc (i, f);
+  }
+  return true;
+}
+@z
+
+@x
+wterm (mp->banner);
+@y
+wterm (mp->banner);
+wterm(" (");
+wterm((char *)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 ((char *)(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) {
+@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) {
+      cc=char_mp_info(f,mp_lookup_ctype(mp, f,fromBUFF(mp_text_p(p)->str,limit,k)));
+      k++;
+    } else {
+      cc = char_mp_info (f, *(mp_text_p (p)->str + k));
+    }
+@z
+
+@x
+@* Debugging.
+@y
+@ @<Declare JFM function for text measuring@>=
+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
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/jmppsw.ch
@@ -0,0 +1,74 @@
+%
+%
+% change file of psout.w for jMetaPost (CWEB version)
+% Akira Kakuto (translated the WEB version)
+%
+%
+
+@x
+#include "pmppsout.h" /* internal header */
+#include "pmpmath.h" /* internal header */
+@y
+#include "pmppsout.h" /* internal header */
+#include "pmpmath.h" /* internal header */
+#include <ptexenc/ptexenc.h>
+@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);
+void mp_ps_kanji_string_out (MP mp, unsigned char *s);
+
+#define Hi(x) (((x) >> 8) & 0xff)
+#define Lo(x) ((x) & 0xff)
+
+@ @c
+void mp_ps_kanji_string_out (MP mp, unsigned char *s)
+{
+int i, len;
+int c;
+
+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);
+  c=toDVI(fromBUFF(s, i+2, i));
+  i=i+2;
+  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
+  mp_ps_print_nl(mp, "%%Creator: MetaPost (Japanese version) ");
+@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
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/mp.ch
@@ -0,0 +1,20 @@
+@x
+  /* open the terminal for output */
+  t_open_out();
+#if DEBUG
+  setlinebuf(stdout);
+  setlinebuf(mp->term_out);
+#endif
+@y
+  /* open the terminal for output */
+  t_open_out();
+#if DEBUG
+#ifdef WIN32
+  setvbuf(stdout, (char *) NULL, _IONBF, 0);
+  setvbuf(mp->term_out, (char *) NULL, _IONBF, 0);
+#else
+  setlinebuf(stdout);
+  setlinebuf(mp->term_out);
+#endif
+#endif
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/mpmathdouble.ch
@@ -0,0 +1,76 @@
+@x
+#define _ISOC99_SOURCE /* to get the round() prototype */
+#include <w2c/config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+@y
+#define _ISOC99_SOURCE /* to get the round() prototype */
+#include <w2c/config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+double round(double x);
+#endif
+@z
+
+@x
+void mp_init_randoms (MP mp, int seed) {
+  int j, jj, k;    /* more or less random integers */
+  int i;        /* index into |randoms| */
+  j =  abs (seed);
+  while (j >= fraction_one) {
+    j = j/2;
+  }
+  k = 1;
+  for (i = 0; i <= 54; i++) {
+    jj = k;
+    k = j - k;
+    j = jj;
+    if (k<0)
+      k += fraction_one;
+    mp->randoms[(i * 21) % 55].data.dval = j;
+  }
+  mp_new_randoms (mp);
+  mp_new_randoms (mp);
+  mp_new_randoms (mp);          /* ``warm up'' the array */
+}
+@y
+void mp_init_randoms (MP mp, int seed) {
+  int j, jj, k;    /* more or less random integers */
+  int i;        /* index into |randoms| */
+  j =  abs (seed);
+  while (j >= fraction_one) {
+    j = j/2;
+  }
+  k = 1;
+  for (i = 0; i <= 54; i++) {
+    jj = k;
+    k = j - k;
+    j = jj;
+    if (k<0)
+      k += fraction_one;
+    mp->randoms[(i * 21) % 55].data.dval = j;
+  }
+  mp_new_randoms (mp);
+  mp_new_randoms (mp);
+  mp_new_randoms (mp);          /* ``warm up'' the array */
+}
+#ifdef _MSC_VER
+#  include <math.h>
+double round(double x)
+{
+    double c, f, d1, d2;
+
+    c = ceil(x);
+    f = floor(x);
+    d1 = fabs(c - x);
+    d2 = fabs(x - f);
+    if (d1 > d2)
+        return f;
+    else
+        return c;
+}
+#endif
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/mpost.ch
@@ -0,0 +1,298 @@
+@x
+#include <kpathsea/kpathsea.h>
+@y
+#include <kpathsea/kpathsea.h>
+#include <ptexenc/ptexenc.h>
+char kanjioption[16];
+@z
+
+@x
+@d TEX     "tex"
+@d TROFF   "soelim | eqn -Tps -d$$ | troff -Tps"
+
+@c
+#ifndef MPXCOMMAND
+#define MPXCOMMAND "makempx"
+#endif
+@y
+@d TEX     "eptex"
+@d TROFF   "gsoelim | geqn -Tps -d$$ | gtroff -Tps"
+
+@c
+#ifndef MPXCOMMAND
+#define MPXCOMMAND "pmakempx"
+#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 pmpost version ";
+@z
+
+@x
+  mpost_xfree (cnf_cmd);
+@y
+  if(cnf_cmd)
+    mpost_xfree (cnf_cmd);
+@z
+
+@x
+      const char *banner = "% Written by dvitomp version ";
+@y
+      const char *banner = "% Written by pdvitomp 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 "\n", s);
+else
+  fprintf(stdout, "This is MetaPost %s" WEB2CVERSION "\n", s);
+mpost_xfree(s);
+fprintf(stdout,
+"\n"
+"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"
+"  -interaction=STRING       set interaction mode (STRING=batchmode/nonstopmode/\n"
+"                            scrollmode/errorstopmode)\n"
+"  -numbersystem=STRING      set number system mode (STRING=scaled/double/binary/decimal)\n"
+"  -jobname=STRING           set the job name to STRING\n"
+@y
+  fprintf(stdout, "This is pdvitomp %s" WEB2CVERSION "\n", s);
+else
+  fprintf(stdout, "This is pMetaPost %s" WEB2CVERSION "\n", s);
+mpost_xfree(s);
+fprintf(stdout,
+"\n"
+"Usage: pmpost [OPTION] [&MEMNAME] [MPNAME[.mp]] [COMMANDS]\n"
+"       pmpost --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"\n"
+"  Run pMetaPost 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 pMetaPost input,\n"
+"  after MPNAME is read.\n\n"
+"  With a --dvitomp argument, pMetaPost acts as DVI-to-MPX converter only.\n"
+"  Call pMetaPost with --dvitomp --help for option explanations.\n\n");
+fprintf(stdout,
+"  -ini                      be inipmpost, for dumping mem files\n"
+"  -interaction=STRING       set interaction mode (STRING=batchmode/nonstopmode/\n"
+"                            scrollmode/errorstopmode)\n"
+"  -numbersystem=STRING      set number system mode (STRING=scaled/double/binary/decimal)\n"
+"  -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 "\n", s);
+else
+  fprintf(stdout, "This is MetaPost %s" WEB2CVERSION "\n", s);
+mpost_xfree(s);
+fprintf(stdout,
+"\n"
+"Usage: dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"       mpost --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"\n"
+"  Convert a TeX DVI file to a MetaPost MPX file.\n\n");
+fprintf(stdout,
+"  -progname=STRING          set program name to STRING\n"
+@y
+  fprintf(stdout, "This is pdvitomp %s" WEB2CVERSION "\n", s);
+else
+  fprintf(stdout, "This is pMetaPost %s" WEB2CVERSION "\n", s);
+mpost_xfree(s);
+fprintf(stdout,
+"\n"
+"Usage: pdvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"       pmpost --dvitomp DVINAME[.dvi] [MPXNAME[.mpx]]\n"
+"\n"
+"  Convert a TeX DVI file to a MetaPost MPX file.\n\n");
+fprintf(stdout,
+"  -progname=STRING          set program name to STRING\n"
+"  -kanji=STRING             set kanji encoding (sjis, jis, euc, utf8)\n"
+@z
+
+@x
+  fprintf(stdout, "dvitomp (MetaPost) %s" WEB2CVERSION "\n", s);
+else
+  fprintf(stdout, "MetaPost %s" WEB2CVERSION "\n", s);
+@y
+  fprintf(stdout, "pdvitomp (pMetaPost) %s" WEB2CVERSION "\n", s);
+else
+  fprintf(stdout, "pMetaPost %s" WEB2CVERSION "\n", s);
+@z
+
+@x
+"Author of the CWEB MetaPost: Taco Hoekwater.\n"
+@y
+"Author of the CWEB MetaPost: Taco Hoekwater.\n"
+"Authors of pMetaPost: Michio Matsuyama, Hideyuki Suzuki.\n"
+@z
+
+@x
+  const char * banner = "This is MetaPost, version ";
+@y
+  const char * banner = "This is pMetaPost, version ";
+@z
+
+@x
+  options->print_found_names = (int)true;
+  {
+    const char *base = xbasename(argv[0]);
+    if (!strcmp(base, "dvitomp") || !strcasecmp(base, "dvitomp.exe"))
+      dvitomp_only=1;
+  }
+  if (dvitomp_only) {
+    @<Read and set dvitomp command line options@>;
+  } else {
+@y
+  options->print_found_names = (int)true;
+
+#if defined(WIN32)
+  {
+    char *p , *q;
+    p = (char *)xbasename(argv[0]);
+    if ((q = strrchr(p, '.')) && !strcasecmp(q, ".exe"))
+       *q = '\0';
+    argv[0] = p;
+  }
+  kanjioption[0] = '\0';
+  enable_UPTEX (false);
+  set_enc_string("sjis", "sjis");
+#else
+  {
+    char *p;
+    p = (char *)xbasename(argv[0]);
+    argv[0] = p;
+  }
+  kanjioption[0] = '\0';
+  enable_UPTEX (false);
+  set_enc_string("utf8", "euc");
+#endif
+
+  if (strstr(argv[0], "dvitomp") != NULL) {
+    dvitomp_only=1;
+    @<Read and set dvitomp command line options@>;
+  } else {
+    options->mem_name = mpost_xstrdup(argv[0]);
+@z
+
+@x
+  if(putenv(xstrdup("engine=metapost")))
+@y
+  if(putenv(xstrdup("engine=pmpost")))
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/mpxout.ch
@@ -0,0 +1,8 @@
+@x
+#include <process.h>
+@y
+#include <process.h>
+#define R_OK 4
+typedef int boolean;
+typedef int integer;
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/pdvitomp.ch
@@ -0,0 +1,492 @@
+@x
+#include "pmpxout.h"
+@y
+#include "pmpxout.h"
+#include <ptexenc/ptexenc.h>
+@z
+
+@x
+@d max_widths (256*max_fonts) /* maximum number of different characters among all fonts */
+@y
+@d max_widths 512000 /* maximum number of different characters among all fonts */
+@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 */
+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
+@ 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|@>@;
+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@>=
+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;
+}
+
+@ Every 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).
+
+@d Hi(x) (((x)>> 8) & 0xff)
+@d Lo(x) ( (x)      & 0xff)
+
+@<Declare subroutines for printing strings@>=
+void mpx_print_kanji_char (MPX mpx,integer c)
+{
+  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));
+  putc2(Hi(c), mpx->mpxfile);
+  mpx->print_col++;
+  putc2(Lo(c), mpx->mpxfile);
+  mpx->print_col++;
+}
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/psout.ch
@@ -0,0 +1,42 @@
+@x
+integer ps_offset;
+@y
+integer ps_offset;
+integer is_mapfile_read;
+@z
+
+@x
+mp->ps->ps_offset = 0;
+@y
+mp->ps->ps_offset = 0;
+mp->ps->is_mapfile_read = 0;
+@z
+
+@x
+        mp->ps->fm_file = (mp->open_file)(mp, n, "r", mp_filetype_fontmap);
+        if (!mp->ps->fm_file) {
+@y
+        mp->ps->fm_file = (mp->open_file)(mp, n, "r", mp_filetype_fontmap);
+        if (!mp->ps->fm_file) {
+            mp->ps->mitem->map_line = mp_xstrdup (mp,psf_tab_name);
+            n = mp->ps->mitem->map_line;
+            mp->ps->fm_file = (mp->open_file)(mp, n, "r", mp_filetype_fontmap);
+        }
+        if (!mp->ps->fm_file) {
+@z
+
+@x
+@d ps_tab_name "psfonts.map"  /* locates font name translation table */
+@y
+@d ps_tab_name "mpost.map"  /* locates font name translation table */
+@d psf_tab_name "psfonts.map"  /* locates font name translation table */
+@z
+
+@x
+  fm_read_info (mp);
+@y
+  if (mp->ps->is_mapfile_read == 0) {
+    mp->ps->is_mapfile_read++;
+    fm_read_info (mp);
+  }
+@z
--- /dev/null
+++ texlive-bin/texk/web2c/pmpostdir/svgout.ch
@@ -0,0 +1,59 @@
+@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) {
+      k=(int)*s++;
+      if (@<Character |k| is illegal in SVG output@>) {
+@y
+    if ( mp->font_id[gr_font_n(p)]!=0 ) {
+    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) {
+      k=(int)*s++;
+      if (@<Character |k| is illegal in SVG output@>) {
+@z
+
+@x
+    mp_svg_print(mp, "<?xml version=\"1.0\"?>");
+@y
+    mp_svg_print(mp, "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+@z
