texlive[65177] Build/source/texk/web2c: uptex: Merge change files for

commits+takuji at tug.org commits+takuji at tug.org
Sat Dec 3 13:53:58 CET 2022


Revision: 65177
          http://tug.org/svn/texlive?view=revision&revision=65177
Author:   takuji
Date:     2022-12-03 13:53:58 +0100 (Sat, 03 Dec 2022)
Log Message:
-----------
uptex: Merge change files for pTeX tools into upTeX tools

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/Makefile.in
    trunk/Build/source/texk/web2c/ptexdir/nissya.test
    trunk/Build/source/texk/web2c/ptexdir/pbibtex.test
    trunk/Build/source/texk/web2c/ptexdir/pdvitype.test
    trunk/Build/source/texk/web2c/ptexdir/skipjfmp.test
    trunk/Build/source/texk/web2c/ptexdir/yokotate.test
    trunk/Build/source/texk/web2c/uptexdir/am/uptex.am
    trunk/Build/source/texk/web2c/uptexdir/nissya.test
    trunk/Build/source/texk/web2c/uptexdir/sample.test
    trunk/Build/source/texk/web2c/uptexdir/skipjfmp.test
    trunk/Build/source/texk/web2c/uptexdir/upbibtex-mem.test
    trunk/Build/source/texk/web2c/uptexdir/upbibtex.ch
    trunk/Build/source/texk/web2c/uptexdir/updvitype.ch
    trunk/Build/source/texk/web2c/uptexdir/updvitype.test
    trunk/Build/source/texk/web2c/uptexdir/uppltotf.ch
    trunk/Build/source/texk/web2c/uptexdir/uptftopl.ch
    trunk/Build/source/texk/web2c/uptexdir/yokotate.test

Modified: trunk/Build/source/texk/web2c/Makefile.in
===================================================================
--- trunk/Build/source/texk/web2c/Makefile.in	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/Makefile.in	2022-12-03 12:53:58 UTC (rev 65177)
@@ -3303,9 +3303,8 @@
 	eptexdir/pdfprimitive.test \
 	eptexdir/tests/pdfprimitive-test.tex \
 	eptexdir/tests/pdfprimitive-eptex.log $(uptex_web_srcs) \
-	$(uptex_ch_srcs) uptexdir/uptex.defines ptexdir/pbibtex.ch \
-	uptexdir/upbibtex.ch ptexdir/pdvitype.ch uptexdir/updvitype.ch \
-	ptexdir/ppltotf.ch uptexdir/uppltotf.ch ptexdir/ptftopl.ch \
+	$(uptex_ch_srcs) uptexdir/uptex.defines uptexdir/upbibtex.ch \
+	uptexdir/updvitype.ch uptexdir/uppltotf.ch \
 	uptexdir/uptftopl.ch uptexdir/COPYRIGHT uptexdir/COPYRIGHT.jis \
 	uptexdir/ChangeLog $(uptex_tests) $(upweb_tests) \
 	tests/enc-u.bbl tests/enc-eu.bbl tests/enc-su.bbl \
@@ -22270,8 +22269,8 @@
 	@$(web2c) upbibtex
 upbibtex.p: tangle$(EXEEXT) upbibtex.web uptexdir/upbibtex.ch
 	$(up_tangle) upbibtex upbibtex
-upbibtex.web: tie$(EXEEXT) bibtex.web bibtex.ch ptexdir/pbibtex.ch
-	$(tie_m) bibtex.web bibtex.ch ptexdir/pbibtex.ch
+upbibtex.web: tie$(EXEEXT) bibtex.web bibtex.ch
+	$(tie_m) bibtex.web bibtex.ch
 updvitype.c updvitype.h: updvitype-web2c
 	@$(web2c) updvitype
 updvitype-web2c: updvitype.p $(web2c_depend) uptexdir/uptex.defines
@@ -22278,8 +22277,8 @@
 	@$(web2c) updvitype
 updvitype.p: tangle$(EXEEXT) updvitype.web uptexdir/updvitype.ch
 	$(up_tangle) updvitype updvitype
-updvitype.web: tie$(EXEEXT) dvitype.web dvitype.ch ptexdir/pdvitype.ch
-	$(tie_m) dvitype.web dvitype.ch ptexdir/pdvitype.ch
+updvitype.web: tie$(EXEEXT) dvitype.web dvitype.ch
+	$(tie_m) dvitype.web dvitype.ch
 uppltotf.c uppltotf.h: uppltotf-web2c
 	@$(web2c) uppltotf
 uppltotf-web2c: uppltotf.p $(web2c_depend) uptexdir/uptex.defines
@@ -22286,8 +22285,8 @@
 	@$(web2c) uppltotf
 uppltotf.p: tangle$(EXEEXT) uppltotf.web uptexdir/uppltotf.ch
 	$(up_tangle) uppltotf uppltotf
-uppltotf.web: tie$(EXEEXT) pltotf.web pltotf.ch ptexdir/ppltotf.ch
-	$(tie_m) pltotf.web pltotf.ch ptexdir/ppltotf.ch
+uppltotf.web: tie$(EXEEXT) pltotf.web pltotf.ch
+	$(tie_m) pltotf.web pltotf.ch
 uptftopl.c uptftopl.h: uptftopl-web2c
 	@$(web2c) uptftopl
 uptftopl-web2c: uptftopl.p $(web2c_depend) uptexdir/uptex.defines
@@ -22294,8 +22293,8 @@
 	@$(web2c) uptftopl
 uptftopl.p: tangle$(EXEEXT) uptftopl.web uptexdir/uptftopl.ch
 	$(up_tangle) uptftopl uptftopl
-uptftopl.web: tie$(EXEEXT) tftopl.web tftopl.ch ptexdir/ptftopl.ch
-	$(tie_m) tftopl.web tftopl.ch ptexdir/ptftopl.ch
+uptftopl.web: tie$(EXEEXT) tftopl.web tftopl.ch
+	$(tie_m) tftopl.web tftopl.ch
 uptexdir/uptriptest.log: uptex$(EXEEXT) dvitype$(EXEEXT) pltotf$(EXEEXT) tftopl$(EXEEXT)
 uptexdir/upver.log uptexdir/upkcat.log: uptex$(EXEEXT)
 uptexdir/upbibtex.log: upbibtex$(EXEEXT)
@@ -22304,7 +22303,7 @@
 uptexdir/uptftopl.log: uptftopl$(EXEEXT)
 uptexdir/upbibtex-openout-test.log uptexdir/upbibtex-longline-test.log \
 	uptexdir/upbibtex-mem.log uptexdir/nissya.log: upbibtex$(EXEEXT)
-uptexdir/sample.log: pdvitype$(EXEEXT)
+uptexdir/sample.log: updvitype$(EXEEXT)
 uptexdir/yokotate.log uptexdir/skipjfmp.log \
 	uptexdir/newjfm.log uptexdir/uparse.log uptexdir/gkhuge.log: uppltotf$(EXEEXT) uptftopl$(EXEEXT)
 uptrip.diffs: uptex$(EXEEXT) dvitype$(EXEEXT) pltotf$(EXEEXT) tftopl$(EXEEXT)

Modified: trunk/Build/source/texk/web2c/ptexdir/nissya.test
===================================================================
--- trunk/Build/source/texk/web2c/ptexdir/nissya.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/ptexdir/nissya.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/ptexdir/pbibtex.test
===================================================================
--- trunk/Build/source/texk/web2c/ptexdir/pbibtex.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/ptexdir/pbibtex.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/ptexdir/pdvitype.test
===================================================================
--- trunk/Build/source/texk/web2c/ptexdir/pdvitype.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/ptexdir/pdvitype.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/ptexdir/skipjfmp.test
===================================================================
--- trunk/Build/source/texk/web2c/ptexdir/skipjfmp.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/ptexdir/skipjfmp.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2018-2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2018 Karl Berry <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.
 

Modified: trunk/Build/source/texk/web2c/ptexdir/yokotate.test
===================================================================
--- trunk/Build/source/texk/web2c/ptexdir/yokotate.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/ptexdir/yokotate.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/uptexdir/am/uptex.am
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/am/uptex.am	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/am/uptex.am	2022-12-03 12:53:58 UTC (rev 65177)
@@ -99,9 +99,9 @@
 	@$(web2c) upbibtex
 upbibtex.p: tangle$(EXEEXT) upbibtex.web uptexdir/upbibtex.ch
 	$(up_tangle) upbibtex upbibtex
-upbibtex.web: tie$(EXEEXT) bibtex.web bibtex.ch ptexdir/pbibtex.ch
-	$(tie_m) bibtex.web bibtex.ch ptexdir/pbibtex.ch
-EXTRA_DIST += ptexdir/pbibtex.ch uptexdir/upbibtex.ch
+upbibtex.web: tie$(EXEEXT) bibtex.web bibtex.ch
+	$(tie_m) bibtex.web bibtex.ch
+EXTRA_DIST += uptexdir/upbibtex.ch
 
 ## upDVItype
 ##
@@ -116,9 +116,9 @@
 	@$(web2c) updvitype
 updvitype.p: tangle$(EXEEXT) updvitype.web uptexdir/updvitype.ch
 	$(up_tangle) updvitype updvitype
-updvitype.web: tie$(EXEEXT) dvitype.web dvitype.ch ptexdir/pdvitype.ch
-	$(tie_m) dvitype.web dvitype.ch ptexdir/pdvitype.ch
-EXTRA_DIST += ptexdir/pdvitype.ch uptexdir/updvitype.ch
+updvitype.web: tie$(EXEEXT) dvitype.web dvitype.ch
+	$(tie_m) dvitype.web dvitype.ch
+EXTRA_DIST += uptexdir/updvitype.ch
 
 ## upPLtoTF
 ##
@@ -133,9 +133,9 @@
 	@$(web2c) uppltotf
 uppltotf.p: tangle$(EXEEXT) uppltotf.web uptexdir/uppltotf.ch
 	$(up_tangle) uppltotf uppltotf
-uppltotf.web: tie$(EXEEXT) pltotf.web pltotf.ch ptexdir/ppltotf.ch
-	$(tie_m) pltotf.web pltotf.ch ptexdir/ppltotf.ch
-EXTRA_DIST += ptexdir/ppltotf.ch uptexdir/uppltotf.ch
+uppltotf.web: tie$(EXEEXT) pltotf.web pltotf.ch
+	$(tie_m) pltotf.web pltotf.ch
+EXTRA_DIST += uptexdir/uppltotf.ch
 
 ## upTFtoPL
 ##
@@ -150,9 +150,9 @@
 	@$(web2c) uptftopl
 uptftopl.p: tangle$(EXEEXT) uptftopl.web uptexdir/uptftopl.ch
 	$(up_tangle) uptftopl uptftopl
-uptftopl.web: tie$(EXEEXT) tftopl.web tftopl.ch ptexdir/ptftopl.ch
-	$(tie_m) tftopl.web tftopl.ch ptexdir/ptftopl.ch
-EXTRA_DIST += ptexdir/ptftopl.ch uptexdir/uptftopl.ch
+uptftopl.web: tie$(EXEEXT) tftopl.web tftopl.ch
+	$(tie_m) tftopl.web tftopl.ch
+EXTRA_DIST += uptexdir/uptftopl.ch
 
 ##
 EXTRA_DIST += \
@@ -186,7 +186,7 @@
 uptexdir/uptftopl.log: uptftopl$(EXEEXT)
 uptexdir/upbibtex-openout-test.log uptexdir/upbibtex-longline-test.log \
 	uptexdir/upbibtex-mem.log uptexdir/nissya.log: upbibtex$(EXEEXT)
-uptexdir/sample.log: pdvitype$(EXEEXT)
+uptexdir/sample.log: updvitype$(EXEEXT)
 uptexdir/yokotate.log uptexdir/skipjfmp.log \
 	uptexdir/newjfm.log uptexdir/uparse.log uptexdir/gkhuge.log: uppltotf$(EXEEXT) uptftopl$(EXEEXT)
 

Modified: trunk/Build/source/texk/web2c/uptexdir/nissya.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/nissya.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/nissya.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/uptexdir/sample.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/sample.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/sample.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017-2020 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/uptexdir/skipjfmp.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/skipjfmp.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/skipjfmp.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2018-2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2018 Karl Berry <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.
 

