aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff.h
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-04-02 22:48:17 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-04-02 22:48:17 +0000
commit8a1e7c36cb8b9ca64c677d1ff9d786c9e46fd7b0 (patch)
tree8875174fa99d2fb62fe97ec308a53905416a4e4f /roff.h
parent483afc5a7a52b601da9e854d5645cd4b0a140184 (diff)
downloadmandoc-8a1e7c36cb8b9ca64c677d1ff9d786c9e46fd7b0.tar.gz
mandoc-8a1e7c36cb8b9ca64c677d1ff9d786c9e46fd7b0.tar.zst
mandoc-8a1e7c36cb8b9ca64c677d1ff9d786c9e46fd7b0.zip
Second step towards parser unification:
Replace struct mdoc_node and struct man_node by a unified struct roff_node. To be able to use the tok member for both mdoc(7) and man(7) without defining all the macros in roff.h, sacrifice a tiny bit of type safety and make tok an int rather than an enum. Almost mechanical, no functional change. Written on the Eurostar from Bruxelles to London on the way to p2k15.
Diffstat (limited to 'roff.h')
-rw-r--r--roff.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/roff.h b/roff.h
index e9566c1a..232100c8 100644
--- a/roff.h
+++ b/roff.h
@@ -16,6 +16,36 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+struct mdoc_arg;
+union mdoc_data;
+
+enum roff_sec {
+ SEC_NONE = 0,
+ SEC_NAME,
+ SEC_LIBRARY,
+ SEC_SYNOPSIS,
+ SEC_DESCRIPTION,
+ SEC_CONTEXT,
+ SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */
+ SEC_RETURN_VALUES,
+ SEC_ENVIRONMENT,
+ SEC_FILES,
+ SEC_EXIT_STATUS,
+ SEC_EXAMPLES,
+ SEC_DIAGNOSTICS,
+ SEC_COMPATIBILITY,
+ SEC_ERRORS,
+ SEC_SEE_ALSO,
+ SEC_STANDARDS,
+ SEC_HISTORY,
+ SEC_AUTHORS,
+ SEC_CAVEATS,
+ SEC_BUGS,
+ SEC_SECURITY,
+ SEC_CUSTOM,
+ SEC__MAX
+};
+
enum roff_type {
ROFFT_ROOT,
ROFFT_BLOCK,
@@ -27,3 +57,50 @@ enum roff_type {
ROFFT_TBL,
ROFFT_EQN
};
+
+/*
+ * Indicates that a BODY's formatting has ended, but
+ * the scope is still open. Used for badly nested blocks.
+ */
+enum mdoc_endbody {
+ ENDBODY_NOT = 0,
+ ENDBODY_SPACE, /* Is broken: append a space. */
+ ENDBODY_NOSPACE /* Is broken: don't append a space. */
+};
+
+struct roff_node {
+ struct roff_node *parent; /* Parent AST node. */
+ struct roff_node *child; /* First child AST node. */
+ struct roff_node *last; /* Last child AST node. */
+ struct roff_node *next; /* Sibling AST node. */
+ struct roff_node *prev; /* Prior sibling AST node. */
+ struct roff_node *head; /* BLOCK */
+ struct roff_node *body; /* BLOCK/ENDBODY */
+ struct roff_node *tail; /* BLOCK */
+ struct mdoc_arg *args; /* BLOCK/ELEM */
+ union mdoc_data *norm; /* Normalized arguments. */
+ char *string; /* TEXT */
+ const struct tbl_span *span; /* TBL */
+ const struct eqn *eqn; /* EQN */
+ int nchild; /* Number of child nodes. */
+ int line; /* Input file line number. */
+ int pos; /* Input file column number. */
+ int tok; /* Request or macro ID. */
+ int flags;
+#define MDOC_VALID (1 << 0) /* Has been validated. */
+#define MDOC_ENDED (1 << 1) /* Gone past body end mark. */
+#define MDOC_EOS (1 << 2) /* At sentence boundary. */
+#define MDOC_LINE (1 << 3) /* First macro/text on line. */
+#define MDOC_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting. */
+#define MDOC_BROKEN (1 << 5) /* Must validate parent when ending. */
+#define MDOC_DELIMO (1 << 6)
+#define MDOC_DELIMC (1 << 7)
+#define MAN_VALID MDOC_VALID
+#define MAN_EOS MDOC_EOS
+#define MAN_LINE MDOC_LINE
+ int prev_font; /* Before entering this node. */
+ int aux; /* Decoded node data, type-dependent. */
+ enum roff_type type; /* AST node type. */
+ enum roff_sec sec; /* Current named section. */
+ enum mdoc_endbody end; /* BODY */
+};