bt_macros - Man Page
accessing and manipulating the btparse macro table
Synopsis
   void bt_add_macro_value (AST *  assignment,
                            btshort options);
   void bt_add_macro_text (char * macro,
                           char * text,
                           char * filename,
                           int    line);
   void bt_delete_macro (char * macro);
   void bt_delete_all_macros (void);
   int bt_macro_length (char *macro);
   char * bt_macro_text (char * macro,
                         char * filename,
                         int line);Description
btparse maintains a single table of all macros (abbreviations) encountered while parsing BibTeX entries.  It updates this table whenever it encounters a "macro definition" (@string) entry, and refers to it whenever a macro is used in an entry and needs to be expanded.  (Macros are not necessarily expanded on input, although this is the default.  See bt_postprocess.)  Macro definitions are only cleared when btparse's global cleanup function, bt_cleanup(), is called.  Thus, unless you explicitly call bt_delete_macro() or bt_delete_all_macros(), macro definitions persist for as long as you use the library---usually, the lifetime of your process.
Functions
You can use the following functions to add macros, delete them, and query their values---thus interfering with btparse's normal operation on the fly.
- bt_add_macro_text ()
- void bt_add_macro_text (char * macro, char * text, char * filename, int line);- Defines a new macro, or redefines an old one. - macrois the name of the macro, and- textis the text it should expand to.- filenameand- lineare just used to generate any warnings about the macro definition; if they don't apply, specify- NULLfor- filenameand- 0for- line. The only such warning occurs when you redefine an old macro: its value is overridden, and- bt_add_macro_text()issues a warning saying so.- For instance, when parsing this macro definition entry: - @string{fubar = "Fouled Up Beyond All Recognition"}- the library (in particular, the post-processing code called after an entry is successfully parsed) will ultimately do this: - bt_add_macro_text ("fubar", "Fouled Up Beyond All Recognition", filename, line);- This in turn will cause the macro - fubarto be expanded appropriately whenever the post-processing code sees it in any future entries.
- bt_add_macro_value ()
- void bt_add_macro_value (AST * assignment, btshort options);- This function is mainly for internal use by the library, but it's available to you if you ever find yourself with a little bit of AST representing a macro definition, and you want to set the macro yourself (rather than letting the library's post-processing code take care of it for you). - assignmentmust be an AST node as returned by- bt_next_field(). Unlike most other btparse functions that take an- optionsargument,- optionshere tells how the value in- assignmentwas post-processed. This is needed because macro values have to be processed in a special way to be valid in future expansions; if this one wasn't processed like that,- bt_add_macro_value()will do it for you. If you don't know how the value was post-processed, just supply- 0for- options---that's guaranteed to describe something different from "the right way" for macros, so the post-processing will be done correctly.- The processing done to macro values is mainly to ensure that we can get away with storing just a string in the macro table: macros invoked by the macro are themselves expanded, and all sub-strings are concatenated. For instance, if btparse parses these entries: - @string{and = " and "} @string{jim_n_bob = "James Smith" # and # "Bob Jones"}- then the value stored for - jim_n_bobshould obviously be the string- "James Smith and Bob Jones". To ensure this, btparse has to process the value of- anddifferently from most BibTeX strings: in particular, whitespace is not collapsed before the string is stored. That way, the correct value,- " and ", is interpolated into the value of- jim_n_bob. Thus, all macro values have sub-macros expanded and strings concatenated before they are stored, but whitespace is not collapsed until the macro is used in a regular entry.- This function calls - bt_add_macro_text(), so the same proviso about redefining old macros applies---a warning will be issued, and the old value lost.
- bt_delete_macro ()
- void bt_delete_macro (char * macro); - Deletes a macro from the macro table. If - macroisn't defined, takes no action.
- bt_delete_all_macros ()
- void bt_delete_all_macros (void); - Deletes all macros from the macro table. 
- bt_macro_length ()
- int bt_macro_length (char *macro); - Returns the length of a macro's expansion text. If the macro is undefined, returns 0; no warning is issued. 
- bt_macro_text ()
- char * bt_macro_text (char * macro, char * filename, int line);- Returns the expansion text of a macro. If the macro is not defined, issues a warning and returns - NULL.- filenameand- lineare used for generating this warning; if they don't apply (i.e. you're not expanding the macro as a result of finding it in some file), supply- NULLfor- filenameand- 0for- line.
See Also
btparse
Author
Greg Ward <gward@python.net>