summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c')
-rw-r--r--Build/source/texk/web2c/ChangeLog6
-rw-r--r--Build/source/texk/web2c/bibtex.ch34
2 files changed, 37 insertions, 3 deletions
diff --git a/Build/source/texk/web2c/ChangeLog b/Build/source/texk/web2c/ChangeLog
index 38bd2295bb0..ea4fa468e19 100644
--- a/Build/source/texk/web2c/ChangeLog
+++ b/Build/source/texk/web2c/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-18 Karl Berry <karl@tug.org>
+
+ * bibtex.ch (str_ends_with): new fn.
+ (print_bib_name, log_pr_bib_name): don't print foo.bib.bib
+ when given \bibdata{foo.bib}.
+
2018-02-03 Hironobu Yamashita <h.y.acetaminophen@gmail.com>
* lib/texmfmp.c, texmfmp.h: XeTeX properly close input pipes.
diff --git a/Build/source/texk/web2c/bibtex.ch b/Build/source/texk/web2c/bibtex.ch
index 5653ca9f805..344dde782ae 100644
--- a/Build/source/texk/web2c/bibtex.ch
+++ b/Build/source/texk/web2c/bibtex.ch
@@ -831,7 +831,7 @@ end;
@!bib_number = integer; {gives the |bib_list| range}
@z
-@x [122] Add log_pr_bib_name.
+@x [122] Don't print extension twice; add log_pr_bib_name function.
procedure print_bib_name;
begin
print_pool_str (cur_bib_str);
@@ -839,17 +839,45 @@ print_pool_str (s_bib_extension);
print_newline;
end;
@y
+{Return true if the |ext| string is at the end of the |s| string. There
+ are surely far more clever ways to do this, but it doesn't matter.}
+function str_ends_with (@!s:str_number; @!ext:str_number) : boolean;
+var i : integer;
+ str_idx,ext_idx : integer;
+ str_char,ext_char : ASCII_code;
+begin
+ str_ends_with := false;
+ if (length (ext) > length (s)) then
+ return; {if extension is longer, they don't match}
+ str_idx := length (s) - 1;
+ ext_idx := length (ext) - 1;
+ while (ext_idx >= 0) do begin {|>=| so we check the |'.'| char.}
+ str_char := str_pool[str_start[s]+str_idx];
+ ext_char := str_pool[str_start[ext]+ext_idx];
+ if (str_char <> ext_char) then
+ return;
+ decr (str_idx);
+ decr (ext_idx);
+ end;
+ str_ends_with := true;
+exit: end;
+
+{The above is needed because the file name specified in the
+ \.{\\bibdata} command may or may not have the \.{.bib} extension. If it
+ does, we don't want to print \.{.bib} twice.}
procedure print_bib_name;
begin
print_pool_str (cur_bib_str);
-print_pool_str (s_bib_extension);
+if not str_ends_with (cur_bib_str, s_bib_extension) then
+ print_pool_str (s_bib_extension);
print_newline;
end;
@#
procedure log_pr_bib_name;
begin
log_pr_pool_str (cur_bib_str);
-log_pr_pool_str (s_bib_extension);
+if not str_ends_with (cur_bib_str, s_bib_extension) then
+ log_pr_pool_str (s_bib_extension);
log_pr_newline;
end;
@z