diff options
Diffstat (limited to 'Build')
-rw-r--r-- | Build/source/texk/web2c/xetexdir/ChangeLog | 5 | ||||
-rw-r--r-- | Build/source/texk/web2c/xetexdir/xetex.web | 89 |
2 files changed, 35 insertions, 59 deletions
diff --git a/Build/source/texk/web2c/xetexdir/ChangeLog b/Build/source/texk/web2c/xetexdir/ChangeLog index 8256cf8eae0..cda1d5bb0ff 100644 --- a/Build/source/texk/web2c/xetexdir/ChangeLog +++ b/Build/source/texk/web2c/xetexdir/ChangeLog @@ -1,3 +1,8 @@ +2018-02-26 Jonathan Kew <jfkthame@gmail.com> + + * xetex.web: Fix the code to skip discretionaries when looking + for a |native_word|. + 2018-02-04 Jonathan Kew <jfkthame@gmail.com> * NEWS: Update for 0.99999. diff --git a/Build/source/texk/web2c/xetexdir/xetex.web b/Build/source/texk/web2c/xetexdir/xetex.web index acd2069aa8f..f7b0bbe05cb 100644 --- a/Build/source/texk/web2c/xetexdir/xetex.web +++ b/Build/source/texk/web2c/xetexdir/xetex.web @@ -3331,14 +3331,9 @@ than size and length fields, and there's no subsidiary C pointer. @d native_word_node=40 {|subtype| of whatsits that hold |native_font| words} @d native_word_node_AT=41 {a |native_word_node| that should output ActualText} -@d native_word_node_disc_flag=2 {flag added to the |subtype| when the node is the trailing node - of the no-break text of a discretionary, so we can avoid - merging it with following chars} -@d native_word_node_MIN=native_word_node -@d native_word_node_MAX=native_word_node_AT+native_word_node_disc_flag -@d is_native_word_subtype(#)==((subtype(#)>=native_word_node_MIN) and (subtype(#)<=native_word_node_MAX)) +@d is_native_word_subtype(#)==((subtype(#)>=native_word_node) and (subtype(#)<=native_word_node_AT)) -@d glyph_node=44 {|subtype| in whatsits that hold glyph numbers} +@d glyph_node=42 {|subtype| in whatsits that hold glyph numbers} @d native_node_size=6 {size of a |native_word| node (plus the actual chars) -- see also \.{xetex.h}} @d glyph_node_size=5 @@ -3380,8 +3375,8 @@ So |pic_node_size|, which does not include any space for the picture file pathna A |pdf_node| is just like |pic_node|, but generate a different \.{XDV} file code. -@d pic_node=45 {|subtype| in whatsits that hold picture file references} -@d pdf_node=46 {|subtype| in whatsits that hold PDF page references} +@d pic_node=43 {|subtype| in whatsits that hold picture file references} +@d pdf_node=44 {|subtype| in whatsits that hold PDF page references} @# @d pic_node_size=9 {must sync with \.{xetex.h}} @d pic_path_length(#)==mem[#+4].hh.b0 @@ -3974,10 +3969,7 @@ hlist_node,vlist_node,ins_node,mark_node,adjust_node, unset_node: print("[]"); whatsit_node: case subtype(p) of - native_word_node, native_word_node_AT, - native_word_node+native_word_node_disc_flag, - native_word_node_AT+native_word_node_disc_flag: - begin + native_word_node, native_word_node_AT: begin if native_font(p)<>font_in_short_display then begin print_esc(font_id_text(native_font(p))); print_char(" "); @@ -23665,25 +23657,21 @@ collected: if mode=hmode then begin main_ppp:=head; - if main_ppp<>main_pp then { find node preceding tail, skipping discretionaries } - while (link(main_ppp)<>main_pp) do begin - if (not is_char_node(main_ppp)) and (type(main_ppp=disc_node)) then begin - temp_ptr:=main_ppp; - for main_p:=1 to replace_count(temp_ptr) do main_ppp:=link(main_ppp); - end; - if main_ppp<>main_pp then main_ppp:=link(main_ppp); + + { find node preceding tail, skipping discretionaries } + while (main_ppp<>main_pp) and (link(main_ppp)<>main_pp) do begin + if (not is_char_node(main_ppp)) and (type(main_ppp)=disc_node) then begin + temp_ptr:=main_ppp; + for main_p:=1 to replace_count(temp_ptr) do main_ppp:=link(main_ppp); end; + if main_ppp<>main_pp then main_ppp:=link(main_ppp); + end; temp_ptr:=0; repeat if main_h = 0 then main_h:=main_k; - {If |main_pp| is the [last node of the] no-break text of a discretionary, - we do not want to merge following text into it, as that would swallow - the following text in the case where the discretionary break is used - and its no-break list is discarded. Hence, we do this only when the - |native_word_node_disc_flag| was NOT set on the |main_pp| node.} - if (is_native_word_node(main_pp) and (subtype(main_pp)<=native_word_node_AT)) + if is_native_word_node(main_pp) and (native_font(main_pp)=main_f) and (main_ppp<>main_pp) and (not is_char_node(main_ppp)) @@ -23743,14 +23731,16 @@ collected: { must be restricted hmode, so no need for line-breaking or discretionaries } { but there might already be explicit |disc_node|s in the list } main_ppp:=head; - if main_ppp<>main_pp then { find node preceding tail, skipping discretionaries } - while (link(main_ppp)<>main_pp) do begin - if (not is_char_node(main_ppp)) and (type(main_ppp=disc_node)) then begin - temp_ptr:=main_ppp; - for main_p:=1 to replace_count(temp_ptr) do main_ppp:=link(main_ppp); - end; - if main_ppp<>main_pp then main_ppp:=link(main_ppp); + + { find node preceding tail, skipping discretionaries } + while (main_ppp<>main_pp) and (link(main_ppp)<>main_pp) do begin + if (not is_char_node(main_ppp)) and (type(main_ppp)=disc_node) then begin + temp_ptr:=main_ppp; + for main_p:=1 to replace_count(temp_ptr) do main_ppp:=link(main_ppp); end; + if main_ppp<>main_pp then main_ppp:=link(main_ppp); + end; + if is_native_word_node(main_pp) and (native_font(main_pp)=main_f) and (main_ppp<>main_pp) @@ -25276,11 +25266,7 @@ else begin print_err("Discretionary list is too long"); ("You can't seriously need such a huge discretionary list?"); error; end; -if n>0 then begin - tail:=q; - if (is_native_word_node(tail)) then - subtype(tail):=subtype(tail)+native_word_node_disc_flag; - end; +if n>0 then tail:=q; decr(save_ptr); return; end @@ -29110,10 +29096,7 @@ language_node:begin print_esc("setlanguage"); print_int(what_lhm(p)); print_char(","); print_int(what_rhm(p)); print_char(")"); end; -native_word_node, native_word_node_AT, -native_word_node+native_word_node_disc_flag, -native_word_node_AT+native_word_node_disc_flag: -begin print_esc(font_id_text(native_font(p))); +native_word_node, native_word_node_AT:begin print_esc(font_id_text(native_font(p))); print_char(" "); print_native_word(p); end; @@ -29146,10 +29129,7 @@ write_node,special_node: begin r:=get_node(write_node_size); close_node,language_node: begin r:=get_node(small_node_size); words:=small_node_size; end; -native_word_node, native_word_node_AT, -native_word_node+native_word_node_disc_flag, -native_word_node_AT+native_word_node_disc_flag: -begin words:=native_size(p); +native_word_node, native_word_node_AT: begin words:=native_size(p); r:=get_node(words); while words > 0 do begin decr(words); mem[r+words]:=mem[p+words]; end; @@ -29175,10 +29155,7 @@ write_node,special_node: begin delete_token_ref(write_tokens(p)); free_node(p,write_node_size); goto done; end; close_node,language_node: free_node(p,small_node_size); -native_word_node, native_word_node_AT, -native_word_node+native_word_node_disc_flag, -native_word_node_AT+native_word_node_disc_flag: -begin free_native_glyph_info(p); free_node(p,native_size(p)); end; +native_word_node, native_word_node_AT: begin free_native_glyph_info(p); free_node(p,native_size(p)); end; glyph_node: free_node(p,glyph_node_size); pic_node,pdf_node: free_node(p,total_pic_node_size(p)); pdf_save_pos_node: @@ -29203,10 +29180,7 @@ end @ @<Incorporate a whatsit node into an hbox@>= begin case subtype(p) of - native_word_node, native_word_node_AT, - native_word_node+native_word_node_disc_flag, - native_word_node_AT+native_word_node_disc_flag: - begin + native_word_node, native_word_node_AT: begin { merge with any following word fragments in same font, discarding discretionary breaks } if (q <> r+list_offset) and (type(q) = disc_node) then k:=replace_count(q) else k:=0; while (link(q) <> p) do begin @@ -29401,10 +29375,7 @@ else @ @<Output the whatsit node |p| in an hlist@>= begin case subtype(p) of - native_word_node, native_word_node_AT, - native_word_node+native_word_node_disc_flag, - native_word_node_AT+native_word_node_disc_flag, - glyph_node: begin + native_word_node, native_word_node_AT, glyph_node: begin synch_h; synch_v; {Sync DVI state to TeX state} f:=native_font(p); if f<>dvi_f then @<Change font |dvi_f| to |f|@>; @@ -29417,7 +29388,7 @@ begin dvi_two(native_glyph(p)); cur_h:=cur_h + width(p); end else begin - if (subtype(p)=native_word_node_AT) or (subtype(p)=native_word_node_AT+native_word_node_disc_flag) then begin + if subtype(p)=native_word_node_AT then begin if (native_length(p) > 0) or (native_glyph_info_ptr(p) <> null_ptr) then begin dvi_out(set_text_and_glyphs); len:=native_length(p); |