Modified: trunk/Build/source/texk/web2c/uptexdir/upbibtex-mem.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/upbibtex-mem.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/upbibtex-mem.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2010-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/uptexdir/upbibtex.ch
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/upbibtex.ch	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/upbibtex.ch	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,35 +1,103 @@
+% Change file for BibTeX in C, originally by Howard Trickey.
+%
+% 05/28/84      Initial implementation, version 0.41 of BibTeX
+% 07/01/84      Version 0.41a of BibTeX.
+% 12/17/84      Version 0.97c of BibTeX.
+% 02/12/85      Version 0.98c of BibTeX.
+% 02/25/85      Newer version 0.98c of BibTeX.
+% 03/25/85      Version 0.98f of BibTeX
+% 05/23/85      Version 0.98i of BibTeX
+% 02/11/88      Version 0.99b of BibTeX
+% 04/04/88      Version 0.99c; converted for use with web2c (ETM).
+% 11/30/89      Use FILENAMESIZE instead of 1024 (KB).
+% 03/09/90	`int' is a bad variable name for C.
+% (more recent changes in the ChangeLog)
+%
+%  5/ 2/89      Version 0.20 of JBiBTeX by Shouichi Matsui
+% 12/25/90      Version 0.30 of JBibTeX by Shouichi Matsui
+%  1/ 1/91      last update for JBibTeX 0.30 by Shouichi Matsui
+% 10/30/92      last update for JBibTeX 0.31 for bug fix by Shouichi Matsui
+% 11/02/94      Version 0.32 for use with web2c 6.1, by Takafumi Sakurai
+%
+% 2002          Version 0.33 add kanji option by ASCII Corporation
+%
+% 2009          pTeXenc, pbibtex N. Tsuchimura
+% 2010          Version 0.99d of BibTeX for TeX Live
+%
+% 2022-02-08    Version 0.34 by H. Yamashita
+%   * Avoid breaking BBL lines at white space after a Japanese character, to
+%     preserve spacing within BIB entry for subsequent pTeX line-end operations.
+% 2022-02-20    Still version 0.34 by H. Yamashita (-> TL'22 version)
+%   * Improve substring$ to truncate at least one character when trying to
+%     start counting from the middle byte of the first or last Japanese character.
+% 2022-05-15    Version 0.35 by Takuji Tanaka
+%   * Accept multibyte characters by int.to.chr$ and chr.to.int$.
+% 2022-12-03    Version 0.36 by Takuji Tanaka (-> TL'23 version)
+%   * Merge pBibTeX source/binary into upBibTeX.
+
+ at x [0] only print chnages
+\def\title{\BibTeX\ }
+ at y
+\let\maybe=\iffalse
+\def\title{J\BibTeX\ 0.36 Changes for C Version \BibTeX\ }
+ at z
+
 @x
- at d my_name=='pbibtex'
- at d banner=='This is pBibTeX, Version 0.99d-j0.35'
+ \def\titlepage{F}
+ \centerline{\:\titlefont The {\:\ttitlefont \BibTeX} preprocessor}
+ \vskip 15pt \centerline{(Version 0.99d---\today)} \vfill}
 @y
+ \def\titlepage{F}
+ \centerline{\:\titlefont The {\:\ttitlefont J\BibTeX} preprocessor}
+ \vskip 15pt \centerline{(Version 0.99d-j0.36---\today)} \vfill}
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+ at d my_name=='bibtex'
+ at d banner=='This is BibTeX, Version 0.99d' {printed when the program starts}
+ at y
 @d my_name=='upbibtex'
- at d banner=='This is upBibTeX, Version 0.99d-j0.35-u1.29'
+ at d banner=='This is upBibTeX, Version 0.99d-j0.36-u1.29'
+  {printed when the program starts}
 @z
 
 @x
-for i:=@'200 to @'237 do xchr[i]:=chr(i-@'200);
-for i:=@'240 to 255 do xchr[i]:=chr(i);
+  print (banner);
 @y
+  print (banner);
+  print (' (', conststringcast(get_enc_string), ')');
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [27]
+for i:=0 to @'37 do xchr[i]:=chr(i);
+for i:=@'177 to @'377 do xchr[i]:=chr(i);
+ at y
+for i:=1 to @'37 do xchr[i]:=' ';
+xchr[tab]:=chr(tab);
 for i:=@'200 to 255 do xchr[i]:=chr(i);
+xchr[@'33]:=chr(@'33); {escape char}
 @z
 
- at x
-for i:=@'200 to @'237 do xord[i]:= i-@'200;
-for i:=@'240 to 255 do xord[i]:=i;
+ at x Changes for JBibTeX by Shouichi Matsui [28]
+for i:=first_text_char to last_text_char do xord[xchr[i]]:=i;
 @y
+for i:=first_text_char to last_text_char do xord[i]:=invalid_code;
+for i:=1 to @'176 do xord[i]:= i;
 for i:=@'200 to 255 do xord[i]:=i;
 @z
 
- at x
- at d zen_pun_first = 161          {Zenkaku punctuation first byte; in EUC}
- at d zen_space = 161              {Zenkaku space first, second byte; in EUC}
- at d zen_kuten = 162              {Zenkaku kuten second byte; in EUC}
- at d zen_ten = 163                {Zenkaku ten second byte; in EUC}
- at d zen_comma = 164              {Zenkaku comman second byte; in EUC}
- at d zen_period = 165             {Zenkaku period second byte; in EUC}
- at d zen_question = 169           {Zenkaku question mark second byte; in EUC}
- at d zen_exclamation = 170        {Zenkaku exclamation mark second byte; in EUC}
+
+ at x Changes for JBibTeX by Shouichi Matsui  for ver. 0.30
+ at d period = "."                 {these are three}
+ at d question_mark = "?"          {string-ending characters}
+ at d exclamation_mark = "!"       {of interest in \.{add.period\$}}
 @y
+ at d period = "."                 {these are three}
+ at d question_mark = "?"          {string-ending characters}
+ at d exclamation_mark = "!"       {of interest in \.{add.period\$}}
 @d e_ss3 = @"8F                 {single shift three in EUC}
 @d e_pun_first = @"A1           {Zenkaku punctuation first byte; in EUC}
 @d e_space = @"A1A1             {Zenkaku space; in EUC}
@@ -55,23 +123,116 @@
 @d u_exclam_question = @"2049   {Zenkaku exclamation question mark; in UCS}
 @z
 
- at x
-for i:=@'200 to @'237 do lex_class[i] := illegal;
-for i:=@'240 to 255 do lex_class[i] := alpha;
-lex_class[@'33]:=alpha;
+% [32] Make RET a `white_space' character, so we won't choke on DOS
+% files, which use CR/LF for line endings.
+ at x Changes for JBibTeX by Shouichi Matsui [32]
+@<Set initial values of key variables@>=
+for i:=0 to @'177 do lex_class[i] := other_lex;
+for i:=@'200 to @'377 do lex_class[i] := alpha;
+for i:=0 to @'37 do lex_class[i] := illegal;
+lex_class[invalid_code] := illegal;
+lex_class[tab] := white_space;
+lex_class[13] := white_space;
+lex_class[space] := white_space;
+lex_class[tie] := sep_char;
+lex_class[hyphen] := sep_char;
+for i:=@'60 to @'71 do lex_class[i] := numeric;
+for i:=@'101 to @'132 do lex_class[i] := alpha;
+for i:=@'141 to @'172 do lex_class[i] := alpha;
 @y
+@<Set initial values of key variables@>=
+for i:=0 to @'377 do lex_class[i] := other_lex;
+for i:=0 to @'37 do lex_class[i] := illegal;
+lex_class[invalid_code] := illegal;
+lex_class[tab] := white_space;
+lex_class[13] := white_space;
+lex_class[space] := white_space;
+lex_class[tie] := sep_char;
+lex_class[hyphen] := sep_char;
+for i:=@'60 to @'71 do lex_class[i] := numeric;
+for i:=@'101 to @'132 do lex_class[i] := alpha;
+for i:=@'141 to @'172 do lex_class[i] := alpha;
 @z
 
- at x
-for i:=@'200 to @'237 do id_class[i] := illegal_id_char;
+ at x Changes for JBibTeX by Shouichi Matsui [33]
+@<Set initial values of key variables@>=
+for i:=0 to @'377 do id_class[i] := legal_id_char;
+for i:=0 to @'37 do id_class[i] := illegal_id_char;
+id_class[space] := illegal_id_char;
+id_class[tab] := illegal_id_char;
+id_class[double_quote] := illegal_id_char;
+id_class[number_sign] := illegal_id_char;
+id_class[comment] := illegal_id_char;
+id_class[single_quote] := illegal_id_char;
+id_class[left_paren] := illegal_id_char;
+id_class[right_paren] := illegal_id_char;
+id_class[comma] := illegal_id_char;
+id_class[equals_sign] := illegal_id_char;
+id_class[left_brace] := illegal_id_char;
+id_class[right_brace] := illegal_id_char;
 @y
