Home | History | Annotate | Line # | Download | only in dist
libmdoc.h revision 1.1.1.4
      1 /*	$Vendor-Id: libmdoc.h,v 1.33 2010/04/06 11:33:00 kristaps Exp $ */
      2 /*
      3  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps (at) kth.se>
      4  *
      5  * Permission to use, copy, modify, and distribute this software for any
      6  * purpose with or without fee is hereby granted, provided that the above
      7  * copyright notice and this permission notice appear in all copies.
      8  *
      9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     16  */
     17 #ifndef LIBMDOC_H
     18 #define LIBMDOC_H
     19 
     20 #include "mdoc.h"
     21 
     22 enum	mdoc_next {
     23 	MDOC_NEXT_SIBLING = 0,
     24 	MDOC_NEXT_CHILD
     25 };
     26 
     27 struct	mdoc {
     28 	void		 *data;
     29 	struct mdoc_cb	  cb;
     30 	int		  flags;
     31 #define	MDOC_HALT	 (1 << 0)	/* Error in parse. Halt. */
     32 #define	MDOC_LITERAL	 (1 << 1)	/* In a literal scope. */
     33 #define	MDOC_PBODY	 (1 << 2)	/* In the document body. */
     34 	int		  pflags;
     35 	enum mdoc_next	  next;
     36 	struct mdoc_node *last;
     37 	struct mdoc_node *first;
     38 	struct mdoc_meta  meta;
     39 	enum mdoc_sec	  lastnamed;
     40 	enum mdoc_sec	  lastsec;
     41 };
     42 
     43 enum	merr {
     44 	ETAILWS = 0,
     45 	EQUOTPARM,
     46 	EQUOTTERM,
     47 	EARGVAL,
     48 	EBODYPROL,
     49 	EPROLBODY,
     50 	ETEXTPROL,
     51 	ENOBLANK,
     52 	ETOOLONG,
     53 	EESCAPE,
     54 	EPRINT,
     55 	ENODAT,
     56 	ENOPROLOGUE,
     57 	ELINE,
     58 	EATT,
     59 	ENAME,
     60 	ELISTTYPE,
     61 	EDISPTYPE,
     62 	EMULTIDISP,
     63 	EMULTILIST,
     64 	ESECNAME,
     65 	ENAMESECINC,
     66 	EARGREP,
     67 	EBOOL,
     68 	ECOLMIS,
     69 	ENESTDISP,
     70 	EMISSWIDTH,
     71 	EWRONGMSEC,
     72 	ESECOOO,
     73 	ESECREP,
     74 	EBADSTAND,
     75 	ENOMULTILINE,
     76 	EMULTILINE,
     77 	ENOLINE,
     78 	EPROLOOO,
     79 	EPROLREP,
     80 	EBADMSEC,
     81 	EBADSEC,
     82 	EFONT,
     83 	EBADDATE,
     84 	ENUMFMT,
     85 	ENOWIDTH,
     86 	EUTSNAME,
     87 	EOBS,
     88 	EIMPBRK,
     89 	EIGNE,
     90 	EOPEN,
     91 	EQUOTPHR,
     92 	ENOCTX,
     93 	ELIB,
     94 	EBADCHILD,
     95 	ENOTYPE,
     96 	MERRMAX
     97 };
     98 
     99 #define	MACRO_PROT_ARGS	struct mdoc *m, enum mdoct tok, \
    100 			int line, int ppos, int *pos, char *buf
    101 
    102 struct	mdoc_macro {
    103 	int		(*fp)(MACRO_PROT_ARGS);
    104 	int		  flags;
    105 #define	MDOC_CALLABLE	 (1 << 0)
    106 #define	MDOC_PARSED	 (1 << 1)
    107 #define	MDOC_EXPLICIT	 (1 << 2)
    108 #define	MDOC_PROLOGUE	 (1 << 3)
    109 #define	MDOC_IGNDELIM	 (1 << 4)
    110 	/* Reserved words in arguments treated as text. */
    111 };
    112 
    113 extern	const struct mdoc_macro *const mdoc_macros;
    114 
    115 __BEGIN_DECLS
    116 
    117 #define		  mdoc_perr(m, l, p, t) \
    118 		  mdoc_err((m), (l), (p), 1, (t))
    119 #define		  mdoc_pwarn(m, l, p, t) \
    120 		  mdoc_err((m), (l), (p), 0, (t))
    121 #define		  mdoc_nerr(m, n, t) \
    122 		  mdoc_err((m), (n)->line, (n)->pos, 1, (t))
    123 #define		  mdoc_nwarn(m, n, t) \
    124 		  mdoc_err((m), (n)->line, (n)->pos, 0, (t))
    125 
    126 int		  mdoc_err(struct mdoc *, int, int, int, enum merr);
    127 int		  mdoc_verr(struct mdoc *, int, int, const char *, ...);
    128 int		  mdoc_vwarn(struct mdoc *, int, int, const char *, ...);
    129 
    130 int		  mdoc_macro(MACRO_PROT_ARGS);
    131 int		  mdoc_word_alloc(struct mdoc *,
    132 			int, int, const char *);
    133 int		  mdoc_elem_alloc(struct mdoc *, int, int,
    134 			enum mdoct, struct mdoc_arg *);
    135 int		  mdoc_block_alloc(struct mdoc *, int, int,
    136 			enum mdoct, struct mdoc_arg *);
    137 int		  mdoc_head_alloc(struct mdoc *, int, int, enum mdoct);
    138 int		  mdoc_tail_alloc(struct mdoc *, int, int, enum mdoct);
    139 int		  mdoc_body_alloc(struct mdoc *, int, int, enum mdoct);
    140 void		  mdoc_node_delete(struct mdoc *, struct mdoc_node *);
    141 void		  mdoc_hash_init(void);
    142 enum mdoct	  mdoc_hash_find(const char *);
    143 int		  mdoc_iscdelim(char);
    144 int		  mdoc_isdelim(const char *);
    145 size_t		  mdoc_isescape(const char *);
    146 enum	mdoc_sec  mdoc_atosec(const char *);
    147 time_t		  mdoc_atotime(const char *);
    148 
    149 size_t		  mdoc_macro2len(int);
    150 const char	 *mdoc_a2att(const char *);
    151 const char	 *mdoc_a2lib(const char *);
    152 const char	 *mdoc_a2st(const char *);
    153 const char	 *mdoc_a2arch(const char *);
    154 const char	 *mdoc_a2vol(const char *);
    155 const char	 *mdoc_a2msec(const char *);
    156 int		  mdoc_valid_pre(struct mdoc *,
    157 			const struct mdoc_node *);
    158 int		  mdoc_valid_post(struct mdoc *);
    159 int		  mdoc_action_pre(struct mdoc *,
    160 			const struct mdoc_node *);
    161 int		  mdoc_action_post(struct mdoc *);
    162 int		  mdoc_argv(struct mdoc *, int, enum mdoct,
    163 			struct mdoc_arg **, int *, char *);
    164 #define	ARGV_ERROR	(-1)
    165 #define	ARGV_EOLN	(0)
    166 #define	ARGV_ARG	(1)
    167 #define	ARGV_WORD	(2)
    168 void		  mdoc_argv_free(struct mdoc_arg *);
    169 void		  mdoc_argn_free(struct mdoc_arg *, int);
    170 int		  mdoc_args(struct mdoc *, int,
    171 			int *, char *, enum mdoct, char **);
    172 int		  mdoc_zargs(struct mdoc *, int,
    173 			int *, char *, int, char **);
    174 #define	ARGS_DELIM	(1 << 1)	/* See args(). */
    175 #define	ARGS_TABSEP	(1 << 2)	/* See args(). */
    176 #define	ARGS_NOWARN	(1 << 3)	/* See args(). */
    177 #define	ARGS_ERROR	(-1)
    178 #define	ARGS_EOLN	(0)
    179 #define	ARGS_WORD	(1)
    180 #define	ARGS_PUNCT	(2)
    181 #define	ARGS_QWORD	(3)
    182 #define	ARGS_PHRASE	(4)
    183 int		  mdoc_macroend(struct mdoc *);
    184 
    185 __END_DECLS
    186 
    187 #endif /*!LIBMDOC_H*/
    188