/****************************************************************************\ $Id$ Part of the XeTeX typesetting system Copyright (c) 1994-2008 by SIL International Copyright (c) 2009-2021 by Jonathan Kew Copyright (c) 2012 by Khaled Hosny SIL Author(s): Jonathan Kew Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the copyright holders. \****************************************************************************/ @x \let\maybe=\iffalse @y \let\maybe=\iftrue @z @x [1] m.2 l.188 - banner @d banner==TeX_banner @d banner_k==TeX_banner_k @y @d banner==XeTeX_banner @d banner_k==XeTeX_banner @z @x [2.20] l.579 - printable characters xchr: array [ASCII_code] of text_char; { specifies conversion of output characters } xprn: array [ASCII_code] of ASCII_code; { non zero iff character is printable } @y @!xchr: ^text_char; {dummy variable so tangle doesn't complain; not actually used} @z @x [2.23] l.723 - Translate characters if desired, otherwise allow them all. {Initialize |xchr| to the identity mapping.} for i:=0 to @'37 do xchr[i]:=i; for i:=@'177 to @'377 do xchr[i]:=i; @y @z @x [2.24] l.733 - Don't reinitialize xord. for i:=0 to @'176 do xord[xchr[i]]:=i; {Set |xprn| for printable ASCII, unless |eight_bit_p| is set.} for i:=0 to 255 do xprn[i]:=(eight_bit_p or ((i>=" ")and(i<="~"))); {The idea for this dynamic translation comes from the patch by Libor Skarvada \.{} and Petr Sojka \.{}. I didn't use any of the actual code, though, preferring a more general approach.} {This updates the |xchr|, |xord|, and |xprn| arrays from the provided |translate_filename|. See the function definition in \.{texmfmp.c} for more comments.} if translate_filename then read_tcx_file; @y @z @x [3.26] l.789 - name_of_file is no longer an array @!name_of_file:^text_char; @y @!name_of_file:^UTF8_code; {we build filenames in utf8 to pass to the OS} @z @x @!name_of_file16:array[1..file_name_size] of UTF16_code;@;@/ @y @!name_of_file16:^UTF16_code; @z @x [3.30] l.888 - Array size of input buffer is determined at runtime. @!buffer:^ASCII_code; {lines of characters being read} @y @!buffer:^UnicodeScalar; {lines of characters being read} @z @x [3.32] l.961 - `term_in' and `term_out' are standard input and output. @d term_in==stdin {the terminal as an input file} @y @z @x [3.32] l.961 @!bound_default:integer; {temporary for setup} @y @!term_in:unicode_file; @# @!bound_default:integer; {temporary for setup} @z @x [5.61] l.1556 - Print rest of banner, eliminate misleading `(no format preloaded)'. if translate_filename then begin wterm(' ('); fputs(translate_filename, stdout); wterm_ln(')'); @y if translate_filename then begin wterm(' (WARNING: translate-file "'); fputs(translate_filename, stdout); wterm_ln('" ignored)'); @z @x We add a new |history| value for failure of the output driver has been detected. It has four possible values: |spotless|, |warning_issued|, |error_message_issued|, and |fatal_error_stop|. @y has been detected. It has five possible values: |spotless|, |warning_issued|, |error_message_issued|, |fatal_error_stop|, and |output_failure|. @z @x @d fatal_error_stop=3 {|history| value when termination was premature} @y @d fatal_error_stop=3 {|history| value when termination was premature} @d output_failure=4 {|history| value when output driver returned an error} @z @x @!history:spotless..fatal_error_stop; {has the source input been clean so far?} @y @!history:spotless..output_failure; {has the source input been clean so far?} @z @x [6.84] l.1904 - Implement the switch-to-editor option. begin edit_name_start:=str_start[edit_file.name_field]; edit_name_length:=str_start[edit_file.name_field+1] - str_start[edit_file.name_field]; @y begin edit_name_start:=str_start_macro(edit_file.name_field); edit_name_length:=str_start_macro(edit_file.name_field+1) - str_start_macro(edit_file.name_field); @z @x [8.110] l.2423 @d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|} @y @d max_halfword==@"3FFFFFFF {largest allowable value in a |halfword|} @z @x [15.209] l.4165 @d shorthand_def=95 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)} @y @d shorthand_def=97 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)} @z @x [16.215] - e-TeX last_node_type last_glue:=max_halfword; last_penalty:=0; last_kern:=0; @y last_glue:=max_halfword; last_penalty:=0; last_kern:=0; last_node_type:=-1; @z @x [17.222] l.4523 - frozen_special, for source specials. @d frozen_null_font=frozen_control_sequence+11 @y @d frozen_null_font=frozen_control_sequence+12+prim_size @z @x [17.230] l.4731 @d char_sub_code_base=math_code_base+256 {table of character substitutions} @d int_base=char_sub_code_base+256 {beginning of region 5} @y @d char_sub_code_base=math_code_base+number_usvs {table of character substitutions} @d int_base=char_sub_code_base+number_usvs {beginning of region 5} @z @x [17.236] l.4960 - first web2c, then e-TeX additional integer parameters @d int_pars=web2c_int_pars {total number of integer parameters} @# @d etex_int_base=tex_int_pars {base for \eTeX's integer parameters} @y @d etex_int_base=web2c_int_pars {base for \eTeX's integer parameters} @z @x [22.304] l.6536 - texarray; additions for file:line:error style. @!input_file : ^alpha_file; @y @!input_file : ^unicode_file; @z @x [29.516] l.9992 - filenames: more_name begin if (c=" ") and stop_at_space and (not quoted_filename) then more_name:=false else if c="""" then begin quoted_filename:=not quoted_filename; @y begin if stop_at_space and (c=" ") and (file_name_quote_char=0) then more_name:=false else if stop_at_space and (file_name_quote_char<>0) and (c=file_name_quote_char) then begin file_name_quote_char:=0; more_name:=true; end else if stop_at_space and (file_name_quote_char=0) and ((c="""") or (c="'")) then begin file_name_quote_char:=c; quoted_filename:=true; @z @x [29.517] l.10002 - end_name: string recycling @!j,@!s,@!t: pool_pointer; {running indices} @!must_quote:boolean; {whether we need to quote a string} @y @!j: pool_pointer; {running index} @z @x [29.517] l.10002 - end_name: string recycling str_room(6); {Room for quotes, if needed.} {add quotes if needed} if area_delimiter<>0 then begin {maybe quote |cur_area|} must_quote:=false; s:=str_start[str_ptr]; t:=str_start[str_ptr]+area_delimiter; j:=s; while (not must_quote) and (j0 then ext_delimiter:=ext_delimiter+2; area_delimiter:=area_delimiter+2; pool_ptr:=pool_ptr+2; end; end; {maybe quote |cur_name|} s:=str_start[str_ptr]+area_delimiter; if ext_delimiter=0 then t:=pool_ptr else t:=str_start[str_ptr]+ext_delimiter-1; must_quote:=false; j:=s; while (not must_quote) and (j0 then ext_delimiter:=ext_delimiter+2; pool_ptr:=pool_ptr+2; end; if ext_delimiter<>0 then begin {maybe quote |cur_ext|} s:=str_start[str_ptr]+ext_delimiter-1; t:=pool_ptr; must_quote:=false; j:=s; while (not must_quote) and (j0 then begin j:=str_start[#]; while (not must_quote) and (j0 then begin j:=str_start_macro(#); while ((not must_quote) or (quote_char=0)) and (j0 then for j:=str_start[#] to str_start[#+1]-1 do if so(str_pool[j])<>"""" then print(so(str_pool[j])) @y @d print_quoted(#) == {print string |#|, omitting quotes} if #<>0 then for j:=str_start_macro(#) to str_start_macro(#+1)-1 do begin if str_pool[j]=quote_char then begin print(quote_char); quote_char:="""" + "'" - quote_char; print(quote_char); end; print(str_pool[j]); end @z @x [29.518] l.10042 - print_file_name: quote if spaces in names. @!j:pool_pointer; {index into |str_pool|} begin must_quote:=false; check_quoted(a); check_quoted(n); check_quoted(e); {FIXME: Alternative is to assume that any filename that has to be quoted has at least one quoted component...if we pick this, a number of insertions of |print_file_name| should go away. |must_quote|:=((|a|<>0)and(|str_pool|[|str_start|[|a|]]=""""))or ((|n|<>0)and(|str_pool|[|str_start|[|n|]]=""""))or ((|e|<>0)and(|str_pool|[|str_start|[|e|]]=""""));} if must_quote then print_char(""""); print_quoted(a); print_quoted(n); print_quoted(e); if must_quote then print_char(""""); @y @!quote_char: integer; {current quote char (single or double)} @!j:pool_pointer; {index into |str_pool|} begin must_quote:=false; quote_char:=0; check_quoted(a); check_quoted(n); check_quoted(e); if must_quote then begin if quote_char=0 then quote_char:=""""; print_char(quote_char); end; print_quoted(a); print_quoted(n); print_quoted(e); if quote_char<>0 then print_char(quote_char); @z @x [29.519] l.10051 - have append_to_name skip quotes. @d append_to_name(#)==begin c:=#; if not (c="""") then begin incr(k); if k<=file_name_size then name_of_file[k]:=xchr[c]; end end @y @d append_to_name(#)==begin c:=#; incr(k); if k<=file_name_size then begin if (c < 128) then name_of_file[k]:=c else if (c < @"800) then begin name_of_file[k]:=@"C0 + c div @"40; incr(k); name_of_file[k]:=@"80 + c mod @"40; end else begin name_of_file[k]:=@"E0 + c div @"1000; incr(k); name_of_file[k]:=@"80 + (c mod @"1000) div @"40; incr(k); name_of_file[k]:=@"80 + (c mod @"1000) mod @"40; end end end @z @x [29.519] l.10047 - pack_file_name, leave room for the extra null name_of_file:= xmalloc_array (ASCII_code, length(a)+length(n)+length(e)+1); @y name_of_file:= xmalloc_array (UTF8_code, (length(a)+length(n)+length(e))*3+1); @z @x [29.523] l.10095 - Change to pack_buffered_name as with pack_file_name. name_of_file := xmalloc_array (ASCII_code, n+(b-a+1)+format_ext_length+1); for j:=1 to n do append_to_name(xord[ucharcast(TEX_format_default[j])]); @y name_of_file := xmalloc_array (UTF8_code, n+(b-a+1)+format_ext_length+1); for j:=1 to n do append_to_name(TEX_format_default[j]); @z @x [29.523] l.10095 - Change to pack_buffered_name as with pack_file_name. append_to_name(xord[ucharcast(TEX_format_default[j])]); @y append_to_name(TEX_format_default[j]); @z @x [29.525] l.10174 - make_name_string k:=1; while (k<=name_length)and(more_name(name_of_file[k])) do @y k:=0; while (ktoken_list) and (loc>limit) then goto done; @y @z @x [29.536] l.10331 wlog(' ('); fputs(translate_filename, log_file); wlog(')'); @y wlog(' (WARNING: translate-file "'); fputs(translate_filename, log_file); wlog('" ignored)'); @z @x [29.537] l.10338 - start_input var temp_str: str_number; v: pointer; begin scan_file_name; {set |cur_name| to desired file name} @y var temp_str: str_number; v: pointer; @!k:0..file_name_size; {index into |name_of_file16|} begin scan_file_name; {set |cur_name| to desired file name} @z @x [29.537] l.10338 - start_input and a_open_in(cur_file, kpse_tex_format) then goto done; @y and u_open_in(cur_file, kpse_tex_format, XeTeX_default_input_mode, XeTeX_default_input_encoding) then {At this point |name_of_file| contains the actual name found, as a UTF8 string. We convert to UTF16, then extract the |cur_area|, |cur_name|, and |cur_ext| from it.} begin make_utf16_name; name_in_progress:=true; begin_name; stop_at_space:=false; k:=0; while (k@@; @y @ The subroutines for |new_character| have been moved. @z @x [30.582] l.11276 - MLTeX: call |effective_char| in |new_character| @p function new_character(@!f:internal_font_number;@!c:eight_bits):pointer; @y @p function new_character(@!f:internal_font_number;@!c:ASCII_code):pointer; @z @x [30.582] l.11276 - MLTeX: call |effective_char| in |new_character| begin ec:=effective_char(false,f,qi(c)); @y begin if is_native_font(f) then begin new_character:=new_native_character(f,c); return; end; ec:=effective_char(false,f,qi(c)); @z @x [32.619] l.12294 - MLTeX: substitute character in |hlist_out| label reswitch, move_past, fin_rule, next_p, continue, found; @y label reswitch, move_past, fin_rule, next_p, continue, found, check_next, end_node_run; @z @x if list_ptr(p)=null then cur_v:=cur_v+height(p)+depth(p) @y if list_ptr(p)=null then begin if upwards then cur_v:=cur_v-depth(p)-height(p) else cur_v:=cur_v+height(p)+depth(p); end @z @x [32.645] l.12780 - use print_file_name print_nl("Output written on "); print_file_name(0, output_file_name, 0); @.Output written on x@> print(" ("); print_int(total_pages); if total_pages<>1 then print(" pages") else print(" page"); print(", "); print_int(dvi_offset+dvi_ptr); print(" bytes)."); b_close(dvi_file); @y k:=dvi_close(dvi_file); if k=0 then begin print_nl("Output written on "); print(output_file_name); @.Output written on x@> print(" ("); print_int(total_pages); if total_pages<>1 then print(" pages") else print(" page"); if no_pdf_output then begin print(", "); print_int(dvi_offset+dvi_ptr); print(" bytes)."); end else print(")."); end else begin print_nl("Error "); print_int(k); print(" ("); if no_pdf_output then print_c_string(strerror(k)) else print("driver return code"); print(") generating output;"); print_nl("file "); print(output_file_name); print(" may not be valid."); history:=output_failure; end; @z @x [43.943] l.18348 - bigtrie: Larger hyphenation tries. @!trie_used:array[ASCII_code] of trie_opcode; @y @!trie_used:array[0..biggest_lang] of trie_opcode; @z @x [43.946] l.18416 - bigtrie: And larger tries again. for k:=0 to 255 do trie_used[k]:=min_trie_op; @y for k:=0 to biggest_lang do trie_used[k]:=min_trie_op; @z @xx [43.958] l.18638 - bigtrie: Larger tries. begin for r:=0 to 256 do clear_trie; trie_max:=256; @y begin for r:=0 to max_hyph_char do clear_trie; trie_max:=max_hyph_char; @z @x [49.1222] l.22833 - MLTeX: \charsubdef primitive else begin n:=cur_chr; get_r_token; p:=cur_cs; define(p,relax,256); @y else begin n:=cur_chr; get_r_token; p:=cur_cs; define(p,relax,too_big_usv); @z @x [49.1275] l.23441 - Same stuff as for \input, this time for \openin. var c:0..1; {1 for \.{\\openin}, 0 for \.{\\closein}} @!n:0..15; {stream number} @y var c:0..1; {1 for \.{\\openin}, 0 for \.{\\closein}} @!n:0..15; {stream number} @!k:0..file_name_size; {index into |name_of_file16|} @z @x [49.1275] l.23441 - Same stuff as for \input, this time for \openin. and a_open_in(read_file[n], kpse_tex_format) then read_open[n]:=just_open; @y and u_open_in(read_file[n], kpse_tex_format, XeTeX_default_input_mode, XeTeX_default_input_encoding) then begin make_utf16_name; name_in_progress:=true; begin_name; stop_at_space:=false; k:=0; while (k; @y @z @x [50.1308] l.23793 - texarray format_engine:=xmalloc_array(text_char, x); @y format_engine:=xmalloc_array(char, x); @z @x [50.1308] l.23793 - texarray @; @y @z @x [50.1309] l.23814 - Make dumping/undumping more efficient. dump_things(str_start[0], str_ptr+1); @y dump_things(str_start_macro(too_big_char), str_ptr+1-too_big_char); @z @x [50.1310] l.23829 - Make dumping/undumping more efficient. undump_checked_things(0, pool_ptr, str_start[0], str_ptr+1);@/ @y undump_checked_things(0, pool_ptr, str_start_macro(too_big_char), str_ptr+1-too_big_char);@/ @z @x [50.1322] l.24000 - Make dumping/undumping more efficient - tfm print_file_name(font_name[k],font_area[k],""); @y if is_native_font(k) or (font_mapping[k]<>0) then begin print_file_name(font_name[k],"",""); print_err("Can't \dump a format with native fonts or font-mappings"); help3("You really, really don't want to do this.")@/ ("It won't work, and only confuses me.")@/ ("(Load them at runtime, not as part of the format file.)"); error; end else print_file_name(font_name[k],font_area[k],""); @z @x [50.1322] l.24031 - Make dumping/undumping more efficient - tfm begin {Allocate the font arrays} @y begin {Allocate the font arrays} font_mapping:=xmalloc_array(void_pointer, font_max); font_layout_engine:=xmalloc_array(void_pointer, font_max); font_flags:=xmalloc_array(char, font_max); font_letter_space:=xmalloc_array(scaled, font_max); @z @x [50.1322] l.24031 - Make dumping/undumping more efficient - tfm font_bc:=xmalloc_array(eight_bits, font_max); font_ec:=xmalloc_array(eight_bits, font_max); @y font_bc:=xmalloc_array(UTF16_code, font_max); font_ec:=xmalloc_array(UTF16_code, font_max); @z @x [50.1322] l.24031 - Make dumping/undumping more efficient - tfm undump_things(font_check[null_font], font_ptr+1-null_font); @y for k:=null_font to font_ptr do font_mapping[k]:=0; undump_things(font_check[null_font], font_ptr+1-null_font); @z @x [51.1332] l.24203 - make the main program a procedure, for eqtb hack. setup_bound_var (15000)('max_strings')(max_strings); @y setup_bound_var (15000)('max_strings')(max_strings); max_strings:=max_strings+too_big_char; {the |max_strings| value doesn't include the 64K synthetic strings} @z @x [51.1332] l.24203 - make the main program a procedure, for eqtb hack. buffer:=xmalloc_array (ASCII_code, buf_size); @y buffer:=xmalloc_array (UnicodeScalar, buf_size); @z @x [51.1332] l.24203 - make the main program a procedure, for eqtb hack. input_file:=xmalloc_array (alpha_file, max_in_open); @y input_file:=xmalloc_array (unicode_file, max_in_open); @z @x [51.1332] l.24203 (ca.) texarray line_stack:=xmalloc_array (integer, max_in_open); @y line_stack:=xmalloc_array (integer, max_in_open); eof_seen:=xmalloc_array (boolean, max_in_open); grp_stack:=xmalloc_array (save_pointer, max_in_open); if_stack:=xmalloc_array (pointer, max_in_open); @z @x [51.1333] l.24254 - Print new line before termination; switch to editor if necessary. print_file_name(0, log_name, 0); print_char("."); @y print(log_name); print_char("."); @z @x [51.1337] l.24371 (ca.) texarray trie_root:=0; trie_c[0]:=si(0); trie_ptr:=0; @y trie_root:=0; trie_c[0]:=si(0); trie_ptr:=0; hyph_root:=0; hyph_start:=0; @z @x [51.1337] l.24371 - Allocate hyphenation tries, do char translation, MLTeX {Allocate and initialize font arrays} @y {Allocate and initialize font arrays} font_mapping:=xmalloc_array(void_pointer, font_max); font_layout_engine:=xmalloc_array(void_pointer, font_max); font_flags:=xmalloc_array(char, font_max); font_letter_space:=xmalloc_array(scaled, font_max); @z @x [51.1337] l.24371 - Allocate hyphenation tries, do char translation, MLTeX font_bc:=xmalloc_array(eight_bits, font_max); font_ec:=xmalloc_array(eight_bits, font_max); @y font_bc:=xmalloc_array(UTF16_code, font_max); font_ec:=xmalloc_array(UTF16_code, font_max); @z @x [51.1337] l.24371 - Allocate hyphenation tries, do char translation, MLTeX param_base[null_font]:=-1; @y font_mapping[null_font]:=0; param_base[null_font]:=-1; @z @x [53.1348] (do_extension) Remove unused variables var k:integer; {all-purpose integers} @y var i,@!j,@!k:integer; {all-purpose integers} @z @x [53.1370] l.24779 - system: (write_out) \write18{foo} => system(foo). print(so(str_pool[str_start[str_ptr]+d])); {N.B.: not |print_char|} @y print(so(str_pool[str_start_macro(str_ptr)+d])); {N.B.: not |print_char|} @z @x [53.1370] l.24779 - system: (write_out) \write18{foo} => system(foo). str_pool[str_start[str_ptr]+d]:=xchr[str_pool[str_start[str_ptr]+d]]; if (str_pool[str_start[str_ptr]+d]=null_code) @y if (str_pool[str_start_macro(str_ptr)+d]=null_code) @z @x [53.1370] l.24779 - convert from UTF-16 to UTF-8 for system(3). runsystem_ret := runsystem(conststringcast(addressof( str_pool[str_start[str_ptr]]))); @y if name_of_file then libc_free(name_of_file); name_of_file := xmalloc(cur_length * 3 + 2); k := 0; for d:=0 to cur_length-1 do append_to_name(str_pool[str_start_macro(str_ptr)+d]); name_of_file[k+1] := 0; runsystem_ret := runsystem(conststringcast(name_of_file+1)); @z @x [53.1370] l.24779 - system: (write_out) \write18{foo} => system(foo). pool_ptr:=str_start[str_ptr]; {erase the string} @y pool_ptr:=str_start_macro(str_ptr); {erase the string} @z @x [53a.1379] l.??? -etex command line switch @!init if (buffer[loc]="*")and(format_ident=" (INITEX)") then @y @!init if (etex_p or(buffer[loc]="*"))and(format_ident=" (INITEX)") then @z @x [53a.1379] l.??? -etex command line switch incr(loc); eTeX_mode:=1; {enter extended mode} @y if buffer[loc]="*" then incr(loc); eTeX_mode:=1; {enter extended mode} @z @x [53a.1383] l.??? -etex command line switch @!eTeX_mode: 0..1; {identifies compatibility and extended mode} @y @!eTeX_mode: 0..1; {identifies compatibility and extended mode} @!etex_p: boolean; {was the -etex option specified} @z @x [53a.1391] l.??? texarray @!eof_seen : array[1..max_in_open] of boolean; {has eof been seen?} @y @!eof_seen : ^boolean; {has eof been seen?} @z @x [53a.1506] l.??? texarray @!grp_stack : array[0..max_in_open] of save_pointer; {initial |cur_boundary|} @!if_stack : array[0..max_in_open] of pointer; {initial |cond_ptr|} @y @!grp_stack : ^save_pointer; {initial |cur_boundary|} @!if_stack : ^pointer; {initial |cond_ptr|} @z @x [54.1376] l.24903 - print_csnames for c := str_start[text(h)] to str_start[text(h) + 1] - 1 @y for c := str_start_macro(text(h)) to str_start_macro(text(h) + 1) - 1 @z @x [54.1376] l.24903 - Dumping/Undumping @ Dumping the |xord|, |xchr|, and |xprn| arrays. We dump these always in the format, so a TCX file loaded during format creation can set a default for users of the format. @= dump_things(xord[0], 256); dump_things(xchr[0], 256); dump_things(xprn[0], 256); @ Undumping the |xord|, |xchr|, and |xprn| arrays. This code is more complicated, because we want to ensure that a TCX file specified on the command line will override whatever is in the format. Since the tcx file has already been loaded, that implies throwing away the data in the format. Also, if no |translate_filename| is given, but |eight_bit_p| is set we have to make all characters printable. @= if translate_filename then begin for k:=0 to 255 do undump_things(dummy_xord, 1); for k:=0 to 255 do undump_things(dummy_xchr, 1); for k:=0 to 255 do undump_things(dummy_xprn, 1); end else begin undump_things(xord[0], 256); undump_things(xchr[0], 256); undump_things(xprn[0], 256); if eight_bit_p then for k:=0 to 255 do xprn[k]:=1; end; @y @z @x while s>255 do {first 256 strings depend on implementation!!} @y while s>65535 do {first 64K strings don't really exist in the pool!} @z @x [54/web2c.1407] - scan a bgroup/egroup-delimited file name stop_at_space := false; {set |stop_at_space| to false to allow spaces in file names} begin_name; for i:=str_start[s] to str_start[s+1]-1 do dummy := more_name(str_pool[i]); {add each read character to the current file name} @y stop_at_space := false; {set |stop_at_space| to false to allow spaces in file names} begin_name; for i:=str_start_macro(s) to str_start_macro(s+1)-1 do dummy := more_name(str_pool[i]); {add each read character to the current file name} @z @x @!mltex_enabled_p:boolean; {enable character substitution} @y @!mltex_enabled_p:boolean; {enable character substitution} @!native_font_type_flag:integer; {used by XeTeX font loading code to record which font technology was used} @!xtx_ligature_present:boolean; {to suppress tfm font mapping of char codes from ligature nodes (already mapped)} @z @x [54/web2c.???] l.??? needed earlier replacement, but always existing character |font_bc[f]|. @^inner loop@> @= function effective_char(@!err_p:boolean; @y replacement, but always existing character |font_bc[f]|. @^inner loop@> @= function effective_char(@!err_p:boolean; @z @x begin result:=c; {return |c| unless it does not exist in the font} @y begin if (not xtx_ligature_present) and (font_mapping[f]<>nil) then c:=apply_tfm_font_mapping(font_mapping[f],c); xtx_ligature_present:=false; result:=c; {return |c| unless it does not exist in the font} @z @x begin if not mltex_enabled_p then @y begin if (not xtx_ligature_present) and (font_mapping[f]<>nil) then c:=apply_tfm_font_mapping(font_mapping[f],c); xtx_ligature_present:=false; if not mltex_enabled_p then @z @x effective_char_info:=null_character; exit:end; @y effective_char_info:=null_character; exit:end; @# @@; @z