+@<Set initial values of key variables@>=
+for i:=0 to @'377 do id_class[i] := legal_id_char;
+for i:=0 to @'37 do id_class[i] := illegal_id_char;
+id_class[@'33] := legal_id_char;
+id_class[space] := illegal_id_char;
+id_class[tab] := illegal_id_char;
+id_class[double_quote] := illegal_id_char;
+id_class[number_sign] := illegal_id_char;
+id_class[comment] := illegal_id_char;
+id_class[single_quote] := illegal_id_char;
+id_class[left_paren] := illegal_id_char;
+id_class[right_paren] := illegal_id_char;
+id_class[comma] := illegal_id_char;
+id_class[equals_sign] := illegal_id_char;
+id_class[left_brace] := illegal_id_char;
+id_class[right_brace] := illegal_id_char;
 @z
 
- at x
-for i:=@'240 to 254 do char_width[i]:=514;
+ at x Changes for JBibTeX by Shouichi Matsui [35]
+char_width[@'167] := 722;
+char_width[@'170] := 528;
+char_width[@'171] := 528;
+char_width[@'172] := 444;
+char_width[@'173] := 500;
+char_width[@'174] :=1000;
+char_width[@'175] := 500;
+char_width[@'176] := 500;
 @y
+char_width[@'167] := 722;
+char_width[@'170] := 528;
+char_width[@'171] := 528;
+char_width[@'172] := 444;
+char_width[@'173] := 500;
+char_width[@'174] :=1000;
+char_width[@'175] := 500;
+char_width[@'176] := 500;
 @z
 
+ at x [48] JBibTeX and dynamic buf_size.
+label loop_exit;
+ at y
+label loop_exit;
+var i:c_int_type;
+ at z
+ at x [still 48] JBibTeX and dynamic buf_size.
+  while (not eoln(f)) do
+    begin
+    if (last >= buf_size) then
+        buffer_overflow;
+    buffer[last] := xord[getc (f)];
+    incr (last);
+    end;
+  vgetc (f); {skip the eol}
+ at y
+  last := input_line2(f,ustringcast(buffer),last,buf_size,address_of(i));
+  while (not eof(f)) and (last > 0) and (i <> 10) and (i <> 13) do
+  begin
+    buffer_overflow;
+    last := input_line2(f,ustringcast(buffer),last,buf_size,address_of(i));
+  end;
+ at z
+
 @x procedure lower_case
 procedure lower_case (var buf:buf_type; @!bf_ptr,@!len:buf_pointer);
 var i:buf_pointer;
@@ -196,11 +357,14 @@
     end
 @z
 
- at x procedure get_the_top_level_aux_file_name
+ at x
+@<Procedures and functions for the reading and processing of input files@>=
+procedure get_the_top_level_aux_file_name;
 label aux_found,@!aux_not_found;
 begin
-  if (not set_enc_string (nil,'EUC')) then uexit(1);
 @y
+@<Procedures and functions for the reading and processing of input files@>=
+procedure get_the_top_level_aux_file_name;
 label aux_found,@!aux_not_found;
 var i:0..last_text_char;    {this is the first one declared}
 begin
@@ -208,17 +372,96 @@
 @z
 
 @x
-    zen_ten,
-    zen_period,
-    zen_question,
-    zen_exclamation:
-        if( str_pool[sp_ptr-1] = zen_pun_first ) then
-            repush_string
-        else
-            @<Add the |period| (it's necessary) and push@>;
+parse_arguments;
+ at y
+init_kanji;
+parse_arguments;
+ at z
+
+% pBibTeX: do not break at |white_space| after Japanese characters (2022-02-08 j0.34)
+ at x "Break that line"
+while ((lex_class[out_buf[out_buf_ptr]] <> white_space) and
+                                        (out_buf_ptr >= min_print_line)) do
+    decr(out_buf_ptr);
+ at y
+while (((lex_class[out_buf[out_buf_ptr]] <> white_space) or
+       (out_buf[out_buf_ptr-1] > 127)) and (out_buf_ptr >= min_print_line)) do
+    decr(out_buf_ptr);
+ at z
+ at x "Break that unbreakably long line"
+    if (lex_class[out_buf[out_buf_ptr]] <> white_space) then
+        incr(out_buf_ptr)
+ at y
+    if (lex_class[out_buf[out_buf_ptr]] <> white_space) or
+      (out_buf[out_buf_ptr-1] > 127) then
+        incr(out_buf_ptr)
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [332]
+@!b_write : hash_loc;           {\.{write\$}}
+@!b_default : hash_loc;         {either \.{skip\$} or \.{default.type}}
+ at y
+@!b_write : hash_loc;           {\.{write\$}}
+@!b_is_kanji_str : hash_loc;    {\.{is.kanji.str\$}}
+@!b_default : hash_loc;         {either \.{skip\$} or \.{default.type}}
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [334]
+ at d n_write = 36         {\.{write\$}}
+
+@<Constants in the outer block@>=
+@!num_blt_in_fns = 37;  {one more than the previous number}
+ at y
+ at d n_write = 36         {\.{write\$}}
+ at d n_is_kanji_str = 37  {\.{is.kanji.str\$}}
+
+@<Constants in the outer block@>=
+@!num_blt_in_fns = 38;  {one more than the previous number}
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [335]
+build_in('write$      ',6,b_write,n_write);
+ at y
+build_in('write$      ',6,b_write,n_write);
+build_in('is.kanji.str$',13,b_is_kanji_str,n_is_kanji_str);
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [342]
+    n_write :           x_write;
+    othercases confusion ('Unknown built-in function')
+endcases;
+end
+ at y
+    n_write :           x_write;
+    n_is_kanji_str:     x_is_kanji_str;
+    othercases confusion ('Unknown built-in function')
+endcases;
+end
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [343]
+@<|execute_fn|({\.{write\$}})@>@;
+@<|execute_fn| itself@>
+ at y
+@<|execute_fn|({\.{write\$}})@>@;
+@<|execute_fn|({\.{is.kanji.str\$}})@>@;
+@<|execute_fn| itself@>
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui   --- add.period$ for ver. 0.30
+case (str_pool[sp_ptr]) of
+    period,
+    question_mark,
+    exclamation_mark :
+        repush_string;
     othercases
         @<Add the |period| (it's necessary) and push@>
 @y
+case (str_pool[sp_ptr]) of
+    period,
+    question_mark,
+    exclamation_mark :
+        repush_string;
     othercases
         begin
         if (is_internalEUC) then
@@ -257,18 +500,41 @@
 @z
 
 @x x_chr_to_int
-        push_lit_stk(toDVI(fromBUFF(str_pool, str_start[pop_lit1]+2, str_start[pop_lit1])),stk_int)
-                                        { a KANJI char is 2byte long }
+else if (length(pop_lit1) <> 1) then
+    begin
+    print ('"');
+    print_pool_str (pop_lit1);
+    bst_ex_warn ('" isn''t a single character');
+    push_lit_stk (0, stk_int);
+    end
+else
+    push_lit_stk (str_pool[str_start[pop_lit1]], stk_int);
+                                        {push the (|ASCII_code|) integer}
 @y
+else if (length(pop_lit1) = multibytelen(str_pool[str_start[pop_lit1]])) then
+    begin
+    if (length(pop_lit1) = 1) then
+        push_lit_stk(str_pool[str_start[pop_lit1]],stk_int)
+                                        {push the (|ASCII_code|) integer}
+    else
         push_lit_stk(toDVI(fromBUFF(str_pool, str_start[pop_lit1]+length(pop_lit1), str_start[pop_lit1])),stk_int)
                                         { a KANJI char is |2..4|byte long }
+    end
+else
+    begin
+    print ('"');
+    print_pool_str (pop_lit1);
+    bst_ex_warn ('" isn''t a single character');
+    push_lit_stk (0, stk_int);
+    end
 @z
 
- at x
-    if( (ex_buf[ex_buf_ptr-1]=zen_comma) or (ex_buf[ex_buf_ptr-1]=zen_kuten) )
-    then ex_buf_ptr := ex_buf_ptr - 2
-    else ex_buf_ptr := ex_buf_ptr - 4;
+ at x by Shouichi Matsui for Zenkaku comma
+if (ex_buf_ptr < ex_buf_length) then            {remove the ``and''}
+    ex_buf_ptr := ex_buf_ptr - 4;
 @y
+if (ex_buf_ptr < ex_buf_length) then    {remove the ``and'', or Zenkau comma}
+  begin
     if (is_internalEUC) then
       if((fromBUFF(ex_buf, ex_buf_length, ex_buf_ptr-2) = e_comma) or
          (fromBUFF(ex_buf, ex_buf_length, ex_buf_ptr-2) = e_toten))
@@ -279,28 +545,41 @@
          (fromBUFF(ex_buf, ex_buf_length, ex_buf_ptr-3) = u_toten))
       then ex_buf_ptr := ex_buf_ptr - 3
       else ex_buf_ptr := ex_buf_ptr - 4;
+  end;
 @z
 
- at x
-     zen_pun_first:
+ at x Changes for JBibTeX by Shouichi Matsui for Zenkaku comma
+    "a", "A" :
         begin
-          if((ex_buf[ex_buf_ptr+1]=zen_comma) or
-             (ex_buf[ex_buf_ptr+1]=zen_kuten) ) then
+        incr(ex_buf_ptr);
+        if (preceding_white) then
+            @<See if we have an ``and''@>;      {if so, |and_found := true|}
+        preceding_white := false;
+        end;
 @y
+    "a", "A" :
+        begin
+        incr(ex_buf_ptr);
+        if (preceding_white) then
+            @<See if we have an ``and''@>;      {if so, |and_found := true|}
+        preceding_white := false;
+        end;
      e_pun_first:
         if (is_internalEUC) then
         begin
           if ((fromBUFF(ex_buf, ex_buf_length, ex_buf_ptr) = e_comma) or 
               (fromBUFF(ex_buf, ex_buf_length, ex_buf_ptr) = e_toten)) then
- at z
- at x
-          else if(ex_buf[ex_buf_ptr+1]=zen_space) then
- at y
+                begin
+                  preceding_white := false;
+                  and_found  := true
+                end
           else if (fromBUFF(ex_buf,ex_buf_length,ex_buf_ptr) = e_space) then
- at z
- at x
-        end;
- at y
+               begin
+                  ex_buf[ex_buf_ptr]   := space;
+                  ex_buf[ex_buf_ptr+1] := space;
+                  preceding_white := true;
+               end;
+          ex_buf_ptr := ex_buf_ptr + 2;
         end else begin
             ex_buf_ptr := ex_buf_ptr + multibytelen(ex_buf[ex_buf_ptr]);
             preceding_white := false;
@@ -329,24 +608,48 @@
         end;
 @z
 
- at x
-                if( ex_buf[ex_buf_ptr] > 127 ) then
-                        ex_buf_ptr := ex_buf_ptr +2
-                else
-                        incr(ex_buf_ptr);
+ at x Changes for JBibTeX by Shouichi Matsui for Zenkaku comma[385]
+    othercases
+        if (lex_class[ex_buf[ex_buf_ptr]] = white_space) then
+            begin
+            incr(ex_buf_ptr);
+            preceding_white := true;
+            end
+        else
+            begin
+            incr(ex_buf_ptr);
+            preceding_white := false;
+            end
+  endcases;
+check_brace_level (pop_lit_var);
+end;
 @y
+    othercases
+        if (lex_class[ex_buf[ex_buf_ptr]] = white_space) then
+            begin
+            incr(ex_buf_ptr);
+            preceding_white := true;
+            end
+        else
+            begin
             ex_buf_ptr := ex_buf_ptr + multibytelen(ex_buf[ex_buf_ptr]);
+            preceding_white := false;
+            end
+  endcases;
+check_brace_level (pop_lit_var);
+end;
 @z
 
- at x
-            if name_buf[name_bf_ptr]>127 then begin
-                append_ex_buf_char_and_check (name_buf[name_bf_ptr]);
-                incr(name_bf_ptr);
-                append_ex_buf_char_and_check (name_buf[name_bf_ptr]);
-            end
-            else
-                append_ex_buf_char_and_check (name_buf[name_bf_ptr]);
+ at x Changes for JBibTeX by Shouichi Matsui [415]
+    if (lex_class[name_buf[name_bf_ptr]] = alpha) then
+        begin
+        append_ex_buf_char_and_check (name_buf[name_bf_ptr]);
+        goto loop_exit;
+        end
+    else if ((name_buf[name_bf_ptr] = left_brace) and
 @y
+    if (lex_class[name_buf[name_bf_ptr]] = alpha) then
+        begin
         append_ex_buf_char_and_check (name_buf[name_bf_ptr]);
         if multibytelen(name_buf[name_bf_ptr]) > 1 then
             append_ex_buf_char_and_check (name_buf[name_bf_ptr+1]);
@@ -355,19 +658,52 @@
         if multibytelen(name_buf[name_bf_ptr]) > 3 then
             append_ex_buf_char_and_check (name_buf[name_bf_ptr+3]);
         name_bf_ptr := name_bf_ptr + multibytelen(name_buf[name_bf_ptr])-1;
+        goto loop_exit;
+        end
+    else if ((name_buf[name_bf_ptr] = left_brace) and
 @z
 
 @x x_int_to_chr
-    str_room(2);
-    if (pop_lit1>127) then begin
-        append_char (Hi(k));
-        append_char (Lo(k));
+procedure x_int_to_chr;
+begin
+pop_lit_stk (pop_lit1,pop_typ1);
+if (pop_typ1 <> stk_int) then
+    begin
+    print_wrong_stk_lit (pop_lit1,pop_typ1,stk_int);
+    push_lit_stk (s_null, stk_str);
     end
-    else
-        append_char (pop_lit1);
+else if ((pop_lit1 < 0) or (pop_lit1 > 127)) then
+    begin
+    bst_ex_warn (pop_lit1:0,' isn''t valid ASCII');
+    push_lit_stk (s_null, stk_str);
+    end
+else
+    begin
+    str_room(1);
+    append_char (pop_lit1);
     push_lit_stk (make_string, stk_str);
     end;
+end;
 @y
+procedure x_int_to_chr;
+var k:integer;
+begin
+pop_lit_stk (pop_lit1,pop_typ1);
+if (pop_typ1 <> stk_int) then
+    begin
+    print_wrong_stk_lit (pop_lit1,pop_typ1,stk_int);
+    push_lit_stk (s_null, stk_str);
+    end
+else begin
+k:=pop_lit1;
+if (pop_lit1 > 127) then k:=fromDVI(pop_lit1);
+if ((pop_lit1 < 0) or ((pop_lit1 > 127) and (k = 0))) then
+    begin
+    bst_ex_warn (pop_lit1:0,' isn''t valid character code');
+    push_lit_stk (s_null, stk_str);
+    end
+else
+    begin
     str_room(4);
     k:=toBUFF(k);
     if (BYTE1(k)>0) then
@@ -380,41 +716,41 @@
         append_char (BYTE4(k));
     push_lit_stk (make_string, stk_str);
     end;
+end;
+end;
 @z
 
- at x
-@!pop_lit2_saved: integer;
+ at x Changes for JBibTeX by Shouichi Matsui [437]
+@<|execute_fn|({\.{substring\$}})@>=
+procedure x_substring;
+label exit;
+begin
 @y
+@<|execute_fn|({\.{substring\$}})@>=
+procedure x_substring;
+label exit;
+var tps,tpe:pool_pointer; {temporary pointer}
 @!pop_lit2_saved,@!mbl_tpe: integer;
+begin
 @z
 
 @x
-{ 2 bytes Kanji code break check }
-tps:=str_start[pop_lit3];
-tpe:=tps;
-while tpe < str_start[pop_lit3+1] do begin
-    if str_pool[tpe] > 127 then begin
-        if str_start[pop_lit3+1] < tpe+2 then
-            break;
-        tpe := tpe + 2;
-        end
-    else begin
-        if str_start[pop_lit3+1] < tpe+1 then
-            break;
-        tpe := tpe + 1;
-        end;
-    if tpe<=sp_ptr then
-        tps := tpe;
-    if sp_end<=tpe then break;
-end;
-if (pop_lit2_saved > 1) and (tps = str_start[pop_lit3])
-    then tps := tps + 2; {truncate at least one}
-if (pop_lit2_saved < -1) and (tpe = str_start[pop_lit3+1])
-    then tpe := tpe - 2; {truncate at least one}
-if tps > tpe then tpe := tps;
-sp_ptr := tps;
-sp_end := tpe;
+@<Form the appropriate substring@>=
+begin
 @y
+@<Form the appropriate substring@>=
+begin
+pop_lit2_saved := pop_lit2; {save before negate}
+ at z
+
+ at x Changes for JBibTeX by Shouichi Matsui [438] + fix (2022-02-20 j0.34)
+str_room(sp_end - sp_ptr);
+while (sp_ptr < sp_end) do                      {shift the substring}
+    begin
+    append_char (str_pool[sp_ptr]);
+    incr(sp_ptr);
+    end;
+ at y
 { |2..4| bytes Kanji code break check }
 tps:=str_start[pop_lit3];
 tpe:=tps;
@@ -437,36 +773,48 @@
 if tps > tpe then tpe := tps;
 sp_ptr := tps;
 sp_end := tpe;
- at z
 
- at x
-    if str_pool[sp_ptr] >127 then begin
-         append_char (str_pool[sp_ptr]); incr(sp_ptr);
-         append_char (str_pool[sp_ptr]); incr(sp_ptr);
-         end
-    else begin
-         append_char (str_pool[sp_ptr]); incr(sp_ptr);
-         end;
- at y
+str_room(sp_end - sp_ptr);
+while (sp_ptr < sp_end) do                      {shift the substring}
+    begin
     append_char (str_pool[sp_ptr]);
     incr(sp_ptr);
+    end;
 @z
 
- at x
-            incr(sp_xptr1); num_text_chars:=num_text_chars+2;
+ at x Changes for JBibTeX by Shouichi Matsui [445]
+    else if (str_pool[sp_xptr1-1] = right_brace) then
+        begin
+        if (sp_brace_level > 0) then
+            decr(sp_brace_level);
+        end
+    else
+        incr(num_text_chars);
+    end;
 @y
+    else if (str_pool[sp_xptr1-1] = right_brace) then
+        begin
+        if (sp_brace_level > 0) then
+            decr(sp_brace_level);
+        end
+    else if (str_pool[sp_xptr1-1]>127) then
+        begin {kanji char}
             num_text_chars := num_text_chars + multibytelen(str_pool[sp_xptr1-1]);
             sp_xptr1 := sp_xptr1-1 + multibytelen(str_pool[sp_xptr1-1]);
+        end
+    else
+        incr(num_text_chars);
+    end;
 @z
 
 @x
-const n_options = 8; {Pascal won't count array lengths for us.}
+const n_options = 4; {Pascal won't count array lengths for us.}
 @y
 const n_options = 9; {Pascal won't count array lengths for us.}
 @z
 
 @x
-      usage_help (PBIBTEX_HELP, 'issue@@texjp.org');
+      usage_help (BIBTEX_HELP, nil);
 @y
       usage_help (UPBIBTEX_HELP, 'issue@@texjp.org');
 @z
@@ -474,6 +822,16 @@
 @x
     end; {Else it was a flag; |getopt| has already done the assignment.}
 @y
+    end else if argument_is ('kanji') then begin
+      if (not set_enc_string(optarg, nil)) then
+        write_ln('Bad kanji encoding "', stringcast(optarg), '".');
+
+    end else if argument_is ('guess-input-enc') then begin
+        enable_guess_file_enc;
+
+    end else if argument_is ('no-guess-input-enc') then begin
+        disable_guess_file_enc;
+
     end else if argument_is ('kanji-internal') then begin
       if (not (set_enc_string(nil,optarg) and
                (is_internalEUC or is_internalUPTEX))) then
@@ -483,6 +841,40 @@
 @z
 
 @x
+long_options[current_option].name := 'version';
+long_options[current_option].has_arg := 0;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr (current_option);
+ at y
+long_options[current_option].name := 'version';
+long_options[current_option].has_arg := 0;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr (current_option);
+
+@ Kanji option.
+ at .-kanji@>
+
+@<Define the option...@> =
+long_options[current_option].name := 'kanji';
+long_options[current_option].has_arg := 1;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr(current_option);
+long_options[current_option].name := 'guess-input-enc';
+long_options[current_option].has_arg := 0;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr(current_option);
+long_options[current_option].name := 'no-guess-input-enc';
+long_options[current_option].has_arg := 0;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr(current_option);
+ at z
+
+ at x
 @ An element with all zeros always ends the list.
 @y
 @ Kanji-internal option.
@@ -499,31 +891,42 @@
 @z
 
 @x
-begin kpse_set_program_name (argv[0], 'pbibtex');
+begin kpse_set_program_name (argv[0], 'bibtex');
 @y
 begin kpse_set_program_name (argv[0], 'upbibtex');
 @z
 
- at x procedure x_is_kanji_str
-procedure x_is_kanji_str;
-label exit;
+ at x
+  until j_prime;
+  incr (k);
+  hash_prime := j;
+  primes[k] := hash_prime;
+  end;
+end;
+
 @y
+  until j_prime;
+  incr (k);
+  hash_prime := j;
+  primes[k] := hash_prime;
+  end;
+end;
+
+@ modules for JBibTeX
+
+@<|execute_fn|({\.{is.kanji.str\$}})@>=
 procedure x_is_kanji_str;
 label exit;
 var ctmp,clen:integer;
- at z
-
- at x procedure x_is_kanji_str (cont.)
+begin
+    pop_lit_stk(pop_lit1, pop_typ1);
+    if pop_typ1<> stk_str then
+    begin print_wrong_stk_lit(pop_lit1,pop_typ1,stk_str);
+          push_lit_stk(0,stk_int);
+    end else begin
+        sp_ptr := str_start[pop_lit1];
+        sp_end := str_start[pop_lit1+1];
         while sp_ptr<sp_end do begin
-            if str_pool[sp_ptr]>127 then begin
-                push_lit_stk(1,stk_int);
-                return;
-            end else begin
-                incr(sp_ptr);
-            end;
-        end;
- at y
-        while sp_ptr<sp_end do begin
             clen := multibytelen(str_pool[sp_ptr]);
             if sp_ptr+clen<=sp_end then
                 ctmp := fromBUFF(str_pool, sp_ptr+clen, sp_ptr)
@@ -539,12 +942,9 @@
                     incr(sp_ptr);
             end;
         end;
- at z
-
- at x
+        push_lit_stk(0,stk_int);
+    end;
 exit:end;
- at y
-exit:end;
 
 @ @<Procedures and functions for handling numbers, characters, and strings@>=
 function is_char_kanji_upbibtex(@!c:integer):boolean;
@@ -605,4 +1005,3 @@
     char_width[e_ss3]:=0;
   end;
 @z
-

Modified: trunk/Build/source/texk/web2c/uptexdir/updvitype.ch
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/updvitype.ch	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/updvitype.ch	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,15 +1,25 @@
+% This is a change file for DVItype.
+%
+% 09/27/95 (KA)  Supporting ASCII pTeX
+% 2020-08-24 (HY)  Support \dtou
+% 2022-12-03 (TTK) Merge pDVItype source/binary into upDVItype
+%
 @x
- at d my_name=='pdvitype'
- at d banner=='This is pDVItype, Version 3.6-p0.5'
+ at d my_name=='dvitype'
+ at d banner=='This is DVItype, Version 3.6' {printed when the program starts}
 @y
 @d my_name=='updvitype'
- at d banner=='This is upDVItype, Version 3.6-p0.5-u1.29'
+ at d banner=='This is upDVItype, Version 3.6-p221203'
+  {printed when the program starts}
 @z
 
 @x procedure initialize
+  parse_arguments;
   print (banner);
   print_ln (version_string);
 @y
+  init_kanji;
+  parse_arguments;
   print (banner);
   print (' (');
   print (conststringcast(get_enc_string));
@@ -17,12 +27,147 @@
   print_ln (version_string);
 @z
 
- at x procedure out_kanji
-  if text_ptr>=line_length-3 then flush_text;
-  c:=toBUFF(fromDVI(c));
-  incr(text_ptr); text_buf[text_ptr]:= Hi(c);
-  incr(text_ptr); text_buf[text_ptr]:= Lo(c);
+ at x
+for i:=@'177 to 255 do xchr[i]:='?';
 @y
+for i:=@'177 to 255 do xchr[i]:=i;
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+ at d undefined_commands==250,251,252,253,254,255
+ at y
+ at d dir=255 {pTeX direction}
+ at d undefined_commands==250,251,252,253,254
+ at z
+
+ at x
+ at d id_byte=2 {identifies the kind of \.{DVI} files described here}
+ at y
+ at d id_byte=2 {identifies the kind of \.{DVI} files described here}
+ at d ptex_id_byte=3 {identifies the kind of pTeX \.{DVI} files described here}
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% JFM and pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+@!width_ptr:0..max_widths; {the number of known character widths}
+ at y
+@!width_ptr:0..max_widths; {the number of known character widths}
+@!fnt_jfm_p:array [0..max_fonts] of boolean;
+@!jfm_char_code:array [0..max_widths] of integer;
+@!jfm_char_type:array [0..max_widths] of integer;
+@!jfm_char_font:array [0..max_widths] of integer;
+@!jfm_char_type_count:integer;
+@!cur_jfm_char_type:integer;
+
+@ @d jfm_hash_size=347
+
+@ @<Types...@>=
+@!jfm_char_type_hash_value=0..jfm_hash_size-1;
+
+@ @<Glob...@>=
+@!jfm_char_type_hash_table:array[jfm_char_type_hash_value] of integer;
+  { first pointer to character information. 0 means null pointer. }
+@!jfm_char_type_hash_link:array[0..max_widths] of integer;
+  { next pointer to character information. 0 means null pointer. }
+
+@ @<Set init...@>=
+for i:=0 to jfm_hash_size-1 do
+  jfm_char_type_hash_table[i] := 0;
+jfm_char_type[0]:=0;
+jfm_char_type_count:=1;
+
+@ Refer char_type table.
+
+ at p function get_jfm_char_type(@!fntn:integer;@!jfmc:integer):integer;
+  var p:integer; ct:integer;
+begin
+  p:=jfm_char_type_hash_table[(jfmc+fntn) mod jfm_hash_size];
+  ct:=0; { default char_type is 0 }
+  while p <> 0 do
+    if (jfm_char_code[p] = jfmc) and (jfm_char_font[p] = fntn) then
+      begin ct:=jfm_char_type[p]; p:=0; end
+    else
+      p:=jfm_char_type_hash_link[p];
+  get_jfm_char_type:=ct;
+end;
+
+@ @<Glob...@>=
+@!ptex_p:boolean;
+@!dd:eight_bits;
+@!ddstack:array [0..stack_size] of eight_bits;
+ at z
+
+ at x
+@!lh:integer; {length of the header data, in four-byte words}
+ at y
+@!lh:integer; {length of the header data, in four-byte words}
+@!nt:integer;
+@!jfm_h:integer;
+ at z
+
+ at x [35] JFM by K.A.
+read_tfm_word; lh:=b2*256+b3;
+ at y
+read_tfm_word; lh:=b0*256+b1;
+if (lh = 11) or (lh = 9) then
+  begin
+    print(' (JFM');
+    fnt_jfm_p[nf] := true;
+    if lh = 9 then print(' tate');
+    print(')');
+    nt:=b2*256+b3;
+    read_tfm_word;
+  end
+else
+  begin
+    nt:=0;
+    fnt_jfm_p[nf] := false;
+  end;
+lh:=b2*256+b3;
+ at z
+
+ at x [35] JFM by K.A.
+      tfm_design_size:=round(tfm_conv*(((b0*256+b1)*256+b2)*256+b3))
+    else goto 9997;
+  end;
+ at y
+      tfm_design_size:=round(tfm_conv*(((b0*256+b1)*256+b2)*256+b3))
+    else goto 9997;
+  end;
+for k:=1 to nt do
+  begin
+    read_tfm_word;
+    jfm_char_code[jfm_char_type_count]:=b0*256+b1+b2*65536;
+    jfm_char_type[jfm_char_type_count]:=b3;
+    jfm_char_font[jfm_char_type_count]:=nf;
+    jfm_h:= { hash value }
+      (jfm_char_code[jfm_char_type_count]+nf) mod jfm_hash_size;
+    jfm_char_type_hash_link[jfm_char_type_count]:=
+      jfm_char_type_hash_table[jfm_h];
+    jfm_char_type_hash_table[jfm_h]:=jfm_char_type_count;
+    jfm_char_type_count := jfm_char_type_count + 1
+  end;
+ at z
+
+ at x
+ at p procedure out_text(c:ASCII_code);
+begin if text_ptr=line_length-2 then flush_text;
+incr(text_ptr); text_buf[text_ptr]:=c;
+end;
+ at y
+ at p procedure out_text(c:ASCII_code);
+begin if text_ptr=line_length-2 then flush_text;
+incr(text_ptr);
+if c>=177 then text_buf[text_ptr]:=@'77 else text_buf[text_ptr]:=c;
+end;
+
+@ @p procedure out_kanji(c:integer);
+begin
   if text_ptr>=line_length-5 then flush_text;
   c:=toBUFF(fromDVI(c));
   if BYTE1(c)<>0 then begin incr(text_ptr); text_buf[text_ptr]:=BYTE1(c); end;
@@ -29,11 +174,320 @@
   if BYTE2(c)<>0 then begin incr(text_ptr); text_buf[text_ptr]:=BYTE2(c); end;
   if BYTE3(c)<>0 then begin incr(text_ptr); text_buf[text_ptr]:=BYTE3(c); end;
                             incr(text_ptr); text_buf[text_ptr]:=BYTE4(c);
+end;
+
+@ output hexdecimal / octal character code.
+
+ at d print_hex_digit(#)==if # <= 9 then print((#):1)
+                       else case # of
+                         10: print(xchr['A']);
+                         11: print(xchr['B']);
+                         12: print(xchr['C']);
+                         13: print(xchr['D']);
+                         14: print(xchr['E']);
+                         15: print(xchr['F']); { no more cases }
+                       end
+
+ at p
+ifdef('HEX_CHAR_CODE')
+procedure print_hex_number(c:integer);
+var n:integer;
+    b:array[1..8] of integer;
+begin
+  n:=1;
+  while (n<8) and (c<>0) do
+    begin b[n]:=c mod 16; c:=c div 16; n:=n+1 end;
+  print('"');
+  if n=1 then print(xchr['0'])
+  else
+    begin
+      n:=n-1;
+      while n>0 do
+        begin print_hex_digit(b[n]); n:=n-1 end
+    end
+end;
+endif('HEX_CHAR_CODE')
 @z
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 @x
-      usage_help (PDVITYPE_HELP, 'issue@@texjp.org');
+z0: first_par:=z;
 @y
+z0: first_par:=z;
+dir: first_par:=get_byte;
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+@!hhh:integer; {|h|, rounded to the nearest pixel}
+ at y
+@!hhh,@!vvv:integer; {|h|,|v| rounded to the nearest pixel}
+ at z
+
+ at x
+s:=0; h:=0; v:=0; w:=0; x:=0; y:=0; z:=0; hh:=0; vv:=0;
+ at y
+s:=0; h:=0; v:=0; w:=0; x:=0; y:=0; z:=0; hh:=0; vv:=0; dd:=0;
+ at z
+
+ at x
+move_right: @<Finish a command that sets |h:=h+q|, then |goto done|@>;
+ at y
+move_right:
+  if dd=0 then begin
+    @<Finish a command that sets |h:=h+q|, then |goto done|@>;
+  end else begin
+    if dd=1 then p:=q else {if dd=3 then} p:=-q;
+    @<Finish a command that sets |v:=v+p|, then |goto done|@>;
+  end;
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+  four_cases(set1): begin major('set',o-set1+1:1,' ',p:1); goto fin_set;
+    end;
+  four_cases(put1): begin major('put',o-put1+1:1,' ',p:1); goto fin_set;
+ at y
+  four_cases(set1),four_cases(put1):
+    begin
+      if fnt_jfm_p[cur_font]=true then
+        begin
+          cur_jfm_char_type:=get_jfm_char_type(cur_font,p);
+          out_kanji(p);
+          if o<put1 then
+            begin
+              minor('set',o-set1+1:1,' ',p:1);
+            end
+          else begin
+            minor('put',o-put1+1:1,' ',p:1);
+          end;
+ifdef('HEX_CHAR_CODE')
+          print('(');
+          print_hex_number(p);
+          print(')');
+endif('HEX_CHAR_CODE')
+          print(' type=',cur_jfm_char_type);
+          p:=cur_jfm_char_type
+        end
+      else begin
+        if o<put1 then
+          begin
+            major('set',o-set1+1:1,' ',p:1);
+          end
+        else begin
+          major('put',o-put1+1:1,' ',p:1);
+        end;
+ifdef('HEX_CHAR_CODE')
+        print('(');
+        print_hex_number(p);
+        print(')');
+endif('HEX_CHAR_CODE')
+      end;
+      goto fin_set;
+ at z
+
+ at x
+  @t\4@>@<Cases for commands |nop|, |bop|, \dots, |pop|@>@;
+ at y
+  dir: begin
+    if not ptex_p and (out_mode=the_works) then
+      bad_dvi('dir command within normal dvi file');
+    major('dir ',p:1); dd:=p; goto done;
+    end;
+  @t\4@>@<Cases for commands |nop|, |bop|, \dots, |pop|@>@;
+ at z
+
+ at x
+@!vvv:integer; {|v|, rounded to the nearest pixel}
+ at y
+@!vvv,hhh:integer; {|v|,|h| rounded to the nearest pixel}
+ at z
+
+ at x
+move_down: @<Finish a command that sets |v:=v+p|, then |goto done|@>;
+ at y
+move_down:
+  if dd=0 then begin
+    @<Finish a command that sets |v:=v+p|, then |goto done|@>;
+  end else begin
+    if dd=1 then q:=-p else {if dd=3 then} q:=p;
+    @<Finish a command that sets |h:=h+q|, then |goto done|@>;
+  end;
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+  hstack[s]:=h; vstack[s]:=v; wstack[s]:=w;
+ at y
+  ddstack[s]:=dd;
+  hstack[s]:=h; vstack[s]:=v; wstack[s]:=w;
+ at z
+
+ at x
+    h:=hstack[s]; v:=vstack[s]; w:=wstack[s];
+ at y
+    dd:=ddstack[s];
+    h:=hstack[s]; v:=vstack[s]; w:=wstack[s];
+ at z
+
+ at x
+ at d out_space(#)==if (p>=font_space[cur_font])or(p<=-4*font_space[cur_font]) then
+    begin out_text(" "); hh:=pixel_round(h+p);
+    end
+  else hh:=hh+pixel_round(p);
+ at y
+ at d out_space(#)==if (p>=font_space[cur_font])or(p<=-4*font_space[cur_font]) then
+    begin out_text(" ");
+      if dd=0 then hh:=pixel_round(h+p)
+      else if dd=1 then vv:=pixel_round(v+p)
+      else {if dd=3 then} vv:=pixel_round(v-p);
+    end
+  else if dd=0 then hh:=hh+pixel_round(p)
+    else if dd=1 then vv:=vv+pixel_round(p)
+    else {if dd=3 then} vv:=vv-pixel_round(p);
+ at z
+
+ at x
+ at d out_vmove(#)==if abs(p)>=5*font_space[cur_font] then vv:=pixel_round(v+p)
+  else vv:=vv+pixel_round(p);
+ at y
+ at d out_vmove(#)==if abs(p)>=5*font_space[cur_font] then
+    begin if dd=0 then vv:=pixel_round(v+p)
+      else if dd=1 then hh:=pixel_round(h-p)
+      else {if dd=3 then} hh:=pixel_round(h+p);
+    end
+  else if dd=0 then vv:=vv+pixel_round(p)
+    else if dd=1 then hh:=hh-pixel_round(p)
+    else {if dd=3 then} hh:=hh+pixel_round(p);
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hexadecimal code
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+@ @<Translate a |set_char|...@>=
+begin if (o>" ")and(o<="~") then
+  begin out_text(p); minor('setchar',p:1);
+  end
+else major('setchar',p:1);
+ at y
+@ @<Translate a |set_char|...@>=
+begin if (o>" ")and(o<="~") then
+  begin out_text(p); minor('setchar',p:1);
+  end
+else major('setchar',p:1);
+ifdef('HEX_CHAR_CODE')
+  print(' (');
+  print_hex_number(p);
+  print(')');
+endif('HEX_CHAR_CODE')
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+else hh:=hh+char_pixel_width(cur_font)(p);
+ at y
+else if dd=0 then hh:=hh+char_pixel_width(cur_font)(p)
+     else if dd=1 then vv:=vv+char_pixel_width(cur_font)(p)
+     else {if dd=3 then} vv:=vv-char_pixel_width(cur_font)(p);
+ at z
+
+ at x
+hh:=hh+rule_pixels(q); goto move_right
+ at y
+if dd=0 then hh:=hh+rule_pixels(q)
+else if dd=1 then vv:=vv+rule_pixels(q)
+else {if dd=3 then} vv:=vv-rule_pixels(q);
+goto move_right
+ at z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% pTeX
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ at x
+  print('level ',ss:1,':(h=',h:1,',v=',v:1,
+    ',w=',w:1,',x=',x:1,',y=',y:1,',z=',z:1,
+    ',hh=',hh:1,',vv=',vv:1,')');
+ at y
+  begin
+    print('level ',ss:1,':(h=',h:1,',v=',v:1,
+      ',w=',w:1,',x=',x:1,',y=',y:1,',z=',z:1);
+    if ptex_p then print(',d=',dd:1);
+    print(',hh=',hh:1,',vv=',vv:1,')');
+  end;
+ at z
+
+ at x
+if k<>id_byte then bad_dvi('ID byte is ',k:1);
+ at y
+ptex_p:=(k=ptex_id_byte);
+if (k<>id_byte) and (not ptex_p) then bad_dvi('ID byte is ',k:1);
+ at z
+
+ at x
+print_ln(', maxstackdepth=',max_s:1,', totalpages=',total_pages:1);
+ at y
+print_ln(', maxstackdepth=',max_s:1,', totalpages=',total_pages:1);
+if ptex_p then print_ln('pTeX DVI (id=',ptex_id_byte:1,')');
+ at z
+
+ at x
+if m<>id_byte then print_ln('identification in byte ',cur_loc-1:1,
+ at .identification...should be n@>
+    ' should be ',id_byte:1,'!');
+ at y
+if (m<>id_byte) and (m<>ptex_id_byte) then
+  print_ln('identification in byte ',cur_loc-1:1,
+ at .identification...should be n@>
+    ' should be ',id_byte:1,' or ',ptex_id_byte:1,'!');
+ at z
+
+ at x
+const n_options = 8; {Pascal won't count array lengths for us.}
+ at y
+const n_options = 10; {Pascal won't count array lengths for us.}
+ at z
+
+ at x
+      usage_help (DVITYPE_HELP, nil);
+ at y
       usage_help (UPDVITYPE_HELP, 'issue@@texjp.org');
 @z
 
+ at x
+    end; {Else it was a flag; |getopt| has already done the assignment.}
+ at y
+    end else if argument_is ('kanji') then begin
+      set_prior_file_enc;
+      if (not set_enc_string(optarg,optarg)) then begin
+        write_ln('Bad kanji encoding "', stringcast(optarg), '".');
+      end;
+
+    end; {Else it was a flag; |getopt| has already done the assignment.}
+ at z
+
+ at x
+@ An element with all zeros always ends the list.
+ at y
+@ Decide kanji encode
+ at .-kanji@>
+
+@<Define the option...@> =
+long_options[current_option].name := 'kanji';
+long_options[current_option].has_arg := 1;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr (current_option);
+
+@ An element with all zeros always ends the list.
+ at z

Modified: trunk/Build/source/texk/web2c/uptexdir/updvitype.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/updvitype.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/updvitype.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2011-2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.

Modified: trunk/Build/source/texk/web2c/uptexdir/uppltotf.ch
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/uppltotf.ch	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/uppltotf.ch	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,38 +1,632 @@
- at x
- at d my_name=='ppltotf'
- at d banner=='This is pPLtoTF, Version 3.6-p2.0'
+% This is a change file for PLtoTF
+%
+% (2022-12-03) TTK Merge pPLtoTF source/binary into upPLtoTF
+% (2018-01-27) HY pPLtoTF p2.0 - new JFM spec by texjporg
+% (07/18/2006) ST PLtoTF p1.8 (3.5, Web2c 7.2)
+% (11/13/2000) KN PLtoTF p1.4 (3.5, Web2c 7.2)
+% (03/27/1998) KN PLtoTF p1.3 (3.5, Web2c 7.2)
+%
+ at x [0] l.52 - pTeX:
+\def\title{PL$\,$\lowercase{to}$\,$TF changes for C}
 @y
+\def\title{PL$\,$\lowercase{to}$\,$TF changes for C, and for KANJI}
+ at z
+
+ at x [2] l.69 - pTeX:
+ at d my_name=='pltotf'
+ at d banner=='This is PLtoTF, Version 3.6' {printed when the program starts}
+ at y
 @d my_name=='uppltotf'
- at d banner=='This is upPLtoTF, Version 3.6-p2.0-u1.29'
+ at d banner=='This is upPLtoTF, Version 3.6-p221203'
+  {printed when the program starts}
 @z
 
 @x
-      usage_help (PPLTOTF_HELP, 'issue@@texjp.org');
+  parse_arguments;
 @y
+  init_kanji;
+  parse_arguments;
+ at z
+
+ at x [6] l.140 - pTeX:
+  print_ln (version_string);
+ at y
+  print_ln (version_string);
+  print_ln ('process kanji code is ', conststringcast(get_enc_string), '.');
+ at z
+
+ at x [18] l.495 - pTeX:
+@!xord:array[char] of ASCII_code; {conversion table}
+ at y
+@!xord:array[char] of ASCII_code; {conversion table}
+@!xchr:array[char] of byte; {specifiles conversion of output character}
+ at z
+
+ at x [19] l.506 - pTeX:
+for k:=first_ord to last_ord do xord[chr(k)]:=invalid_code;
+ at y
+for k:=0 to @'37 do xchr[k]:='?';
+for k:=@'40 to 255 do xchr[k]:=k;
+for k:=first_ord to last_ord do xord[chr(k)]:=invalid_code;
+ at z
+
+ at x [28] l.619 - pTeX:
+else  begin while (limit<buf_size-2)and(not eoln(pl_file)) do
+    begin incr(limit); read(pl_file,buffer[limit]);
+    end;
+ at y
+else  begin limit:=input_line2(pl_file,ustringcast(buffer),limit+1,buf_size-1)-1;
+ at z
+
+ at x [36] l.754 - pTeX: May have to increase some numbers to fit new commands
+ at d max_name_index=88 {upper bound on the number of keywords}
+ at d max_letters=600 {upper bound on the total length of all keywords}
+ at y
+ at d max_name_index=97 {upper bound on the number of keywords}
+ at d max_letters=700 {upper bound on the total length of all keywords}
+ at z
+
+ at x [44] l.839 - pTeX: Add kanji related codes
+ at d character_code=12
+ at y
+ at d character_code=12
+ at d type_code=13            {|TYPE| property}
+ at d glue_kern_code=14       {|GLUEKERN| property}
+ at d chars_in_type_code=15   {|CHARSINTYPE| property}
+ at d dir_code=16             {|DIRECTION| property}
+ at z
+
+ at x [44] l.856 - pTeX:
+ at d lig_code=74
+ at y
+ at d lig_code=74
+ at d glue_code=75            {|GLUE| property}
+@#
+ at d undefined=0  {not decided file format yet}
+ at d tfm_format=1 {\.{TFM} file format}
+ at d jfm_or_vfm=2 {Yoko or Tate \.{JFM} file format}
+ at d jfm_format=3 {Yoko-kumi \.{JFM} file format}
+ at d vfm_format=4 {Tate-kumi \.{JFM} file format}
+ at z
+
+ at x [84] l.1542 - pTeX: Change valid property code.
+if cur_code=comment_code then skip_to_end_of_item
+else if cur_code>character_code then
+  flush_error('This property name doesn''t belong on the outer level')
+ at .This property name doesn't belong...@>
+ at y
+if cur_code=comment_code then skip_to_end_of_item
+else if (cur_code>dir_code)or
+        ((file_format=tfm_format)and(cur_code>character_code)) then
+  flush_error('This property name doesn''t belong on the outer level')
+ at .This property name doesn't belong...@>
+ at z
+
+ at x [85] l.1565 - pTeX: Added some property codes.
+character_code: read_char_info;
+ at y
+character_code: read_char_info;
+type_code: read_kanji_info;
+glue_kern_code: read_glue_kern;
+chars_in_type_code: read_chars_in_type;
+dir_code: read_direction;
+ at z
+
+ at x [110] l.1915 - pTeX: there are no charlists in kanji format files.
+for c:=0 to 255 do
+  @<Make sure that |c| is not the largest element of a charlist cycle@>;
+ at y
+if file_format=tfm_format then
+  for c:=0 to 255 do
+    @<Make sure that |c| is not the largest element of a charlist cycle@>;
+ at z
+
+ at x [120] l.2037 - pTeX: when checking glue_kern prog check glues as well
+    begin if lig_exam<>bchar then
+      check_existence(lig_exam)('LIG character examined by');
+ at .LIG character examined...@>
+    check_existence(lig_gen)('LIG character generated by');
+ at .LIG character generated...@>
+    if lig_gen>=128 then if(c<128)or(c=256) then
+      if(lig_exam<128)or(lig_exam=bchar) then seven_unsafe:=true;
+    end
+ at y
+  begin if file_format=tfm_format then
+    begin if lig_exam<>bchar then
+      check_existence(lig_exam)('LIG character examined by');
+ at .LIG character examined...@>
+    check_existence(lig_gen)('LIG character generated by');
+ at .LIG character generated...@>
+    if lig_gen>=128 then if(c<128)or(c=256) then
+      if(lig_exam<128)or(lig_exam=bchar) then seven_unsafe:=true;
+    end
+  else check_existence(lig_exam)('GLUE character generated by');
+  end
+ at z
+
+ at x [126] l.2178 - pTeX: Fix up output of bytes.
+@<Doublecheck...@>=
+if nl>0 then for lig_ptr:=0 to nl-1 do
+  if lig_kern[lig_ptr].b2<kern_flag then
+    begin if lig_kern[lig_ptr].b0<255 then
+      begin double_check_lig(b1)('LIG step'); double_check_lig(b3)('LIG step');
+      end;
+    end
+  else double_check_lig(b1)('KRN step');
+ at y
+@<Doublecheck...@>=
+ at z
+
+ at x [128] l.2207 - pTeX: Decide the |file_format|.
+@<Do the output@>=
+ at y
+@<Do the output@>=
+case file_format of
+tfm_format: do_nothing;
+undefined,jfm_or_vfm: begin file_format:=jfm_format;
+  print_ln('Input file is in kanji YOKO-kumi format.');
+  end;
+jfm_format: print_ln('Input file is in kanji YOKO-kumi format.');
+vfm_format: print_ln('Input file is in kanji TATE-kumi format.');
+end;
+ at z
+
+ at x [128] l.2211 - pTeX: Output kanji character
+@<Output the character info@>;
+ at y
+if file_format<>tfm_format then @<Output the kanji character type info@>;
+@<Output the character info@>;
+ at z
+
+ at x [128] l.2213 - pTeX: Output glue/kern programs
+@<Output the ligature/kern program@>;
+ at y
+@<Output the ligature/kern program@>;
+if (file_format<>tfm_format)and(ng>0) then
+  for krn_ptr:=0 to ng-1 do
+    begin out_scaled(glue[3*krn_ptr+0]);
+    out_scaled(glue[3*krn_ptr+1]);
+    out_scaled(glue[3*krn_ptr+2]);
+    end;
+ at z
+
+ at x [130] l.2238 - pTeX:
+not_found:=true; bc:=0;
+while not_found do
+  if (char_wd[bc]>0)or(bc=255) then not_found:=false
+  else incr(bc);
+not_found:=true; ec:=255;
+while not_found do
+  if (char_wd[ec]>0)or(ec=0) then not_found:=false
+  else decr(ec);
+if bc>ec then bc:=1;
+ at y
+if file_format<>tfm_format then
+  begin bc:=0; ec:=0; nt:=1;
+  for kanji_type_index:=0 to max_kanji do
+    begin if kanji_type[kanji_type_index]>0 then incr(nt);
+    if kanji_type[kanji_type_index]>ec then ec:=kanji_type[kanji_type_index];
+    end;
+  end
+else  begin not_found:=true; bc:=0;
+  while not_found do
+    if (char_wd[bc]>0)or(bc=255) then not_found:=false
+    else incr(bc);
+  not_found:=true; ec:=255;
+  while not_found do
+    if (char_wd[ec]>0)or(ec=0) then not_found:=false
+    else decr(ec);
+  if bc>ec then bc:=1;
+  end;
+ at z
+
+ at x [130] l.2250 - pTeX:
+lf:=6+lh+(ec-bc+1)+memory[width]+memory[height]+memory[depth]+
+memory[italic]+nl+lk_offset+nk+ne+np;
+ at y
+if file_format<>tfm_format then
+  lf:=7+nt+lh+(ec-bc+1)+memory[width]+memory[height]+memory[depth]+
+    memory[italic]+nl+lk_offset+nk+3*ng+np
+else
+  lf:=6+lh+(ec-bc+1)+memory[width]+memory[height]+memory[depth]+
+    memory[italic]+nl+lk_offset+nk+ne+np;
+ at z
+
+ at x [131] pTeX:
+@ @d out_size(#)==out((#) div 256); out((#) mod 256)
+ at y
+@ @d out_size(#)==out((#) div 256); out((#) mod 256)
+ at d out_kanji_code(#)==out_size((#) mod 65536); out((#) div 65536)
+ at z
+
+ at x [131] l.2256 - pTeX:
+out_size(lf); out_size(lh); out_size(bc); out_size(ec);
+out_size(memory[width]); out_size(memory[height]);
+out_size(memory[depth]); out_size(memory[italic]);
+out_size(nl+lk_offset); out_size(nk); out_size(ne); out_size(np);
+ at y
+if file_format=jfm_format then
+  begin out_size(yoko_id_number); out_size(nt);
+  end
+else if file_format=vfm_format then
+  begin out_size(tate_id_number); out_size(nt);
+  end;
+out_size(lf); out_size(lh); out_size(bc); out_size(ec);
+out_size(memory[width]); out_size(memory[height]);
+out_size(memory[depth]); out_size(memory[italic]);
+out_size(nl+lk_offset); out_size(nk);
+if file_format<>tfm_format then begin out_size(ng*3)
+  end
+else begin out_size(ne);
+  end;
+out_size(np);
+ at z
+
+ at x [146] l.2476 - pTeX:
+ at p procedure param_enter;
+ at y
+ at p
+@<Declare kanji scanning routines@>@/
+procedure param_enter;
+ at z
+
+ at x [146] l.2488 - pTeX: LIGTABLE command can not be used in JPL.
+begin @<Read ligature/kern list@>;
+end;
+ at y
+begin @<If is jfm or vfm then print error@>;
+@<Read ligature/kern list@>;
+end;
+ at z
+
+ at x [146] l.2493 - pTeX: CHARACTER command can not be used in JPL.
+begin @<Read character info list@>;
+end;
+ at y
+begin @<If is jfm or vfm then print error@>;
+@<Read character info list@>;
+end;
+ at z
+
+ at x [146] l.2506 - pTeX:
+begin @<Correct and check the information@>
+end;
+ at y
+begin @<Correct and check the information@>
+end;
+@#
+procedure read_kanji_info; {TYPE command}
+var @!c:byte; {the char}
+begin @<If is tfm then print error@>;
+@<Read Kanji character type list@>;
+end;
+@#
+procedure read_glue_kern; {GLUEKERN command}
+var krn_ptr:0..max_kerns; {an index into |kern|}
+@!c:byte; {runs through all character codes}
+begin @<If is tfm then print error@>;
+@<Read glue/kern list@>;
+end;
+@#
+procedure read_chars_in_type; {CHARSINTYPE command}
+var @!type_num:byte; {kanji character type number}
+@!jis_code:integer; {sixteen bits Kanji character code}
+begin @<If is tfm then print error@>;
+@<Read Kanji characters list in this type@>;
+end;
+@#
+procedure read_direction; {DIRECTION command}
+begin @<If is tfm then print error@>;
+@<Read direction@>;
+end;
+ at z
+
+ at x
+const n_options = 3; {Pascal won't count array lengths for us.}
+ at y
+const n_options = 5; {Pascal won't count array lengths for us.}
+ at z
+
+ at x
+      usage_help (PLTOTF_HELP, nil);
+ at y
       usage_help (UPPLTOTF_HELP, 'issue@@texjp.org');
 @z
 
 @x
-max_kanji=7237; { maximum number of 2byte characters }
-max_kanji_code=@"7E7E; { maximum jis code }
+    end; {Else it was a flag; |getopt| has already done the assignment.}
 @y
-max_kanji=1114111; { maximam number of 2byte characters }
-max_kanji_code=@"10FFFF; { maximum ucs code }
+    end else if argument_is ('kanji') then begin
+      if (not set_enc_string(optarg,optarg)) then
+        print_ln('Bad kanji encoding "', stringcast(optarg), '".');
+
+    end; {Else it was a flag; |getopt| has already done the assignment.}
 @z
 
- at x function get_next_raw
-if multistrlen(ustringcast(buffer),loc+2,loc)=2 then cur_char:=" "
+ at x
+@ An element with all zeros always ends the list.
 @y
-if multistrlen(ustringcast(buffer),loc+3,loc)>1 then cur_char:=" "
+@ Kanji option.
+ at .-kanji@>
+
+@<Define the option...@> =
+long_options[current_option].name := 'kanji';
+long_options[current_option].has_arg := 1;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr(current_option);
+
+@ An element with all zeros always ends the list.
 @z
 
- at x procedure print_jis_hex
-var dig:array[0..3] of byte; {holds jis hex codes}
-i:byte; {index of array}
-begin dig[0]:=Hi(jis_code) div 16; dig[1]:=Hi(jis_code) mod 16;
-dig[2]:=Lo(jis_code) div 16; dig[3]:=Lo(jis_code) mod 16;
-for i:=0 to 3 do
+ at x [148] l.2620 - pTeX:
+@* Index.
 @y
+@* For Japanese Font Metric routines.
+We need to include some routines for handling kanji characters.
+
+@<Constants...@>=
+max_kanji=1114111; { maximam number of 2byte characters }
+max_kanji_code=@"10FFFF; { maximum ucs code }
+yoko_id_number=11; { is identifier for YOKO-kumi font}
+tate_id_number=9; { is identifier for TATE-kumi font}
+
+@ @<Glob...@>=
+file_format:undefined..vfm_format; {the format of the input file}
+kanji_type:array[0..max_kanji] of -1..256; {the type of every kanji char }
+kanji_type_index:0..max_kanji; { index into above }
+nt:integer; {number of entries in character type table}
+glue:array[0..768] of fix_word; {the distinct glue amounts}
+ng:integer; {number of 3-word entries in glue table}
+
+@ @<Set init...@>=
+file_format:=undefined;
+for kanji_type_index:=0 to max_kanji do kanji_type[kanji_type_index]:=-1;
+ng:=0;
+
+@ @<If is jfm or vfm then print error@>=
+if file_format>tfm_format then
+  err_print('This is an illegal command for kanji format files.')
+else if file_format=undefined then file_format:=tfm_format
+
+@ @<If is tfm then print error@>=
+if file_format=tfm_format then
+  err_print('You can use this command only for kanji format files.')
+else if file_format=undefined then file_format:=jfm_or_vfm
+
+@ These are extended propaties for \.{JFM}.
+
+@<Enter all of the names and ...@>=
+load4("T")("Y")("P")("E")(type_code);@/
+load8("G")("L")("U")("E")("K")("E")("R")("N")(glue_kern_code);@/
+load11("C")("H")("A")("R")("S")("I")("N")("T")("Y")("P")("E")
+  (chars_in_type_code);@/
+load9("D")("I")("R")("E")("C")("T")("I")("O")("N")(dir_code);@/
+load4("G")("L")("U")("E")(glue_code);@/
+
+@ @<Enter the parameter names@>=
+load10("E")("X")("T")("R")("A")("S")("P")("A")("C")("E")(parameter_code+7);@/
+load12("E")("X")("T")("R")("A")("S")("T")("R")("E")("T")("C")("H")
+  (parameter_code+8);@/
+load11("E")("X")("T")("R")("A")("S")("H")("R")("I")("N")("K")
+  (parameter_code+9);@/
+
+
+@ Here, we declare kanji related routines and package gluekern stuff.
+There routines a bit similar reading ligature/kern programs.
+
+@<Read glue/kern list@>=
+begin while level=1 do
+  begin while cur_char=" " do get_next;
+  if cur_char="(" then @<Read a glue/kern command@>
+  else if cur_char=")" then skip_to_end_of_item
+  else junk_error;
+  end;
+finish_inner_property_list;
+end;
+
+@ @<Read a glue/kern command@>=
+begin get_name;
+if cur_code=comment_code then skip_to_end_of_item
+else  begin case cur_code of
+  label_code:@<Read a glue label step@>;
+  stop_code:@<Read a stop step@>;
+  skip_code:@<Read a skip step@>;
+  krn_code:@<Read a (glue) kerning step@>;
+  glue_code:@<Read a glue step@>;
+  others:
+    flush_error('This property name doesn''t belong in a GLUEKERN list');
+ at .This property name doesn't belong...@>
+  end;
+  finish_the_property;
+  end;
+end
+
+@ When a character is about to be tagged, we use the following
+so that an error message is given in case of multiple tags.
+
+@<Read a glue label step@>=
+begin c:=get_byte;
+case char_tag[c] of
+  no_tag: do_nothing;
+  lig_tag: err_print('This character already appeared in a GLUEKERN LABEL');
+  @.This character already...@>
+  list_tag: err_print('Impossible: a list tag in a kanji format file?');
+  ext_tag: err_print('Impossible: an extensible tag in a kanji format file?');
+end;
+if nl>max_lig_steps then
+  err_print('GLUEKERN with more than ',max_lig_steps,' commands cannot have further labels')
+ at .GLUEKERN with more than...@>
+else begin char_tag[c]:=lig_tag; char_remainder[c]:=nl;
+  lk_step_ended:=false;
+  end;
+end
+
+@ @<Read a (glue) kerning step@>=
+begin lig_kern[nl].b0:=0; lig_kern[nl].b1:=get_byte;@/
+lig_kern[nl].b2:=kern_flag; kern[nk]:=get_fix; krn_ptr:=0;
+while kern[krn_ptr]<>kern[nk] do incr(krn_ptr);
+if krn_ptr=nk then
+  begin if nk<max_kerns then incr(nk)
+  else begin err_print('At most ',max_kerns,' different kerns are allowed');
+ at .At most 5000 different kerns...@>
+    krn_ptr:=max_kerns-1;
+    end;
+  end;
+lig_kern[nl].b3:=krn_ptr;
+if nl=max_lig_steps then
+  err_print('GLUEKERN table should never exceed ',max_lig_steps,' LIG/KRN commands')
+ at .GLUEKERN table should never...@>
+else incr(nl);
+lk_step_ended:=true;
+end
+
+@ @<Read a glue step@>=
+begin lig_kern[nl].b0:=0; lig_kern[nl].b1:=get_byte; lig_kern[nl].b2:=0;@/
+glue[3*ng+0]:=get_fix; glue[3*ng+1]:=get_fix; glue[3*ng+2]:=get_fix;
+krn_ptr:=0;
+while (glue[3*krn_ptr+0]<>glue[3*ng+0])or
+      (glue[3*krn_ptr+1]<>glue[3*ng+1])or
+      (glue[3*krn_ptr+2]<>glue[3*ng+2]) do incr(krn_ptr);
+if krn_ptr=ng then
+  begin if ng<256 then incr(ng)
+  else begin err_print('At most 256 different glues are allowed');
+    krn_ptr:=255;
+    end;
+  end;
+lig_kern[nl].b3:=krn_ptr;
+if nl=max_lig_steps then
+  err_print('GLUEKERN table should never exceed ',max_lig_steps,' GLUE/KRN commands')
+ at .GLUEKERN table should never...@>
+else incr(nl);
+lk_step_ended:=true;
+end
+
+@ The |TYPE| command like |CHARACTER| command, but |TYPE| only use
+|CHARWD|, |CHARHT|, |CHARDP| and |CHARIT|
+
+@<Read Kanji character type list@>=
+begin c:=get_byte; {read the character type that is begin specified}
+if verbose then @<Print |c| in octal notation@>;
+while level=1 do
+  begin while cur_char=" " do get_next;
+  if cur_char="(" then @<Read a kanji property@>
+  else if cur_char=")" then skip_to_end_of_item
+    else junk_error;
+  end;
+if char_wd[c]=0 then char_wd[c]:=sort_in(width,0); {legitimatize c}
+finish_inner_property_list;
+end;
+
+@ @<Read a kanji property@>=
+begin get_name;
+if cur_code=comment_code then skip_to_end_of_item
+else if (cur_code<char_wd_code)or(cur_code>char_ic_code) then
+  flush_error('This property name doesn''t belong in a TYPE list')
+else  begin case cur_code of
+  char_wd_code: char_wd[c]:=sort_in(width,get_fix);
+  char_ht_code: char_ht[c]:=sort_in(height,get_fix);
+  char_dp_code: char_dp[c]:=sort_in(depth,get_fix);
+  char_ic_code: char_ic[c]:=sort_in(italic,get_fix);
+  end;@/
+  finish_the_property;
+  end;
+end
+
+@ Next codes used to get KANJI codes from \.{JPL} file.
+
+@<Read Kanji characters list in this type@>=
+begin type_num:=get_byte;
+if type_num=0 then
+  skip_error('You cannot list the chars in type 0. It is the default type')
+else  begin repeat jis_code:=get_kanji;
+  if jis_code<0 then
+    err_print('Illegal characters. I was expecting a jis code or character')
+  else if jis_code=0 then { 0 signals |end_of_list| }
+    do_nothing
+  else if kanji_type[jis_to_index(jis_code)]>=0 then
+    err_print('jis code ', jis_code:1, ' is already in type ',
+      kanji_type[jis_to_index(jis_code)])
+  else
+    kanji_type[jis_to_index(jis_code)]:=type_num;
+  until jis_code=0;
+  skip_to_paren;
+  end
+end
+
+@ Next codes read and check direction.  We can not decide |file_format| of
+metric file whether for yoko-kumi or tate-kumi, until have scan |DIRECTION|
+property (|dir_code| command).
+
+@<Read direction@>=
+begin while cur_char=" " do get_next;
+if cur_char="T" then
+  begin if verbose then print_ln('This is tatekumi format');
+  file_format:=vfm_format;
+  end
+else if cur_char="Y" then
+  begin if verbose then print_ln('This is yokokumi format');
+  file_format:=jfm_format;
+  end
+else err_print('The dir value should be "TATE" or "YOKO"');
+skip_to_paren;
+end
+
+@ Next codes used to write |kanji_type| to \.{JFM}.
+In the original JFM spec by ASCII Corporation, |jis_code| and |char_type|
+were packed into upper (2~bytes) and lower (2~bytes) halfword respectively.
+However, |char_type| is allowed only 0..255,
+so the upper byte of lower halfword was always 0.
+
+In the new JFM spec by texjporg, |jis_code| ``XXyyzz'' is packed into
+first 3~bytes in the form ``yy zz XX'', and |char_type| is packed into
+remaining 1~byte. The new spec is effectively upper compatible with
+the original, and it allows |jis_code| larger than 0x10000 (not really
+useful for me \.{pPLtoTF} but necessary for \.{upPLtoTF}).
+
+@<Output the kanji character type info@>=
+begin out_size(0); out_size(0); { the default }
+for kanji_type_index:=0 to max_kanji do
+  begin if kanji_type[kanji_type_index]>0 then
+    begin out_kanji_code(index_to_jis(kanji_type_index));
+    out(kanji_type[kanji_type_index]);
+    if verbose then begin
+      print('char index = ', kanji_type_index);
+      print(' (jis ');
+      print_jis_hex(index_to_jis(kanji_type_index));
+      print(') is type ');
+      print_octal(kanji_type[kanji_type_index]);
+      write_ln('');
+      end;
+    end;
+  end;
+end;
+
+@ We also need to define some routines which handling 2bytes characters.
+These routine is called from only |read_chars_in_type| command.
+
+The kanji jis code is taken from the |char_ext| and |char_code| values
+set by the user.  The index into the |kanji_type| array is based on the
+kuten codes, with all unused codes removed and beginning at 0, not 0101.
+The |jis_to_index| is called from |chars_in_type| command.
+
+@<Declare kanji scanning routines@>=
+function get_next_raw:byte; {get next rawdata in buffer}
+begin while loc=limit do fill_buffer;
+incr(loc); get_next_raw:=buffer[loc];
+if multistrlen(ustringcast(buffer),loc+3,loc)>1 then cur_char:=" "
+else cur_char:=xord[buffer[loc]];
+end;
+@#
+function todig(@!ch:byte):byte; {convert character to number}
+begin if (ch>="A")and(ch<="F") then todig:=ch-"A"+10
+else if (ch>="0")and(ch<="9") then todig:=ch-"0"
+else  begin skip_error('This expression is out of JIS-code encoding.');
+  todig:=0;
+  end;
+end;
+@#
+procedure print_jis_hex(jis_code:integer); {prints jiscode as four digits}
 var dig:array[0..5] of byte; {holds jis hex codes}
 i:byte; {index of array}
 begin dig[0]:=(jis_code div 65536) div 16; dig[1]:=(jis_code div 65536) mod 16;
@@ -47,51 +641,45 @@
     end;
   end;
 for i:=2 to 5 do
- at z
-
- at x function valid_jis_code
-var @!first_byte,@!second_byte:integer; { jis code bytes }
+  if dig[i]<10 then print(dig[i]) else
+  case dig[i] of
+     10: print('A'); 11: print('B'); 12: print('C');
+     13: print('D'); 14: print('E'); 15: print('F');
+  end;
+end;
+@#
+function valid_jis_code(cx:integer):boolean;
 begin valid_jis_code:=true;
-first_byte:=cx div @'400; second_byte:=cx mod @'400;
-if (first_byte<@"21)
-   or((first_byte>@"28)and(first_byte<@"30))
-   or(first_byte>@"74) then valid_jis_code:=false;
-if (second_byte<@"21)or(second_byte>@"7E) then valid_jis_code:=false;
- at y
-begin valid_jis_code:=true;
 if (cx>@"10FFFF)or(not is_char_kanji(fromDVI(cx)))
   or(toDVI(fromDVI(cx))<>cx) then valid_jis_code:=false;
- at z
-
- at x function jis_to_index
-var @!first_byte,@!second_byte:integer; { jis code bytes }
+end;
+@#
+function jis_to_index(jis:integer):integer;
 begin
-first_byte:=jis div @'400 -@"21;
-second_byte:=jis mod @'400 -@"21;
-if first_byte<8 then
-  jis_to_index:=first_byte*94+second_byte
-else { next |first_byte| start 16 }
-  jis_to_index:=(first_byte-7)*94+second_byte;
- at y
-begin
 jis_to_index:=jis;
- at z
-
- at x function index_to_jis
-begin if ix<=8*94-1 then
-  index_to_jis:=(ix div 94 +@"21)*@'400+(ix mod 94 +@"21)
-else
-  index_to_jis:=((ix+7*94) div 94 +@"21)*@'400+((ix+7*94) mod 94 +@"21);
- at y
+end;
+@#
+function index_to_jis(ix:integer):integer;
 begin
 index_to_jis:=ix;
- at z
-
- at x function get_kanji
-else if multistrlen(ustringcast(buffer), loc+2, loc)=2 then
-  begin jis_code:=toDVI(fromBUFF(ustringcast(buffer), loc+2, loc));
-  incr(loc); cur_char:=" ";
- at y
+end;
+@#
+function get_kanji:integer; {get kanji character code}
+var @!ch:byte;
+@!cx,@!jis_code:integer; {sixteen bits kanji character code}
+begin repeat ch:=get_next_raw; {|ch| is rawdata in buffer}
+until ch<>' '; {skip the blanks before the kanji code}
+if ch=')' then
+  begin decr(loc); jis_code:=0;
+  end
+else if (ch='J')or(ch='j') then
+  begin repeat ch:=get_next_raw;
+  until ch<>' '; {skip the blanks after the type code}
+  @<Scan a Kanji hexadecimal code@>;
+  jis_code:=toDVI(fromJIS(cx)); cur_char:=ch;
+  if not valid_jis_code(jis_code) then
+    err_print('jis code ', jis_code:1, ' is invalid');
+  end
 else if (ch='U')or(ch='u') then
   begin repeat ch:=get_next_raw;
   until ch<>' '; {skip the blanks after the type code}
@@ -104,5 +692,26 @@
   begin cur_char:=" ";
   jis_code:=toDVI(fromBUFF(ustringcast(buffer), loc+4, loc));
   loc:=loc+multistrlen(ustringcast(buffer), loc+4, loc)-1;
+  if not valid_jis_code(jis_code) then
+    err_print('jis code ', jis_code:1, ' is invalid');
+  end
+else jis_code:=-1;
+get_kanji:=jis_code;
+end;
+
+@ @<Scan a Kanji hex...@>=
+begin cx:=todig(xord[ch]);
+  incr(loc); ch:=xord[buffer[loc]];
+  while ((ch>="0")and(ch<="9"))or((ch>="A")and(ch<="F")) do
+    begin cx:=cx*16+todig(ch); {overflow might happen, but rare...}
+    incr(loc); ch:=xord[buffer[loc]];
+    end;
+  decr(loc); ch:=xord[buffer[loc]];
+  if cx>max_kanji_code then
+    begin skip_error('This value shouldn''t exceed jis code');
+    cx:=0; ch:=" ";
+    end;
+end
+
+@* Index.
 @z
-

Modified: trunk/Build/source/texk/web2c/uptexdir/uptftopl.ch
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/uptftopl.ch	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/uptftopl.ch	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,34 +1,492 @@
- at x
- at d my_name=='ptftopl'
- at d banner=='This is pTFtoPL, Version 3.3-p2.0'
+% This is a change file for TFtoPL
+%
+% (2022-12-03) TTK Merge pTFtoPL source/binary into upTFtoPL
+% (2018-01-27) HY pTFtoPL p2.0 - new JFM spec by texjporg
+% (07/18/2006) ST TFtoPL p1.7 (3.1, Web2c 7.2)
+% (03/27/1998) KN TFtoPL p1.4 (3.1, Web2c 7.2)
+%
+ at x [0] l.45 - pTeX:
+\def\title{TF\lowercase{to}PL changes for C}
 @y
+\def\title{TF\lowercase{to}PL changes for C, and for KANJI}
+ at z
+
+ at x [2] l.64 - pTeX:
+ at d my_name=='tftopl'
+ at d banner=='This is TFtoPL, Version 3.3' {printed when the program starts}
+ at y
 @d my_name=='uptftopl'
- at d banner=='This is upTFtoPL, Version 3.3-p2.0-u1.29'
+ at d banner=='This is upTFtoPL, Version 3.3-p221203'
+  {printed when the program starts}
 @z
 
+ at x [2] l.91 - pTeX:
+procedure initialize; {this procedure gets things started properly}
+ at y
+procedure initialize; {this procedure gets things started properly}
+var @!k:integer; {all-purpose initiallization index}
+ at z
+
+ at x [2] l.97 - pTeX:
+    tfm_file_array := xmalloc_array (byte, 1002);
+ at y
+    tfm_file_array := xmalloc_array (byte, 1002 + 4);
+ at z
+
 @x
-      usage_help (PTFTOPL_HELP, 'issue@@texjp.org');
+    parse_arguments;
 @y
-      usage_help (UPTFTOPL_HELP, 'issue@@texjp.org');
+    init_kanji;
+    parse_arguments;
 @z
 
+ at x [7] l.149 - pTeX:
+  print_ln (version_string);
+ at y
+  print_ln (version_string);
+  print_ln ('process kanji code is ', conststringcast(get_enc_string), '.');
+ at z
+
+ at x [18.20] l.438 - pTeX:
+ at d index == index_type
+ at y
+ at d index == index_type
+ at d yoko_id_byte = 11 {id byte for YOKO-kumi kanji tfm files}
+ at d tate_id_byte = 9   {id byte for TATE-kumi kanji tfm files}
+ at d tfm_format = 1 {normal tfm formated metric files}
+ at d jfm_format = 2 {jfm formated metric files for YOKO-kumi kanji}
+ at d vfm_format = 3 {vfm formated metric files for TATE-kumi kanji}
+ at z
+
+ at x [18.20] l.448 - pTeX:
+@!tfm_file_array: ^byte; {the input data all goes here}
+ at y
+@!tfm_file_array: ^byte; {the input data all goes here}
+@!file_format:tfm_format..vfm_format; {format of tfm file}
+@!nt:0..@'77777; {number of words in the character type table}
+@!ng:0..@'77777; {number of words in the glue table}
+ at z
+
+ at x [20] l.434 - pTeX: Read JFM header
+read(tfm_file,tfm[1]); lf:=tfm[0]*@'400+tfm[1];
+ at y
+read(tfm_file,tfm[1]); lf:=tfm[0]*@'400+tfm[1];
+if lf=yoko_id_byte then
+  begin file_format:=jfm_format;
+  print_ln('Input file is in YOKO-kumi kanji tfm format.');
+  write_ln(pl_file,'(COMMENT THIS IS A KANJI FORMAT FILE)');
+  end
+else if lf=tate_id_byte then
+  begin file_format:=vfm_format;
+  print_ln('Input file is in TATE-kumi kanji tfm format.');
+  write_ln(pl_file,'(COMMENT THIS IS A KANJI FORMAT FILE)');
+  write_ln(pl_file,'(DIRECTION TATE)');
+  end
+else file_format:=tfm_format;
+if file_format=tfm_format then
+  begin nt:=0; tmp_ptr:=2;
+  end
+else
+  begin if eof(tfm_file) then abort('The input file is only two bytes long!');
+  read(tfm_file,tfm[2]);
+  if eof(tfm_file) then abort('The input file is only three bytes long!');
+  read(tfm_file,tfm[3]); nt:=tfm[2]*@'400+tfm[3];
+  if eof(tfm_file) then abort('The input file is only four bytes long!');
+  read(tfm_file,tfm[4]);
+  if eof(tfm_file) then abort('The input file is only five bytes long!');
+  if tfm[4]>127 then abort('The fifth byte of the input file exceeds 127!');
+  read(tfm_file,tfm[5]); lf:=tfm[4]*@'400+tfm[5];
+  tmp_ptr:=6;
+  end;
+ at z
+
+ at x [20] l.445 - pTeX:  put the rest of the file into tfm[6] and after
+for tfm_ptr:=2 to 4*lf-1 do
+ at y
+for tfm_ptr:=tmp_ptr to 4*lf-1 do
+ at z
+
+ at x [21] l.468 - pTeX: the location of subfile sizes is different
+begin tfm_ptr:=2;@/
+ at y
+begin
+if file_format<>tfm_format then
+  begin tfm_ptr:=6; check_sum_value:=28;
+  end
+else
+  begin tfm_ptr:=2; check_sum_value:=24;
+  end;
+ at z
+
+ at x [21] l.485 - pTeX: ng has to be treated specially
+if (bc>ec+1)or(ec>255) then abort('The character code range ',
+ at .The character code range...@>
+  bc:1,'..',ec:1,' is illegal!');
+if (nw=0)or(nh=0)or(nd=0)or(ni=0) then
+  abort('Incomplete subfiles for character dimensions!');
+ at .Incomplete subfiles...@>
+if ne>256 then abort('There are ',ne:1,' extensible recipes!');
+ at .There are ... recipes@>
+if lf<>6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ne+np then
+  abort('Subfile sizes don''t add up to the stated total!');
+ at .Subfile sizes don't add up...@>
+ at y
+case file_format of
+tfm_format: begin
+  if (bc>ec+1)or(ec>255) then abort('The character code range ',
+ at .The character code range...@>
+    bc:1,'..',ec:1,' is illegal!');
+  if (nw=0)or(nh=0)or(nd=0)or(ni=0) then
+    abort('Incomplete subfiles for character dimensions!');
+ at .Incomplete subfiles...@>
+  if ne>256 then abort('There are ',ne:1,' extensible recipes!');
+ at .There are ... recipes@>
+  if lf<>6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ne+np then
+    abort('Subfile sizes don''t add up to the stated total!');
+ at .Subfile sizes don't add up...@>
+  end;
+jfm_format,vfm_format: begin ng:=ne;
+  if (bc>ec+1)or(ec>255)or(bc<>0) then abort('The character code range ',
+ at .The character code range...@>
+      bc:1,'..',ec:1,' is illegal!');
+  if (nw=0)or(nh=0)or(nd=0)or(ni=0) then
+    abort('Incomplete subfiles for character dimensions!');
+ at .Incomplete subfiles...@>
+  if lf<>7+nt+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ng+np then
+    abort('Sum of subfile sizes (',
+      7+nt+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ng+np:1,
+      ') is not equal to the stated total ', lf:1);
+ at .Subfile sizes don't add up...@>
+  end;
+end;
+ at z
+
+ at x [23] l.506 - pTeX: declare type_base.
+@!char_base,@!width_base,@!height_base,@!depth_base,@!italic_base,
+@!lig_kern_base,@!kern_base,@!exten_base,@!param_base:integer;
+  {base addresses for the subfiles}
+ at y
+@!char_base,@!width_base,@!height_base,@!depth_base,@!italic_base,
+@!lig_kern_base,@!kern_base,@!exten_base,@!param_base:integer;
+@!type_base,@!glue_base:integer; {base addresses for the subfiles}
+@!check_sum_value:integer; {either 24 (normal case) or 28 (kanji case)}
+ at z
+
+ at x [24] l.510 - pTeX: define type_base
+@ @<Compute the base addresses@>=
+begin char_base:=6+lh-bc;
+ at y
+@ @<Compute the base addresses@>=
+begin
+if file_format<>tfm_format then
+  begin type_base:=7+lh;
+  char_base:=type_base+nt-bc; { bc should be zero ...}
+  end
+else char_base:=6+lh-bc;
+ at z
+
+ at x [24] l.517 - pTeX: define glue_base
+kern_base:=lig_kern_base+nl;
+exten_base:=kern_base+nk;
+param_base:=exten_base+ne-1;
+ at y
+kern_base:=lig_kern_base+nl;
+exten_base:=kern_base+nk;
+glue_base:=exten_base;
+param_base:=exten_base+ne-1;
+ at z
+
+ at x [25] l.529 - pTeX: must change check_sum from macro (=24) to variable
+ at d check_sum=24
+ at d design_size=check_sum+4
+ at d scheme=design_size+4
+ at d family=scheme+40
+ at d random_word=family+20
+ at y
+ at d check_sum==check_sum_value
+ at d design_size==check_sum+4
+ at d scheme==design_size+4
+ at d family==scheme+40
+ at d random_word==family+20
+ at z
+
+ at x [25] l.549 - pTeX: add definition of glue macro
+ at d kern(#)==4*(kern_base+#) {here \#\ is an index, not a character}
+ at y
+ at d kern(#)==4*(kern_base+#) {here \#\ is an index, not a character}
+ at d glue(#)==4*(glue_base+#) {likewise}
+ at z
+
+ at x [57] l.982 - pTeX: SEVENBITSAFEFLAG
+if (lh>17) and (tfm[random_word]>127) then
+ at y
+if (lh>17) and (tfm[random_word]>127) and (file_format=tfm_format) then
+ at z
+
+ at x [63] l.1003 - pTeX: Name of parameter for kanji-font
+else if (i<=13)and(font_type=mathex) then
+  if i=8 then out('DEFAULTRULETHICKNESS')
+  else out('BIGOPSPACING',i-8:1)
+else out('PARAMETER D ',i:1)
+ at y
+else if (i<=13)and(font_type=mathex) then
+  if i=8 then out('DEFAULTRULETHICKNESS')
+  else out('BIGOPSPACING',i-8:1)
+else if (i<=9)and(file_format<>tfm_format) then
+  if i=8 then out('EXTRASTRETCH')
+  else out('EXTRASHRINK')
+else out('PARAMETER D ',i:1)
+ at z
+
+ at x [64] l.1027 - pTeX: Add printing of newline at end of program
+if nk>0 then for i:=0 to nk-1 do check_fix(kern(i))('Kern');
+ at .Kern n is too big@>
+ at y
+if nk>0 then for i:=0 to nk-1 do check_fix(kern(i))('Kern');
+ at .Kern n is too big@>
+if file_format<>tfm_format then
+  begin if ng>0 then for i:=0 to ng-1 do check_fix(glue(i))('Glue');
+ at .Glue n is too big@>
+  end;
+ at z
+
+ at x [68] l.1068 - pTeX: we print GLUEKERN instead of LIGTABLE
+  begin left; out('LIGTABLE'); out_ln;@/
+ at y
+  begin left;
+  if file_format<>tfm_format then out('GLUEKERN') else out('LIGTABLE');
+  out_ln;@/
+ at z
+
+ at x [69] l.1090 - pTeX: we print Glue/kern instead of Ligature/kern
+    print('Ligature/kern starting index for character '); print_octal(c);
+    print_ln(' is too large;'); print_ln('so I removed it.'); reset_tag(c);
+ at .Ligature/kern starting index...@>
+ at y
+    case file_format of
+    tfm_format: print('Ligature/kern ');
+ at .Ligature/kern starting index...@>
+    jfm_format,vfm_format: print('Glue/kern ');
+ at .Glue/kern starting index...@>
+    end;
+    print('starting index for character '); print_octal(c);
+    print_ln(' is too large;'); print_ln('so I removed it.'); reset_tag(c);
+ at z
+
+ at x [76] l.1179 - pTeX: if kanji format, output a glue step not a ligature step
+else @<Output a ligature step@>;
+ at y
+else if file_format<>tfm_format then @<Output a glue step@>
+else @<Output a ligature step@>;
+ at z
+
+ at x [78] l.1238 - pTeX:
+for c:=bc to ec do if width_index(c)>0 then
+ at y
+for c:=bc to ec do
+if width_index(c)=0 then
+  begin if file_format<>tfm_format then
+  bad('width index of type ',c:1,' is zero!!')
+  end
+else if width_index(c)>0 then
+ at z
+
+ at x [78] l.1246 - pTeX: the 'character' table is really the 'type' table
+  left; out('CHARACTER'); out_char(c); out_ln;
+ at y
+  left;
+  if file_format<>tfm_format then
+    begin out('TYPE'); tfm[0]:=c; out_octal(0,1);
+    end
+  else
+    begin out('CHARACTER'); out_char(c);
+    end;
+  out_ln;
+ at z
+
+ at x [78] l.1251 - pTeX: types can only have tags equal to 0 or 1
+  case tag(c) of
+  no_tag: do_nothing;
+  lig_tag: @<Output the applicable part of the ligature/kern
+    program as a comment@>;
+  list_tag: @<Output the character link unless there is a problem@>;
+  ext_tag: @<Output an extensible character recipe@>;
+  end; {there are no other cases}
+  right;
+  end
+ at y
+  case tag(c) of
+  no_tag: do_nothing;
+  lig_tag: @<Output the applicable part of the ligature/kern
+    program as a comment@>;
+  list_tag: if file_format<>tfm_format then
+       bad('the tag of type ',c:1,' must be 0 or 1')
+     else @<Output the character link unless there is a problem@>;
+  ext_tag: if file_format<>tfm_format then
+       bad('the tag of type ',c:1,' must be 0 or 1')
+     else @<Output an extensible character recipe@>;
+  end; {there are no other cases}
+  right;
+  end
+ at z
+
+ at x [96] l.1539 - pTeX:
+var tfm_ptr:index; {an index into |tfm|}
+ at y
+var tfm_ptr,tmp_ptr:index; {an index into |tfm|}
+ at z
+
+ at x [98] l.1566 - pTeX: declare kanji conversion subroutines and externals
+ at p begin initialize;@/
+ at y
+ at p
+@<declare kanji conversion functions@>;
+begin initialize;@/
+ at z
+
+ at x [99] l.1570 - pTeX: don't check extensible recipes and list the char_type table
+@<Check the extensible recipes@>;
+ at y
+if file_format<>tfm_format then
+  begin @<list |char_type| table@>;
+  end
+else
+  begin @<Check the extensible recipes@>;
+  end;
+ at z
+
 @x
- at d max_kanji=7237 {number of the kanji characters - 1}
+const n_options = 4; {Pascal won't count array lengths for us.}
 @y
- at d max_kanji=1114111 {number of the kanji characters - 1}
+const n_options = 6; {Pascal won't count array lengths for us.}
 @z
 
- at x procedure out_kanji
-i:0..3; {index of array}
+ at x
+      usage_help (TFTOPL_HELP, nil);
 @y
-i:0..5; {index of array}
+      usage_help (UPTFTOPL_HELP, 'issue@@texjp.org');
 @z
+
 @x
-  begin cx:=jis_code; out('J '); {specify jiscode format}
-  dig[0]:=Hi(cx) div 16; dig[1]:=Hi(cx) mod 16;
-  dig[2]:=Lo(cx) div 16; dig[3]:=Lo(cx) mod 16;
-  for i:=0 to 3 do
+    end; {Else it was a flag; |getopt| has already done the assignment.}
 @y
+    end else if argument_is ('kanji') then begin
+      if (not set_enc_string(optarg,optarg)) then
+        print_ln('Bad kanji encoding "', stringcast(optarg), '".');
+
+    end; {Else it was a flag; |getopt| has already done the assignment.}
+ at z
+
+ at x
+@ An element with all zeros always ends the list.
+ at y
+@ Kanji option.
+ at .-kanji@>
+
+@<Define the option...@> =
+long_options[current_option].name := 'kanji';
+long_options[current_option].has_arg := 1;
+long_options[current_option].flag := 0;
+long_options[current_option].val := 0;
+incr(current_option);
+
+@ An element with all zeros always ends the list.
+ at z
+
+ at x [99] l.1751 - pTeX:
+@* Index.
+ at y
+@* For Japanese Font Metric routines. % pTeX:
+We need to include some routines for handling kanji character.
+
+ at d max_kanji=1114111 {number of the kanji characters - 1}
+
+@<Glob...@>=
+@!this_code:integer; {to hold jis code of the current kanji character}
+@!this_type:integer; {to hold |char_type| of the current kanji character}
+@!type_index:integer; {index into |char_type| table}
+@!type_num:integer; {index into |char_info| table}
+@!type_count:integer; {number of chars with the same type}
+@!kanji_index:integer; {index into |kanji_type| array}
+@!kanji_type:array[0..max_kanji] of -1..255; {kanji type index}
+
+@ @<Output a glue step@>=
+begin  if nonexistent(tfm[k+1]) then
+  correct_bad_char('Glue step for')(k+1)
+ at .Glue step for nonexistent...@>
+else
+  begin left; out('GLUE'); out_char(tfm[k+1]);
+    if 3*tfm[k+3]>=ng then
+      begin bad('Glue index too large.');
+ at .Glue index too large@>
+      out(' R 0.0 R 0.0 R 0.0');
+      end
+    else begin out_fix(glue(3*tfm[k+3]));
+      out_fix(glue(3*tfm[k+3]+1));
+      out_fix(glue(3*tfm[k+3]+2));
+      end;
+    right;
+  end;
+end
+
+@ list the |char_type| table in a similar way to the type table.
+The code is based on the new JFM spec by texjporg.
+
+ at d char_type(#)==4*(type_base+#) {here \#\ is an index, not a character}
+ at d JIS_code(#)==tfm[char_type(#)+0]*@'400+tfm[char_type(#)+1]+tfm[char_type(#)+2]*@'400*@'400 {JIS code from |char_type| table}
+ at d JIS_type(#)==tfm[char_type(#)+3] {JIS type from |char_type| table}
+
+@<list |char_type| table@>=
+this_code:=JIS_code(0);
+this_type:=JIS_type(0);
+if (this_code<>0)or(this_type<>0) then
+  begin bad('the first entry in char_type is not zero. I''ll zero it.');
+  print_ln('JIS code is ', this_code:1, '. Type is ', this_type:1, '.');
+  end;
+for kanji_index:=0 to max_kanji do kanji_type[kanji_index]:=-1;
+for type_index:=1 to nt-1 do
+  begin this_code:=JIS_code(type_index);
+  this_type:=JIS_type(type_index);
+  if not valid_jis_code(this_code) then
+    bad('jis code ', this_code:1,
+	    ' in char_type table entry ', type_index:1,
+    	' is not valid. Ignoring it.')
+  else if (this_type <= 0) or (this_type > ec) then
+    bad('type ', this_type:1, ' of jis code ', this_code:1,
+        ' in char_type table is not valid. Ignoring character.')
+  else
+    kanji_type[jis_to_index(this_code)] := this_type;
+  end;
+@#
+for type_num:=1 to ec do
+  begin left; out('CHARSINTYPE');
+  tfm[0]:=type_num; out_octal(0,1);
+  type_count:=0;
+  for kanji_index:=0 to max_kanji do
+    if kanji_type[kanji_index]=type_num then
+      begin if (type_count mod 10)=0 then out_ln else out(' ');
+      incr(type_count);
+      out_kanji(index_to_jis(kanji_index));
+      end;
+  if type_count=0 then bad('type ', type_num:1, ' has no characters in it!');
+  out_ln; right;
+  end;
+
+@ Some subroutines to handle kanji codes and i/o
+
+@<Globals...@>=
+@!xchr:array[char] of byte; {specifiles conversion of output charcter}
+
+@ @<Set init...@>=
+for k:=@'0 to @'37 do xchr[k]:='?';
+for k:=@'40 to 255 do xchr[k]:=k;
+
+@ @<declare kanji conversion functions@>=
+procedure out_kanji(jis_code:integer); { prints a kanji character }
+var @!cx:integer; {KANJI code}
+i:0..5; {index of array}
+begin@/
+if (charcode_format=charcode_octal)or(jis_code<128) then
   begin cx:=jis_code;
   if (isinternalUPTEX) then out('U ')
   else out('J '); {specify jiscode format}
@@ -44,51 +502,39 @@
       end;
     end;
   for i:=2 to 5 do
- at z
-
- at x
-  out(xchr[Hi(cx)]); out(xchr[Lo(cx)]);
- at y
+    if dig[i]<10 then out(dig[i]) else
+    case dig[i] of
+       10: out('A'); 11: out('B'); 12: out('C');
+       13: out('D'); 14: out('E'); 15: out('F');
+    end;
+  end
+else begin
+  cx:=toBUFF(fromDVI(jis_code));
   if BYTE1(cx)<>0 then out(xchr[BYTE1(cx)]);
   if BYTE2(cx)<>0 then out(xchr[BYTE2(cx)]);
   if BYTE3(cx)<>0 then out(xchr[BYTE3(cx)]);
                        out(xchr[BYTE4(cx)]);
- at z
+  end;
+end;
 
- at x function valid_jis_code
-var first_byte, second_byte:integer; { jis code bytes }
+@ @<declare kanji conversion functions@>=
+function valid_jis_code(cx:integer):boolean;
 begin valid_jis_code:=true;
-first_byte:=cx div @'400; second_byte:=cx mod @'400;
-if (first_byte<@"21)
-     or((first_byte>@"28)and(first_byte<@"30))
-     or(first_byte>@"74) then valid_jis_code:=false;
-if (second_byte<@"21)or(second_byte>@"7E) then valid_jis_code:=false;
- at y
-begin valid_jis_code:=true;
 if (cx>@"10FFFF)or(not is_char_kanji(fromDVI(cx)))
   or(toDVI(fromDVI(cx))<>cx) then valid_jis_code:=false;
- at z
+end;
 
- at x function index_to_jis
-if ix<=8*94-1 then
-  index_to_jis:=(ix div 94 + @"21) * @'400 + (ix mod 94 + @"21)
-else
-  index_to_jis:=((ix+7 * 94) div 94 + @"21) * @'400 + ((ix+7*94) mod 94 + @"21);
- at y
+@ @<declare kanji conversion functions@>=
+function index_to_jis(ix:integer):integer;
+begin
 index_to_jis:=ix;
- at z
+end;
 
- at x function jis_to_index
-var first_byte,second_byte:integer; { jis code bytes }
+@ @<declare kanji conversion functions@>=
+function jis_to_index(cx:integer):integer;
 begin
-first_byte:=cx div @'400 - @"21;
-second_byte:=cx mod @'400 - @"21;
-if first_byte<8 then
-  jis_to_index:=first_byte*94+second_byte
-else
-  jis_to_index:=(first_byte-7)*94+second_byte;
- at y
-begin
 jis_to_index:=cx;
+end
+
+@* Index.
 @z
-

Modified: trunk/Build/source/texk/web2c/uptexdir/yokotate.test
===================================================================
--- trunk/Build/source/texk/web2c/uptexdir/yokotate.test	2022-12-03 12:53:53 UTC (rev 65176)
+++ trunk/Build/source/texk/web2c/uptexdir/yokotate.test	2022-12-03 12:53:58 UTC (rev 65177)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
 # $Id$
+# Copyright 2022 Japanese TeX Development Community <issue at texjp.org>
 # Copyright 2017 Karl Berry <tex-live at tug.org>
 # Copyright 2013 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.



More information about the tex-live-commits mailing list.