]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.h
Commit and commit message by deraadt@:
[mandoc.git] / roff.h
diff --git a/roff.h b/roff.h
index 8cc3c2eb55c31287f09dda6a0ea51b26afcfc8b4..2933eb9c0bf83eb88fd4f2501185e01e98ed70e2 100644 (file)
--- a/roff.h
+++ b/roff.h
@@ -1,7 +1,7 @@
-/*     $Id: roff.h,v 1.54 2017/06/14 22:51:25 schwarze Exp $   */
+/* $Id: roff.h,v 1.74 2020/04/08 11:56:03 schwarze Exp $       */
 /*
+ * Copyright (c) 2013-2015, 2017-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  * 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.
+ *
+ * Common data types for all syntax trees and related functions.
  */
 
 struct ohash;
 struct mdoc_arg;
 union  mdoc_data;
+struct tbl_span;
+struct eqn_box;
 
 enum   roff_macroset {
        MACROSET_NONE = 0,
@@ -26,12 +30,6 @@ enum roff_macroset {
        MACROSET_MAN
 };
 
-enum   mdoc_os {
-       MDOC_OS_OTHER = 0,
-       MDOC_OS_NETBSD,
-       MDOC_OS_OPENBSD
-};
-
 enum   roff_sec {
        SEC_NONE = 0,
        SEC_NAME,
@@ -67,6 +65,7 @@ enum  roff_type {
        ROFFT_TAIL,
        ROFFT_ELEM,
        ROFFT_TEXT,
+       ROFFT_COMMENT,
        ROFFT_TBL,
        ROFFT_EQN
 };
@@ -74,9 +73,11 @@ enum roff_type {
 enum   roff_tok {
        ROFF_br = 0,
        ROFF_ce,
+       ROFF_fi,
        ROFF_ft,
        ROFF_ll,
        ROFF_mc,
+       ROFF_nf,
        ROFF_po,
        ROFF_rj,
        ROFF_sp,
@@ -161,7 +162,6 @@ enum        roff_tok {
        ROFF_fcolor,
        ROFF_fdeferlig,
        ROFF_feature,
-       /* MAN_fi; ignored in mdoc(7) */
        ROFF_fkern,
        ROFF_fl,
        ROFF_flig,
@@ -221,7 +221,6 @@ enum        roff_tok {
        ROFF_mso,
        ROFF_na,
        ROFF_ne,
-       /* MAN_nf; ignored in mdoc(7) */
        ROFF_nh,
        ROFF_nhychar,
        ROFF_nm,
@@ -438,11 +437,13 @@ enum      roff_tok {
        MDOC__Q,
        MDOC__U,
        MDOC_Ta,
+       MDOC_Tg,
        MDOC_MAX,
        MAN_TH,
        MAN_SH,
        MAN_SS,
        MAN_TP,
+       MAN_TQ,
        MAN_LP,
        MAN_PP,
        MAN_P,
@@ -459,8 +460,6 @@ enum        roff_tok {
        MAN_I,
        MAN_IR,
        MAN_RI,
-       MAN_nf,
-       MAN_fi,
        MAN_RE,
        MAN_RS,
        MAN_DT,
@@ -468,19 +467,18 @@ enum      roff_tok {
        MAN_PD,
        MAN_AT,
        MAN_in,
+       MAN_SY,
+       MAN_YS,
        MAN_OP,
        MAN_EX,
        MAN_EE,
        MAN_UR,
        MAN_UE,
+       MAN_MT,
+       MAN_ME,
        MAN_MAX
 };
 
-enum   roff_next {
-       ROFF_NEXT_SIBLING = 0,
-       ROFF_NEXT_CHILD
-};
-
 /*
  * Indicates that a BODY's formatting has ended, but
  * the scope is still open.  Used for badly nested blocks.
@@ -490,6 +488,12 @@ enum       mdoc_endbody {
        ENDBODY_SPACE   /* Is broken: append a space. */
 };
 
+enum   mandoc_os {
+       MANDOC_OS_OTHER = 0,
+       MANDOC_OS_NETBSD,
+       MANDOC_OS_OPENBSD
+};
+
 struct roff_node {
        struct roff_node *parent;  /* Parent AST node. */
        struct roff_node *child;   /* First child AST node. */
@@ -502,21 +506,25 @@ struct    roff_node {
        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 */
+       char             *tag;     /* For less(1) :t and HTML id=. */
+       struct tbl_span  *span;    /* TBL */
+       struct eqn_box   *eqn;     /* EQN */
        int               line;    /* Input file line number. */
        int               pos;     /* Input file column number. */
        int               flags;
 #define        NODE_VALID       (1 << 0)  /* Has been validated. */
 #define        NODE_ENDED       (1 << 1)  /* Gone past body end mark. */
-#define        NODE_EOS         (1 << 2)  /* At sentence boundary. */
+#define        NODE_BROKEN      (1 << 2)  /* Must validate parent when ending. */
 #define        NODE_LINE        (1 << 3)  /* First macro/text on line. */
-#define        NODE_SYNPRETTY   (1 << 4)  /* SYNOPSIS-style formatting. */
-#define        NODE_BROKEN      (1 << 5)  /* Must validate parent when ending. */
-#define        NODE_DELIMO      (1 << 6)
-#define        NODE_DELIMC      (1 << 7)
-#define        NODE_NOSRC       (1 << 8)  /* Generated node, not in input file. */
-#define        NODE_NOPRT       (1 << 9)  /* Shall not print anything. */
+#define        NODE_DELIMO      (1 << 4)
+#define        NODE_DELIMC      (1 << 5)
+#define        NODE_EOS         (1 << 6)  /* At sentence boundary. */
+#define        NODE_SYNPRETTY   (1 << 7)  /* SYNOPSIS-style formatting. */
+#define        NODE_NOFILL      (1 << 8)  /* Fill mode switched off. */
+#define        NODE_NOSRC       (1 << 9)  /* Generated node, not in input file. */
+#define        NODE_NOPRT       (1 << 10) /* Shall not print anything. */
+#define        NODE_ID          (1 << 11) /* Target for deep linking. */
+#define        NODE_HREF        (1 << 12) /* Link to another place in this page. */
        int               prev_font; /* Before entering this node. */
        int               aux;     /* Decoded node data, type-dependent. */
        enum roff_tok     tok;     /* Request or macro ID. */
@@ -526,6 +534,7 @@ struct      roff_node {
 };
 
 struct roff_meta {
+       struct roff_node *first;   /* The first node parsed. */
        char             *msec;    /* Manual section, usually a digit. */
        char             *vol;     /* Manual volume title. */
        char             *os;      /* Operating system. */
@@ -533,50 +542,20 @@ struct    roff_meta {
        char             *title;   /* Manual title, usually CAPS. */
        char             *name;    /* Leading manual name. */
        char             *date;    /* Normalized date. */
+       char             *sodest;  /* .so target file name or NULL. */
        int               hasbody; /* Document is not empty. */
-       enum mdoc_os      os_e;    /* Operating system. */
-};
-
-struct roff_man {
-       struct roff_meta  meta;    /* Document meta-data. */
-       struct mparse    *parse;   /* Parse pointer. */
-       struct roff      *roff;    /* Roff parser state data. */
-       struct ohash     *mdocmac; /* Mdoc macro lookup table. */
-       struct ohash     *manmac;  /* Man macro lookup table. */
-       const char       *defos;   /* Default operating system. */
-       struct roff_node *first;   /* The first node parsed. */
-       struct roff_node *last;    /* The last node parsed. */
-       struct roff_node *last_es; /* The most recent Es node. */
-       int               quick;   /* Abort parse early. */
-       int               flags;   /* Parse flags. */
-#define        MDOC_LITERAL     (1 << 1)  /* In a literal scope. */
-#define        MDOC_PBODY       (1 << 2)  /* In the document body. */
-#define        MDOC_NEWLINE     (1 << 3)  /* First macro/text in a line. */
-#define        MDOC_PHRASE      (1 << 4)  /* In a Bl -column phrase. */
-#define        MDOC_PHRASELIT   (1 << 5)  /* Literal within a phrase. */
-#define        MDOC_FREECOL     (1 << 6)  /* `It' invocation should close. */
-#define        MDOC_SYNOPSIS    (1 << 7)  /* SYNOPSIS-style formatting. */
-#define        MDOC_KEEP        (1 << 8)  /* In a word keep. */
-#define        MDOC_SMOFF       (1 << 9)  /* Spacing is off. */
-#define        MDOC_NODELIMC    (1 << 10) /* Disable closing delimiter handling. */
-#define        MAN_ELINE        (1 << 11) /* Next-line element scope. */
-#define        MAN_BLINE        (1 << 12) /* Next-line block scope. */
-#define        MDOC_PHRASEQF    (1 << 13) /* Quote first word encountered. */
-#define        MDOC_PHRASEQL    (1 << 14) /* Quote last word of this phrase. */
-#define        MDOC_PHRASEQN    (1 << 15) /* Quote first word of the next phrase. */
-#define        MAN_LITERAL       MDOC_LITERAL
-#define        MAN_NEWLINE       MDOC_NEWLINE
+       int               rcsids;  /* Bits indexed by enum mandoc_os. */
+       enum mandoc_os    os_e;    /* Operating system. */
        enum roff_macroset macroset; /* Kind of high-level macros used. */
-       enum roff_sec     lastsec; /* Last section seen. */
-       enum roff_sec     lastnamed; /* Last standard section seen. */
-       enum roff_next    next;    /* Where to put the next node. */
 };
 
 extern const char *const *roff_name;
 
 
-void            deroff(char **, const struct roff_node *);
-struct ohash   *roffhash_alloc(enum roff_tok, enum roff_tok);
-enum roff_tok   roffhash_find(struct ohash *, const char *, size_t);
-void            roffhash_free(struct ohash *);
-void            roff_validate(struct roff_man *);
+int              arch_valid(const char *, enum mandoc_os);
+void             deroff(char **, const struct roff_node *);
+struct roff_node *roff_node_child(struct roff_node *);
+struct roff_node *roff_node_next(struct roff_node *);
+struct roff_node *roff_node_prev(struct roff_node *);
+int              roff_node_transparent(struct roff_node *);
+int              roff_tok_transparent(enum roff_tok);