summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmdoc.h1
-rw-r--r--mdoc.c32
-rw-r--r--mdoc_action.c11
-rw-r--r--mdoc_macro.c5
4 files changed, 34 insertions, 15 deletions
diff --git a/libmdoc.h b/libmdoc.h
index 579809cd..5cf1f647 100644
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -36,6 +36,7 @@ struct mdoc {
#define MDOC_PHRASELIT (1 << 4) /* literal within a partila phrase */
#define MDOC_PPHRASE (1 << 5) /* within a partial phrase */
#define MDOC_FREECOL (1 << 6) /* `It' invocation should close */
+#define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting */
int pflags;
enum mdoc_next next; /* where to put the next node */
struct mdoc_node *last; /* the last node parsed */
diff --git a/mdoc.c b/mdoc.c
index 5fc9ed95..000205be 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -239,6 +239,20 @@ mdoc_parseln(struct mdoc *m, int ln, char *buf, int offs)
return(0);
m->flags |= MDOC_NEWLINE;
+
+ /*
+ * Let the roff nS register switch SYNOPSIS mode early,
+ * such that the parser knows at all times
+ * whether this mode is on or off.
+ * Note that this mode is also switched by the Sh macro.
+ */
+ if (m->regs->regs[(int)REG_nS].set) {
+ if (m->regs->regs[(int)REG_nS].v.u)
+ m->flags |= MDOC_SYNOPSIS;
+ else
+ m->flags &= ~MDOC_SYNOPSIS;
+ }
+
return(('.' == buf[offs] || '\'' == buf[offs]) ?
mdoc_pmacro(m, ln, buf, offs) :
mdoc_ptext(m, ln, buf, offs));
@@ -373,24 +387,14 @@ node_alloc(struct mdoc *m, int line, int pos,
/* Flag analysis. */
+ if (MDOC_SYNOPSIS & m->flags)
+ p->flags |= MDOC_SYNPRETTY;
+ else
+ p->flags &= ~MDOC_SYNPRETTY;
if (MDOC_NEWLINE & m->flags)
p->flags |= MDOC_LINE;
m->flags &= ~MDOC_NEWLINE;
- /* Section analysis. */
-
- if (SEC_SYNOPSIS == p->sec)
- p->flags |= MDOC_SYNPRETTY;
-
- /* Register analysis. */
-
- if (m->regs->regs[(int)REG_nS].set) {
- if (m->regs->regs[(int)REG_nS].v.u)
- p->flags |= MDOC_SYNPRETTY;
- else
- p->flags &= ~MDOC_SYNPRETTY;
- }
-
return(p);
}
diff --git a/mdoc_action.c b/mdoc_action.c
index aad0bb66..0c84a87f 100644
--- a/mdoc_action.c
+++ b/mdoc_action.c
@@ -457,6 +457,17 @@ post_sh(POST_ARGS)
if (SEC_NONE == m->lastnamed || SEC_CUSTOM != sec)
m->lastnamed = sec;
+ /*
+ * Switch the parser's SYNOPSIS mode, to be copied
+ * into individual nodes when creating them.
+ * Note that this mode can also be set and unset
+ * using the roff nS register.
+ */
+ if (SEC_SYNOPSIS == sec)
+ m->flags |= MDOC_SYNOPSIS;
+ else
+ m->flags &= ~MDOC_SYNOPSIS;
+
/* Some sections only live in certain manual sections. */
switch ((m->lastsec = sec)) {
diff --git a/mdoc_macro.c b/mdoc_macro.c
index eba02df7..bce50bd4 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -1582,6 +1582,9 @@ in_line_eoln(MACRO_PROT_ARGS)
assert( ! (MDOC_PARSED & mdoc_macros[tok].flags));
+ if (tok == MDOC_Pp)
+ rew_sub(MDOC_BLOCK, m, MDOC_Nm, line, ppos);
+
/* Parse macro arguments. */
for (arg = NULL; ; ) {
@@ -1645,7 +1648,7 @@ ctx_synopsis(MACRO_PROT_ARGS)
nl = MDOC_NEWLINE & m->flags;
/* If we're not in the SYNOPSIS, go straight to in-line. */
- if (SEC_SYNOPSIS != m->lastsec)
+ if ( ! (MDOC_SYNOPSIS & m->flags))
return(in_line(m, tok, line, ppos, pos, buf));
/* If we're a nested call, same place. */