summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/uptexdir/upbibtex.ch
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/uptexdir/upbibtex.ch')
-rw-r--r--Build/source/texk/web2c/uptexdir/upbibtex.ch669
1 files changed, 534 insertions, 135 deletions
diff --git a/Build/source/texk/web2c/uptexdir/upbibtex.ch b/Build/source/texk/web2c/uptexdir/upbibtex.ch
index 40a12c90d04..e244606e6eb 100644
--- a/Build/source/texk/web2c/uptexdir/upbibtex.ch
+++ b/Build/source/texk/web2c/uptexdir/upbibtex.ch
@@ -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.
+
+@x [0] only print chnages
+\def\title{\BibTeX\ }
+@y
+\let\maybe=\iffalse
+\def\title{J\BibTeX\ 0.36 Changes for C Version \BibTeX\ }
+@z
+
+@x
+ \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}
+@z
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1] banner
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x
-@d my_name=='pbibtex'
-@d banner=='This is pBibTeX, Version 0.99d-j0.35'
+@d my_name=='bibtex'
+@d banner=='This is BibTeX, Version 0.99d' {printed when the program starts}
@y
@d my_name=='upbibtex'
-@d banner=='This is upBibTeX, Version 0.99d-j0.35-u1.29'
+@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), ')');
+@z
+
+@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);
+@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
-@x
-for i:=@'200 to @'237 do xord[i]:= i-@'200;
-for i:=@'240 to 255 do xord[i]:=i;
+@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
-@x
-@d zen_pun_first = 161 {Zenkaku punctuation first byte; in EUC}
-@d zen_space = 161 {Zenkaku space first, second byte; in EUC}
-@d zen_kuten = 162 {Zenkaku kuten second byte; in EUC}
-@d zen_ten = 163 {Zenkaku ten second byte; in EUC}
-@d zen_comma = 164 {Zenkaku comman second byte; in EUC}
-@d zen_period = 165 {Zenkaku period second byte; in EUC}
-@d zen_question = 169 {Zenkaku question mark second byte; in EUC}
-@d zen_exclamation = 170 {Zenkaku exclamation mark second byte; in EUC}
+
+@x Changes for JBibTeX by Shouichi Matsui for ver. 0.30
+@d period = "." {these are three}
+@d question_mark = "?" {string-ending characters}
+@d exclamation_mark = "!" {of interest in \.{add.period\$}}
@y
+@d period = "." {these are three}
+@d question_mark = "?" {string-ending characters}
+@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,21 +123,114 @@ for i:=@'200 to 255 do xord[i]:=i;
@d u_exclam_question = @"2049 {Zenkaku exclamation question mark; in UCS}
@z
-@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.
+@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
-@x
-for i:=@'200 to @'237 do id_class[i] := illegal_id_char;
+@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
-@x
-for i:=@'240 to 254 do char_width[i]:=514;
+@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
+
+@x [48] JBibTeX and dynamic buf_size.
+label loop_exit;
+@y
+label loop_exit;
+var i:c_int_type;
+@z
+@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}
+@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;
@z
@x procedure lower_case
@@ -196,11 +357,14 @@ if (len > 0) then
end
@z
-@x procedure get_the_top_level_aux_file_name
+@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 @@ begin
@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;
+@y
+init_kanji;
+parse_arguments;
+@z
+
+% pBibTeX: do not break at |white_space| after Japanese characters (2022-02-08 j0.34)
+@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);
+@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);
+@z
+@x "Break that unbreakably long line"
+ if (lex_class[out_buf[out_buf_ptr]] <> white_space) then
+ incr(out_buf_ptr)
+@y
+ if (lex_class[out_buf[out_buf_ptr]] <> white_space) or
+ (out_buf[out_buf_ptr-1] > 127) then
+ incr(out_buf_ptr)
+@z
+
+@x Changes for JBibTeX by Shouichi Matsui [332]
+@!b_write : hash_loc; {\.{write\$}}
+@!b_default : hash_loc; {either \.{skip\$} or \.{default.type}}
+@y
+@!b_write : hash_loc; {\.{write\$}}
+@!b_is_kanji_str : hash_loc; {\.{is.kanji.str\$}}
+@!b_default : hash_loc; {either \.{skip\$} or \.{default.type}}
+@z
+
+@x Changes for JBibTeX by Shouichi Matsui [334]
+@d n_write = 36 {\.{write\$}}
+
+@<Constants in the outer block@>=
+@!num_blt_in_fns = 37; {one more than the previous number}
+@y
+@d n_write = 36 {\.{write\$}}
+@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}
+@z
+
+@x Changes for JBibTeX by Shouichi Matsui [335]
+build_in('write$ ',6,b_write,n_write);
+@y
+build_in('write$ ',6,b_write,n_write);
+build_in('is.kanji.str$',13,b_is_kanji_str,n_is_kanji_str);
+@z
+
+@x Changes for JBibTeX by Shouichi Matsui [342]
+ n_write : x_write;
+ othercases confusion ('Unknown built-in function')
+endcases;
+end
+@y
+ n_write : x_write;
+ n_is_kanji_str: x_is_kanji_str;
+ othercases confusion ('Unknown built-in function')
+endcases;
+end
+@z
+
+@x Changes for JBibTeX by Shouichi Matsui [343]
+@<|execute_fn|({\.{write\$}})@>@;
+@<|execute_fn| itself@>
+@y
+@<|execute_fn|({\.{write\$}})@>@;
+@<|execute_fn|({\.{is.kanji.str\$}})@>@;
+@<|execute_fn| itself@>
+@z
+
+@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 @@ begin
@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
-@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;
+@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 @@ begin
(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
-@x
- zen_pun_first:
+@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
-@z
-@x
- else if(ex_buf[ex_buf_ptr+1]=zen_space) then
-@y
+ begin
+ preceding_white := false;
+ and_found := true
+ end
else if (fromBUFF(ex_buf,ex_buf_length,ex_buf_ptr) = e_space) then
-@z
-@x
- end;
-@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 @@ begin
end;
@z
-@x
- if( ex_buf[ex_buf_ptr] > 127 ) then
- ex_buf_ptr := ex_buf_ptr +2
- else
- incr(ex_buf_ptr);
+@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
-@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]);
+@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 @@ begin
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,40 +716,40 @@ begin
append_char (BYTE4(k));
push_lit_stk (make_string, stk_str);
end;
+end;
+end;
@z
-@x
-@!pop_lit2_saved: integer;
+@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}
+@z
+
+@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;
@y
{ |2..4| bytes Kanji code break check }
tps:=str_start[pop_lit3];
@@ -437,36 +773,48 @@ if (pop_lit2_saved < -1) and (tpe = str_start[pop_lit3+1]) then
if tps > tpe then tpe := tps;
sp_ptr := tps;
sp_end := tpe;
-@z
-@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;
-@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
-@x
- incr(sp_xptr1); num_text_chars:=num_text_chars+2;
+@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 @@ const n_options = 9; {Pascal won't count array lengths for us.}
@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 @@ const n_options = 9; {Pascal won't count array lengths for us.}
@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);
+@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.
+@.-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);
+@z
+
+@x
@ An element with all zeros always ends the list.
@y
@ Kanji-internal option.
@@ -499,30 +891,41 @@ incr(current_option);
@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
-@x procedure x_is_kanji_str
-procedure x_is_kanji_str;
-label exit;
+@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;
-@z
-
-@x procedure x_is_kanji_str (cont.)
- 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;
-@y
+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
clen := multibytelen(str_pool[sp_ptr]);
if sp_ptr+clen<=sp_end then
@@ -539,11 +942,8 @@ var ctmp,clen:integer;
incr(sp_ptr);
end;
end;
-@z
-
-@x
-exit:end;
-@y
+ push_lit_stk(0,stk_int);
+ end;
exit:end;
@ @<Procedures and functions for handling numbers, characters, and strings@>=
@@ -605,4 +1005,3 @@ else
char_width[e_ss3]:=0;
end;
@z
-