You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/translators/btparse/btparse.h

379 lines
12 KiB

/* ------------------------------------------------------------------------
@NAME : btparse.h
@DESCRIPTION: Declarations and types for users of the btparse library.
(Actually, btparse.h is generated from btparse.h.in by
the `configure' script, in order to automatically determine
the appropriate values of HAVE_USHORT and HAVE_BOOLEAN.)
@GLOBALS :
@CALLS :
@CREATED : 1997/01/19, Greg Ward
@MODIFIED :
@VERSION : $Id: btparse.h.in,v 1.35 1999/12/28 18:23:17 greg Exp $
@COPYRIGHT : Copyright (c) 1996-97 by Gregory P. Ward. All rights reserved.
This file is part of the btparse library. This library 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 2
of the License, or (at your option) any later version.
-------------------------------------------------------------------------- */
#ifndef BTPARSE_H
#define BTPARSE_H
#include <sys/types.h> /* probably supplies 'ushort' */
#include <stdio.h>
#include "config.h" /* not btparse's config.h but Tellico's */
/*
* Here we attempt to define HAVE_USHORT if a typdef for `ushort' appears
* in <sys/types.h>. The detective work is actually done by the
* `configure' script, so if compilation fails because of duplicate
* definitions of `ushort', that's a bug in `configure' -- please tell me
* about it!
*/
#ifndef HAVE_USHORT
# define HAVE_USHORT 0
#endif
#if ! HAVE_USHORT /* needed for various bitmaps */
typedef unsigned short ushort;
#endif
/* Likewise for boolean. */
#ifndef HAVE_BOOLEAN
# define HAVE_BOOLEAN 0
#endif
#if ! HAVE_BOOLEAN
typedef int boolean;
#endif
#ifndef TRUE
# define TRUE 1
# define FALSE 0
#endif
#ifndef HAVE_STRLWR
# define HAVE_STRLWR 0
#endif
#ifndef HAVE_STRUPR
# define HAVE_STRUPR 0
#endif
/* Parsing (and post-processing) options */
#define BTO_CONVERT 1 /* convert numbers to strings? */
#define BTO_EXPAND 2 /* expand macros? */
#define BTO_PASTE 4 /* paste substrings together? */
#define BTO_COLLAPSE 8 /* collapse whitespace? */
#define BTO_NOSTORE 16
#define BTO_FULL (BTO_CONVERT | BTO_EXPAND | BTO_PASTE | BTO_COLLAPSE)
#define BTO_MACRO (BTO_CONVERT | BTO_EXPAND | BTO_PASTE)
#define BTO_MINIMAL 0
#define BTO_STRINGMASK (BTO_CONVERT | BTO_EXPAND | BTO_PASTE | BTO_COLLAPSE)
#define BT_VALID_NAMEPARTS "fvlj"
#define BT_MAX_NAMEPARTS 4
typedef enum
{
BTE_UNKNOWN,
BTE_REGULAR,
BTE_COMMENT,
BTE_PREAMBLE,
BTE_MACRODEF
/*
BTE_ALIAS,
BTE_MODIFY
*/
} bt_metatype;
#define NUM_METATYPES ((int) BTE_MACRODEF + 1)
typedef enum
{
BTAST_BOGUS, /* to detect uninitialized nodes */
BTAST_ENTRY,
BTAST_KEY,
BTAST_FIELD,
BTAST_STRING,
BTAST_NUMBER,
BTAST_MACRO
} bt_nodetype;
typedef enum
{
BTN_FIRST, BTN_VON, BTN_LAST, BTN_JR, BTN_NONE
} bt_namepart;
typedef enum
{
BTJ_MAYTIE, /* "discretionary" tie between words */
BTJ_SPACE, /* force a space between words */
BTJ_FORCETIE, /* force a tie (~ in TeX) */
BTJ_NOTHING /* nothing between words */
} bt_joinmethod;
#define USER_DEFINED_AST 1
#define zzcr_ast(ast,attr,tok,txt) \
{ \
(ast)->filename = InputFilename; \
(ast)->line = (attr)->line; \
(ast)->offset = (attr)->offset; \
(ast)->text = strdup ((attr)->text); \
}
#define zzd_ast(ast) \
/* printf ("zzd_ast: free'ing ast node with string %p (%s)\n", \
(ast)->text, (ast)->text); */ \
if ((ast)->text != NULL) free ((ast)->text);
#ifdef USER_DEFINED_AST
typedef struct _ast
{
struct _ast *right, *down;
char * filename;
int line;
int offset;
bt_nodetype nodetype;
bt_metatype metatype;
char * text;
} AST;
#endif /* USER_DEFINED_AST */
typedef struct
{
/*
* `string' is the string that has been split; items[0] ...
* items[num_items-1] are pointers into `string', or NULL for empty
* substrings. Note that `string' is actually a copy of the string
* passed in to bt_split_list() with NULs inserted between substrings.
*/
char * string;
int num_items;
char ** items;
} bt_stringlist;
typedef struct
{
bt_stringlist * tokens; /* flat list of all tokens in name */
char ** parts[BT_MAX_NAMEPARTS]; /* each elt. is list of pointers */
/* into `tokens->string' */
int part_len[BT_MAX_NAMEPARTS]; /* length in tokens */
} bt_name;
typedef struct tex_tree_s
{
char * start;
int len;
struct tex_tree_s
* child,
* next;
} bt_tex_tree;
typedef struct
{
/* These determine the order (and presence) of parts in the name. */
int num_parts;
bt_namepart parts[BT_MAX_NAMEPARTS];
/*
* These lists are always in the order of the bt_namepart enum -- *not*
* dependent on the particular order of parts the user specified! (This
* will make it a bit harder if I ever allow more than one occurrence of
* a part in a format; since I don't allow that, I'm not [yet] worried
* about it!)
*/
const char * pre_part[BT_MAX_NAMEPARTS];
char * post_part[BT_MAX_NAMEPARTS];
char * pre_token[BT_MAX_NAMEPARTS];
const char * post_token[BT_MAX_NAMEPARTS];
boolean abbrev[BT_MAX_NAMEPARTS];
bt_joinmethod join_tokens[BT_MAX_NAMEPARTS];
bt_joinmethod join_part[BT_MAX_NAMEPARTS];
} bt_name_format;
typedef enum
{
BTERR_NOTIFY, /* notification about next action */
BTERR_CONTENT, /* warning about the content of a record */
BTERR_LEXWARN, /* warning in lexical analysis */
BTERR_USAGEWARN, /* warning about library usage */
BTERR_LEXERR, /* error in lexical analysis */
BTERR_SYNTAX, /* error in parser */
BTERR_USAGEERR, /* fatal error in library usage */
BTERR_INTERNAL /* my fault */
} bt_errclass;
typedef enum
{
BTACT_NONE, /* do nothing on error */
BTACT_CRASH, /* call exit(1) */
BTACT_ABORT /* call abort() */
} bt_erraction;
typedef struct
{
bt_errclass errclass;
char * filename;
int line;
const char * item_desc;
int item;
char * message;
} bt_error;
typedef void (*bt_err_handler) (bt_error *);
#if defined(__cplusplus__) || defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
/* Function prototypes */
/*
* First, we might need a prototype for strdup() (because the zzcr_ast
* macro uses it, and that macro is used in pccts/ast.c -- which I don't
* want to modify if I can help it, because it's someone else's code).
* This is to accomodate AIX, where including <string.h> apparently doesn't
* declare strdup() (reported by Reiner Schlotte
* <schlotte@geo.palmod.uni-bremen.de>), and compiling bibtex.c (which
* includes pccts/ast.c) crashes because of this (yes, yes, I know it
* should just be a warning -- I don't know what's going on there!).
*
* Unfortunately, this duplicates code in bt_config.h -- I can't include
* bt_config.h here, because this header must be freestanding; I don't want
* to include bt_config.h in pccts/ast.c, because I don't want to touch the
* PCCTS code if I can help it; but I don't want every source file that
* uses strdup() to have to include btparse.h. Hence the duplication.
* Yuck.
*/
#ifndef HAVE_STRDUP_DECL
# define HAVE_STRDUP_DECL 0
#endif
#if !HAVE_STRDUP_DECL
extern char *strdup (const char *s);
#endif
/* init.c */
void bt_initialize (void);
void bt_free_ast (AST *ast);
void bt_cleanup (void);
/* input.c */
void bt_set_stringopts (bt_metatype metatype, ushort options);
AST * bt_parse_entry_s (char * entry_text,
char * filename,
int line,
ushort options,
boolean * status);
AST * bt_parse_entry (FILE * infile,
char * filename,
ushort options,
boolean * status);
AST * bt_parse_file (char * filename,
ushort options,
boolean * overall_status);
/* postprocess.c */
void bt_postprocess_string (char * s, ushort options);
char * bt_postprocess_value (AST * value, ushort options, boolean replace);
char * bt_postprocess_field (AST * field, ushort options, boolean replace);
void bt_postprocess_entry (AST * entry, ushort options);
/* error.c */
void bt_reset_error_counts (void);
int bt_get_error_count (bt_errclass errclass);
int * bt_get_error_counts (int *counts);
ushort bt_error_status (int *saved_counts);
/* macros.c */
void bt_add_macro_value (AST *assignment, ushort 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);
/* traversal.c */
AST *bt_next_entry (AST *entry_list, AST *prev_entry);
bt_metatype bt_entry_metatype (AST *entry);
char *bt_entry_type (AST *entry);
char *bt_entry_key (AST *entry);
AST *bt_next_field (AST *entry, AST *prev, char **name);
AST *bt_next_macro (AST *entry, AST *prev, char **name);
AST *bt_next_value (AST *head,
AST *prev,
bt_nodetype *nodetype,
char **text);
char *bt_get_text (AST *node);
/* modify.c */
void bt_set_text (AST * node, char * new_text);
void bt_entry_set_key (AST * entry, char * new_key);
/* names.c */
bt_stringlist * bt_split_list (char * string,
char * delim,
char * filename,
int line,
char * description);
void bt_free_list (bt_stringlist *list);
bt_name * bt_split_name (char * name,
char * filename,
int line,
int name_num);
void bt_free_name (bt_name * name);
/* tex_tree.c */
bt_tex_tree * bt_build_tex_tree (char * string);
void bt_free_tex_tree (bt_tex_tree **top);
void bt_dump_tex_tree (bt_tex_tree *node, int depth, FILE *stream);
char * bt_flatten_tex_tree (bt_tex_tree *top);
/* string_util.c */
void bt_purify_string (char * string, ushort options);
void bt_change_case (char transform, char * string, ushort options);
/* format_name.c */
bt_name_format * bt_create_name_format (char * parts, boolean abbrev_first);
void bt_free_name_format (bt_name_format * format);
void bt_set_format_text (bt_name_format * format,
bt_namepart part,
char * pre_part,
char * post_part,
char * pre_token,
char * post_token);
void bt_set_format_options (bt_name_format * format,
bt_namepart part,
boolean abbrev,
bt_joinmethod join_tokens,
bt_joinmethod join_part);
char * bt_format_name (bt_name * name, bt_name_format * format);
#if defined(__cplusplus__) || defined(__cplusplus) || defined(c_plusplus)
}
#endif
#endif /* BTPARSE_H */