X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/9d89dc957fdca4edae24c0b070474ec19997ffbb..9275a05a090b366b47ed479d15472e058b8d8318:/private.h

diff --git a/private.h b/private.h
index 3f46f174..6bcfe7c0 100644
--- a/private.h
+++ b/private.h
@@ -1,4 +1,4 @@
-/* $Id: private.h,v 1.52 2009/01/01 20:40:16 kristaps Exp $ */
+/* $Id: private.h,v 1.77 2009/02/21 21:00:06 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -30,65 +30,116 @@ struct	mdoc {
 	void		 *data;
 	struct mdoc_cb	  cb;
 	void		 *htab;
+	int		  linetok;
 	int		  flags;
+#define	MDOC_HALT	 (1 << 0)
 	enum mdoc_next	  next;
 	struct mdoc_node *last;
 	struct mdoc_node *first;
 	struct mdoc_meta  meta;
-	enum mdoc_sec	  sec_lastn;
-	enum mdoc_sec	  sec_last;
+	enum mdoc_sec	  lastnamed;
 };
 
+
+/* Hard-limit of macro arguments. */
+
+#define	MDOC_LINEARG_MAX 9
+
+/* Suggested limit of macro arguments. */
+
+#define	MDOC_LINEARG_SOFTMAX 9
+
+#define	MACRO_PROT_ARGS	struct mdoc *mdoc, int tok, int line, \
+			int ppos, int *pos, char *buf
+
 struct	mdoc_macro {
-	int	(*fp)(struct mdoc *, int, int, int *, char *);
-	int	  flags;
-#define	MDOC_CALLABLE	(1 << 0)
-#define	MDOC_EXPLICIT	(1 << 1)
-#define	MDOC_QUOTABLE	(1 << 2)
-#define	MDOC_PROLOGUE	(1 << 3)
+	int		(*fp)(MACRO_PROT_ARGS);
+	int		  flags;
+#define	MDOC_CALLABLE	 (1 << 0)
+#define	MDOC_PARSED	 (1 << 1)
+#define	MDOC_EXPLICIT	 (1 << 2)
+#define	MDOC_PROLOGUE	 (1 << 3)
 };
 
