From e481dc9146719345547c7554d9259c923d2846ae Mon Sep 17 00:00:00 2001 From: Hironobu Yamashita Date: Fri, 25 Jun 2021 09:24:54 +0000 Subject: ptex: fix searching in inhibit/kinsoku tables git-svn-id: svn://tug.org/texlive/trunk@59700 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/web2c/ptexdir/ChangeLog | 10 +++- Build/source/texk/web2c/ptexdir/ptex-base.ch | 62 ++++++++++++++++------ .../texk/web2c/ptexdir/tests/kinsoku_search.tex | 43 +++++++++++++++ .../texk/web2c/ptexdir/tests/kinsoku_table.tex | 29 +++++----- 4 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 Build/source/texk/web2c/ptexdir/tests/kinsoku_search.tex (limited to 'Build/source/texk/web2c/ptexdir') diff --git a/Build/source/texk/web2c/ptexdir/ChangeLog b/Build/source/texk/web2c/ptexdir/ChangeLog index cf8e1e62b56..9f6c2c00c34 100644 --- a/Build/source/texk/web2c/ptexdir/ChangeLog +++ b/Build/source/texk/web2c/ptexdir/ChangeLog @@ -7,8 +7,14 @@ and it is a disp_node. https://github.com/texjporg/tex-jp-build/issues/123 * ptex-base.ch: Partially revert the commit on 2019-05-06; - no re-eval kcatcode of Japanese character token in \if and \ifcat. - This is because the behavior was inconsistent against \ifx. + no re-eval kcatcode of \let-copied Japanese character token in + \if and \ifcat, because the behavior was inconsistent against \ifx. + https://github.com/texjporg/ptex-manual/issues/4 + * ptex-base.ch: Fix searching in inhibit/kinsoku tables, because + the fix on 2018-04-14 was still incomplete. + https://github.com/texjporg/tex-jp-build/issues/113 + * tests/kinsoku_search.tex: New test file. + * tests/kinsoku_table.tex: Update. 2021-03-23 Karl Berry diff --git a/Build/source/texk/web2c/ptexdir/ptex-base.ch b/Build/source/texk/web2c/ptexdir/ptex-base.ch index 0cee7df6b36..b9e4fc96e00 100644 --- a/Build/source/texk/web2c/ptexdir/ptex-base.ch +++ b/Build/source/texk/web2c/ptexdir/ptex-base.ch @@ -1249,10 +1249,27 @@ if n -else if n<=eqtb_size then print("kinsoku") +else if n<=eqtb_size then begin + print("kinsoku table "); print_int(n-kinsoku_penalty_base); + print(", penalty="); print_int(eqtb[n].int); + end else print_char("?"); {this can't happen either} end; tats @@ -6582,19 +6602,23 @@ assign_inhibit_xsp_code: print_esc("inhibitxspcode"); @ @= function get_inhibit_pos(c:KANJI_code; n:small_number):pointer; label done, done1; -var p,s:pointer; -begin s:=calc_pos(c); p:=s; +var p,pp,s:pointer; +begin s:=calc_pos(c); p:=s; pp:=no_entry; if n=new_pos then begin repeat - if (inhibit_xsp_type(p)=inhibit_unused)or(inhibit_xsp_code(p)=0) - or(inhibit_xsp_code(p)=c) then goto done; + if inhibit_xsp_code(p)=c then goto done; { found, update there } + if inhibit_xsp_code(p)=0 then { no further scan needed } + begin if pp<>no_entry then p:=pp; goto done; end; + if inhibit_xsp_type(p)=inhibit_unused then + if pp=no_entry then pp:=p; { save the nearest unused hash } incr(p); if p>255 then p:=0; - until s=p; p:=no_entry; + until s=p; + p:=pp; end else begin repeat - if inhibit_xsp_code(p)=0 then goto done1 - else if (inhibit_xsp_type(p)<>inhibit_unused)and(inhibit_xsp_code(p)=c) then goto done; + if inhibit_xsp_code(p)=0 then goto done1; + if inhibit_xsp_code(p)=c then goto done; incr(p); if p>255 then p:=0; until s=p; done1: p:=no_entry; @@ -6629,6 +6653,7 @@ end; begin scan_int; q:=get_inhibit_pos(tokanji(cur_val),cur_pos); cur_val_level:=int_val; cur_val:=inhibit_none; if q<>no_entry then cur_val:=inhibit_xsp_type(q); +if cur_val>inhibit_none then cur_val:=inhibit_none; end @ The \.{\\prebreakpenalty} is used to specified amount of penalties inserted @@ -6654,8 +6679,8 @@ assign_kinsoku: case chr_code of @ @= function get_kinsoku_pos(c:KANJI_code; n:small_number):pointer; label done, done1; -var p,s:pointer; -begin s:=calc_pos(c); p:=s; +var p,pp,s:pointer; +begin s:=calc_pos(c); p:=s; pp:=no_entry; @!debug print_ln; print("c:="); print_int(c); print(", p:="); print_int(s); if p+kinsoku_base<0 then @@ -6664,16 +6689,19 @@ if p+kinsoku_base<0 then gubed if n=new_pos then begin repeat - if (kinsoku_type(p)=0)or(kinsoku_type(p)=kinsoku_unused_code) - or(kinsoku_code(p)=c) then goto done; + if kinsoku_code(p)=c then goto done; { found, update there } + if kinsoku_type(p)=0 then { no further scan needed } + begin if pp<>no_entry then p:=pp; goto done; end; + if kinsoku_type(p)=kinsoku_unused_code then + if pp=no_entry then pp:=p; { save the nearest unused hash } incr(p); if p>255 then p:=0; until s=p; - p:=no_entry; + p:=pp; end else begin repeat - if kinsoku_type(p)=0 then goto done1 - else if (kinsoku_type(p)<>kinsoku_unused_code)and(kinsoku_code(p)=c) then goto done; + if kinsoku_type(p)=0 then goto done1; + if kinsoku_code(p)=c then goto done; incr(p); if p>255 then p:=0; until s=p; done1: p:=no_entry; diff --git a/Build/source/texk/web2c/ptexdir/tests/kinsoku_search.tex b/Build/source/texk/web2c/ptexdir/tests/kinsoku_search.tex new file mode 100644 index 00000000000..e59445e7d9c --- /dev/null +++ b/Build/source/texk/web2c/ptexdir/tests/kinsoku_search.tex @@ -0,0 +1,43 @@ +%#!euptex -ini -etex +\tracingonline1 +\tracingassigns1 + +% 最優先hashはコードポイントから一意に決まる値(jtex.pdfも参照) +\prebreakpenalty`、=10000 % code=12289, 最優先hash=1 +\prebreakpenalty`。=10000 % code=12290, 最優先hash=2 +\prebreakpenalty`ぁ=150 % code=12353, 最優先hash=1だが埋まってしまったので3に分配 +\prebreakpenalty`ぃ=150 % code=12355, 最優先hash=3だが埋まってしまったので4に分配 + +\showthe\currentgrouplevel % > 0. +\showthe\prebreakpenalty`ぃ % > 150. + +\prebreakpenalty`ぃ=0 % changing hash=4 +\showthe\prebreakpenalty`ぃ % > 0. ← OK(hash=4読出) + +\prebreakpenalty`ぃ=123 % changing hash=4 +\showthe\prebreakpenalty`ぃ % > 123. ← OK(hash=4読出) + +\prebreakpenalty`ぁ=0 % changing hash=3 +\showthe\prebreakpenalty`ぃ % > 123. ← OK(hash=4読出) + +% この時点で "ぁ" が消えてhash=3が空いている。 +% 一方,"ぃ"はフォールバックしたhash=4に格納されている。 + +\prebreakpenalty`ぃ=0 % changing hash=4 +\showthe\prebreakpenalty`ぃ % > 0. ← 修正(削除済み) + +\prebreakpenalty`ぃ=234 % changing hash=3 +\showthe\prebreakpenalty`ぃ % > 234. ← OK(hash=3読出) + +\prebreakpenalty`ぃ=0 % changing hash=3 +\showthe\prebreakpenalty`ぃ % > 0. ← 修正(削除済み) + +\prebreakpenalty`ぁ=345 % changing hash=3 +\showthe\prebreakpenalty`ぃ % > 0. ← 修正(削除済み) + +% この時点で "ぁ" が再びhash=3を埋めている。 + +\prebreakpenalty`ぃ=0 % reassigning hash=4 +\showthe\prebreakpenalty`ぃ % > 0. ← OK(削除済み) + +\end diff --git a/Build/source/texk/web2c/ptexdir/tests/kinsoku_table.tex b/Build/source/texk/web2c/ptexdir/tests/kinsoku_table.tex index bece61cd0c6..52b21fdbf86 100644 --- a/Build/source/texk/web2c/ptexdir/tests/kinsoku_table.tex +++ b/Build/source/texk/web2c/ptexdir/tests/kinsoku_table.tex @@ -1,44 +1,47 @@ -%#!uptex +%#!uptex -ini +\let\dump\relax +\input plain \newcount\fuga\newcount\dflt +\fuga="3300 \iffalse \global\let\prebreakpenalty=\inhibitxspcode - \fuga="30D3 \dflt=3 + \dflt=3 \else - \fuga="3090 \dflt=0 + \dflt=0 \fi \scrollmode \newcount\hoge\hoge="3000 \loop\ifnum\hoge<\fuga \message{\the\hoge}\prebreakpenalty\hoge=2 - \advance\hoge 1\relax \repeat + \advance\hoge 3\relax \repeat -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000>}% 2, D +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000>}% 2, D { - \prebreakpenalty"3001=\dflt\relax + \prebreakpenalty"3003=\dflt\relax \global\prebreakpenalty"4000=1\relax% error -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000>}% D, D +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000>}% D, D } -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000>}% 2, D +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000>}% 2, D { - \global\prebreakpenalty"3001=\dflt\relax + \global\prebreakpenalty"3003=\dflt\relax \prebreakpenalty"4000=1\relax% no error -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000>}% D, 1 +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000>}% D, 1 } -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000>}% D, D +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000>}% D, D \prebreakpenalty"4000=1\relax% no error -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000, +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000, \the\prebreakpenalty"3549>}% D, 1, D \prebreakpenalty"4000=\dflt\relax \prebreakpenalty"3549=1\relax% no error -\message{<\the\prebreakpenalty"3001, \the\prebreakpenalty"4000, +\message{<\the\prebreakpenalty"3003, \the\prebreakpenalty"4000, \the\prebreakpenalty"3549>}% D, D, 1 -- cgit v1.2.3