diff options
author | Karl Berry <karl@freefriends.org> | 2010-03-01 18:42:45 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2010-03-01 18:42:45 +0000 |
commit | 3dfed15293bcc13fe005211af237271d15e33670 (patch) | |
tree | 9cdb2a26bde6a8f70857d6918a9f339755321b73 /Build/source/texk/web2c/bibtex.web | |
parent | f437f873abf5f480b2fa40298e1423082409b6e7 (diff) |
bibtex 0.99d-test1 from Oren, breaking .bbl lines only at whitespace
git-svn-id: svn://tug.org/texlive/trunk@17253 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/bibtex.web')
-rw-r--r-- | Build/source/texk/web2c/bibtex.web | 78 |
1 files changed, 50 insertions, 28 deletions
diff --git a/Build/source/texk/web2c/bibtex.web b/Build/source/texk/web2c/bibtex.web index e465a33c48d..614143d5e2c 100644 --- a/Build/source/texk/web2c/bibtex.web +++ b/Build/source/texk/web2c/bibtex.web @@ -1,4 +1,5 @@ -% This program is copyright (C) 1985 by Oren Patashnik; all rights reserved. +% This program is copyright (C) 1985, 1988, 2010 by Oren Patashnik; +% all rights reserved. % Copying of this file is authorized only if (1) you are Oren Patashnik, or if % (2) you make absolutely no changes to your copy. (The WEB system provides % for alterations via an auxiliary file; the master file should stay intact.) @@ -32,8 +33,12 @@ % Version 0.99c was released in February 1988. It removed two begin-end pairs % that, for convention only, surrounded entire modules, but that elicited % label-related complaints from some compilers. +% Version 0.99d was released in March 2010. It made output lines breakable +% only at white_space (so that, for example, URLs would not be broken). +% Other known bugs (all minor) will be fixed in a subsequent release. +% THIS IS BibTeX 0.99d TEST VERSION 1; PLEASE DO NOT RELEASE -% Please report any bugs to Oren Patashnik (PATASHNIK@@SCORE.STANFORD.EDU) +% Please report any bugs to biblio@@tug.org % Although considerable effort has been expended to make the BibTeX program % correct and reliable, no warranty is implied; the author disclaims any @@ -131,7 +136,7 @@ style writers would be eternally grateful, if only they knew. The |banner| string defined here should be changed whenever \BibTeX\ gets modified. -@d banner=='This is BibTeX, Version 0.99c' {printed when the program starts} +@d banner=='This is BibTeX, Version 0.99dtest' {printed when the program starts} @ @@ -7573,14 +7578,16 @@ This procedure adds to the output buffer the given string in length of the current string in |out_buf|, and thus also gives the location for the next character. If there are enough characters present in the output buffer, it writes one or more lines out to the -\.{.bbl} file. It may break a line at any |white_space| character it -likes, but if it does, it will add two |space|s to the next output -line. +\.{.bbl} file. It breaks a line only at a |white_space| character, +and when it does, it adds two |space|s to the next output line. @<Procedures and functions for style-file function execution@>= procedure add_out_pool (@!p_str : str_number); +label loop1_exit,loop2_exit; var break_ptr : buf_pointer; {the first character following the line break} @!end_ptr : buf_pointer; {temporary end-of-buffer pointer} +break_pt_found : boolean; {a suitable |white_space| character} +unbreakable_tail : boolean; {because it contains no |white_space| character} begin p_ptr1 := str_start[p_str]; p_ptr2 := str_start[p_str+1]; @@ -7594,7 +7601,8 @@ while (p_ptr1 < p_ptr2) do incr(out_buf_ptr); end; out_buf_length := out_buf_ptr; -while (out_buf_length > max_print_line) do +unbreakable_tail := false; +while ((out_buf_length > max_print_line) and (not unbreakable_tail)) do @<Break that line@>; end; @@ -7604,19 +7612,25 @@ Here we break the line by looking for a |white_space| character, backwards from |out_buf[max_print_line]| until |out_buf[min_print_line]|; we break at the |white_space| and indent the next line two |space|s. The next module handles things when -there's no |white_space| character to break at. +there's no |white_space| character to break at. (It seems that the +annoyances to the average user of a warning message when there's an +output line longer than |max_print_line| outweigh the benefits, so we +don't issue such warnings in the current code.) @<Break that line@>= begin end_ptr := out_buf_length; out_buf_ptr := max_print_line; +break_pt_found := false; while ((lex_class[out_buf[out_buf_ptr]] <> white_space) and (out_buf_ptr >= min_print_line)) do decr(out_buf_ptr); if (out_buf_ptr = min_print_line-1) then {no |white_space| character} - @<Break that unbreakable line@> + @<Break that unbreakably long line@> {(if |white_space| follows)} else - begin {hit a |white_space| character} + break_pt_found := true; {hit a |white_space| character} +if (break_pt_found) then + begin out_buf_length := out_buf_ptr; break_ptr := out_buf_length + 1; output_bbl_line; {output what we can} @@ -7636,27 +7650,35 @@ end @ -If there's no |white_space| character to break the line at, we break -it at |out_buf[max_print_line-1]|, append a |comment| character, and -don't indent the next line. +If there's no |white_space| character up through +|out_buf[max_print_line]|, we instead break the line at the first +following |white_space| character, if one exists. And if, starting +with that |white_space| character, there are multiple consecutive +|white_space| characters, |out_buf_ptr| points to the last of them. +If no |white_space| character exists, we haven't found a viable break +point, so we don't break the line (yet). -@<Break that unbreakable line@>= +@<Break that unbreakably long line@>= begin -out_buf[end_ptr] := out_buf[max_print_line-1]; {save this character} -out_buf[max_print_line-1] := comment; {so \TeX\ does the thing right} -out_buf_length := max_print_line; -break_ptr := out_buf_length - 1; {the `|-1|' allows for the restoration} -output_bbl_line; {output what we can,} -out_buf[max_print_line-1] := out_buf[end_ptr]; {restore this character} -out_buf_ptr := 0; -tmp_ptr := break_ptr; -while (tmp_ptr < end_ptr) do {and slide the rest down} - begin - out_buf[out_buf_ptr] := out_buf[tmp_ptr]; - incr(out_buf_ptr); - incr(tmp_ptr); +out_buf_ptr := max_print_line + 1; {|break_pt_found| is still |false|} +while (out_buf_ptr < end_ptr) do + if (lex_class[out_buf[out_buf_ptr]] <> white_space) then + incr(out_buf_ptr) + else + goto loop1_exit; +loop1_exit: +if (out_buf_ptr = end_ptr) then + unbreakable_tail := true {because no |white_space| character} +else {hit |white_space|, and |out_buf_ptr < end_ptr|} + begin + break_pt_found := true; + while (out_buf_ptr+1 < end_ptr) do {look for more |white_space|} + if (lex_class[out_buf[out_buf_ptr+1]] = white_space) then + incr(out_buf_ptr) {which then points to |white_space|} + else + goto loop2_exit; +loop2_exit: end; -out_buf_length := end_ptr - break_ptr; end |