-extern	const struct mdoc_macro *const mdoc_macros;
+#define	mdoc_nwarn(mdoc, node, type, fmt, ...) \
+		  mdoc_vwarn((mdoc), (node)->line, \
+		  (node)->pos, (type), (fmt), ##__VA_ARGS__)
 
-#define	MACRO_PROT_ARGS	struct mdoc *mdoc, int tok, \
-			int ppos, int *pos, char *buf
+#define	mdoc_nerr(mdoc, node, fmt, ...) \
+		  mdoc_verr((mdoc), (node)->line, \
+		  (node)->pos, (fmt), ##__VA_ARGS__)
+
+#define	mdoc_warn(mdoc, type, fmt, ...) \
+		  mdoc_vwarn((mdoc), (mdoc)->last->line, \
+		  (mdoc)->last->pos, (type), (fmt), ##__VA_ARGS__)
+
+#define	mdoc_err(mdoc, fmt, ...) \
+		  mdoc_verr((mdoc), (mdoc)->last->line, \
+		  (mdoc)->last->pos, (fmt), ##__VA_ARGS__)
+
+#define	mdoc_msg(mdoc, fmt, ...) \
+		  mdoc_vmsg((mdoc), (mdoc)->last->line, \
+		  (mdoc)->last->pos, (fmt), ##__VA_ARGS__)
+
+#define	mdoc_pmsg(mdoc, line, pos, fmt, ...) \
+		  mdoc_vmsg((mdoc), (line), \
+	  	  (pos), (fmt), ##__VA_ARGS__)
+
+#define	mdoc_pwarn(mdoc, line, pos, type, fmt, ...) \
+		  mdoc_vwarn((mdoc), (line), \
+	  	  (pos), (type), (fmt), ##__VA_ARGS__)
+
+#define	mdoc_perr(mdoc, line, pos, fmt, ...) \
+		  mdoc_verr((mdoc), (line), \
+	  	  (pos), (fmt), ##__VA_ARGS__)
+
+extern	const struct mdoc_macro *const mdoc_macros;
 
 __BEGIN_DECLS
 
-int		  mdoc_err(struct mdoc *, int, int, enum mdoc_err);
-int		  mdoc_warn(struct mdoc *, int, int, enum mdoc_warn);
-void		  mdoc_msg(struct mdoc *, int, const char *, ...);
-int		  mdoc_macro(struct mdoc *, int, int, int *, char *);
+int		  mdoc_vwarn(struct mdoc *, int, int, 
+			enum mdoc_warn, const char *, ...);
+void		  mdoc_vmsg(struct mdoc *, int, int, 
+			const char *, ...);
+int		  mdoc_verr(struct mdoc *, int, int, 
+			const char *, ...);
+
+int		  mdoc_macro(MACRO_PROT_ARGS);
 int		  mdoc_find(const struct mdoc *, const char *);
-void		  mdoc_word_alloc(struct mdoc *, int, const char *);
-void		  mdoc_elem_alloc(struct mdoc *, int, int, 
-			size_t, const struct mdoc_arg *, 
-			size_t, const char **);
-void		  mdoc_block_alloc(struct mdoc *, int, int, 
-			size_t, const struct mdoc_arg *);
-void		  mdoc_head_alloc(struct mdoc *, int, int);
-void		  mdoc_body_alloc(struct mdoc *, int, int);
+int		  mdoc_word_alloc(struct mdoc *, 
+			int, int, const char *);
+int		  mdoc_elem_alloc(struct mdoc *, int, int, 
+			int, size_t, const struct mdoc_arg *);
+int		  mdoc_block_alloc(struct mdoc *, int, int, 
+			int, size_t, const struct mdoc_arg *);
+int		  mdoc_root_alloc(struct mdoc *);
+int		  mdoc_head_alloc(struct mdoc *, int, int, int);
+int		  mdoc_tail_alloc(struct mdoc *, int, int, int);
+int		  mdoc_body_alloc(struct mdoc *, int, int, int);
 void		  mdoc_node_free(struct mdoc_node *);
+void		  mdoc_node_freelist(struct mdoc_node *);
 void		  mdoc_sibling(struct mdoc *, int, struct mdoc_node **,
 			struct mdoc_node **, struct mdoc_node *);
 void		 *mdoc_tokhash_alloc(void);
 int		  mdoc_tokhash_find(const void *, const char *);
 void		  mdoc_tokhash_free(void *);
-int		  mdoc_isdelim(const char *);
 int		  mdoc_iscdelim(char);
-enum	mdoc_sec  mdoc_atosec(size_t, const char **);
+enum	mdoc_sec  mdoc_atosec(const char *);
 enum	mdoc_msec mdoc_atomsec(const char *);
 enum	mdoc_vol  mdoc_atovol(const char *);
 enum	mdoc_arch mdoc_atoarch(const char *);
 enum	mdoc_att  mdoc_atoatt(const char *);
 time_t		  mdoc_atotime(const char *);
 
-int		  mdoc_valid_post(struct mdoc *, int, int);
-int		  mdoc_valid_pre(struct mdoc *, int, int,
-			int, const char *[],
-			int, const struct mdoc_arg *);
+char		 *mdoc_type2a(enum mdoc_type);
+char		 *mdoc_node2a(struct mdoc_node *);
 
-int		  mdoc_argv(struct mdoc *, int, 
+int		  mdoc_valid_pre(struct mdoc *, struct mdoc_node *);
+int		  mdoc_valid_post(struct mdoc *);
+int		  mdoc_action_pre(struct mdoc *, struct mdoc_node *);
+int		  mdoc_action_post(struct mdoc *);
+
+int		  mdoc_argv(struct mdoc *, int, int, 
 			struct mdoc_arg *, int *, char *);
 #define	ARGV_ERROR	(-1)
 #define	ARGV_EOLN	(0)
@@ -101,28 +152,27 @@ int		  mdoc_args(struct mdoc *, int,
 #define	ARGS_EOLN	(0)
 #define	ARGS_WORD	(1)
 #define	ARGS_PUNCT	(2)
+#define	ARGS_QWORD	(3)
+#define	ARGS_PHRASE	(4)
 
-#define	ARGS_QUOTED	(1 << 0)
-#define	ARGS_DELIM	(1 << 1)
-
+int		  xstrlcats(char *, const struct mdoc_node *, size_t);
 int	  	  xstrlcat(char *, const char *, size_t);
 int	  	  xstrlcpy(char *, const char *, size_t);
 int	  	  xstrcmp(const char *, const char *);
+int	  	  xstrncmp(const char *, const char *, size_t);
 void	 	 *xcalloc(size_t, size_t);
 char	 	 *xstrdup(const char *);
 
 int		  macro_obsolete(MACRO_PROT_ARGS);
-int		  macro_constant_quoted(MACRO_PROT_ARGS);
-int		  macro_constant_obsolete(MACRO_PROT_ARGS);
-int		  macro_constant_argv(MACRO_PROT_ARGS);
 int		  macro_constant(MACRO_PROT_ARGS);
+int		  macro_constant_scoped(MACRO_PROT_ARGS);
 int		  macro_constant_delimited(MACRO_PROT_ARGS);
 int		  macro_text(MACRO_PROT_ARGS);
 int		  macro_scoped(MACRO_PROT_ARGS);
-int		  macro_close_explicit(MACRO_PROT_ARGS);
+int		  macro_scoped_close(MACRO_PROT_ARGS);
 int		  macro_scoped_line(MACRO_PROT_ARGS);
-int		  macro_scoped_pline(MACRO_PROT_ARGS);
 int		  macro_prologue(MACRO_PROT_ARGS);
+int		  macro_end(struct mdoc *);
 
 __END_DECLS