summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/xetexdir/char-warning-xetex.ch
blob: fcf9a6386a2709fff8d50f95fe4cf52bfc9cfe6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
% $Id$
% Public domain. See ../pdftexdir/char-warning-pdftex.ch for basic info.
% In addition to the basic change, we also define a new procedure
% print_ucs_code to print in the format U+.... for system fonts.
%
% To test:
% xetex -ini
%   \font\x=/usr/local/texlive/2020/texmf-dist/fonts/tfm/public/knuth-lib/logo10.tfm
%   \tracinglostchars=3 \x \char99\end
% should get:
%   ! Missing character: There is no c ("63) in font logo10.
% And:
%   \font\y="Nimbus Mono" \tracinglostchars=3 \y \char43981\end
% should get:
%   ! Missing character: There is no ꯍ (U+ABCD) in font Nimbus Mono Regular!.
% Assuming that font is findable as a system font, e.g., shown by
%   fc-list :scalable=true family

@x [30] If \tracinglostchars > 2, then promote to full error.
procedure char_warning(@!f:internal_font_number;@!c:integer);
var old_setting: integer; {saved value of |tracing_online|}
begin if tracing_lost_chars>0 then
 begin old_setting:=tracing_online;
 if eTeX_ex and(tracing_lost_chars>1) then tracing_online:=1;
  begin begin_diagnostic;
  print_nl("Missing character: There is no ");
@.Missing character@>
  if c < @"10000 then print_ASCII(c)
  else print_char(c); {non-Plane 0 Unicodes can't be sent through |print_ASCII|}
  print(" in font ");
  slow_print(font_name[f]); print_char("!"); end_diagnostic(false);
  end;
 tracing_online:=old_setting;
 end;
end;
@y
procedure print_ucs_code(@!n: UnicodeScalar); { cf.~|print_hex| }
    var k: 0..22; {index to current digit; we assume that $0\L n<16^{22}$}
    begin
        k := 0;
        print("U+"); { prefix with U+ instead of " }
        repeat
            dig[k] := n mod 16;
            n      := n div 16;
            incr(k);
        until n = 0;
        { pad to at least 4 hex digits }
        while k < 4 do
        begin
            dig[k] := 0;
            incr(k);
        end;
        print_the_digs(k);
end;

procedure char_warning(@!f:internal_font_number;@!c:integer);
var old_setting: integer; {saved value of |tracing_online|}
begin if tracing_lost_chars>0 then
 begin old_setting:=tracing_online;
 if eTeX_ex and(tracing_lost_chars>1) then tracing_online:=1;
 if tracing_lost_chars > 2 then
   print_err("Missing character: There is no ")
 else begin
   begin_diagnostic;
   print_nl("Missing character: There is no ")
 end;
@.Missing character@>
 if c < @"10000 then print_ASCII(c)
 else print_char(c); {non-Plane 0 Unicodes can't be sent through |print_ASCII|}
 print(" (");
 if is_native_font(f) then print_ucs_code(c)
 else print_hex(c);
 print(")");
 print(" in font ");
 slow_print(font_name[f]);
 if tracing_lost_chars < 3 then print_char("!");
 tracing_online:=old_setting;
 if tracing_lost_chars > 2 then begin
   help0;
   error;
 end else end_diagnostic(false);
 end; {of |tracing_lost_chars>0|}
end;  {of procedure}
@z