]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc.h
Fixed STRUCTURE repeat (schwarze@openbsd.org).
[mandoc.git] / mdoc.h
diff --git a/mdoc.h b/mdoc.h
index baeb448452ab4f718f1ecf669da3b5f8445563c5..bd139d6c9e30e47c29049c9183d8fd2d22e91825 100644 (file)
--- a/mdoc.h
+++ b/mdoc.h
@@ -1,27 +1,35 @@
-/* $Id: mdoc.h,v 1.1 2008/12/15 01:54:58 kristaps Exp $ */
+/*     $Id: mdoc.h,v 1.61 2009/06/18 20:46:19 kristaps Exp $ */
 /*
- * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
  * 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
 
-#define        MDOC_LINEARG_MAX 9
+#include <time.h>
 
-#define        MDOC___          0
+/*
+ * This library implements a validating scanner/parser for ``mdoc'' roff
+ * macro documents, a.k.a. BSD manual page documents.  The mdoc.c file
+ * drives the parser, while macro.c describes the macro ontologies.
+ * validate.c pre- and post-validates parsed macros, and action.c
+ * performs actions on parsed and validated macros.
+ */
+
+/* What follows is a list of ALL possible macros. */
+
+#define        MDOC_Ap          0
 #define        MDOC_Dd          1
 #define        MDOC_Dt          2
 #define        MDOC_Os          3
 #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_MAX         118
+
+/* What follows is a list of ALL possible macro arguments. */
 
 #define        MDOC_Split       0
 #define        MDOC_Nosplit     1
 #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_ARG_MAX     60
-
-enum   mdoc_err {
-       ERR_SYNTAX_QUOTE,
-       ERR_SYNTAX_WS,
-       ERR_MACRO_NOTSUP,
-       ERR_MACRO_NOTCALL,
-       ERR_SCOPE_BREAK,
-       ERR_ARGS_GE1
-};
+#define        MDOC_Filled      21
+#define        MDOC_Words       22
+#define        MDOC_Emphasis    23
+#define        MDOC_Symbolic    24
+#define        MDOC_Nested      25
+#define        MDOC_ARG_MAX     26
 
+/* Warnings are either syntax or groff-compatibility. */
 enum   mdoc_warn {
-       WARN_SYNTAX_WS_EOLN,
-       WARN_SYNTAX_MACLIKE,
-       WARN_ARGS_GE1
-};
-
-struct mdoc_arg {
-       int               arg;
-       size_t            sz;
-       char            **value;
+       WARN_SYNTAX,
+       WARN_COMPAT
 };
 
+/* Type of a syntax node. */
 enum   mdoc_type {
        MDOC_TEXT,
        MDOC_ELEM,
        MDOC_HEAD,
+       MDOC_TAIL,
        MDOC_BODY,
-       MDOC_BLOCK
+       MDOC_BLOCK,
+       MDOC_ROOT
 };
 
-struct mdoc_text {
-       char             *string;
+/* Section (named/unnamed) of `Sh'. */
+enum   mdoc_sec {
+       SEC_NONE,               /* No section, yet. */
+       SEC_NAME,
+       SEC_LIBRARY,
+       SEC_SYNOPSIS,
+       SEC_DESCRIPTION,
+       SEC_IMPLEMENTATION,
+       SEC_RETURN_VALUES,
+       SEC_ENVIRONMENT,
+       SEC_FILES,
+       SEC_EXAMPLES,
+       SEC_DIAGNOSTICS,
+       SEC_COMPATIBILITY,
+       SEC_ERRORS,
+       SEC_SEE_ALSO,
+       SEC_STANDARDS,
+       SEC_HISTORY,
+       SEC_AUTHORS,
+       SEC_CAVEATS,
+       SEC_BUGS,
+       SEC_CUSTOM              /* User-defined. */
 };
 
-struct mdoc_block {
-       int               tok;
-       size_t            argc;
-       struct mdoc_arg  *argv;
+/* Information from prologue. */
+struct mdoc_meta {
+       int               msec;
+       char             *vol;
+       char             *arch;
+       time_t            date;
+       char             *title;
+       char             *os;
+       char             *name;
 };
 
-struct mdoc_head {
+/* An argument to a macro (multiple values = `It -column'). */
+struct mdoc_argv {
+       int               arg;
+       int               line;
+       int               pos;
        size_t            sz;
-       char            **args;
-       int               tok;
-};
-
-struct mdoc_body {
-       int               tok;
+       char            **value;
 };
 
-struct mdoc_elem {
-       size_t            sz;
-       char            **args;
-       int               tok;
+struct         mdoc_arg {
        size_t            argc;
-       struct mdoc_arg  *argv;
-};
-
-union  mdoc_data {
-       struct mdoc_text  text;
-       struct mdoc_elem  elem;
-       struct mdoc_body  body;
-       struct mdoc_head  head;
-       struct mdoc_block block;
+       struct mdoc_argv *argv;
+       unsigned int      refcnt;
 };
 
+/* 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;
+       int               flags;
+#define        MDOC_VALID       (1 << 0)
+#define        MDOC_ACTED       (1 << 1)
        enum mdoc_type    type;
-       union mdoc_data   data;
+       enum mdoc_sec     sec;
+
+       /* FIXME: union/struct this with #defines. */
+       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. */
+/* FIXME: unify somehow with man_cb. */
 struct mdoc_cb {
-       int     (*mdoc_err)(void *, int, int, enum mdoc_err);
-       int     (*mdoc_warn)(void *, int, int, enum mdoc_warn);
-       void    (*mdoc_msg)(void *, int, const char *);
+       int     (*mdoc_err)(void *, int, int, const char *);
+       int     (*mdoc_warn)(void *, int, int, 
+                       enum mdoc_warn, const char *);
 };
 
+/* See mdoc.3 for documentation. */
+
 extern const char *const *mdoc_macronames;
 extern const char *const *mdoc_argnames;
 
@@ -277,12 +292,19 @@ __BEGIN_DECLS
 
 struct mdoc;
 
+/* See mdoc.3 for documentation. */
+
 void             mdoc_free(struct mdoc *);
-struct mdoc     *mdoc_alloc(void *data, const struct mdoc_cb *);
-int              mdoc_parseln(struct mdoc *, char *buf);
+struct mdoc     *mdoc_alloc(void *, int, const struct mdoc_cb *);
+int              mdoc_reset(struct mdoc *);
+int              mdoc_parseln(struct mdoc *, int, char *buf);
+const struct mdoc_node *mdoc_node(const struct mdoc *);
+const struct mdoc_meta *mdoc_meta(const struct mdoc *);
+int              mdoc_endparse(struct mdoc *);
 
-const struct mdoc_node
-                *mdoc_result(struct mdoc *);
+const char      *mdoc_a2att(const char *);
+const char      *mdoc_a2lib(const char *);
+const char      *mdoc_a2st(const char *);
 
 __END_DECLS