=================================================================== RCS file: /cvs/mandoc/mdoc.h,v retrieving revision 1.33 retrieving revision 1.73 diff -u -p -r1.33 -r1.73 --- mandoc/mdoc.h 2009/02/23 09:33:34 1.33 +++ mandoc/mdoc.h 2009/10/30 05:58:38 1.73 @@ -1,20 +1,18 @@ -/* $Id: mdoc.h,v 1.33 2009/02/23 09:33:34 kristaps Exp $ */ +/* $Id: mdoc.h,v 1.73 2009/10/30 05:58:38 kristaps Exp $ */ /* - * Copyright (c) 2008 Kristaps Dzonsons + * Copyright (c) 2008, 2009 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef MDOC_H #define MDOC_H @@ -29,7 +27,7 @@ /* What follows is a list of ALL possible macros. */ -#define MDOC___ 0 +#define MDOC_Ap 0 #define MDOC_Dd 1 #define MDOC_Dt 2 #define MDOC_Os 3 @@ -135,7 +133,22 @@ #define MDOC_Hf 103 #define MDOC_Fr 104 #define MDOC_Ud 105 -#define MDOC_MAX 106 +#define MDOC_Lb 106 +#define MDOC_Lp 107 +#define MDOC_Lk 108 +#define MDOC_Mt 109 +#define MDOC_Brq 110 +#define MDOC_Bro 111 +#define MDOC_Brc 112 +#define MDOC__C 113 +#define MDOC_Es 114 +#define MDOC_En 115 +#define MDOC_Dx 116 +#define MDOC__Q 117 +#define MDOC_br 118 +#define MDOC_sp 119 +#define MDOC__U 120 +#define MDOC_MAX 121 /* What follows is a list of ALL possible macro arguments. */ @@ -160,81 +173,14 @@ #define MDOC_Width 18 #define MDOC_Compact 19 #define MDOC_Std 20 -#define MDOC_p1003_1_88 21 -#define MDOC_p1003_1_90 22 -#define MDOC_p1003_1_96 23 -#define MDOC_p1003_1_2001 24 -#define MDOC_p1003_1_2004 25 -#define MDOC_p1003_1 26 -#define MDOC_p1003_1b 27 -#define MDOC_p1003_1b_93 28 -#define MDOC_p1003_1c_95 29 -#define MDOC_p1003_1g_2000 30 -#define MDOC_p1003_2_92 31 -#define MDOC_p1387_2_95 32 -#define MDOC_p1003_2 33 -#define MDOC_p1387_2 34 -#define MDOC_isoC_90 35 -#define MDOC_isoC_amd1 36 -#define MDOC_isoC_tcor1 37 -#define MDOC_isoC_tcor2 38 -#define MDOC_isoC_99 39 -#define MDOC_ansiC 40 -#define MDOC_ansiC_89 41 -#define MDOC_ansiC_99 42 -#define MDOC_ieee754 43 -#define MDOC_iso8802_3 44 -#define MDOC_xpg3 45 -#define MDOC_xpg4 46 -#define MDOC_xpg4_2 47 -#define MDOC_xpg4_3 48 -#define MDOC_xbd5 49 -#define MDOC_xcu5 50 -#define MDOC_xsh5 51 -#define MDOC_xns5 52 -#define MDOC_xns5_2d2_0 53 -#define MDOC_xcurses4_2 54 -#define MDOC_susv2 55 -#define MDOC_susv3 56 -#define MDOC_svid4 57 -#define MDOC_Filled 58 -#define MDOC_Words 59 -#define MDOC_Emphasis 60 -#define MDOC_Symbolic 61 -#define MDOC_ARG_MAX 62 +#define MDOC_Filled 21 +#define MDOC_Words 22 +#define MDOC_Emphasis 23 +#define MDOC_Symbolic 24 +#define MDOC_Nested 25 +#define MDOC_Centred 26 +#define MDOC_ARG_MAX 27 -/* Warnings are either syntax or groff-compatibility. */ -enum mdoc_warn { - WARN_SYNTAX, - WARN_COMPAT -}; - -/* Possible values for the `At' macro. */ -enum mdoc_att { - ATT_DEFAULT = 0, - ATT_v1, - ATT_v2, - ATT_v3, - ATT_v4, - ATT_v5, - ATT_v6, - ATT_v7, - ATT_32v, - ATT_V1, - ATT_V2, - ATT_V3, - ATT_V4 -}; - -/* An argument to a macro (multiple values = `It -column'). */ -struct mdoc_arg { - int arg; - int line; - int pos; - size_t sz; - char **value; -}; - /* Type of a syntax node. */ enum mdoc_type { MDOC_TEXT, @@ -246,41 +192,21 @@ enum mdoc_type { MDOC_ROOT }; -/* Manual section. */ -enum mdoc_msec { - MSEC_DEFAULT = 0, - MSEC_1, - MSEC_2, - MSEC_3, - MSEC_3f, - MSEC_3p, - MSEC_4, - MSEC_5, - MSEC_6, - MSEC_7, - MSEC_8, - MSEC_9, - MSEC_X11, - MSEC_X11R6, - MSEC_local, - MSEC_n, - MSEC_unass, - MSEC_draft, - MSEC_paper -}; - -/* Section (named/unnamed) of `Ss'. */ +/* Section (named/unnamed) of `Sh'. */ enum mdoc_sec { - SEC_PROLOGUE = 0, - SEC_BODY, + SEC_NONE, /* No section, yet. */ SEC_NAME, + SEC_LIBRARY, SEC_SYNOPSIS, SEC_DESCRIPTION, + SEC_IMPLEMENTATION, + SEC_EXIT_STATUS, SEC_RETURN_VALUES, - SEC_ENVIRONMENT, + SEC_ENVIRONMENT, SEC_FILES, SEC_EXAMPLES, SEC_DIAGNOSTICS, + SEC_COMPATIBILITY, SEC_ERRORS, SEC_SEE_ALSO, SEC_STANDARDS, @@ -288,100 +214,43 @@ enum mdoc_sec { SEC_AUTHORS, SEC_CAVEATS, SEC_BUGS, - SEC_CUSTOM + SEC_SECURITY, + SEC_CUSTOM /* User-defined. */ }; -/* Volume of `Dt'. */ -enum mdoc_vol { - VOL_DEFAULT = 0, - VOL_AMD, - VOL_IND, - VOL_KM, - VOL_LOCAL, - VOL_PRM, - VOL_PS1, - VOL_SMM, - VOL_URM, - VOL_USD -}; - -/* Architecture of `Dt'. */ -enum mdoc_arch { - ARCH_DEFAULT = 0, - ARCH_alpha, - ARCH_amd64, - ARCH_amiga, - ARCH_arc, - ARCH_arm, - ARCH_armish, - ARCH_aviion, - ARCH_hp300, - ARCH_hppa, - ARCH_hppa64, - ARCH_i386, - ARCH_landisk, - ARCH_luna88k, - ARCH_mac68k, - ARCH_macppc, - ARCH_mvme68k, - ARCH_mvme88k, - ARCH_mvmeppc, - ARCH_pmax, - ARCH_sgi, - ARCH_socppc, - ARCH_sparc, - ARCH_sparc64, - ARCH_sun3, - ARCH_vax, - ARCH_zaurus -}; - /* Information from prologue. */ struct mdoc_meta { - enum mdoc_msec msec; - enum mdoc_vol vol; - enum mdoc_arch arch; + int msec; + char *vol; + char *arch; time_t date; char *title; char *os; char *name; }; -/* Text-only node. */ -struct mdoc_text { - char *string; +/* An argument to a macro (multiple values = `It -column'). */ +struct mdoc_argv { + int arg; + int line; + int pos; + size_t sz; + char **value; }; -/* Block (scoped) node. */ -struct mdoc_block { +struct mdoc_arg { size_t argc; - struct mdoc_arg *argv; - struct mdoc_node *head; - struct mdoc_node *body; - struct mdoc_node *tail; + struct mdoc_argv *argv; + unsigned int refcnt; }; -/* In-line element node. */ -struct mdoc_elem { - size_t sz; - char **args; - size_t argc; - struct mdoc_arg *argv; -}; - -/* Typed nodes of an AST node. */ -union mdoc_data { - struct mdoc_text text; - struct mdoc_elem elem; - struct mdoc_block block; -}; - /* Node in AST. */ struct mdoc_node { struct mdoc_node *parent; struct mdoc_node *child; struct mdoc_node *next; struct mdoc_node *prev; + int nchild; int line; int pos; int tok; @@ -389,51 +258,45 @@ struct mdoc_node { #define MDOC_VALID (1 << 0) #define MDOC_ACTED (1 << 1) enum mdoc_type type; - union mdoc_data data; enum mdoc_sec sec; + + struct mdoc_arg *args; /* BLOCK/ELEM */ + struct mdoc_node *head; /* BLOCK */ + struct mdoc_node *body; /* BLOCK */ + struct mdoc_node *tail; /* BLOCK */ + char *string; /* TEXT */ }; +#define MDOC_IGN_SCOPE (1 << 0) /* Ignore scope violations. */ +#define MDOC_IGN_ESCAPE (1 << 1) /* Ignore bad escape sequences. */ +#define MDOC_IGN_MACRO (1 << 2) /* Ignore unknown macros. */ +#define MDOC_IGN_CHARS (1 << 3) /* Ignore disallowed chars. */ + /* Call-backs for parse messages. */ + struct mdoc_cb { - void (*mdoc_msg)(void *, int, int, const char *); int (*mdoc_err)(void *, int, int, const char *); - int (*mdoc_warn)(void *, int, int, - enum mdoc_warn, const char *); + int (*mdoc_warn)(void *, int, int, const char *); }; -/* Global table of macro names (`Bd', `Ed', etc.). */ -extern const char *const *mdoc_macronames; +/* See mdoc.3 for documentation. */ -/* Global table of argument names (`column', `tag', etc.). */ +extern const char *const *mdoc_macronames; extern const char *const *mdoc_argnames; __BEGIN_DECLS struct mdoc; -/* Free memory allocated with mdoc_alloc. */ -void mdoc_free(struct mdoc *); +/* See mdoc.3 for documentation. */ -/* Allocate a new parser instance. */ -struct mdoc *mdoc_alloc(void *data, const struct mdoc_cb *); - -/* Parse a single line in a stream (boolean retval). */ +void mdoc_free(struct mdoc *); +struct mdoc *mdoc_alloc(void *, int, const struct mdoc_cb *); +void mdoc_reset(struct mdoc *); int mdoc_parseln(struct mdoc *, int, char *buf); - -/* Get result first node (after mdoc_endparse!). */ const struct mdoc_node *mdoc_node(const struct mdoc *); - -/* Get result meta-information (after mdoc_endparse!). */ const struct mdoc_meta *mdoc_meta(const struct mdoc *); - -/* Signal end of parse sequence (boolean retval). */ int mdoc_endparse(struct mdoc *); - -/* The following are utility functions. */ -const char *mdoc_arch2a(enum mdoc_arch); -const char *mdoc_vol2a(enum mdoc_vol); -const char *mdoc_msec2a(enum mdoc_msec); -int mdoc_isdelim(const char *); __END_DECLS