/*- ****************************************************************************** ****************************************************************************** ** ** MODULE ** ** file: bibtex.h ** ** DESCRIPTION ** ** A 32-bit implementation of BibTeX v0.99c for MS-DOS, OS/2 2.x, ** Unix and VMS. This C language implementation is based on the ** original WEB source but it has been enhanced to support 8-bit input ** characters and a very large processing capacity. ** ** For documentation describing how to use and build this program, ** see the 00README.TXT file that accompanies this distribution. ** ** MODULE CONTENTS ** ** This module defines the macros used in the BibTeX WEB source. ** This file also contains the definitions that determine BibTeX's ** processing capacity. ** ** AUTHORS ** ** Original WEB translation to C, conversion to "big" (32-bit) capacity, ** addition of run-time selectable capacity and 8-bit support extensions ** by: ** ** Niel Kempson ** Snowy Owl Systems Limited, Cheltenham, England ** E-mail: kempson@snowyowl.co.uk ** ** 8-bit support extensions also by: ** ** Alejandro Aguilar-Sierra ** Centro de Ciencias de la Atm\'osfera, ** Universidad Nacional Aut\'onoma de M\'exico, M\'exico ** E-mail: asierra@servidor.unam.mx ** ** COPYRIGHT ** ** This implementation copyright (c) 1991-1995 by Niel Kempson ** and copyright (c) 1995 by Alejandro Aguilar-Sierra. ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 1, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** ** In other words, you are welcome to use, share and improve this ** program. You are forbidden to forbid anyone else to use, share ** and improve what you give them. Help stamp out software-hoarding! ** ** ACKNOWLEDGEMENT ** ** The original BibTeX was written by Oren Patashnik using Donald ** Knuth's WEB system. This format produces a PASCAL program for ** execution and a TeX documented version of the source code. This ** program started as a (manual) translation of the WEB source into C. ** ** CHANGE LOG ** ** $Log: bibtex.h,v $ ** Revision 3.71 1996/08/18 20:47:30 kempson ** Official release 3.71 (see HISTORY file for details). ** ** Revision 3.70 1996/04/08 10:08:40 kempson ** Final documentation & cosmetic changes for official release 3.70. ** ** Revision 3.5 1995/09/24 20:44:37 kempson ** Many changes for final beta test version. ** ** Revision 3.4 1995/04/09 22:15:43 kempson ** Placed under RCS control ** ****************************************************************************** ****************************************************************************** */ #ifndef __BIBTEX_H__ #define __BIBTEX_H__ 1 /*************************************************************************** * WEB section number: 1 * ~~~~~~~~~~~~~~~~~~~ * The BANNER string is defined here and should be changed whenever BibTeX * is modified. ***************************************************************************/ #ifdef UTF_8 # define BANNER "This is BibTeXu: a UTF-8 Big BibTeX version 0.99d" # define PROGNAME "bibtexu" # define SUPPORT_8BIT #else # ifdef SUPPORT_8BIT # define BANNER "This is 8-bit Big BibTeX version 0.99d" # else # define BANNER "This is Big BibTeX version 0.99d" # endif # define PROGNAME "bibtex8" #endif /*************************************************************************** * WEB section number: 2 * ~~~~~~~~~~~~~~~~~~~ * Terminal output goes to the file |TERM_OUT|, while terminal input comes * from |TERM_IN|. On our system, these (system-dependent) files are * already opened at the beginning of the program. ***************************************************************************/ #define TERM_OUT stdout #define TERM_IN stdin /*************************************************************************** * WEB section number: 3 * ~~~~~~~~~~~~~~~~~~~ * This program uses the term |print| instead of |write| when writing on * both the |log_file| and (system-dependent) |term_out| file, and it * uses |trace_pr| when in |trace| mode, for which it writes on just the * |log_file|. If you want to change where either set of macros writes * to, you should also change the other macros in this program for that * set; each such macro begins with |print_| or |trace_pr_|. ***************************************************************************/ #define PRINT_NEWLINE print_a_newline () #define PRINT(X) \ {\ if (log_file != NULL)\ FPRINTF (log_file, X);\ FPRINTF (TERM_OUT, X);\ } #define PRINT2(X, Y) \ {\ if (log_file != NULL)\ FPRINTF (log_file, X, Y);\ FPRINTF (TERM_OUT, X, Y);\ } #define PRINT3(X, Y, Z) \ {\ if (log_file != NULL)\ FPRINTF (log_file, X, Y, Z);\ FPRINTF (TERM_OUT, X, Y, Z);\ } #define PRINT4(W, X, Y, Z) \ {\ if (log_file != NULL)\ FPRINTF (log_file, W, X, Y, Z);\ FPRINTF (TERM_OUT, W, X, Y, Z);\ } #define PRINT_LN(X) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X); FPUTC ('\n', log_file);\ }\ FPRINTF (TERM_OUT, X); FPUTC('\n', TERM_OUT);\ } #define PRINT_LN2(X, Y) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X, Y); FPUTC ('\n', log_file);\ }\ FPRINTF (TERM_OUT, X, Y); FPUTC('\n', TERM_OUT);\ } #define PRINT_LN3(X, Y, Z) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X, Y, Z); FPUTC ('\n', log_file);\ }\ FPRINTF (TERM_OUT, X, Y, Z); FPUTC('\n', TERM_OUT);\ } #define PRINT_LN4(W, X, Y, Z) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, W, X, Y, Z); FPUTC ('\n', log_file);\ }\ FPRINTF (TERM_OUT, W, X, Y, Z); FPUTC('\n', TERM_OUT);\ } #define TRACE_PR(X) \ if (log_file != NULL) FPRINTF (log_file, X); #define TRACE_PR2(X, Y) \ if (log_file != NULL) FPRINTF (log_file, X, Y); #define TRACE_PR3(X, Y, Z) \ if (log_file != NULL) FPRINTF (log_file, X, Y, Z); #define TRACE_PR_LN(X) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X); FPUTC ('\n', log_file);\ }\ } #define TRACE_PR_LN2(X, Y) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X, Y); FPUTC ('\n', log_file);\ }\ } #define TRACE_PR_LN3(X, Y, Z) \ {\ if (log_file != NULL) {\ FPRINTF (log_file, X, Y, Z); FPUTC ('\n', log_file);\ }\ } #define TRACE_PR_NEWLINE \ {\ if (log_file != NULL)\ FPUTC ('\n', log_file);\ } /*************************************************************************** * WEB section number: 4 * ~~~~~~~~~~~~~~~~~~~ * Some of the code is intended to be used only when diagnosing the strange * behaviour that sometimes occurs when BibTeX is being installed or when * system wizards are fooling around with BibTeX without quite knowing what * they are doing. Such code will not normally be compiled; it is delimited * by the preprocessor conditionals `#ifdef DEBUG ... #endif'. Similarly, * there is some conditional code delimited by `#ifdef STAT ... #endif' * that is intended only for use when statistics are to be kept about * BibTeX's memory/CPU usage, and there is conditional code delimited by * `#ifdef TRACE ... #endif' that is intended to be a trace facility for * use mainly when debugging .BST files. ***************************************************************************/ #define DEBUG 1 #define STAT 1 #define TRACE 1 /*************************************************************************** * WEB section number: 9 * ~~~~~~~~~~~~~~~~~~~ * Here are some macros for common programming idioms. ***************************************************************************/ #define INCR(X) ++(X) #define DECR(X) --(X) #define LOOP while (TRUE) #define DO_NOTHING ; #define EMPTY 0 #define ANY_VALUE 0 /*************************************************************************** * WEB section number: 14 * ~~~~~~~~~~~~~~~~~~~ * These parameters may be changed at compile time to extend or reduce * BiBTeX's capacity. They are set to accommodate a maximum of about 750 * cites when used with the standard styles. ***************************************************************************/ #define MIN_PRINT_LINE 3 #define MAX_PRINT_LINE 79 #define AUX_STACK_SIZE 20 #define MAX_BIB_FILES 20 #define BUF_SIZE 20000 #define MAX_CITES 750 #define MAX_FIELDS 5000 #define MAX_STRINGS 4000 #define POOL_SIZE 65000L #define MIN_CROSSREFS 2 #define WIZ_FN_SPACE 3000 #define SINGLE_FN_SPACE 50 #define ENT_STR_SIZE 100 #define GLOB_STR_SIZE 1000 #define LIT_STK_SIZE 50 /*************************************************************************** * WEB section number: 15 * ~~~~~~~~~~~~~~~~~~~ * These parameters can also be changed at compile time, but they're * needed to define some WEB numeric macros so they must be defined * themselves. ***************************************************************************/ #define HASH_SIZE 5000 #ifdef MSDOS # define FILE_NAME_SIZE 64 #else /* NOT MSDOS */ # define FILE_NAME_SIZE 255 #endif /* MSDOS */ #define MAX_GLOB_STRS 10 /*************************************************************************** * WEB section number: 18 * ~~~~~~~~~~~~~~~~~~~ * A global variable called |history| will contain one of four values at * the end of every run: |spotless| means that no unusual messages were * printed; |warning_message| means that a message of possible interest * was printed but no serious errors were detected; |error_message| means * that at least one error was found; |fatal_message| means that the * program terminated abnormally. The value of |history| does not * influence the behavior of the program; it is simply computed for the * convenience of systems that might want to use such information. ***************************************************************************/ #define SPOTLESS 0 #define WARNING_MESSAGE 1 #define ERROR_MESSAGE 2 #define FATAL_MESSAGE 3 /*************************************************************************** * WEB section number: 23 * ~~~~~~~~~~~~~~~~~~~ * We shall use the |text_char| to stand for the data type of the * characters that are converted to and from |ASCIICode_T| when they are * input and output. We shall also assume that |text_char| consists of the * elements |chr[FIRST_TEXT_CHAR]| through |chr[LAST_TEXT_CHAR]| inclusive. * The following definitions should be adjusted if necessary. ***************************************************************************/ #define FIRST_TEXT_CHAR 0 #define LAST_TEXT_CHAR 255 #ifdef SUPPORT_8BIT #define LAST_ASCII_CHAR 255 #else #define LAST_ASCII_CHAR 127 #endif /* SUPPORT_8BIT */ #ifdef UTF_8 #define LAST_LATIN_CHAR 0x17F #define LAST_UCS_CHAR 0x10FFFF #else #define LAST_LATIN_CHAR LAST_ASCII_CHAR #endif /*************************************************************************** * WEB section number: 26 * ~~~~~~~~~~~~~~~~~~~ * Some of the ASCII codes without visible characters have been given * symbolic names in this program because they are used with a special * meaning. The |tab| character may be system dependent. ***************************************************************************/ #define NULL_CODE 0 #define TAB 9 #define SPACE 32 #define INVALID_CODE 127 /*************************************************************************** * WEB section number: 29 * ~~~~~~~~~~~~~~~~~~~ * Also, various characters are given symbolic names; all the ones this * program uses are collected here. We use the sharp sign as the * |concat_char|, rather than something more natural (like an ampersand), * for uniformity of database syntax (ampersand is a valid character in * identifiers). ***************************************************************************/ #define DOUBLE_QUOTE '"' #define NUMBER_SIGN '#' #define COMMENT '%' #define SINGLE_QUOTE '\'' #define LEFT_PAREN '(' #define RIGHT_PAREN ')' #define COMMA ',' #define MINUS_SIGN '-' #define EQUALS_SIGN '=' #define AT_SIGN '@' #define LEFT_BRACE '{' #define RIGHT_BRACE '}' #define PERIOD '.' #define QUESTION_MARK '?' #define EXCLAMATION_MARK '!' #define TIE '~' #define HYPHEN '-' #define STAR '*' #define CONCAT_CHAR '#' #define COLON ':' #define BACKSLASH '\\' /*************************************************************************** * WEB section number: 31 * ~~~~~~~~~~~~~~~~~~~~ * Every character has two types of the lexical classifications. The * first type is general, and the second type tells whether the character * is legal in identifiers. ***************************************************************************/ #define ILLEGAL 0 #define WHITE_SPACE 1 #define ALPHA 2 #define NUMERIC 3 #define SEP_CHAR 4 #define OTHER_LEX 5 #define LAST_LEX 5 #define ILLEGAL_ID_CHAR 0 #define LEGAL_ID_CHAR 1 /*************************************************************************** * WEB section number: 35 * ~~~~~~~~~~~~~~~~~~~~ * Now we initialize the system-dependent |char_width| array, for which * |space| is the only |white_space| character given a nonzero printing * width. The widths here are taken from Stanford's June '87 cmr10 font * and represent hundredths of a point (rounded), but since they're used * only for relative comparisons, the units have no meaning. ***************************************************************************/ #define SS_WIDTH 500 #define AE_WIDTH 722 #define OE_WIDTH 778 #define UPPER_AE_WIDTH 903 #define UPPER_OE_WIDTH 1014 /*************************************************************************** * WEB section number: 44 * ~~~~~~~~~~~~~~~~~~~~ * When something in the program wants to be bigger or something out * there wants to be smaller, it's time to call it a run. Here's the * first of several macros that have associated procedures so that they * produce less inline code. ***************************************************************************/ #define BIBTEX_OVERFLOW(X, Y) {\ print_overflow ();\ PRINT_LN3 ("%s%ld\n", (X), (long) (Y));\ longjmp (Close_Up_Shop_Flag, 1);} /*************************************************************************** * WEB section number: 45 * ~~~~~~~~~~~~~~~~~~~~ * When something happens that the program thinks is impossible, call the * maintainer. ***************************************************************************/ #define CONFUSION(X) {\ PRINT (X); print_confusion();\ longjmp (Close_Up_Shop_Flag, 1);} #define CONFUSION2(X, Y) {\ PRINT2 (X, Y); print_confusion();\ longjmp (Close_Up_Shop_Flag, 1);} /*************************************************************************** * WEB section number: 50 * ~~~~~~~~~~~~~~~~~~~~ * These macros send a string in |str_pool| to an output file. ***************************************************************************/ #define MAX_POP 3 #define PRINT_POOL_STR(X) print_a_pool_str(X) #define TRACE_PR_POOL_STR(X) { out_pool_str(log_file, X);} /*************************************************************************** * WEB section number: 52 * ~~~~~~~~~~~~~~~~~~~ * Several of the elementary string operations are performed using WEB * macros instead of using PASCAL procedures, because many of the operations * are done quite frequently and we want to avoid the overhead of procedure * calls. For example, here's a simple macro that computes the length of a * string. ***************************************************************************/ #define LENGTH(s) (str_start[(s)+1] - str_start[s]) /*************************************************************************** * WEB section number: 53 * ~~~~~~~~~~~~~~~~~~~ * Strings are created by appending character codes to |str_pool|. The macro * called |append_char|, defined here, does not check to see if the value * of |pool_ptr| is too high; this test is supposed to be made before * |append_char| is used. ***************************************************************************/ #define APPEND_CHAR(X) {str_pool[pool_ptr] = (X);\ INCR(pool_ptr);} #define STR_ROOM(X) {while((pool_ptr+(X))>Pool_Size)\ pool_overflow();} /*************************************************************************** * WEB section number: 55 * ~~~~~~~~~~~~~~~~~~~ * These macros destroy an recreate the string at the end of the pool. ***************************************************************************/ #define FLUSH_STRING {DECR(str_ptr);\ pool_ptr=str_start[str_ptr];} #define UNFLUSH_STRING {INCR(str_ptr);\ pool_ptr=str_start[str_ptr];} /*************************************************************************** * WEB section number: 62 * ~~~~~~~~~~~~~~~~~~~ * This system-independent procedure converts upper-case characters to * lower case for the specified part of |buf|. It is system independent * because it uses only the internal representation for characters. ***************************************************************************/ #define CASE_DIFFERENCE ('a' - 'A') /*************************************************************************** * WEB section number: 64 * ~~~~~~~~~~~~~~~~~~~ * All static strings that BibTeX might have to search for, generally * identifiers, are stored and retrieved by means of a fairly standard * hash-table algorithm (but slightly altered here) called the method of * ``coalescing lists'' (cf.\ Algorithm 6.4C in The Art of Computer * Programming). Once a string enters the table, it is never removed. * The actual sequence of characters forming a string is stored in the * |str_pool| array. ***************************************************************************/ #define HASH_BASE (EMPTY + 1) #define HASH_MAX (HASH_BASE + Hash_Size - 1) #define HASH_IS_FULL ((hash_used) == (HASH_BASE)) #define TEXT_ILK 0 #define INTEGER_ILK 1 #define AUX_COMMAND_ILK 2 #define AUX_FILE_ILK 3 #define BST_COMMAND_ILK 4 #define BST_FILE_ILK 5 #define BIB_FILE_ILK 6 #define FILE_EXT_ILK 7 #define FILE_AREA_ILK 8 #define CITE_ILK 9 #define LC_CITE_ILK 10 #define BST_FN_ILK 11 #define BIB_COMMAND_ILK 12 #define MACRO_ILK 13 #define CONTROL_SEQ_ILK 14 #define LAST_ILK 14 /*************************************************************************** * WEB section number: 68 * ~~~~~~~~~~~~~~~~~~~ * Here is the subroutine that searches the the hash table for a (string, * str_ilk) pair, where the string is of length l >= 0 and appears in * |buffer[j..(j+l-1)]|. If it finds the pair, it returns the corresponding * hash table location and sets the global variable |hash_found| to |TRUE|. * Otherwise is sets |hash_found| to |FALSE|, and if the parameter * |insert_it| is |TRUE|, it inserts the pair into the hash table, inserts * the string into |str_pool| if not previously encountered, and returns its * location. Note that two different pairs can have the same string but * different |str_ilks|, in which case the second pair encountered, if * |insert_it| were |TRUE|, would be inserted into the hash table though its * string wouldn't be inserted into |str_pool| because it would already be * there. ***************************************************************************/ #define MAX_HASH_VALUE (Hash_Prime + Hash_Prime - 2 + 127) #define DO_INSERT TRUE #define DONT_INSERT FALSE /*************************************************************************** * WEB section number: 73 * ~~~~~~~~~~~~~~~~~~~ * The longest pre-defined string determines type definitions used to * insert the pre-defined strings into |str_pool|. * Set to accommodate the longest translations of the environment variables. ***************************************************************************/ #define LONGEST_PDS MAX_FILE_NAME /*************************************************************************** * WEB section number: 78 * ~~~~~~~~~~~~~~~~~~~ * These constants all begin with |n_| and are used for the |case| * statement that determines which command to execute. The variable * |command_num| is set to one of these and is used to do the branching, * but it must have the full |integer| range because at times it can * assume an arbitrary |ilk_info| value (though it will be one of the * values here when we actually use it). ***************************************************************************/ #define N_AUX_BIBDATA 0 #define N_AUX_BIBSTYLE 1 #define N_AUX_CITATION 2 #define N_AUX_INPUT 3 #define N_BST_ENTRY 0 #define N_BST_EXECUTE 1 #define N_BST_FUNCTION 2 #define N_BST_INTEGERS 3 #define N_BST_ITERATE 4 #define N_BST_MACRO 5 #define N_BST_READ 6 #define N_BST_REVERSE 7 #define N_BST_SORT 8 #define N_BST_STRINGS 9 #define N_BIB_COMMENT 0 #define N_BIB_PREAMBLE 1 #define N_BIB_STRING 2 /*************************************************************************** * WEB section number: 80 * ~~~~~~~~~~~~~~~~~~~ * This section describes the various |buffer| scanning routines. The * two global variables |buf_ptr1| and |buf_ptr2| are used in scanning an * input line. Between scans, |buf_ptr1| points to the first character * of the current token and |buf_ptr2| points to that of the next. The * global variable |last|, set by the function |input_ln|, marks the end * of the current line; it equals 0 at the end of the current file. All * the procedures and functions in this section will indicate an * end-of-line when it's the end of the file. ***************************************************************************/ #define TOKEN_LEN (buf_ptr2 - buf_ptr1) #define SCAN_CHAR buffer[buf_ptr2] /*************************************************************************** * WEB section number: 81 * ~~~~~~~~~~~~~~~~~~~ * These macros send the current token, in |buffer[buf_ptr1]| to * |buffer[buf_ptr2-1]|, to an output file. ***************************************************************************/ #define PRINT_TOKEN print_a_token (); #define TRACE_PR_TOKEN out_token (log_file); /*************************************************************************** * WEB section number: 89 * ~~~~~~~~~~~~~~~~~~~ * These are the possible values for |scan_result|; they're set by the * |scan_identifier| procedure and are described in the next section. ***************************************************************************/ #define ID_NULL 0 #define SPECIFIED_CHAR_ADJACENT 1 #define OTHER_CHAR_ADJACENT 2 #define WHITE_ADJACENT 3 /*************************************************************************** * WEB section number: 91 * ~~~~~~~~~~~~~~~~~~~ * The next two procedures scan for an integer, setting the global * variable |token_value| to the corresponding integer. ***************************************************************************/ #define CHAR_VALUE (SCAN_CHAR - '0') /*************************************************************************** * WEB section number: 93 * ~~~~~~~~~~~~~~~~~~~ * This procedure scans for an integer, stopping at the first nondigit; * it sets the value of |token_value| accordingly. It returns |true| if * the token was a legal integer (i.e., consisted of an optional * |minus_sign| followed by one or more digits). ***************************************************************************/ #define NEGATIVE (sign_length == 1) /*************************************************************************** * WEB section number: 98 * ~~~~~~~~~~~~~~~~~~~ * I mean, this is truly disgraceful ... * * Note: The |term_out| file is system dependent. ***************************************************************************/ #define SAM_YOU_MADE_THE_FILE_NAME_TOO {\ sam_too_long_file_name_print ();\ goto Aux_Not_Found_Label;} /*************************************************************************** * WEB section number: 99 * ~~~~~~~~~~~~~~~~~~~ * We've abused the user enough for one section; suffice it to * say here that most of what we said last module still applies. * Note: The |term_out| file is system dependent. ***************************************************************************/ #define SAM_YOU_MADE_THE_FILE_NAME_WRON {\ sam_wrong_file_name_print ();\ goto Aux_Not_Found_Label;} /*************************************************************************** * WEB section number: 104 * ~~~~~~~~~~~~~~~~~~~ * Here we set up definitions and declarations for files opened in this * section. Each element in |aux_list| (except for * |aux_list[aux_stack_size]|, which is always unused) is a pointer to * the appropriate |str_pool| string representing the \.{.aux} file name. * The array |aux_file| contains the corresponding \PASCAL\ |file| * variables. ***************************************************************************/ #define CUR_AUX_STR aux_list[aux_ptr] #define CUR_AUX_FILE aux_file[aux_ptr] #define CUR_AUX_LINE aux_ln_stack[aux_ptr] /*************************************************************************** * WEB section number: 111 * ~~~~~~~~~~~~~~~~~~~ * When we find a bug, we print a message and flush the rest of the line. * This macro must be called from within a procedure that has an |exit| * label. ***************************************************************************/ #define AUX_ERR_RETURN {aux_err_print(); goto Exit_Label;} /*************************************************************************** * WEB section number: 112 * ~~~~~~~~~~~~~~~~~~~ * Here are a bunch of macros whose print statements are used at least * twice. Thus we save space by making the statements procedures. This * macro complains when there's a repeated command that's to be used just * once. ***************************************************************************/ #define AUX_ERR_ILLEGAL_ANOTHER(X) {aux_err_illegal_another_print (X);\ AUX_ERR_RETURN;} /*************************************************************************** * WEB section number: 113 * ~~~~~~~~~~~~~~~~~~~ * This one complains when a command is missing its |right_brace|. ***************************************************************************/ #define AUX_ERR_NO_RIGHT_BRACE {\ PRINT2 ("No \"%c\"", xchr[RIGHT_BRACE]);\ AUX_ERR_RETURN;} /*************************************************************************** * WEB section number: 114 * ~~~~~~~~~~~~~~~~~~~ * This one complains when a command has stuff after its |right_brace|. ***************************************************************************/ #define AUX_ERR_STUFF_AFTER_RIGHT_BRACE {\ PRINT2 ("Stuff after \"%c\"", xchr[RIGHT_BRACE]);\ AUX_ERR_RETURN;} /*************************************************************************** * WEB section number: 115 * ~~~~~~~~~~~~~~~~~~~ * And this one complains when a command has white space in its argument. ***************************************************************************/ #define AUX_ERR_WHITE_SPACE_IN_ARGUMENT {\ PRINT ("White space in argument");\ AUX_ERR_RETURN;} /*************************************************************************** * WEB section number: 117 * ~~~~~~~~~~~~~~~~~~~ * Here we introduce some variables for processing a \.{\\bibdata} * command. Each element in |bib_list| (except for * |bib_list[max_bib_files]|, which is always unused) is a pointer to the * appropriate |str_pool| string representing the \.{.bib} file name. * The array |bib_file| contains the corresponding \PASCAL\ |file| * variables. ***************************************************************************/ #define CUR_BIB_STR bib_list[bib_ptr] #define CUR_BIB_FILE bib_file[bib_ptr] /*************************************************************************** * WEB section number: 122 * ~~~~~~~~~~~~~~~~~~~ * This macro is very similar to aux_err but it complains specifically about * opening a file for a \bibdata command. ***************************************************************************/ #define OPEN_BIBDATA_AUX_ERR(X) {\ PRINT (X);\ print_bib_name();\ AUX_ERR_RETURN;} /*************************************************************************** * WEB section number: 129 * ~~~~~~~~~~~~~~~~~~~ * Here we introduce some variables for processing a \.{\\citation} * command. Each element in |cite_list| (except for * |cite_list[Max_Cites]|, which is always unused) is a pointer to the * appropriate |str_pool| string. The cite-key list is kept in order of * occurrence with duplicates removed. ***************************************************************************/ #define CUR_CITE_STR cite_list[cite_ptr] /*************************************************************************** * WEB section number: 133 * ~~~~~~~~~~~~~~~~~~~ * We must check if (the lower-case version of) this cite key has been * previously encountered, and proceed accordingly. The alias kludge * helps make the stack space not overflow on some machines. ***************************************************************************/ #define EX_BUF1 ex_buf /*************************************************************************** * WEB section number: 144 * ~~~~~~~~~~~~~~~~~~~ * We must complain if anything's amiss. ***************************************************************************/ #define AUX_END_ERR(X) {\ aux_end1_err_print();\ PRINT (X);\ aux_end2_err_print();} /*************************************************************************** * WEB section number: 149 * ~~~~~~~~~~~~~~~~~~~ * When there's a serious error parsing the .bst file, we flush the rest of * the current command; a blank line is assumed to mark the end of a command * (but for the purposes of error recovery only). Thus, error recovery will * be better if style designers leave blank lines between .bst commands. * This macro must be called from within a procedure that has an 'exit' * label. ***************************************************************************/ #define BST_ERR_PRINT_AND_LOOK_FOR_BLAN {\ bst_err_print_and_look_for_blan();\ goto Exit_Label;} #define BST_ERR(X) {\ PRINT (X);\ bst_err_print_and_look_for_blan ();\ goto Exit_Label;} #define BST_ERR2(X, Y) {\ PRINT2 (X, Y);\ bst_err_print_and_look_for_blan ();\ goto Exit_Label;} /*************************************************************************** * WEB section number: 150 * ~~~~~~~~~~~~~~~~~~~ * When there's a harmless error parsing the .bst file (harmless * syntactically, at least) we give just a warning message. ***************************************************************************/ #define BST_WARN(X) {\ PRINT (X); bst_warn_print();} /*************************************************************************** * WEB section number: 153 * ~~~~~~~~~~~~~~~~~~~ * It's often illegal to end a .bst command in certain places, and this is * where we come to check. ***************************************************************************/ #define EAT_BST_WHITE_AND_EOF_CHECK(X) {\ if (! eat_bst_white_space()) {\ PRINT (X); BST_ERR(X);}} /*************************************************************************** * WEB section number: 156 * ~~~~~~~~~~~~~~~~~~~ * We need data structures for the function definitions, the entry * variables, the global variables, and the actual entries corresponding * to the cite-key list. First we define the classes of `function's used. * Functions in all classes are of |bst_fn_ilk| except for |int_literal|s, * which are of |integer_ilk|; and |str_literal|s, which are of * |text_ilk|. ***************************************************************************/ #define BUILT_IN 0 #define WIZ_DEFINED 1 #define INT_LITERAL 2 #define STR_LITERAL 3 #define FIELD 4 #define INT_ENTRY_VAR 5 #define STR_ENTRY_VAR 6 #define INT_GLOBAL_VAR 7 #define STR_GLOBAL_VAR 8 #define LAST_FN_CLASS 8 /*************************************************************************** * WEB section number: 160 * ~~~~~~~~~~~~~~~~~~~ * Besides the function classes, we have types based on \BibTeX's * capacity limitations and one based on what can go into the array * |wiz_functions| explained below. ***************************************************************************/ #define QUOTE_NEXT_FN (HASH_BASE - 1) #define END_OF_DEF (HASH_MAX + 1) /*************************************************************************** * WEB section number: 161 * ~~~~~~~~~~~~~~~~~~~ * We store information about the \.{.bst} functions in arrays the same * size as the hash-table arrays and in locations corresponding to their * hash-table locations. The two arrays |fn_info| (an alias of * |ilk_info| described earlier) and |fn_type| accomplish this: |fn_type| * specifies one of the above classes, and |fn_info| gives information * dependent on the class. ***************************************************************************/ #define FN_INFO ilk_info #define MISSING EMPTY /*************************************************************************** * WEB section number: 166 * ~~~~~~~~~~~~~~~~~~~ * This macro is used to scan all .bst identifiers. The argument supplies * .bst command name. The associated procedure simply prints an error * message. ***************************************************************************/ #define BST_IDENTIFIER_SCAN(X) {\ scan_identifier (RIGHT_BRACE, COMMENT, COMMENT);\ if ((scan_result == WHITE_ADJACENT) \ || (scan_result == SPECIFIED_CHAR_ADJACENT)) {DO_NOTHING;}\ else {bst_id_print(); BST_ERR(X)}} /*************************************************************************** * WEB section number: 167 * ~~~~~~~~~~~~~~~~~~~ * This macro just makes sure we're at a |left_brace|. ***************************************************************************/ #define BST_GET_AND_CHECK_LEFT_BRACE(X) {\ if (SCAN_CHAR != LEFT_BRACE) \ {bst_left_brace_print(); BST_ERR(X);}\ INCR (buf_ptr2);} /*************************************************************************** * WEB section number: 168 * ~~~~~~~~~~~~~~~~~~~ * This macro just makes sure we're at a |right_brace|. ***************************************************************************/ #define BST_GET_AND_CHECK_RIGHT_BRACE(X) {\ if (SCAN_CHAR != RIGHT_BRACE) \ {bst_right_brace_print(); BST_ERR(X);}\ INCR (buf_ptr2);} /*************************************************************************** * WEB section number: 169 * ~~~~~~~~~~~~~~~~~~~ * This macro complains if we've already encountered a function to be * inserted into the hash table. ***************************************************************************/ #define CHECK_FOR_ALREADY_SEEN_FUNCTION(X) {\ if (hash_found) {\ already_seen_function_print(X);\ goto Exit_Label;}} /*************************************************************************** * WEB section number: 183 * ~~~~~~~~~~~~~~~~~~~ * We're about to start scanning tokens in a function definition. When a * function token is illegal, we skip until it ends; a |white_space| * character, an end-of-line, a |right_brace|, or a |comment| marks the * end of the current token. ***************************************************************************/ #define SKIP_TOKEN(X) {\ PRINT (X);\ skip_token_print ();\ goto Next_Token_Label;} #define SKIP_TOKEN2(X, Y) {\ PRINT2 (X, Y);\ skip_token_print ();\ goto Next_Token_Label;} /*************************************************************************** * WEB section number: 184 * ~~~~~~~~~~~~~~~~~~~ * This macro is similar to the last one but is specifically for * recursion in a |wiz_defined| function, which is illegal; it helps save * space. ***************************************************************************/ #define SKIP_RECURSIVE_TOKEN { print_recursion_illegal (); \ goto Next_Token_Label;} /*************************************************************************** * WEB section number: 185 * ~~~~~~~~~~~~~~~~~~~ * Here's another macro for saving some space when there's a problem with * a token. ***************************************************************************/ #define SKIP_TOKEN_UNKNOWN_FUNCTION {skp_token_unknown_function_prin ();\ goto Next_Token_Label;} /*************************************************************************** * WEB section number: 186 * ~~~~~~~~~~~~~~~~~~~ * And another. ***************************************************************************/ #define SKIP_TOKEN_ILLEGAL_STUFF_AFTER {\ skip_illegal_stuff_after_token ();\ goto Next_Token_Label;} /*************************************************************************** * WEB section number: 194 * ~~~~~~~~~~~~~~~~~~~ * This module marks the implicit function as being quoted, generates a * name, and stores it in the hash table. This name is strictly internal * to this program, starts with a |single_quote| (since that will make * this function name unique), and ends with the variable |impl_fn_num| * converted to ASCII. The alias kludge helps make the stack space not * overflow on some machines. ***************************************************************************/ #define EX_BUF2 ex_buf /*************************************************************************** * WEB section number: 197 * ~~~~~~~~~~~~~~~~~~~ * This module appends a character to |int_buf| after checking to make * sure it will fit; for use in |int_to_ASCII|. ***************************************************************************/ #define APPEND_INT_CHAR(X) {\ if (int_ptr == Buf_Size)\ { buffer_overflow ();}\ int_buf[int_ptr] = (X);\ INCR (int_ptr); } /*************************************************************************** * WEB section number: 216 * ~~~~~~~~~~~~~~~~~~~ * Here we insert the just found |int_global_var| name into the hash * table and record it as an |int_global_var|. Also, we initialize it by * setting |fn_info[fn_loc]| to 0. ***************************************************************************/ #define END_OF_STRING INVALID_CODE /*************************************************************************** * WEB section number: 219 * ~~~~~~~~~~~~~~~~~~~ * These global variables are used ... ***************************************************************************/ #define UNDEFINED (HASH_MAX + 1) /*************************************************************************** * WEB section number: 221 * ~~~~~~~~~~~~~~~~~~~ * When there's a serious error parsing a \.{.bib} file, we flush * everything up to the beginning of the next entry. ***************************************************************************/ #define BIB_ERR(X) {\ PRINT (X);\ bib_err_print ();\ goto Exit_Label;} #define BIB_ERR2(X, Y) {\ PRINT2 (X, Y);\ bib_err_print ();\ goto Exit_Label;} #define BIB_ERR3(X, Y, Z) {\ PRINT3 (X, Y, Z);\ bib_err_print ();\ goto Exit_Label;} /*************************************************************************** * WEB section number: 222 * ~~~~~~~~~~~~~~~~~~~ * When there's a harmless error parsing a \.{.bib} file, we just give a * warning message. This is always called after other stuff has been * printed out. ***************************************************************************/ #define BIB_WARN(X) {\ PRINT (X);\ bib_warn_print ();} #define BIB_WARN_NEWLINE(X) {\ PRINT_LN (X);\ bib_warn_print ();} /*************************************************************************** * WEB section number: 229 * ~~~~~~~~~~~~~~~~~~~ * It's often illegal to end a \.{.bib} command in certain places, and * this is where we come to check. ***************************************************************************/ #define EAT_BIB_WHITE_AND_EOF_CHECK {\ if (! eat_bib_white_space())\ {eat_bib_print();\ goto Exit_Label;}} /*************************************************************************** * WEB section number: 230 * ~~~~~~~~~~~~~~~~~~~ * And here are a bunch of error-message macros, each called more than * once, that thus save space as implemented. This one is for when one * of two possible characters is expected while scanning. ***************************************************************************/ #define BIB_ONE_OF_TWO_EXPECTED_ERR(X, Y) {\ bib_one_of_two_print (X, Y);\ goto Exit_Label;} /*************************************************************************** * WEB section number: 231 * ~~~~~~~~~~~~~~~~~~~ * This one's for an unexpected equals sign. ***************************************************************************/ #define BIB_EQUALS_SIGN_EXPECTED_ERR {\ bib_equals_sign_print ();\ goto Exit_Label;} /*************************************************************************** * WEB section number: 232 * ~~~~~~~~~~~~~~~~~~~ * This complains about unbalanced braces. ***************************************************************************/ #define BIB_UNBALANCED_BRACES_ERR {\ bib_unbalanced_braces_print ();\ goto Exit_Label;} /*************************************************************************** * WEB section number: 233 * ~~~~~~~~~~~~~~~~~~~ * And this one about an overly exuberant field. ***************************************************************************/ #define BIB_FIELD_TOO_LONG_ERR {\ bib_field_too_long_print ();\ goto Exit_Label;} /*************************************************************************** * WEB section number: 234 * ~~~~~~~~~~~~~~~~~~~ * This one is just a warning, not an error. It's for when something * isn't (or might not be) quite right with a macro name. ***************************************************************************/ #define MACRO_NAME_WARNING(X) {\ macro_warn_print ();\ BIB_WARN_NEWLINE (X);} /*************************************************************************** * WEB section number: 235 * ~~~~~~~~~~~~~~~~~~~ * This macro is used to scan all \.{.bib} identifiers. The argument * tells what was happening at the time. The associated procedure simply * prints an error message. ***************************************************************************/ #define BIB_IDENTIFIER_SCAN_CHECK(X) {\ if ((scan_result == WHITE_ADJACENT) \ || (scan_result == SPECIFIED_CHAR_ADJACENT)) {DO_NOTHING;}\ else {bib_id_print(); BIB_ERR (X);}} /*************************************************************************** * WEB section number: 247 * ~~~~~~~~~~~~~~~~~~~ * The variables for the function * |scan_and_store_the_field_value_and_eat_white| must be global since * the functions it calls use them too. The alias kludge helps make the * stack space not overflow on some machines. ***************************************************************************/ #define FIELD_VL_STR ex_buf #define FIELD_END ex_buf_ptr #define FIELD_START ex_buf_xptr /*************************************************************************** * WEB section number: 251 * ~~~~~~~~~~~~~~~~~~~ * Now we come to the stuff that actually accumulates the field value to * be stored. This module copies a character into |field_vl_str| if it * will fit; since it's so low level, it's implemented as a macro. ***************************************************************************/ #define COPY_CHAR(X) {\ if (FIELD_END == Buf_Size)\ { BIB_FIELD_TOO_LONG_ERR; }\ else\ { FIELD_VL_STR[FIELD_END] = (X);\ INCR (FIELD_END);}} /*************************************************************************** * WEB section number: 252 * ~~~~~~~~~~~~~~~~~~~ * The \.{.bib}-specific scanning function |compress_bib_white| skips * over |white_space| characters within a string until hitting a nonwhite * character; in fact, it does everything |eat_bib_white_space| does, but * it also adds a |space| to |field_vl_str|. This function is never * called if there are no |white_space| characters (or ends-of-line) to * be scanned (though the associated macro might be). The function * returns |false| if there is a serious syntax error. ***************************************************************************/ #define CHECK_FOR_AND_COMPRESS_BIB_WHIT {\ if ((lex_class[SCAN_CHAR] == WHITE_SPACE) || (buf_ptr2 == last)){\ if (! compress_bib_white ()) { goto Exit_Label;}}} /*************************************************************************** * WEB section number: 264 * ~~~~~~~~~~~~~~~~~~~ * If the cross-referenced entry isn't already on |cite_list| we add it * (at least temporarily); if it is already on |cite_list| we update the * cross-reference count, if necessary. Note that |all_entries| is * |false| here. The alias kludge helps make the stack space not * overflow on some machines. ***************************************************************************/ #define EXTRA_BUF out_buf /*************************************************************************** * WEB section number: 267 * ~~~~~~~~~~~~~~~~~~~ * The lower-case version of this database key must correspond to one in * |cite_list|, or else |all_entries| must be |true|, if this entry is to * be included in the reference list. Accordingly, this module sets * |store_entry|, which determines whether the relevant information for * this entry is stored. The alias kludge helps make the stack space not * overflow on some machines. ***************************************************************************/ #define EX_BUF3 ex_buf /*************************************************************************** * WEB section number: 270 * ~~~~~~~~~~~~~~~~~~~ * This module, a simpler version of the * |find_cite_locs_for_this_cite_key| function, exists primarily to * compute |lc_xcite_loc|. When this code is executed we have * |(all_entries) and (entry_cite_ptr >= all_marker) and (not * entry_exists[entry_cite_ptr])|. The alias kludge helps make the stack * space not overflow on some machines. ***************************************************************************/ #define EX_BUF4 ex_buf #define EX_BUF4_PTR ex_buf_ptr /*************************************************************************** * WEB section number: 277 * ~~~~~~~~~~~~~~~~~~~ * Occasionally we need to figure out the hash-table location of a given * cite-key string and its lower-case equivalent. This function does * that. To perform the task it needs to borrow a buffer, a need that * gives rise to the alias kludge---it helps make the stack space not * overflow on some machines (and while it's at it, it'll borrow a * pointer, too). Finally, the function returns |true| if the cite key * exists on |cite_list|, and its sets |cite_hash_found| according to * whether or not it found the actual version (before |lower_case|ing) of * the cite key; however, its {\sl raison d'\^$\mkern-8mu$etre\/} * (literally, ``to eat a raisin'') is to compute |cite_loc| and * |lc_cite_loc|. ***************************************************************************/ #define EX_BUF5 ex_buf #define EX_BUF5_PTR ex_buf_ptr /*************************************************************************** * WEB section number: 289 * ~~~~~~~~~~~~~~~~~~~ * The array |sorted_cites| initially specifies that the entries are to * be processed in order of cite-key occurrence. The \.{sort} command * may change this to whatever it likes (which, we hope, is whatever the * style-designer instructs it to like). We make |sorted_cites| an alias * to save space; this works fine because we're done with |cite_info|. ***************************************************************************/ #define SORTED_CITES cite_info /*************************************************************************** * WEB section number: 291 * ~~~~~~~~~~~~~~~~~~~ * Where |lit_stk_loc| is a stack location, and where |stk_type| gives * one of the three types of literals (an integer, a string, or a * function) or a special marker. If a |lit_stk_type| element is a * |stk_int| then the corresponding |lit_stack| element is an integer; if * a |stk_str|, then a pointer to a |str_pool| string; and if a |stk_fn|, * then a pointer to the function's hash-table location. However, if the * literal should have been a |stk_str| that was the value of a field * that happened to be |missing|, then the special value * |stk_field_missing| goes on the stack instead; its corresponding * |lit_stack| element is a pointer to the field-name's string. Finally, * |stk_empty| is the type of a literal popped from an empty stack. ***************************************************************************/ #define STK_INT 0 #define STK_STR 1 #define STK_FN 2 #define STK_FIELD_MISSING 3 #define STK_EMPTY 4 #define LAST_LIT_TYPE 4 /*************************************************************************** * WEB section number: 293 * ~~~~~~~~~~~~~~~~~~~ * When there's an error while executing \.{.bst} functions, what we do * depends on whether the function is messing with the entries. * Furthermore this error is serious enough to classify as an * |error_message| instead of a |warning_message|. These messages (that * is, from |bst_ex_warn|) are meant both for the user and for the style * designer while debugging. ***************************************************************************/ #define BST_EX_WARN(X) {\ PRINT (X); bst_ex_warn_print ();} #define BST_EX_WARN2(X, Y) {\ PRINT2 (X, Y); bst_ex_warn_print ();} /*************************************************************************** * WEB section number: 294 * ~~~~~~~~~~~~~~~~~~~ * When an error is so harmless, we print a warning message instead of an * error message. ***************************************************************************/ #define BST_MILD_EX_WARN(X) {\ PRINT (X); bst_mild_ex_warn_print ();} /*************************************************************************** * WEB section number: 301 * ~~~~~~~~~~~~~~~~~~~ * The function |less_than| compares the two \.{sort.key\$}s indirectly * pointed to by its arguments and returns |true| if the first argument's * \.{sort.key\$} is lexicographically less than the second's (that is, * alphabetically earlier). In case of ties the function compares the * indices |arg1| and |arg2|, which are assumed to be different, and * returns |true| if the first is smaller. This function uses * |ASCII_code|s to compare, so it might give ``interesting'' results * when handling nonletters. ***************************************************************************/ #define COMPARE_RETURN(X) {\ less_than = (X);\ goto Exit_Label;} /*************************************************************************** * WEB section number: 302 * ~~~~~~~~~~~~~~~~~~~ * The recursive procedure |quick_sort| sorts ... ***************************************************************************/ #define SHORT_LIST 10 #define END_OFFSET 4 /*************************************************************************** * WEB section number: 308 * ~~~~~~~~~~~~~~~~~~~ * This macro pushes the last thing, necessarily a string, that was * popped. And this module, along with others that push the literal * stack without explicitly calling |push_lit_stack|, have an index entry * under ``push the literal stack''; these implicit pushes collectively * speed up the program by about ten percent. ***************************************************************************/ #define REPUSH_STRING {\ if (lit_stack[lit_stk_ptr] >= cmd_str_ptr)\ { UNFLUSH_STRING; }\ INCR (lit_stk_ptr);} /*************************************************************************** * WEB section number: 319 * ~~~~~~~~~~~~~~~~~~~ * These macros append a character to |ex_buf|. Which is called depends * on whether the character is known to fit. ***************************************************************************/ #define APPEND_EX_BUF_CHAR(X) {\ ex_buf[ex_buf_ptr] = (X);\ INCR(ex_buf_ptr);} #define APPEND_EX_BUF_CHAR_AND_CHECK(X) {\ if (ex_buf_ptr == Buf_Size) {buffer_overflow ();}; \ APPEND_EX_BUF_CHAR(X)} /*************************************************************************** * WEB section number: 333 * ~~~~~~~~~~~~~~~~~~~ * These constants all begin with |n_| and are used for the |case| * statement that determines which |built_in| function to execute. ***************************************************************************/ #define N_EQUALS 0 #define N_GREATER_THAN 1 #define N_LESS_THAN 2 #define N_PLUS 3 #define N_MINUS 4 #define N_CONCATENATE 5 #define N_GETS 6 #define N_ADD_PERIOD 7 #define N_CALL_TYPE 8 #define N_CHANGE_CASE 9 #define N_CHR_TO_INT 10 #define N_CITE 11 #define N_DUPLICATE 12 #define N_EMPTY 13 #define N_FORMAT_NAME 14 #define N_IF 15 #define N_INT_TO_CHR 16 #define N_INT_TO_STR 17 #define N_MISSING 18 #define N_NEWLINE 19 #define N_NUM_NAMES 20 #define N_POP 21 #define N_PREAMBLE 22 #define N_PURIFY 23 #define N_QUOTE 24 #define N_SKIP 25 #define N_STACK 26 #define N_SUBSTRING 27 #define N_SWAP 28 #define N_TEXT_LENGTH 29 #define N_TEXT_PREFIX 30 #define N_TOP_STACK 31 #define N_TYPE 32 #define N_WARNING 33 #define N_WHILE 34 #define N_WIDTH 35 #define N_WRITE 36 #define N_BIT_AND 37 #define N_BIT_OR 38 #ifdef UTF_8 #define N_IS_CJK_STRING 39 #define NUM_BLT_IN_FNS 40 #else #define NUM_BLT_IN_FNS 39 #endif /*************************************************************************** * WEB section number: 338 * ~~~~~~~~~~~~~~~~~~~ * These constants all begin with |n_| and are used for the |case| * statement that determines which, if any, control sequence we're * dealing with; a control sequence of interest will be either one of the * undotted characters `\.{\\i}' or `\.{\\j}' or one of the foreign * characters in Table~3.2 of the \LaTeX\ manual. ***************************************************************************/ #define N_I 0 #define N_J 1 #define N_OE 2 #define N_OE_UPPER 3 #define N_AE 4 #define N_AE_UPPER 5 #define N_AA 6 #define N_AA_UPPER 7 #define N_O 8 #define N_O_UPPER 9 #define N_L 10 #define N_L_UPPER 11 #define N_SS 12 /*************************************************************************** * WEB section number: 344 * ~~~~~~~~~~~~~~~~~~~ * These are nonrecursive variables that |execute_fn| uses. Declaring * them here (instead of in the previous module) saves execution time and * stack space on most machines. ***************************************************************************/ #define NAME_BUF sv_buffer /*************************************************************************** * WEB section number: 356 * ~~~~~~~~~~~~~~~~~~~ * It's time for a complaint if either of the two (entry or global) string * lengths is exceeded. ***************************************************************************/ #define BST_STRING_SIZE_EXCEEDED(X, Y) {\ bst_1print_string_size_exceeded ();\ PRINT3 ("%ld%s", (long) (X), Y);\ bst_2print_string_size_exceeded ();} /*************************************************************************** * WEB section number: 365 * ~~~~~~~~~~~~~~~~~~~ * First we define a few variables for case conversion. The constant * definitions, to be used in |case| statements, are in order of probable * frequency. ***************************************************************************/ #define TITLE_LOWERS 0 #define ALL_LOWERS 1 #define ALL_UPPERS 2 #define BAD_CONVERSION 3 /*************************************************************************** * WEB section number: 397 * ~~~~~~~~~~~~~~~~~~~ * It's a von token if there exists a first brace-level-0 letter (or * brace-level-1 special character), and it's in lower case; in this case * we return |true|. The token is in |name_buf|, starting at * |name_bf_ptr| and ending just before |name_bf_xptr|. ***************************************************************************/ #define RETURN_VON_FOUND {\ von_token_found = TRUE;\ goto Exit_Label;} /*************************************************************************** * WEB section number: 417 * ~~~~~~~~~~~~~~~~~~~ * Here we output either the \.{.bst} given string if it exists, or else * the \.{.bib} |sep_char| if it exists, or else the default string. A * |tie| is the default space character between the last two tokens of * the name part, and between the first two tokens if the first token is * short enough; otherwise, a |space| is the default. ***************************************************************************/ #define LONG_TOKEN 3 /*************************************************************************** * WEB section number: 419 * ~~~~~~~~~~~~~~~~~~~ * If the last character output for this name part is a |tie| but the * previous character it isn't, we're dealing with a discretionary |tie|; * thus we replace it by a |space| if there are enough characters in the * rest of the name part. ***************************************************************************/ #define LONG_NAME 3 /*************************************************************************** * WEB section number: 465 * ~~~~~~~~~~~~~~~~~~~ * These statistics can help determine how large some of the constants * should be and can tell how useful certain |built_in| functions are. * They are written to the same files as tracing information. ***************************************************************************/ #define STAT_PR TRACE_PR #define STAT_PR2 TRACE_PR2 #define STAT_PR3 TRACE_PR3 #define STAT_PR_LN TRACE_PR_LN #define STAT_PR_LN2 TRACE_PR_LN2 #define STAT_PR_LN3 TRACE_PR_LN3 #define STAT_PR_POOL_STR TRACE_PR_POOL_STR /*************************************************************************** * WEB section number: N/A * ~~~~~~~~~~~~~~~~~~~ * C isn't very good at declaring two dimensional arrays whose sizes are * determined at run time. Here we create a useful macro to simulate * accessing a 2D array by converting the row/col into an offset from the * beginning of a 1D array. ***************************************************************************/ #define ENTRY_STRS(_r,_c) entry_strs[(_r * (Ent_Str_Size+1)) + _c] #define GLOBAL_STRS(_r,_c) global_strs[(_r * (Glob_Str_Size+1)) + _c] /*************************************************************************** * WEB section number: N/A * ~~~~~~~~~~~~~~~~~~~ * Define a macro to handle 1-, 2-, 3-, and 4-byte UTF-8 codes. ***************************************************************************/ #define DO_UTF8(ch, do_1, do_2, do_3, do_4) \ if (ch <= 0x7F) { do_1; } \ else if ((ch >= 0xC2) && (ch <= 0xDF)) { do_2; } \ else if ((ch >= 0xE0) && (ch <= 0xEF)) { do_3; } \ else if ((ch >= 0xF0) && (ch <= 0xF4)) { do_4; } \ else printf("this (%x) isn't a right UTF-8 char!\n", ch) /*************************************************************************** * WEB section number: N/A * ~~~~~~~~~~~~~~~~~~~ * Macros adapted from Kpathsea (lib.h) and Web2C (cpascal.h) to dynamically * resize arrays. ***************************************************************************/ /* Reallocate N items of type T for ARRAY using myrealloc. */ #define MYRETALLOC(array, addr, n, t) ((addr) = (t *) myrealloc(addr, (n) * sizeof(t), array)) /* BibTeX needs this to dynamically reallocate arrays. Too bad we can't rely on stringification, or we could avoid the ARRAY_NAME arg. Actually allocate one more than requests, so we can index the last entry, as Pascal wants to do. */ #define BIB_XRETALLOC_NOSET(array_name, array_var, type, size_var, new_size) \ if (log_file != NULL)\ fprintf (log_file, "Reallocated %s (elt_size=%d) to %ld items from %ld.\n", \ array_name, (int) sizeof (type), new_size, size_var); \ MYRETALLOC (array_name, array_var, new_size + 1, type) /* Same as above, but also increase SIZE_VAR for the last (or only) array. */ #define BIB_XRETALLOC(array_name, array_var, type, size_var, new_size) do { \ BIB_XRETALLOC_NOSET(array_name, array_var, type, size_var, new_size); \ size_var = new_size; \ } while (0) /* Same as above, but for the pseudo-TYPE ASCIICode_T[LENGTH+1]. */ #define BIB_XRETALLOC_STRING(array_name, array_var, length, size_var, new_size) \ if (log_file != NULL)\ fprintf (log_file, "Reallocated %s (elt_size=%d) to %ld items from %ld.\n", \ array_name, (int) (length + 1), new_size, size_var); \ MYRETALLOC (array_name, array_var, (new_size) * (length + 1), ASCIICode_T) #endif /* __BIBTEX_H__ */