diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:51:33 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:51:33 +0000 |
commit | 71e0c81c27ec1453263113692bf1cbe5b649fd87 (patch) | |
tree | 0052a8a7d93c3770393ece0469e6d13a4db07495 /Master/texmf-dist/source/latex/camel/bibtex.ch | |
parent | c527dbf71da60b363477eb3371989b216625a359 (diff) |
trunk/Master/texmf-dist/source/latex/camel
git-svn-id: svn://tug.org/texlive/trunk@178 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/camel/bibtex.ch')
-rw-r--r-- | Master/texmf-dist/source/latex/camel/bibtex.ch | 768 |
1 files changed, 768 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/camel/bibtex.ch b/Master/texmf-dist/source/latex/camel/bibtex.ch new file mode 100644 index 00000000000..df54f2e2d69 --- /dev/null +++ b/Master/texmf-dist/source/latex/camel/bibtex.ch @@ -0,0 +1,768 @@ +% Change file for BibTeX in C, originally by Howard Trickey, for +% Berkeley Unix. +% +% History: +% 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. +% (more recent changes in ../ChangeLog.W2C) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1] banner +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is BibTeX, Version 0.99c' {printed when the program starts} +@y +@d banner=='This is BibTeX, Version 0.99c' {more is printed later} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2] `term_in' and `term_out' are standard input and output. But +% there is a complication: BibTeX passes `term_out' to some routines as +% a var parameter. web2c turns a var parameter f into &f at the calling +% side -- and stdout is sometimes implemented as `&_iob[1]' or some +% such. An address of an address is invalid. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d term_out == tty +@d term_in == tty +@y +@d term_out == standard_output +@d term_in == standard_input +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4] Turn debug..gubed et al. into #ifdef's. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d debug == @{ { remove the `|@{|' when debugging } +@d gubed == @t@>@} { remove the `|@}|' when debugging } +@f debug == begin +@f gubed == end +@# +@d stat == @{ { remove the `|@{|' when keeping statistics } +@d tats == @t@>@} { remove the `|@}|' when keeping statistics } +@f stat == begin +@f tats == end +@# +@d trace == @{ { remove the `|@{|' when in |trace| mode } +@d ecart == @t@>@} { remove the `|@}|' when in |trace| mode } +@f trace == begin +@f ecart == end +@y +@d debug == ifdef('DEBUG') +@d gubed == endif('DEBUG') +@f debug == begin +@f gubed == end +@# +@d stat == ifdef('STAT') +@d tats == endif('STAT') +@f stat==begin +@f tats==end +@# +@d trace == ifdef@&('TRACE') +@d ecart == endif@&('TRACE') +@f trace == begin +@f ecart == end +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [10] Don't print the banner unless verbose. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print_ln(banner);@/ +@y +if verbose then begin + print (banner); + print_ln (version_string); +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [10] Possibly exit with bad status. It doesn't seem worth it to move +% the definitions of the |history| values to above this module; hence +% the 1. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +exit_program: +end. +@y +exit_program: +if (history > 1) then uexit (history); +end. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11] Remove compiler directives. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead} +@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [13] Remove nonlocal goto. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + goto exit_program; +@y + uexit (1); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [14] Increase some constants. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!buf_size=1000; {maximum number of characters in an input line (or string)} +@y +@!buf_size=3000; {maximum number of characters in an input line (or string)} +@z +@x +@!max_bib_files=20; {maximum number of \.{.bib} files allowed} +@y +@!max_bib_files=1000; {maximum number of \.{.bib} files allowed} +@z +@x +@!pool_size=65000; {maximum number of characters in strings} +@y +@!pool_size=512000; {maximum number of characters in strings} +@z +@x +@!max_strings=4000; {maximum number of strings, including pre-defined; + must be |<=hash_size|} +@y +@!max_strings=20000; {maximum number of strings, including pre-defined; + must be |<=hash_size|} +@z +@x +@!max_cites=750; {maximum number of distinct cite keys; must be + |<=max_strings|} +@y +@!max_cites=3000; {maximum number of distinct cite keys; must be + |<=max_strings|} +@z +@x +@!min_crossrefs=2; {minimum number of cross-refs required for automatic + |cite_list| inclusion} +@y +{|min_crossrefs| can be set at runtime now.} +@z +@x +@!wiz_fn_space=3000; {maximum amount of |wiz_defined|-function space} +@y +@!wiz_fn_space=10000; {maximum amount of |wiz_defined|-function space} +@z +@x +@!single_fn_space=100; {maximum amount for a single |wiz_defined|-function} +@y +@!single_fn_space=200; {maximum amount for a single |wiz_defined|-function} +@z +@x +@!max_ent_ints=3000; {maximum number of |int_entry_var|s + (entries $\times$ |int_entry_var|s)} +@y +@!max_ent_ints=25000; {maximum number of |int_entry_var|s + (entries $\times$ |int_entry_var|s)} +@z +@x +@!max_ent_strs=3000; {maximum number of |str_entry_var|s + (entries $\times$ |str_entry_var|s)} +@y +@!max_ent_strs=10000; {maximum number of |str_entry_var|s + (entries $\times$ |str_entry_var|s)} +@z +@x +@!max_fields=17250; {maximum number of fields (entries $\times$ fields, + about |23*max_cites| for consistency)} +@y +@!max_fields=69000; {maximum number of fields (entries $\times$ fields, + about |23*max_cites| for consistency)} +@z +@x +@d hash_size=5000 {must be |>= max_strings| and |>= hash_prime|} +@y +@d hash_size=21000 {must be |>= max_strings| and |>= hash_prime|} +@z +@x +@d hash_prime=4253 {a prime number about 85\% of |hash_size| and |>= 128| + and |< @t$2^{14}-2^6$@>|} +@y +@d hash_prime=16319 {a prime number about 85\% of |hash_size| and |>= 128| + and |< @t$2^{14}-2^6$@>|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [15] Use the system constant. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d file_name_size=40 {file names shouldn't be longer than this} +@y +@d file_name_size == PATH_MAX +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [22, 23, 27, 28] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x [22] +@!ASCII_code=0..127; {seven-bit numbers} +@y +@!ASCII_code=0..255; {eight-bit numbers} +@z + +@x [23] +@d text_char == char {the data type of characters in text files} +@d first_text_char=0 {ordinal number of the smallest element of |text_char|} +@d last_text_char=127 {ordinal number of the largest element of |text_char|} + +@<Local variables for initialization@>= +i:0..last_text_char; {this is the first one declared} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@d first_text_char=0 {ordinal number of the smallest element of |text_char|} +@d last_text_char=255 {ordinal number of the largest element of |text_char|} + +@<Local variables for initialization@>= +i:integer; +@z + +@x [27] +for i:=1 to @'37 do xchr[i]:=' '; +xchr[tab]:=chr(tab); +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +@x [28] +for i:=first_text_char to last_text_char do xord[chr(i)]:=invalid_code; +for i:=1 to @'176 do xord[xchr[i]]:=i; +@y +for i:=first_text_char to last_text_char do xord[xchr[i]]:=i; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32] Make RET a `white_space' character, so we won't choke on DOS +% files, which end in a CR/LF pair. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +lex_class[tab] := white_space; +@y +lex_class[tab] := white_space; +lex_class[13] := white_space; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [36] Define `alpha_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!alpha_file=packed file of text_char; {files that contain textual data} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [37] Can't do arithmetic with |file_name_size| any longer, sigh. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!name_ptr:0..file_name_size+1; {index variable into |name_of_file|} +@y +@!name_ptr:integer; {index variable into |name_of_file|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [38] File opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The \ph\ compiler with which the present version of \TeX\ was prepared has +extended the rules of \PASCAL\ in a very convenient way. To open file~|f|, +we can write +$$\vbox{\halign{#\hfil\qquad&#\hfil\cr +|reset(f,@t\\{name}@>,'/O')|&for input;\cr +|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$ +The `\\{name}' parameter, which is of type `\ignorespaces|packed +array[@t\<\\{any}>@>] of text_char|', stands for the name of +the external file that is being opened for input or output. +Blank spaces that might appear in \\{name} are ignored. + +The `\.{/O}' parameter tells the operating system not to issue its own +error messages if something goes wrong. If a file of the specified name +cannot be found, or if such a file cannot be opened for some other reason +(e.g., someone may already be trying to write the same file), we will have +|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows +\TeX\ to undertake appropriate corrective action. + +\TeX's file-opening procedures return |false| if no file identified by +|name_of_file| could be opened. + +@d reset_OK(#)==erstat(#)=0 +@d rewrite_OK(#)==erstat(#)=0 + +@<Procedures and functions for file-system interacting@>= +function erstat(var f:file):integer; extern; {in the runtime library} +@#@t\2@> +function a_open_in(var f:alpha_file):boolean; {open a text file for input} +begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f); +end; +@# +function a_open_out(var f:alpha_file):boolean; {open a text file for output} +begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f); +end; +@y +@ File opening will be done in C. +@d no_file_path = -1 +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [39] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Procedures and functions for file-system interacting@>= +procedure a_close(var f:alpha_file); {close a text file} +begin close(f); +end; +@y +File closing will be done in C, too. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [47] web2c doesn't understand f^. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + buffer[last]:=xord[f^]; + get(f); incr(last); + end; + get(f); +@y + buffer[last] := xord[getc (f)]; + incr (last); + end; + vgetc (f); {skip the eol} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [77] The predefined string array starts at zero instead of one. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=1 to len do + buffer[i] := xord[pds[i]]; +@y +for i:=1 to len do + buffer[i] := xord[pds[i-1]]; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [97] Can't do this tangle-time arithmetic. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!aux_name_length : 0..file_name_size+1; {\.{.aux} name sans extension} +@y +@!aux_name_length : integer; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [100] Reading the aux file name and command-line processing. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This procedure consists of a loop that reads and processes a (nonnull) +\.{.aux} file name. It's this module and the next two that must be +changed on those systems using command-line arguments. Note: The +|term_out| and |term_in| files are system dependent. + +@<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 @<Variables for possible command-line processing@>@/ +begin +check_cmnd_line := false; {many systems will change this} +loop + begin + if (check_cmnd_line) then + @<Process a possible command line@> + else + begin + write (term_out,'Please type input file name (no extension)--'); + if (eoln(term_in)) then {so the first |read| works} + read_ln (term_in); + aux_name_length := 0; + while (not eoln(term_in)) do + begin + if (aux_name_length = file_name_size) then + begin + while (not eoln(term_in)) do {discard the rest of the line} + get(term_in); + sam_you_made_the_file_name_too_long; + end; + incr(aux_name_length); + name_of_file[aux_name_length] := term_in^; + get(term_in); + end; + end; + @<Handle this \.{.aux} name@>; +aux_not_found: + check_cmnd_line := false; + end; +aux_found: {now we're ready to read the \.{.aux} file} +end; +@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 @<Variables for possible command-line processing@>@/ +begin +loop + begin + {initialize the path variables} + set_paths (BIB_INPUT_PATH_BIT + BST_INPUT_PATH_BIT); + if (argc > 1) then + @<Process a possible command line@> + else begin + write (term_out,'Please type input file name (no extension)--'); + aux_name_length := 0; + while (not eoln(term_in)) do begin + if (aux_name_length = file_name_size) then begin + readln(term_in); + sam_you_made_the_file_name_too_long; + end; + name_of_file[aux_name_length+1] := getc(term_in); + incr(aux_name_length); + end; + if (eof(term_in)) then begin + writeln(term_out); + writeln(term_out, + 'Unexpected end of file on terminal---giving up!'); + uexit(1); + end; + readln(term_in); + end; + @<Handle this \.{.aux} name@>; +aux_not_found: + argc := 0; + end; +aux_found: {now we're ready to read the \.{.aux} file} +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [101] Don't need this variable; we use argc to check if we have a +% command line. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Variables for possible command-line processing@>= +@!check_cmnd_line : boolean; {|true| if we're to check the command line} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [102] Get the aux file name from the command line. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Process a possible command line@>= +begin +do_nothing; {the ``default system'' doesn't use the command line} +end +@y +@<Process a possible command line@>= +begin + if argc > n_options + arg_options + 3 + then begin + print ('Usage: bibtex '); + print ('[-verbose] '); + print ('[-min-crossrefs=<number>] '); + print_ln ('[<aux file>].'); +@.Usage: ...@> + uexit (1); + end; + + @<Initialize the option variables@>; + @<Parse arguments@>; + + argv (optind, name_of_file); + aux_name_length := 1; + while name_of_file[aux_name_length] <> ' ' + do incr (aux_name_length); + decr (aux_name_length); +end +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [106] Don't use a path to find the aux file. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (not a_open_in(cur_aux_file)) then + sam_you_made_the_file_name_wrong; +@y +if (not a_open_in(cur_aux_file,no_file_path)) then + sam_you_made_the_file_name_wrong; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [110] Be silent unless verbose. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print ('The top-level auxiliary file: '); +print_aux_name; +@y +if verbose then begin + print ('The top-level auxiliary file: '); + print_aux_name; +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [123] Use BIBINPUTS to search for the .bib file. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (not a_open_in(cur_bib_file)) then + begin + add_area (s_bib_area); + if (not a_open_in(cur_bib_file)) then + open_bibdata_aux_err ('I couldn''t open database file '); + end; +@y +if (not a_open_in(cur_bib_file,BIB_INPUT_PATH)) then + open_bibdata_aux_err ('I couldn''t open database file '); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [127] Use BSTINPUTS/TEXINPUTS to search for .bst files. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +add_extension (s_bst_extension); +if (not a_open_in(bst_file)) then + begin + add_area (s_bst_area); + if (not a_open_in(bst_file)) then + begin + print ('I couldn''t open style file '); + print_bst_name;@/ + bst_str := 0; {mark as unused again} + aux_err_return; + end; + end; +@y +add_extension (s_bst_extension); +if (not a_open_in(bst_file,BST_INPUT_PATH)) then + begin + print ('I couldn''t open style file '); + print_bst_name;@/ + bst_str := 0; {mark as unused again} + aux_err_return; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [127] Be silent unless verbose. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print ('The style file: '); +print_bst_name; +@y +if verbose then begin + print ('The style file: '); + print_bst_name; +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [141] Don't use a path to search for subsidiary aux files, either. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (not a_open_in(cur_aux_file)) then +@y +if (not a_open_in(cur_aux_file, no_file_path)) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [151] This goto gets turned into a setjmp/longjmp by ./convert -- +% unfortunately, it is a nonlocal goto. ekrell@ulysses@att.com +% implemented the conversion. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +buf_ptr2 := last; {to get the first input line} +loop + begin + if (not eat_bst_white_space) then {the end of the \.{.bst} file} + goto bst_done; + get_bst_command_and_process; + end; +bst_done: a_close (bst_file); +@y +buf_ptr2 := last; {to get the first input line} +hack1; + begin + if (not eat_bst_white_space) then {the end of the \.{.bst} file} + hack2; + get_bst_command_and_process; + end; +bst_done: a_close (bst_file); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [198] A variable named `int' is no good in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Procedures and functions for handling numbers, characters, and strings@>= +@y +@d int == the_int + +@<Procedures and functions for handling numbers, characters, and strings@>= +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [223] Be silent unless verbose. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + print ('Database file #',bib_ptr+1:0,': '); + print_bib_name;@/ +@y + if verbose then begin + print ('Database file #',bib_ptr+1:0,': '); + print_bib_name; + end; +@z + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [388] bibtex.web has mutually exclusive tests here; Oren said he +% doesn't want to fix it until 1.0, since it's obviously of no practical +% import (or someone would have found it before GCC 2 did). Changing +% the second `and' to an `or' makes all but the last of multiple authors +% be omitted in the bbl file, so I simply removed the statement. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +while ((ex_buf_xptr < ex_buf_ptr) and + (lex_class[ex_buf[ex_buf_ptr]] = white_space) and + (lex_class[ex_buf[ex_buf_ptr]] = sep_char)) do + incr(ex_buf_xptr); {this removes leading stuff} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [467] System-dependent changes: option handling. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@* System-dependent changes. +@^system dependencies@> +This section should be replaced, if necessary, by changes to the program +that are necessary to make \BibTeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the printed program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@y +@* System-dependent changes. We want to parse a Unix-style command line. +@^system dependencies@> + +This macro tests if its argument is the current option, as represented +by the index variable |option_index|. + +@d argument_is (#) == (strcmp (long_options[option_index].name, #) = 0) + +@<Parse arguments@> = +begin + @<Define the option table@>; + repeat + getopt_return_val := getopt_long_only (argc, gargv, '', long_options, + address_of_int (option_index)); + if getopt_return_val <> -1 + then begin + if getopt_return_val = "?" + then uexit (1); {|getopt| has already given an error message.} + + if argument_is ('min-crossrefs') + then begin + min_crossrefs := atoi (optarg); + end + + else + {It was just a flag; |getopt| has already done the assignment.} + do_nothing; + + end; + until getopt_return_val = -1; + + {Now |optind| is the index of first non-option on the command line.} +end + + +@ The array of information we pass in. The type |getopt_struct| is +defined in C, to avoid type clashes. We also need to know the return +value from getopt, and the index of the current option. + +@<Variables for possible command-line...@> = +@!long_options: array[0..n_options] of getopt_struct; +@!getopt_return_val: integer; +@!option_index: c_int_type; +@!current_option: 0..n_options; + +@ Here is the first of the options we allow. +@.-verbose@> + +@<Define the option...@> = +current_option := 0; +long_options[0].name := 'verbose'; +long_options[0].has_arg := 0; +long_options[0].flag := address_of_int (verbose); +long_options[0].val := 1; +incr (current_option); + +@ The global variable |verbose| determines whether or not we print +progress information. + +@<Glob...@> = +@!verbose: c_int_type; + +@ It starts off |false|. + +@<Initialize the option...@> = +verbose := false; + + +@ Here is an option to change the minimum number of cross-refs required +for automatic |cite_list| inclusion. +@.-min-crossrefs@> + +@<Define the option...@> = +long_options[current_option].name := 'min-crossrefs'; +long_options[current_option].has_arg := 1; +long_options[current_option].flag := 0; +long_options[current_option].val := 0; +incr (current_option); + +@ +@<Glob...@> = +@!min_crossrefs: integer; + +@ Set |min_crossrefs| to two by default, so we match the +documentation (\.{btxdoc.tex}). + +@<Initialize the option...@> = +min_crossrefs := 2; + + +@ An element with all zeros always ends the list. + +@<Define the option...@> = +long_options[current_option].name := 0; +long_options[current_option].has_arg := 0; +long_options[current_option].flag := 0; +long_options[current_option].val := 0; + + +@ Pascal compilers won't count the number of elements in an array +constant for us. This doesn't include the zero-element at the end, +because this array starts at index zero. + +@<Constants...@> = +@!n_options = 2; +@!arg_options = 1; +@z |